console_bouton.py
Una vez colocadas las consignas serie del Nano Every, este cliente Python es la herramienta de mantenimiento: envía órdenes s/p, verifica los acuses y sigue escuchando trazas. El dúo sketch + consola evita reflashear en cada ajuste.
Hardware
Un Arduino Nano Every (ATmega4809 a 20 MHz, mismo formato que el Nano, USB micro-B, chip UART separado, pines de 5 V, compatibilidad directa con el Nano clásico). PC con Python 3 + pyserial, Nano Every flasheada con nvm-consignes.ino, cable USB.
Cableado
Solo cable USB; el script espera 2 s tras abrir para ignorar el reset del puerto.
Funcionamiento
write + read_all hacen el ida y vuelta orden/acuse; readline encadena luego en escucha continua. El timeout de 1 s evita bloqueos si la placa calla.
Ejecución
Instala el paquete Arduino megaAVR Boards en el IDE, selecciona Arduino Nano Every y carga. El Serial USB está separado del Serial1 de hardware (pines RX/TX): el código serie clásico funciona tal cual.
Variantes
Convierte el bucle en un REPL interactivo (input()) para el taller o apila perfiles de consigna en un JSON aplicado a elección.
console_bouton.py
#!/usr/bin/env python3
"""Console de reglage pour le Nano Every (croquis nvm-consignes.ino).
Envoie les commandes s<seuil> et p<periode>, lit les reponses.
Usage : python console_bouton.py [port]
"""
import sys
import time
import serial
def envoyer(carte: serial.Serial, commande: str) -> str:
carte.write((commande + "\n").encode())
time.sleep(0.2)
return carte.read_all().decode(errors="replace").strip()
def principal() -> int:
port = sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyACM0"
with serial.Serial(port, 9600, timeout=1) as carte:
time.sleep(2) # laisser le port se stabiliser
print(envoyer(carte, "")) # réveil + etat courant
for cmd in ("s400", "p30"):
print(f"> {cmd} -> {envoyer(carte, cmd)}")
# lecture continue des traces pendant 5 s
fin = time.time() + 5
while time.time() < fin:
ligne = carte.readline().decode(errors="replace").strip()
if ligne:
print("|", ligne)
return 0
if __name__ == "__main__":
sys.exit(principal())