🛠 Lire un capteur analogique du MCU depuis Python (Firmata)
Objectifs
Utiliser la méthode officielle DFRobot (tutoriel « python_read_sensor ») pour lire des capteurs depuis le système d'exploitation x86 : on téléverse d'abord le firmware StandardFirmata sur l'ATmega32U4, puis un script Python avec pyFirmata pilote les broches à distance, sans écrire une ligne de C. Méthode identique sous Windows et Linux — seul le nom du port change.
Matériel
- LattePanda Alpha + IDE Arduino + Python 3
pip install pyFirmatacôté hôte- Capteur analogique (potentiomètre ou capteur de luminosité) sur A0
- Capteur de mouvement PIR numérique sur D9 (sortie 0/1)
- Câblage selon les broches compatibles Arduino des connecteurs 50 broches ; alimenter les capteurs selon leur fiche (les broches suivent les caractéristiques ATmega32U4/Leonardo)
Code complet
Étape 1 — dans l'IDE Arduino (carte « Arduino Leonardo ») : Fichier → Examples → Firmata → StandardFirmata, puis téléverser.
Étape 2 — script hôte :
# 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)
Vérification attendue
Après téléversement de StandardFirmata, la LED de diffusion clignote brièvement. Le script affiche d'abord A0=None puis des flottants entre 0.0 et 1.0 qui varient quand on tourne le potentiomètre ; D9 passe à True quand le PIR détecte un mouvement.
Erreurs fréquentes
- Oublier l
Iteratordeutil: sans lui,readrenvoieNoneindéfiniment car les trames Firmata ne sont jamais consommées. - StandardFirmata non téléversé (ou un ancien sketch qui occupe les broches) : la connexion pyFirmata se bloque au démarrage.
A0=Noneinterprété comme une panne : c'est normal au premier cycle de lecture, le temps que le rapport analogique arrive.- Confondre la valeur normalisée pyFirmata (0.0–1.0) avec la valeur brute 0–1023 de l'ADC 10 bits du Leonardo.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton.pyPythonservo.pyPythonanalogique.pyPythonrespiration.pyPythonneopixel.pyPython