26. Nodo de sensores con Raspberry Pi Pico (MicroPython)
Da el salto de Arduino C++ a MicroPython con la Pico RP2040: lee un sensor y muéstralo en OLED. Aprende otra plataforma y otro lenguaje.
🧰 Lista de materiales
🎯 Qué vas a aprender
A trabajar con la Raspberry Pi Pico y MicroPython, una alternativa moderna a Arduino: lógica de 3,3 V, REPL interactivo y Python en lugar de C++. Montarás un nodo que lee un sensor y lo muestra en OLED.
📚 Teoría: Pico, MicroPython y niveles lógicos
El RP2040 es un microcontrolador de doble núcleo a 3,3 V. MicroPython es Python compilado para microcontroladores: editas con Thonny, ejecutas al vuelo y no compilas como en Arduino. Los pines GP0–GP28 son configurables.
Diferencia crítica con Arduino Uno: tolerancia de 3,3 V. Cualquier sensor que dé 5 V en una salida hacia la Pico necesita adaptación de nivel.
🔌 Conexiones
| Componente | Pin Pico |
|---|---|
| HC-SR04 VCC | VBUS (5 V) |
| HC-SR04 GND | GND |
| HC-SR04 Trig | GP14 |
| HC-SR04 Echo | GP15 (vía divisor a 3,3 V) |
| OLED VCC / GND | 3V3 / GND |
| OLED SDA / SCL | GP0 / GP1 |
💻 Código completo (MicroPython)
Instala MicroPython en la Pico (arrastra el .uf2 en modo BOOTSEL) y usa Thonny. Sube también la librería ssd1306.py.
# Nodo de distancia con Pico + HC-SR04 + OLED (MicroPython)
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time
# OLED por I2C
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
trig = Pin(14, Pin.OUT)
echo = Pin(15, Pin.IN)
def medir_cm():
trig.low()
time.sleep_us(2)
trig.high()
time.sleep_us(10)
trig.low()
# espera flanco de subida
t0 = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), t0) > 30000:
return -1
inicio = time.ticks_us()
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), inicio) > 30000:
return -1
fin = time.ticks_us()
return time.ticks_diff(fin, inicio) * 0.0343 / 2
while True:
d = medir_cm()
oled.fill(0)
oled.text("Distancia:", 0, 0)
if d < 0:
oled.text("--- cm", 0, 20)
else:
oled.text("{:.1f} cm".format(d), 0, 20)
# barra
ancho = min(int(d), 128)
oled.fill_rect(0, 45, ancho, 10, 1)
oled.show()
time.sleep(0.2)🛠️ Montaje paso a paso
- Flashea MicroPython en la Pico (botón BOOTSEL + arrastrar .uf2).
- Abre Thonny y selecciona el intérprete MicroPython (Pico).
- Sube ssd1306.py al sistema de archivos de la Pico.
- Cablea OLED y HC-SR04 (¡divisor en Echo!).
- Ejecuta el script y observa la distancia en la OLED.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| Pico no detecta sensor | Echo a 5 V sin divisor | Añade el divisor de tensión |
| ImportError ssd1306 | Falta la librería | Súbela al filesystem de la Pico |
| OLED en blanco | I2C mal | Verifica GP0/GP1 y dirección 0x3C |
🚀 Para ir más lejos
- Si tienes Pico W, publica los datos por Wi-Fi/MQTT.
- Aprovecha el panel solar USB-C para alimentarlo (proyecto 27).