🛠 Logger sur carte microSD en SPI (mode carte)
Objectifs
Rendre ta carte RP2040 autonome : écrire des fichiers sur une carte microSD en mode SPI. Le RP2040 dispose de 2 contrôleurs SPI (datasheet) et MicroPython embarque un pilote SD générique (module sdcard de micropython-lib) qui parle le mode SPI de la norme SD (initialisation à ~400 kHz puis transfert plus rapide). Bonus autonomie : la microSD est en 3,3 V natif, aucun level-shifter nécessaire.
Matériel
- 1 × carte RP2040 générique
- 1 × module lecteur microSD à régulateur intégré ou accepté en 3,3 V (la plupart des breakouts le sont)
- Câblage SPI0 : GP5 = SCK, GP3 = MOSI (DI), GP4 = MISO (DO), GP2 = CS (affectations SPI0 classiques côté RP2040, routables ailleurs)
- Carte microSD formatée en FAT32 (les cartes > 32 Go sont en exFAT : non lisible, utilise 32 Go max ou reformate en FAT32)
- Module
sdcard.pycopié sur la carte (micropython-lib)
Code complet
# 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)
Vérification attendue
Après quelques secondes, démonte la carte et lis-la sur un PC : log.csv contient une ligne par seconde avec l'horodatage en ms et la température (~27–30 °C au repos ; la formule du capteur interne, 0,706 V et −1,721 mV/°C, vient de la section « Temperature Sensor » de la datasheet RP2040). Relance le script : le fichier continue de grandir (mode « a ») — la persistance fonctionne.
Erreurs fréquentes
OSError: [Errno 22] EINVALau montage : carte en exFAT/NTFS — reformate en FAT32.- Initialisation trop rapide : certaines cartes exigent l'horloge d'init ~400 kHz ; le pilote s'en occupe, mais si ça échoue, teste à 100 kHz.
- MISO non relié ou CS sur une broche occupée : le pilote ne reçoit jamais le jeton de commande 0xFE → erreur d'init
sdcard. - Oublier
f.flush(ou le contextewith) : les données restent dans le tampon MicroPython et disparaissent avec un reset. - Retirer la carte pendant l'écriture : corruption de la FAT — démonte proprement (
os.umount('/sd')). - Alimentation 5 V sur un lecteur sans régulateur : les cartes SD sont limitées à ~3,6 V — ça abîme la carte, littéralement.
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
- 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
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython