mardi 15 janvier 2019

Afficheur LCD Nokia 5110 et Raspberry Pi

Cet article a été mis à jour le 30 décembre 2020 (compatibilité Python 3).

Il est parfois souhaitable que le Raspberry Pi affiche quelques informations sur un écran, mais sans qu'il soit nécessaire de recourir à un écran HDMI plus coûteux et plus encombrant. Dans une telle situation, l'utilisation d'un petit écran LCD de type Nokia 5110 peut s'avérer une solution intéressante.

Le présent article décrit donc l'affichage de texte et d'éléments graphiques sur un afficheur Nokia 5110, grâce à un script en Python. Les tests ont été réalisés sur un Raspberry Pi 2.

Module "Nokia 5110"

"Nokia 5110" est, en fait, le nom du téléphone qui utilisait ce modèle d'écran à la fin des années 1990. ll s'agit d'un afficheur à cristaux liquides (LCD) monochrome associé à un contrôleur Philips PCD8544, dont la résolution est de 84 X 48 pixels (sa taille est de 3,5 cm par 2,5 cm environ).

Pour faciliter les branchements avec le Rapsberry Pi ou un microcontrôleur, il existe  sur le marché deux types de breakout: le modèle rouge commercialisé par Sparkfun, et le modèle bleu commercialisé par Adafruit. Des clones de ces deux modèles sont également proposés chez les commerçants asiatiques. J'ai moi-même utilisé le modèle de type Sparkfun, mais vous pouvez sans problème utiliser les informations que je vous présente ici avec le modèle de type Adafruit.  Peu importe le modèle que vous choisissez, vous devrez probablement souder vous-même la barrette de 8 connecteurs.


Branchements de l'afficheur au Raspberry Pi

Voici la description des 8 connections à effectuer entre l'afficheur LCD et le Raspberry Pi. Notez que les symboles indiqués sur l'afficheur ne sont pas toujours identiques selon que vous utilisez le modèle Sparkfun ou le modèle Adafruit, j'ai donc essayé autant que possible d'écrire toutes les possibilités.
  • Broche Vcc de l'écran  --- Broche 17 (sortie 3,3 V) du Raspberry Pi
  • Broche GND de l'écran --- Broche 20 (GND) du Raspberry Pi
  • Broche SCE ou CS de l'écran --- Broche 24 (GPIO 8) du Raspberry Pi
  • Broche RST de l'écran --- Broche 18 (GPIO 24) du Raspberry Pi
  • Broche D/C de l'écran --- Broche 16 (GPIO 23) du Raspberry Pi
  • Broche DN (MOSI) ou DIN de l'écran --- Broche 19 (GPIO 10) du Raspberry Pi
  • Broche SCLK ou CLK de l'écran --- Broche 23 (GPIO 11) du Raspberry Pi
  • Je n'ai pas branché la broche LED de l'écran (je n'avais pas besoin du rétroéclairage).


Notez que le schéma ci-dessus est correct pour la version "Sparkfun" de l'écran. Je crois que les broches ne sont pas dans le même ordre sur la version "Adafruit" (référez-vous alors à la description plutôt qu'au schéma).

Préparation du Raspberry Pi

Si ce n'est pas déjà fait, il est important que les broches dédiées à la communication SPI soient activées.  Pour ce faire, on ouvre "Configuration du Raspberry Pi" dans le menu "Préférences" de Raspbian.


Dans l'onglet, on coche "Activé" sur la ligne "SPI".



De plus, nous avons besoin d'installer deux bibliothèques pour Python.

La "Python Imaging Library" est probablement déjà installée, mais au cas où elle ne le serait pas, on peut écrire cette ligne dans le terminal:

sudo apt-get install python3-pil

Pour l'installation de la bibliothèque Nokia d'Adafruit, ce sont 3 lignes qui devront être écrites dans le terminal:

On va chercher la bibliothèque sur GitHub:

git clone https://github.com/adafruit/Adafruit_Nokia_LCD.git

Il reste à exécuter un script d'installation qui se trouve à l'intérieur du répertoire que nous venons d'installer. On entre donc à l'intérieur de ce répertoire:

cd Adafruit_Nokia_LCD

Et on exécute le script d'installation:

sudo python3 setup.py install

Votre petit écran devrait maintenant pouvoir être piloté au moyen d'un script en Python. Une façon rapide et efficace de vérifier que tout fonctionne correctement consiste à explorer les 3 fichiers d'exemple qui se trouvent  à l'intérieur du répertoire Adafruit_Nokia_LCD/examples:
  • shapes.py affiche une image statique constituée d'un cercle, un carré, un triangle, un X et l'inévitable expression "Hello World!"

  • image.py affiche le contenu du fichier "happycat_lcd.ppm" (un chat)

  • animate.py montre une phrase qui bouge en formant une forme sinusoïdale.


Exemple de script

Je vous propose ici un quatrième exemple de script: après une courte animation d'ouverture (qui consiste en une pointe de tarte dont l'angle d'ouverture augmente jusqu'à devenir un cercle complet), l'écran affiche la date, l'heure et l'adresse IP utilisée par votre Raspberry Pi.  Remarquez qu'une fois le script terminé, l'écran continue d'afficher la dernière image.

Pour faciliter le débogage, le script affiche également dans le terminal une description de ce qu'il est en train d'afficher dans le LCD.


Animation d'ouverture:


Adresse IP:


Date et heure:


Pub narcissique:



Pour ceux qui préfèrent une vidéo:




Utilisation de la Python Imaging Library, en bref

Pour terminer, voici quelques informations sur la façon d'écrire et dessiner à l'écran grâce à la PIL (Python Imaging Library). Loin de moi l'idée de vous donner un cours complet sur le sujet. Vous trouverez plus d'informations ailleurs sur le web, par exemple ici.

La position de chaque pixel sur l'écran est déterminée par une coordonnée x (numéro de colonne) et une coordonnée y (numéro de ligne). La première ligne en haut de l'écran et la première colonne à gauche portent le numéro 0. Ainsi, le premier pixel en haut à gauche se trouve aux coordonnées x = 0, y = 0. Le dernier pixel en bas à droite se trouve aux coordonnées x = 83, y = 47.

Pour écrire du texte à l'écran, on utilise une commande de ce genre:

draw.text((5,10), "Bonjour", font=font)

Comme résultat, le mot "Bonjour" sera affiché à l'écran. Son point de départ sera le pixel situé aux coordonnées x = 5, y = 10.

Pour dessiner un rectangle, on peut utiliser:

draw.rectangle((5,10,70,22), outline=0, fill=255)

Dans ce cas, le coin supérieur gauche du rectangle sera le pixel situé à x =5 et y = 10. Il sera large de 70 pixels et haut de 22 pixels. Son contour sera noir (outline = 0) et il sera rempli de blanc (fill = 255).

On peut également tracer des points (pixels individuels), des lignes droites, des ellipses, des polygones, etc.  De plus, tel qu'illustré dans l'exemple "image.py", il est possible d'afficher une image enregistrée dans un fichier.

Lire aussi

Grâce à un script en python sur Raspberry Pi, vous pouvez également contrôler un écran couleur SPI ST7735, un écran OLED SH1106 ou un afficheur 16 X 2.

Le même écran Nokia 5110 peut aussi être contrôlé au moyen d'un Arduino, d'un ESP32/ESP8266 ou d'un MSP430 Launchpad.

Yves Pelletier   (TwitterFacebook)

1 commentaire: