MICROPYTHON-MOD-OLED
Introduction
MOD-OLED-128x64 est un module bon marché, faible puissance, avec un LCD haut contraste et équipé d'un connecteur UEXT. Vous pouvez le contrôler à l'aide du bus I2C. La puissance requise est de l'ordre de 1 µA en mode veille, 200 µA en cours de fonctionnement et 7mA lorsque l'afficheur est activé.
Le surface d'affichage est de 21 x 11 mm pour 128 x 64 pixels. Ce qui est génial avec les afficheurs OLED, c'est qu'ils ne nécessitent pas de source de lumière pour afficher le contenu, chaque pixel produit sa propre lumière. C'est la raison pour laquelle les écran OLED présente un si haut contraste rendant ces écran si facile à lire.
L'arrière de la carte expose un emplacement permettant de souder un connecteur 4 broche vous permettant ainsi d'opter pour un raccordement alternatif. Vous pouvez donc y connecter un pinHeader si vous désirez utiliser le MOD-OLED-128x64 avec un breadboard.
Afficheur OLED I2C - connecteur UEXT
- OLED avec contrôleur SSD1306
- 128x64 pixels
- 27x11mm
- Alimentation 3.3V
- I2C Interface
Matériel utilisé
Pour réaliser ce test, nous avons utilisé:
Description | Quantité | |
ESP8266-EVB |
ESP8266 Evaluation Board d'Olimex disponible ici chez MCHobby |
1 |
MOD-OLED-128x64 |
Carte MOD-OLED-128x64 d'Olimex disponible ici chez MCHobby |
1 |
UEXT-SPLITTER |
Multiplicateur de port UEXT. Permettra de brancher la carte + Interface USB-Serie disponible ici chez MCHobby |
1 |
USB-SERIE-TTL |
Un cable console pour pouvoir communiquer avec l'ESP8266 disponible ici chez MCHobby |
1 |
Raccordements
Les raccordements sont effectués comme suit:
Attention: ne pas appliquer plus de 5V sur la carte d'évaluation ESP8266-EVB |
Le raccordement du convertisseur USB-Série est identique à celui décrit dans le tutoriel ESP8266-DEV sous MicroPython.
Etant donné que le l'ESP8266-DEV (et donc ESP8266-EVB) ne disposent pas de convertisseur USB-Série, il sera donc nécessaire d'utiliser un câble console (USB-Série-TTL) pour communiquer avec la carte ESP8266.
Flasher MicroPython
Pour flasher MicroPython sur l'ESP8266-DEV (module ESP8266) qui équipe la carte d'évaluation d'Olimex (ESP8266-EVB), nous vous proposons les lectures suivantes:
Utiliser MicroPython sur ESP8266 nécessite de Flasher le MicroContrôleur avec le Firmware et d'utiliser des outils appropriés pour communiquer avec lui. Vous trouverez ci-dessous une sélection de tutoriel pour vous préparer. Nous recommandons vivement l'usage de RSHell, même si Ampy reste une solution plus simpliste (mais aussi nettement plus limitée).
Apprenez comment charger le Firmware MicroPython sur une carte Pyboard, ESP8266 (Feather, Wemos, NodeMcu), etc.
Transférez des fichiers et contrôlez votre carte depuis une simple connexion série. ESP8266 compatible.
Outil simplifié de transfert de fichiers et de contrôlez de carte depuis une connexion série. ESP8266 compatible.
RShell sur ESP8266
Une petite pointe de rappel pour l'utilisation des ESP8266 avec RShell...
Il est impératif de réduire la taille du buffer à 128 octets sur un ESP8266 sinon vous risquez d'écraser le système de fichier votre ESP8266... auquel cas il faudra reflasher votre carte |
rshell --port /dev/ttyUSB0 --baud 115200 --buffer-size 128 --editor nano
Nous avons également un petit script shell rsheel-esp8266.sh pour faciliter faciliter le démarrage de rshell pour un esp8266.
Installer la bibliothèque
Cette bibliothèque est un pilote SSD1306 I2C et SPI (MicroPyhton GitHub) pour écran OLED ssd1306 pouvant être utilisé avec MicroPython.
L'utilisation de ce pilote requière l'installation d'une bibliothèque spécifique. Vous la trouverez ici:
Le pilote pour bus I2C utilise l'adresse 0x3c par défaut.
Vous devrez copier les fichiers suivant sur votre carte MicroPython
- ssd1306.py dans le répertoire racine.
Pour savoir comment copier vos fichiers sur votre carte MicroPython, vous pouvez vous référer aux ressources suivantes:
Outil simplifié de transfert de fichiers et de contrôlez de carte depuis une connexion série. ESP8266 compatible.
Transférez des fichiers et contrôlez votre carte depuis une simple connexion série. ESP8266 compatible.
Puis utiliser le code suivant pour faire fonctionner votre interface. Tester le code dans une session REPL ou WebREPL.
Utiliser
Pour tester la bibliothèque, il faut créer une instance du pilote SSD1306.
Celle-ci sera stockée dans le variable lcd. Voir la section "Créer lcd" correspondant à votre cas de figure puis poursuivre dans la section "Tester lcd".
Détecter l'adresse I2C
Si vous ne connaissez pas l'adresse I2C utilisé par votre écran OLED, vous pouvez faire un scan du bus I2C.
from machine import Pin, I2C
i2c = I2C( sda=Pin(2), scl=Pin(4) )
i2c.scan()
Ce qui produit le résultat suivant correspondant à 0x3C dans le cas du module OLED:
[60]
Créer LCD
pour Module MOD-OLED-128x64
from machine import Pin, I2C
i2c = I2C( sda=Pin(2), scl=Pin(4) )
import ssd1306
lcd = ssd1306.SSD1306_I2C( 128, 64, i2c )
Tester la bibliothèque
Dans les exemples ci-dessous, voici les paramètres que vous retrouverez dans les différents appels de fonction:
- x : position du point par rapport au côté gauche de l'écran.
- y : position du point par rapport au dessus de l'écran.
- w : largeur (du mot Width).
- h : hauteur (du mot Height).
- c : couleur (1=point allumé, 0=point éteint)
Remplir
Remplir un écran ou un rectangle de point blanc (allume tous les Pixels) ou points noir (éteint les pixels).
lcd.fill(1) # Rempli l'écran en blanc
lcd.show() # Afficher!
# Remplis un rectangle en noir
# fill_rect( x, y, w, h, c )
lcd.fill_rect( 10,10, 20, 4, 0 )
lcd.show() # Afficher!
Autres méthodes
Exemple : dessiner une image
from machine import Pin, I2C
import time
i2c = I2C( sda=Pin(2), scl=Pin(4) )
import ssd1306
lcd = ssd1306.SSD1306_I2C( 128, 64, i2c )
lcd.fill( 0 )
lcd.show()
# a: Alpha Channel (pas dessiné)
a = None
FB_ICON = [
[a,a,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,a,a],
[a,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,a],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1],
[1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,1,0,0,1],
[1,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,1,1,0,0,0,0],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[a,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,a],
[a,a,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,a,a] ]
def draw_icon( lcd, from_x, from_y, icon ):
for y, row in enumerate( icon ):
for x, color in enumerate( row ):
if color==None:
continue
lcd.pixel( from_x+x,
from_y+y,
color )
def randrange( max ):
assert max < 256
import urandom
r = urandom.getrandbits(8)
while r > max:
r = urandom.getrandbits(8)
return r
def random_icon( lcd, icon, count ):
range_x = lcd.width - len(icon[0])
range_y = lcd.height - len(icon)
for i in range( count ):
draw_icon( lcd,
randrange( range_x ),
randrange( range_y ),
icon
)
# affichage de 30 icones (avec canal Alpha )
lcd.fill( 0 )
for i in range( 8 ):
random_icon( lcd, FB_ICON, 1 )
lcd.show()
time.sleep( 2 )
lcd.fill( 0 )