mercredi 6 mars 2019

Écran OLED SH1106 I2C et Raspberry Pi


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

Dans ce billet, nous allons brancher à un Raspberry Pi un petit écran OLED monochrome de 128 X 64 pixels, puis y afficher du texte et des formes géométriques grâce à un script en Python.

Technologie OLED

OLED signifie "organic light emitting diode", donc "diode électroluminescente organique".

Les écrans OLED offrent des caractéristiques similaires aux écrans LCD (à cristaux liquides), sauf qu'ils ne nécessitent pas de rétroéclairage et produisent des images plus contrastés.

Mon écran OLED

J'ai utilisé un écran OLED de 128 X 64 pixels, dont les dimensions sont approximativement 3,5 cm X 1,8 cm. Il est basé sur le contrôleur SH1106 et utilise le protocole de communication I2C. Il y a quelques semaines, j'ai décrit la façon de le contrôler au moyen d'un Arduino.


Connexion de l'écran au Raspberry Pi

Puisque j'ai la version I2C de l'écran, je l'ai branché au Raspberry Pi de la façon suivante:

Écran OLED  ----  Raspberry Pi
Broche GND  ---- Broche 1 (3,3 V)
Broche VCC  ---- Broche 6 (GND)
Broche SCL   ---- Broche 5 (GPIO 3)
Broche SDA  ----  Broche 3 (GPIO 2)


Activation de l'I2C sur le Rasbperry Pi

Si vous n'avez encore jamais branché de périphérique I2C à votre Raspberry Pi, il est important d'activer le protocole I2C, en ouvrant "Configuration du Raspberry Pi" dans le menu Préférences.


Assurez-vous que l'option I2C est activée dans l'onglet "Interfaces" (un redémarrage du Raspberry Pi est nécessaire pour que les modifications prennent effet).


Si votre écran est correctement branché et que l'I2C est activé, la commande "i2cdetect -y 1" tapée dans le terminal vous permettra de détecter l'écran à l'adresse 3c.


Installation de la bibliothèque luma.oled

La bibliothèque luma.oled est conçue pour le contrôle de nombreux écrans OLED (contrôleurs SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SSD1331, SSD1351 et SH1106). Vous pouvez consulter en ligne son manuel d'utilisation détaillé.

Pour installer ce module Python dans mon Raspberry Pi, il s'agit d'écrire cette commande dans le terminal:

sudo -H pip3 install --upgrade luma.oled

Exemple de script

À titre d'exemple, voici un script qui affiche sur l'écran la date et l'heure, l'adresse IP utilisée par le Rasbperry Pi et quelques formes géométriques (rectangle, ovale, polygone, lignes droites). Comme d'habitude pour ce genre d'écrans, chaque position sur l'écran est définie au moyen d'une abscisse et d'une ordonnée, le premier pixel en haut à gauche ayant les coordonnées x = 0 et y = 0.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Affichage de texte de de formes géométriques
sur un écran OLED i2c sh1106 branché à un
Raspberry Pi.
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/03/ecran-oled-sh1106-i2c-et-raspberry-pi.html
'''
# module luma.oled
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import sh1106
import time # pour les délais
import subprocess # pour l'obtention de l'adresse IP
import datetime # pour l'obtention de la date et de l'heure
#initialisation de l'écran OLED
serial = i2c(port=1, address=0x3C)
device = sh1106(serial)
device.persist = True; # pour que l'image demeure affichée après la fin du programme
# affichage date et heure
with canvas(device) as draw:
x = datetime.datetime.now()
draw.text((15, 0), x.strftime("Date:"), fill="white")
draw.text((25, 15), x.strftime("%x"), fill="white")
draw.text((15, 30), x.strftime("Heure:"), fill="white")
draw.text((25, 45), x.strftime("%X"), fill="white")
time.sleep(2)
# affichage d'un carré blanc
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((15, 15), "Carre", fill="white")
draw.text((15, 30), " blanc", fill="white")
draw.rectangle((70, 10, 110, 50), outline="white", fill="white")
time.sleep(2)
# affichage d'un cercle noir
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((15, 15), "Cercle", fill="white")
draw.text((15, 30), " noir", fill="white")
draw.ellipse((70, 10, 110, 50), outline="white", fill="black")
time.sleep(2)
# affichage d'un triangle blanc
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((15, 15), "Triangle", fill="white")
draw.text((15, 30), " blanc", fill="white")
draw.polygon([(70, 50), (110, 50), (90,10)], outline="white", fill="white")
time.sleep(2)
# affichage d'un X constitué de deux lignes droites
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((15, 15), "Deux", fill="white")
draw.text((15, 30), "lignes", fill="white")
draw.line((70, 10, 110 , 50), fill="white")
draw.line((70, 50, 110 , 10), fill="white")
time.sleep(2)
# affichage de l'adresse IP du Raspberry Pi
with canvas(device) as draw:
IP = subprocess.check_output(["hostname", "-I"]).split()[0]
draw.text((15, 15), "Adresse IP:", fill="white")
draw.text((20, 30), IP, fill="white")
view raw ecran_OLED.py hosted with ❤ by GitHub

Les concepteurs de luma.oled mettent également à notre disposition une grande quantité d'exemples (affichage d'images sauvegardées en fichier, animations, etc.).

À lire également

J'ai aussi eu l'occasion de contrôler cet écran OLED avec un Arduino Uno, avec une carte STM32 (Nucleo et Blue Pill), avec un ESP8266 et avec un ESP32.

D'autres afficheurs peuvent être contrôlés grâce à un script en python sur le Raspberry Pi: écran couleur SPI ST7735, écran Nokia 5110, afficheur LCD 16 X 2 ...

Yves Pelletier   (TwitterFacebook)

1 commentaire: