Dans cet article, je programme le Raspberry Pi Pico en MicroPython afin d'afficher des images et du texte sur un petit écran OLED I2C de 128X64 pixels (contrôleur SH1106).
Connexions
Quatre connections sont suffisantes pour brancher l'écran OLED au Pico:
- Broche GND de l'écran: une des broches GND du Pico
- Broche VCC de l'écran: sortie 3,3 V du Pico
- Broche SCL de l'écran: broche GP9 du Pico
- Broche SDA de l'écran: broche GP8 du Pico
Installation du driver SH1106
Nous utiliserons ce driver spécialement conçu pour contrôler le SH1106 en MicroPython. Le fichier sh1106.py doit être copié dans le Pico pour que nos scripts fonctionnent.
Comment s'y prendre? Vous ouvrez le fichier sh1106.py avec Thonny, et vous choisissez "Enregistrer une copie..." dans le menu "Fichier".
Écrire du texte
Pour afficher du texte à l'écran, on utilise la méthode text. Par exemple, l'expression "oled.text("Bonjour", 10, 15)" affichera le mot "Bonjour". Le début du mot se trouvera à la position horizontale 10 pixels et à la position verticale 15 pixels.
Dessiner des formes géométriques simples
Il est possible de dessiner quelques formes géométriques de base:
- hline pour tracer une droite horizontale
- vline pour tracer une droite verticale
- line pour tracer une droite
- rect pour tracer un rectangle
- pixel pour régler un seul pixel
- fill pour remplir tout l'écran en noir ou en blanc
Pour toutes ces méthodes, le dernier argument est la couleur: 0 pour noir et 1 pour blanc.
Exemple de script
Le script ci-dessous affiche d'abord une charmante comptine...
...puis un rectangle, un cercle et quelques droites.
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Affichage de texte et d'images sur un écran OLED i2C | |
SH1106 branché à un Raspberry Pi Pico. | |
Utilise le driver disponible ici: https://github.com/robert-hh/SH1106 | |
Pour plus d'infos: | |
https://electroniqueamateur.blogspot.com/2021/04/ecran-oled-sh1106-et-pico.html | |
''' | |
from machine import Pin, I2C | |
from sh1106 import SH1106_I2C | |
import utime # pour le délai en secondes | |
from math import sin, cos # pour le tracé du cercle | |
#dimensions de l'écran | |
LARGEUR = 128 | |
HAUTEUR = 64 | |
#initialisation i2c | |
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000) | |
# initialisation oled | |
oled = SH1106_I2C(LARGEUR, HAUTEUR, i2c) | |
while True: | |
# On remplit l'écran de noir (pour effacer) | |
oled.fill(0) | |
# Un peu de texte... | |
oled.text("Am stram gram",5,5) | |
oled.text("Pico Pico",5,15) | |
oled.text("colegram",5,25) | |
oled.text("Bour et bour",5,35) | |
oled.text("et ratatam",5,45) | |
oled.text("Am stram gram",5,55) | |
oled.show() # On affiche le résultat | |
utime.sleep(5) # on attend 5 secondes | |
# On remplit l'écran de noir (pour effacer) | |
oled.fill(0) | |
# rectangle dont le coin supérieur droit est à 10,10 | |
# 45 de large et 45 de haut | |
oled.rect(10, 10, 45, 45, 1) | |
# droite qui va du point 10,10 au point 55,55 | |
oled.line(10, 10, 55, 55, 1) | |
# cercle (dessiné pixel par pixel) | |
rayon = 24 | |
centrex = 90 | |
centrey = 30 | |
for angle in range(126): | |
oled.pixel(centrex + int(rayon * cos(angle/20.0)), centrey + int(rayon * sin(angle/20.0)),1) | |
# droite horizontale débutant à 66,30, longueur 48 | |
oled.hline(66,30,48,1) | |
# droite verticale débutant à 90,6 , longueur 48 | |
oled.vline(90,6,48,1) | |
oled.show() # On affiche le résultat | |
utime.sleep(5) # on attend 5 secondes | |
-
Pour des images plus complexes, il est possible d'afficher un bitmap. La solution la plus efficace, à mon avis, consiste à enregistrer l'image dans un fichier .pbm et à copier ce fichier dans le Pico.
Création du fichier pbm
Pour transformer une photographie ou une illustration en format pbm, j'ai utilisé le logiciel GIMP.
Dans la boîte de dialogue, on choisit "Utiliser un palette noir et blanc (1-bit)":
À cette étape, il n'y a plus de couleurs, ni de niveaux de gris:
Dans la boîte de dialogue, on s'assure que les dimensions de l'image ne sont pas supérieures à celle de l'écran (dans mon cas, c'est un maximum de 128 pixels de largeur et de 64 pixels de hauteur).
La définition de l'image a beaucoup diminué, mais elle correspond à celle de notre écran OLED:
Les parties qu'on voit en noir sur l'image d'origine apparaîtront en blanc sur l'écran OLED, et vice-versa. Si on veut éviter ça, on choisit le menu Couleurs / Inverser.
Il ne reste plus qu'à enregistrer le résultat en format pbm: menu Fichier / Exporter sous ... et on choisit un nom de fichier qui se termine par l'extension ".pbm".
Il faut choisir "Raw" et non ASCII.
Copie du fichier pbm dans le Pico
Pour transférer le fichier dans le Pico, on peut utiliser Thonny.
On s'assure que "Fichiers" est coché dans le menu "Affichages":
Du côté gauche de la fenêtre de Thonny, on peut voir, en haut, la liste des fichiers enregistrés dans le Pico ("appareil MicroPython") et, en bas, les fichiers qui se trouvent dans l'ordinateur. Lorsqu'on a localisé notre fichier .pbm, on fait un clic avec le bouton droit de la souris, et on choisit "Téléversement vers /": le fichier est transféré dans le Pico.
Script en MicroPython pour afficher le contenu du fichier pbm
Voici le script qui affichera sur l'écran OLED l'image stockée dans le fichier pbm (on suppose que ce fichier s'intitule "image.pbm".
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Affichage d'une image bitmap sur un écran OLED | |
SH1106 branché à un Raspberry Pi Pico | |
L'image est dans un fichier "image.pbm" | |
Utilise le driver disponible ici: https://github.com/robert-hh/SH1106 | |
Pour plus d'infos: | |
https://electroniqueamateur.blogspot.com/2021/04/ecran-oled-sh1106-et-pico.html | |
''' | |
from machine import Pin, I2C | |
from sh1106 import SH1106_I2C | |
import framebuf | |
# dimensions de l'écran | |
LARGEUR_OLED = 128 | |
HAUTEUR_OLED = 64 | |
# dimensions de l'image | |
LARGEUR_IMAGE = 128 | |
HAUTEUR_IMAGE = 64 | |
# nom du fichier qui contient l'image | |
NOM_FICHIER = 'image.pbm' | |
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000) # initialisation i2c | |
oled = SH1106_I2C(LARGEUR_OLED, HAUTEUR_OLED, i2c) # initialisation écran OLED | |
oled.fill(0) # pour effacer le contenu précédent | |
with open(NOM_FICHIER, 'rb') as f: | |
f.readline() # on ignore les 3 premieres lignes du fichier | |
f.readline() | |
f.readline() | |
data = bytearray(f.read()) | |
fbuf = framebuf.FrameBuffer(data, LARGEUR_IMAGE, HAUTEUR_IMAGE, framebuf.MONO_HLSB) | |
oled.blit(fbuf, 0, 0) | |
oled.show() |
-
Sources
Cet article sur le blog de Martin Fitzpatrick m'a été particulièrement utile pour l'affichage d'une image bitmap.
À lire également
Aucun commentaire:
Enregistrer un commentaire