🛠 Pont série entre le MCU Arduino et le SoC x86
Objetivos
Comprender el canal de comunicación interno de la placa: el ATmega32U4 es un verdadero Arduino Leonardo que se enumera en un puerto COM virtual conectado al procesador x86. Este es el canal que utiliza pinpong/Firmata internamente; aquí lo redirigimos con nuestro propio protocolo: un sketch de C++ en el lado del MCU que envía medidas con marca de tiempo, y un script de Python en el lado de Linux que las lee con pyserial. Al final, dominarás los dos lenguajes de la placa (C++ en el MCU, Python en el SoC) y su puente.
Material
- LattePanda 3 Delta bajo Ubuntu 22.04 (o Windows)
- Arduino IDE (tipo de placa Arduino Leonardo) para flashear el MCU integrado; usa el botón de reset de Arduino de la placa para entrar en el bootloader
pip install pyserialen el lado de Linux- LED en D13 (tomada del tutorial 1) para un mensaje claro
Código completo
Lado del MCU — sketch de Arduino IDE (placa «Arduino Leonardo», puerto del 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=<etat>;T=<millis>
Serial.print("LED=");
Serial.print(on ? 1 : 0);
Serial.print(";T=");
Serial.println(millis);
}
}
Lado del 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(";"))
etat = "ALLUMÉE" if champs.get("LED") == "1" else "éteinte"
print(f"MCU: LED {etat} depuis {champs.get('T')} ms")
finally:
port.close
Verificación esperada
La terminal del SoC muestra cada segundo «MCU: LED ENCENDIDA desde … ms» de forma alternante, sincronizado con el LED D13. Las dos mitades de la placa se comunican sin ningún cable externo.
Errores frecuentes
- Conflicto con pinpong: si Firmata está cargado en el MCU, ocupa el puerto; vuelve a cargar tu sketch para recuperar el control.
- Placa incorrecta en Arduino IDE: elige «Arduino Leonardo», no «Uno» — el ATmega32U4 integrado es el componente del Leonardo.
- Bootloader no detectado: pulsa el botón de reset de Arduino de la placa justo después de la carga para volver a entrar en el bootloader.
- Puerto ya abierto: cierra el monitor serie del Arduino IDE antes de lanzar pyserial, de lo contrario el puerto estará ocupado o habrá un
PermissionError. - Permisos de acceso en Linux: ejecuta
sudo usermod -aG dialout $USERy vuelve a iniciar sesión, de lo contrario se denegará el acceso a/dev/ttyACM0. - Tramas cortadas: lee línea por línea (iterador del puerto) en lugar de usar
readen bruto, y termina siempre conprintlnen el lado del MCU.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton.pyPythonservo.pyPythonanalogique.pyPythonrespiration.pyPythonneopixel.pyPython