🛠 Pont série entre le MCU Arduino et le SoC x86

LattePanda 3 Delta (id : lattepanda-3) · intermediaire · Schéma : IMG-lattepanda-3-intermediaire-1-pont-serie.svg — Diagramme du port série interne : l'ATmega32U4 envoie des trames vers le port COM virtuel lu par un script Python sur le Celeron N5105.

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels