Abonnement aux commentaires

S'abonner pour recevoir les commentaires suivants par email

まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Un écran LCD piloté via SPI pour le RaspberryPi

L'écran utilisé pour le WebRadioReveilWiFi donnant au final une qualité d'image assez nulle, et pour le besoin d'autres projets, j'ai regardé un peu ce qu'il se faisait du côté des écrans LCD non-Composite et non-HDMI.

dsc04295.jpg

  • Ce qui revient le plus ce sont les écrans de type ili9340 qui fonctionnent en SPI et qui ont l'avantage d'exister de différentes tailles et résolutions, avec parfois aussi des fonctionnalités tactile résistives.

J'ai acquis deux modèles différents, l'un en 2,2 pouces qui vient sur une plaquette enfichable avec un connecteur GPIO de 40 broches, et un autre de 2,8 pouces tactile sur sa plaquette avec un connecteur GPIO de 26 broches.

  • Voici ce que ça donne en place sur un RPi :

dsc04299.jpg dsc04300.jpg

  • On remarque que l'écran 2.2" est directement soudé sur la plaquette, tandis que l'écran 2,8" est tenu à la plaquette avec un connecteur FCC.

dsc04298.jpg dsc04301.jpg

Fonctionnement :

Ces écrans fonctionnent en SPI, c'est à dire qu'ils exploitent directement les GPIO suivant :

- CE0 (GPIO08)
- MISO (GPIO09)
- MOSI (GPIO10)
- SCLK (GPIO11)

D'autres pins sont utilisées pour gérer le RESET et le D/CX.

Et donc pour utiliser le SPI le Raspberry à besoin qu'on le lui active, et qu'on lui charge un driver (module), ce qu'on peut faire,

  • Avec sudo rpi-config ou en éditant directement le fichier /boot/config.txt, pour activer le mode SPI :
dtparam=spi=on
disable_overscan=1
framebuffer_width=320
framebuffer_height=240

Les 3 dernières lignes sont nécessaires afin d'utiliser le player de vidéo oxmplayer dans de bonnes conditions.
framebuffer width et height, à régler selon la résolution native du modèle de LCD.

En effet, mon premier réflexe aura été d'utiliser mplayer car je le connaissais bien, mais ce dernier est incapable d'utiliser l'accélération matérielle du processeur pour décoder les vidéos H264, ce qui fait qu'à la lecture, celles-ci se mettaient à ramer, avec en prime un message d'avertissement sur l'état extrêmement lent du système.
Les vidéo en H263 passaient très bien, mais leurs poids très conséquent m'a découragé à utiliser ce format, et j'ai donc découvert oxmplayer, dédié à gérer le décodage hardware sur le RPi.

  • Créer le fichier, avec dedans le nom des modules à charger :
sudo nano /etc/modules-load.d/fbtft.conf
spi-bcm2835
fbtft_device
  • Créer le fichier, avec dedans les paramètres du module à charger au démarrage du Rpi :
sudo nano /etc/modprobe.d/fbtft.conf
options fbtft_device custom name=fb_ili9341 gpios=reset:25,dc:24 speed=48000000 rotate=270 fps=30 bgr=1

Voilà, l'écran qui à la mise sous tension était blanc, se met en marche et passe au noir, on va pouvoir lire une vidéo !
Cependant, pour déterminer ces paramètres, il aura fallu procéder à des essais préalables…

  • Lancer le module manuellement :
sudo modprobe fbtft_device custom name=fb_ili9341 gpios=reset:24,dc:25,led:18 speed=64000000 fps=30 bgr=1 rotate=90

On fait correspondre les arguments au câblage relevé sur la plaquette de l'écran:

- Le Reset en GPIO24, donc pin N°18.
- Le signal DC en GPIO25, pin N°22.
- LED pour le contrôle du rétro-éclairage par PWM, pin N°12.
- speed pour indiquer la vitesse de rafraîchissement de l'écran, en MHz.
- rotate pour orienter l'écran donc.

  • On peut vérifier que les arguments on bien été pris en compte avec la commande dmesg :
[  305.495703] fbtft_device: module is from the staging directory, the quality is unknown, you have been warned.
[  305.504822] spidev spi0.1: spidev spi0.1 125000kHz 8 bits mode=0x00
[  305.504878] bcm2708_fb soc:fb: soc:fb id=-1 pdata? no
[  305.805642] graphics fb1: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=33, spi0.0 at 64 MHz
[  305.805738] fbtft_device: GPIOS used by 'fb_ili9341':
[  305.805747] fbtft_device: 'reset' = GPIO24
[  305.805751] fbtft_device: 'dc' = GPIO25
[  305.805755] fbtft_device: 'led' = GPIO18
[  305.805770] spidev spi0.1: spidev spi0.1 125000kHz 8 bits mode=0x00
  • Pour changer sans avoir à redémarrer, il suffit de décharger le module avec :
sudo modprobe -r fbtft_device

Et de recommencer l'opération jusqu'à satisfaction !

Lire une vidéo depuis la console :

  • Pour lire une vidéo on aura besoin de mplayer et omxplayer
sudo apt install mplayer omxplayer

Je vais quand même expliquer mplayer, qui ne pourra lire que des vidéos en DivX ou un autre format aussi léger, surtout sur un RPi Zero.
mplayer :

  • Lancer la vidéo avec mplayer:
sudo SDL_VIDEODRIVER=fbcon SDL_FBDEV=/dev/fb1 mplayer -vo sdl -framedrop deathsml_15-07-2015_1cc_h264-21.mp4
  • Avec playlist, Créer la liste :
nano /home/pi/playlists/video.m3u
/home/pi/video/dodonpachi_23-02-2014_montage.mp4
/home/pi/video/galaxian.mp4
sudo SDL_VIDEODRIVER=fbcon SDL_FBDEV=/dev/fb1 mplayer -vo sdl -framedrop -playlist playlists/video.m3u -loop 0
  • Contrôler mplayer en mode slave, utile pour scripter :
mkfifo /tmp/mplayer-control

ajouter « -slave -input file=/tmp/mplayer-control » à la commande mplayer :

sudo SDL_VIDEODRIVER=fbcon SDL_FBDEV=/dev/fb1 mplayer -vo sdl -framedrop -slave -input file=/tmp/mplayer-control -playlist playlists/video.m3u -loop 0
  • Pour connaître toutes les commandes possibles :
mplayer -input cmdlist
echo 'pt_step -1' > /tmp/mplayer-control
echo 'pt_step 1' > /tmp/mplayer-control
echo "volume -1" > /tmp/mplayer-control
echo "volume 1" > /tmp/mplayer-control
echo "pause" > /tmp/mplayer-control
echo "stop" > /tmp/mplayer-control

Pour le play, relancer la playliste

oxmplayer : Avec ce player on va pouvoir lire du H264 :

  • Installer fbcp, soft de Framebuffer mirroring, pour obtenir la console sur l'écran et plus encore :
sudo apt-get update
sudo apt-get install cmake git
git clone https://github.com/tasanakorn/rpi-fbcp
cd rpi-fbcp/
mkdir build
cd build/
cmake ..
make
sudo install fbcp /usr/local/bin/fbcp

D'après ce que j'en comprend, ce soft copie l'affichage tty depuis le premier frameBuffer vers le second, (/dev/fb0 sur /dev/fb1), ce qui doit permettre de bénéficier de l'accélération GPU hardware dédié à la vidéo.
Et effectivement dmesg précise que :

Sep  3 20:59:58 raspberrypi fbcp[652]: Primary display is 720 x 480
Sep  3 20:59:58 raspberrypi fbcp[652]: Second display is 320 x 240 16bps
  • Démarrer le programme en tâche de fond et lancer la vidéo
fbcp & 
omxplayer /home/pi/deathsml_15-07-2015_1cc_h264-21.mp4 --aspect-mode stretch -o local
  • Pour choisir la sortie son, en local (sortie Jack), HDMI ou les deux :
omxplayer -o local deathsml_15-07-2015_1cc_h264-21.mp4
omxplayer -o hdmi deathsml_15-07-2015_1cc_h264-21.mp4
omxplayer -o both deathsml_15-07-2015_1cc_h264-21.mp4

Doc : https://www.raspberrypi.org/documentation/raspbian/applications/omxplayer.md
Playlist : http://apsvr.com/blog/?p=134
Python : https://python-omxplayer-wrapper.readthedocs.io/en/latest/

  • Une petite vidéo de démonstration :


  • Pour arrêter la copie du Framebuffer :
sudo pkill fbcp
  • Pour démarrer fbcp au démarrage du Rpi , Éditer :
sudo nano /etc/rc.local

Et ajouter cette ligne avant la ligne exit 0

/usr/local/bin/fbcp &


Régler le rétro-éclairage :

Par défaut le rétro-éclairage en PWM n'est pas activé, l'éclairage est donc poussé au maximum. Le simple fait d'utiliser le GPIO18 en mode PWM active la fonction…

  • J'ai tenté d'utiliser le mode le plus souvent indiqué, avec la librairie WiringPi, qui consiste à passer le GPIO18 en mode PWM, et de faire varier sa valeur (de 0 à 1023) mais cette méthode freeze mplayer
gpio -g mode 18 pwm
gpio pwmc 1000
gpio -g pwm 18 1023
  • Alors je lui préfère la méthode python !

Installer la librairie RPIO

sudo apt-get install python3-rpi.gpio
  • Pour le code, c'est assez simple et sans mauvais effet sur la vidéo en cours de lecture :
import RPi.GPIO as RPGPIO # Import the GPIO Raspberry PI module
LED = 18
RPGPIO.setmode(RPGPIO.BCM)
RPGPIO.setup(LED, RPGPIO.OUT)
pwm = RPGPIO.PWM(LED, 1000)
brightness = 50 # Brightness value must be between 0 (min) and 100 (max)
pwm.start(brightness)
  • Il est aussi possible d'éteindre complètement l'écran, assez simplement avec ces deux commandes, respectivement PowerOFF et PowerON :
echo 1 | sudo tee /sys/class/backlight/*/bl_power
echo 0 | sudo tee /sys/class/backlight/*/bl_power


Ressources :
- https://www.instructables.com/id/Connect-LCD-to-Raspberry-Pi-Without-Breakout-Board/
- https://learn.adafruit.com/adafruit-2-2-pitft-hat-320-240-primary-display-for-raspberry-pi/downloads
- https://github.com/notro/fbtft/wiki/fbtft_device
- https://learn.adafruit.com/adafruit-2-2-pitft-hat-320-240-primary-display-for-raspberry-pi?view=all#backlight-control
- https://github.com/notro/fbtft/wiki/Framebuffer-use
- https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/backlight-control
- https://github.com/notro/fbtft/wiki/Backlight
- http://ingeniapp.com/en/using-2-2-lcd-spi-in-python-with-raspberry-pi/#comment-811
- https://pythonhosted.org/RPIO/

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet