🛠 Afficher sur un OLED I2C SSD1306 et déboguer le bus
Objectifs
Monter un affichage autonome sur ta carte RP2040 : l'I2C du RP2040 (2 contrôleurs, mappables sur toute GPIO — datasheet) piloté par MicroPython, avec le classique module OLED SSD1306 128×64. Tu apprendras surtout à scanner un bus I2C — la compétence qui sauve quand on ne sait pas si le module est mort, mal câblé, ou à l'adresse 0x3C ou 0x3D.
Matériel
- 1 × carte RP2040 générique (broches libres, ici GP4/GP5)
- 1 × module OLED SSD1306 4 broches (VCC, GND, SCL, SDA), alimenté en 3V3
- Câblage : VCC→3V3, GND→GND, SDA→GP4, SCL→GP5 ; les modules SSD1306 ont déjà leurs pull-up (2,2–4,7 kΩ) — n'en ajoute pas
- Firmware MicroPython rp2 + le driver
ssd1306.py(bibliothèque officielle micropython-lib, à copier sur la carte avec Thonny)
Code complet
# scan_i2c.py — d'abord, trouver le module
from machine import I2C, Pin
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
print('adresses vues:', i2c.scan) # attendu: [60] soit 0x3C
# oled_demo.py — afficher température interne + texte
import ssd1306, time
from machine import Temp
oled = ssd1306.I2C(128, 64, device=i2c) # adresse 0x3C détectée
try:
temp = Temp # capteur interne (MicroPython >= 1.22)
except NameError:
from machine import ADC
_a = ADC(4) # fallback : canal ADC4 interne
def read_T:
mv = _a.read_u16 * 3.3 / 65535
return 27.0 - (mv - 0.706) / 0.001721
else:
def read_T:
return temp.temperature
oled.text('RP2040 generique', 0, 0, 1)
oled.text('I2C 400 kHz OK', 0, 10, 1)
while True:
oled.text('T: %6.2f C' % read_T, 0, 30, 1)
oled.show
time.sleep_ms(500)
Vérification attendue
i2c.scan renvoie [60] (0x3C en décimal — l'autre adresse possible du SSD1306 est 0x3D, pont jumper sur le module). L'écran affiche les lignes de texte et la température du capteur interne du RP2040 qui monte quand tu poses le doigt sur la puce. Coupe le SDA : scan renvoie [] — le bus est vivant, le driver aussi.
Erreurs fréquentes
scanvide : SDA/SCL inversés (le plus fréquent), module mal alimenté, ou mauvais numéro de contrôleur I2C (I2C(1, ...)avec d'autres broches).- Bus bloqué à 0 : un esclave « coincé » après un reset ; 9 impulsions horloge libèrent le bus — recâbler ou
machine.resetsuffit souvent. - Écran allumé mais tout noir : oublié
oled.show— le SSD1306 a sa propre RAM, rien ne s'affiche sans transfert. - Confondre les pilotes : il existe
SSD1306_128_64etSSD1306_128_32— un module 32 lignes avec le driver 64 affiche des lignes fantômes. - Tirer la ligne à la masse avec un câble pincé : l'I2C reste « busy » et le scan échoue pour tous les périphériques.
- Fréquence trop haute sur de longs câbles : repasse à
freq=100000avant de chercher plus loin.
Autres tutoriels pour cette carte
- Piloter la LED RGB embarquée WS2812 d'une carte RP2040 générique
- Avoir une console série sur une carte sans pont USB (UART0)
- Jouer une mélodie avec un buzzer passif et le PWM
- Logger sur carte microSD en SPI (mode carte)
- Interruptions GPIO et alarmes matérielles avec le Pico SDK
- Transformer la carte en clavier USB HID avec TinyUSB
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython