🛠 Logger sur carte microSD en SPI (mode carte)
Objetivos
Hacer que tu placa RP2040 sea autónoma: escribir archivos en una tarjeta microSD en modo SPI. El RP2040 dispone de 2 controladores SPI (hoja de datos) y MicroPython incluye un controlador SD genérico (módulo sdcard de micropython-lib) que utiliza el modo SPI de la norma SD (inicialización a ~400 kHz y luego transferencia más rápida). Bonus de autonomía: la microSD funciona a 3,3 V nativos, no se necesita convertidor de nivel.
Material
- 1 × placa RP2040 genérica
- 1 × módulo lector microSD con regulador integrado o aceptado a 3,3 V (la mayoría de los breakout lo son)
- Cableado SPI0: GP5 = SCK, GP3 = MOSI (DI), GP4 = MISO (DO), GP2 = CS (asignaciones clásicas de SPI0 en el RP2040, enrutables a otros pines)
- Tarjeta microSD formateada en FAT32 (las tarjetas > 32 GB están en exFAT: no legibles, usa máximo 32 GB o reformatea a FAT32)
- Módulo
sdcard.pycopiado en la placa (micropython-lib)
Código completo
# logger.py — monte la SD et journalise la température interne
import os, time, machine
from machine import SPI, Pin
import sdcard
spi = SPI(0, baudrate=400_000, polarity=0, phase=0,
sck=Pin(5), mosi=Pin(3), miso=Pin(4))
cs = Pin(2, Pin.OUT, value=1)
sd = sdcard.SDCard(spi, cs)
fs = os.VfsFat(sd) # monte le système de fichiers
os.mount(fs, '/sd')
t0 = time.ticks_ms
adc = machine.ADC(4) # canal 4 = capteur thermique interne
with open('/sd/log.csv', 'a') as f:
while True:
ms = time.ticks_diff(time.ticks_ms, t0)
mv = adc.read_u16 * 3.3 / 65535
t = 27.0 - (mv - 0.706) / 0.001721 # formule datasheet RP2040
f.write('%d,%.2f\n' % (ms, t))
f.flush # écrit réellement la carte
time.sleep_ms(1000)
Verificación esperada
Después de unos segundos, retira la tarjeta y léela en un PC: log.csv contiene una línea por segundo con la marca de tiempo en ms y la temperatura (~27–30 °C en reposo; la fórmula del sensor interno, 0,706 V y −1,721 mV/°C, proviene de la sección «Temperature Sensor» de la hoja de datos del RP2040). Vuelve a ejecutar el script: el archivo continúa creciendo (modo «a») — la persistencia funciona.
Errores frecuentes
OSError: [Errno 22] EINVALal montar: tarjeta en exFAT/NTFS — reformatea a FAT32.- Inicialización demasiado rápida: algunas tarjetas requieren un reloj de inicialización de ~400 kHz; el controlador se encarga de ello, pero si falla, prueba a 100 kHz.
- MISO no conectado o CS en un pin ocupado: el controlador nunca recibe el token de comando 0xFE → error de inicialización
sdcard. - Olvidar
f.flush(o el contextowith): los datos permanecen en el búfer de MicroPython y desaparecen con un reinicio. - Retirar la tarjeta durante la escritura: corrupción de la FAT — desmonta correctamente (
os.umount('/sd')). - Alimentación a 5 V en un lector sin regulador: las tarjetas SD están limitadas a ~3,6 V — esto daña la tarjeta, literalmente.
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
- Afficher sur un OLED I2C SSD1306 et déboguer le bus
- 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