console_bouton.py

Arduino Nano Every · Archivo : console_bouton.py · Lenguaje : Python · Uso : Régler la carte par commandes série depuis Python

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

← Volver a la ficha