console_bouton.py

Arduino Nano Every · Fichier : console_bouton.py · Langage : Python · Usage : Régler la carte par commandes série depuis Python

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())

← Retour à la fiche