🛠 Lire un capteur analogique du MCU depuis Python (Firmata)
Objetivos
Utilizar el método oficial de DFRobot (tutorial « python_read_sensor ») para leer sensores desde el sistema operativo x86: primero se carga el firmware StandardFirmata en el ATmega32U4, y luego un script de Python con pyFirmata controla los pines a distancia, sin escribir una sola línea de C. El método es idéntico en Windows y Linux; solo cambia el nombre del puerto.
Material
- LattePanda Alpha + IDE de Arduino + Python 3
pip install pyFirmataen el host- Sensor analógico (potenciómetro o sensor de luminosidad) en A0
- Sensor de movimiento PIR digital en D9 (salida 0/1)
- Cableado según los pines compatibles con Arduino de los conectores de 50 pines; alimentar los sensores según su ficha (los pines siguen las características del ATmega32U4/Leonardo)
Código completo
Paso 1 — en el IDE de Arduino (placa « Arduino Leonardo »): Archivo → Ejemplos → Firmata → StandardFirmata, y luego cargar.
Paso 2 — script del host:
# read_sensors.py — Python 3, Windows ou Linux
# Lit un capteur analogique sur A0 et un PIR numérique sur D9
# du coprocesseur Arduino intégré (StandardFirmata doit être téléversé).
import time
from pyfirmata import Arduino, util
PORT = 'COM5' # Windows : vérifier l'IDE Arduino ; Linux : '/dev/ttyACM0'
board = Arduino(PORT)
it = util.Iterator(board) # vide les entrées série pour que read ne bloque jamais
it.start
board.analog[0].enable_reporting
board.digital[9].enable_reporting
while True:
angle = board.analog[0].read # None au premier passage, puis 0.0..1.0
motion = board.digital[9].read # True/False venant du capteur PIR
print(f'A0={angle} D9(motion)={motion}')
time.sleep(0.5)
Verificación esperada
Tras cargar StandardFirmata, el LED de transmisión parpadea brevemente. El script muestra primero A0=None y luego valores flotantes entre 0.0 y 1.0 que varían al girar el potenciómetro; D9 pasa a True cuando el PIR detecta un movimiento.
Errores frecuentes
- Olvidar el
Iteratordeutil: sin él,readdevuelveNoneindefinidamente porque las tramas Firmata nunca se consumen. - No haber cargado StandardFirmata (o un sketch antiguo que ocupa los pines): la conexión de pyFirmata se bloquea al iniciar.
- Interpretar
A0=Nonecomo una avería: es normal en el primer ciclo de lectura, mientras llega el informe analógico. - Confundir el valor normalizado de pyFirmata (0.0–1.0) con el valor bruto 0–1023 del ADC de 10 bits del Leonardo.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton.pyPythonservo.pyPythonanalogique.pyPythonrespiration.pyPythonneopixel.pyPython