console_bouton.py
Une fois les consignes série du Nano Every en place, ce client Python devient l'outil de maintenance : il envoie les commandes s/p, vérifie les accusés puis continue d'écouter les traces. Le duo croquis + console évite de reflasher pour chaque réglage.
Matériel requis
Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). PC avec Python 3 + pyserial, Nano Every flashée avec le croquis nvm-consignes.ino, câble USB.
Câblage
Câble USB uniquement ; le script attend 2 s après l'ouverture pour ignorer le reset du port.
Fonctionnement
write + read_all font l'aller-retour commande/accusé ; readline enchaîne ensuite en écoute continue. Le timeout de 1 s évite tout blocage si la carte se tait.
Exécution
Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.
Variantes
Transformez la boucle en REPL interactive (input()) pour un atelier, ou empilez les profils de consignes dans un JSON appliqué au choix.
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())