🛠 Pont série entre le MCU Arduino et le SoC x86
Objectifs
Comprendre le canal de communication interne de la carte : l'ATmega32U4 est un vrai Arduino Leonardo qui s'énumère sur un port COM virtuel connecté au processeur x86. C'est ce canal qu'utilise pinpong/Firmata en interne ; ici on le détourne avec notre propre protocole : un sketch C++ côté MCU qui envoie des mesures horodatées, et un script Python côté Linux qui les lit avec pyserial. À la fin, vous maîtrisez les deux langages de la carte (C++ sur le MCU, Python sur le SoC) et leur pont.
Matériel
- LattePanda 3 Delta sous Ubuntu 22.04 (ou Windows)
- Arduino IDE (board type Arduino Leonardo) pour flasher le MCU embarqué ; utiliser le bouton reset Arduino de la carte pour entrer dans le bootloader
pip install pyserialcôté Linux- LED sur D13 (reprise du tutoriel 1) pour un message parlant
Code complet
Côté MCU — sketch Arduino IDE (board « Arduino Leonardo », port du MCU) :
// Pont série : envoie une trame horodatée vers le SoC x86.
const uint8_t LED = 13;
unsigned long last = 0;
bool on = false;
void setup {
pinMode(LED, OUTPUT);
Serial.begin(9600); // USB série interne vers le CPU hôte
}
void loop {
if (millis - last >= 1000) {
last = millis;
on = !on;
digitalWrite(LED, on ? HIGH : LOW);
// Trame simple : LED=<état>;T=<millis>
Serial.print("LED=");
Serial.print(on ? 1 : 0);
Serial.print(";T=");
Serial.println(millis);
}
}
Côté SoC — pont_serie.py (Linux : /dev/ttyACM0) :
import serial
port = serial.Serial("/dev/ttyACM0", 9600, timeout=1)
print("Écoute du MCU... (Ctrl+C pour quitter)")
try:
for ligne in port:
texte = ligne.decode("utf-8", errors="replace").strip
if not texte:
continue
champs = dict(p.split("=") for p in texte.split(";"))
état = "ALLUMÉE" if champs.get("LED") == "1" else "éteinte"
print(f"MCU: LED {état} depuis {champs.get('T')} ms")
finally:
port.close
Vérification attendue
Le terminal du SoC affiche chaque seconde « MCU: LED ALLUMÉE depuis … ms » en alternance, synchronisé avec la LED D13. Les deux moitiés de la carte communiquent sans aucun câble externe.
Erreurs fréquentes
- Conflit avec pinpong : si Firmata est téléversé sur le MCU, il avale le port ; re-téléversez votre sketch pour reprendre la main.
- Mauvais board Arduino IDE : choisir « Arduino Leonardo », pas « Uno » — l'ATmega32U4 embarqué est le composant du Leonardo.
- Bootloader manqué : presser le bouton reset Arduino de la carte juste après le téléversement pour réentrer dans le bootloader.
- Port déjà ouvert : fermer le moniteur série de l'Arduino IDE avant de lancer pyserial, sinon port occupé ou
PermissionError. - Droits d'accès Linux :
sudo usermod -aG dialout $USERpuis reconnexion, sinon accès refusé à/dev/ttyACM0. - Trames coupées : lire ligne à ligne (itérateur du port) plutôt que
readbrut, et toujours terminer parprintlncôté MCU.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton.pyPythonservo.pyPythonanalogique.pyPythonrespiration.pyPythonneopixel.pyPython