🛠 Afficher sur un OLED I2C SSD1306 et déboguer le bus
Objetivos
Montar una pantalla autónoma en tu placa RP2040: el I2C del RP2040 (2 controladores, mapeables en cualquier GPIO — hoja de datos) controlado por MicroPython, con el clásico módulo OLED SSD1306 128×64. Aprenderás principalmente a escanear un bus I2C — la habilidad que salva cuando no se sabe si el módulo está muerto, mal conectado, o en la dirección 0x3C o 0x3D.
Material
- 1 × placa RP2040 genérica (pines libres, aquí GP4/GP5)
- 1 × módulo OLED SSD1306 de 4 pines (VCC, GND, SCL, SDA), alimentado a 3V3
- Cableado: VCC→3V3, GND→GND, SDA→GP4, SCL→GP5; los módulos SSD1306 ya tienen sus resistencias de pull-up (2,2–4,7 kΩ) — no añadas más
- Firmware MicroPython rp2 + el driver
ssd1306.py(biblioteca oficial micropython-lib, a copiar en la placa con Thonny)
Código completo
# 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)
Verificación esperada
i2c.scan devuelve [60] (0x3C en decimal — la otra dirección posible del SSD1306 es 0x3D, puente jumper en el módulo). La pantalla muestra las líneas de texto y la temperatura del sensor interno del RP2040 que sube cuando pones el dedo sobre el chip. Desconecta el SDA: scan devuelve [] — el bus está vivo, el driver también.
Errores frecuentes
scanvacío: SDA/SCL invertidos (lo más frecuente), módulo mal alimentado, o número de controlador I2C incorrecto (I2C(1, ...)con otros pines).- Bus bloqueado a 0: un esclavo «atascado» después de un reset; 9 impulsos de reloj liberan el bus — recablear o
machine.resetsuele ser suficiente. - Pantalla encendida pero todo negro: olvidaste
oled.show— el SSD1306 tiene su propia RAM, nada se muestra sin transferencia. - Confundir los drivers: existen
SSD1306_128_64ySSD1306_128_32— un módulo de 32 líneas con el driver de 64 muestra líneas fantasma. - Tirar la línea a masa con un cable pellizcado: el I2C permanece «busy» y el escaneo falla para todos los periféricos.
- Frecuencia demasiado alta en cables largos: vuelve a
freq=100000antes de buscar más lejos.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython