nano_plot.py
Le traceur intégré de l'IDE a des limites : ce pont Python + matplotlib affiche en direct la première colonne des mesures du Nano, avec défilement sur 200 points. Une seule dépendance de plus (matplotlib) pour des courbes partagiables.
Matériel requis
Un Arduino Nano classique (ATmega328P à 16 MHz, brochage DIL 30 broches sur breadboard, USB mini-B, logique 5 V, broche RESET en bas à gauche). PC avec Python 3, pyserial, matplotlib ; Nano émettant des valeurs sur Serial (ex. potentiomete-plot.ino).
Câblage
Câble USB standard ; le débit 115200 du croquis doit correspondre au script.
Fonctionnement
deque à longueur fixe fait défiler la fenêtre ; set_data + draw_idle redessinent sans recréer la figure. Le parse par tabulation tolère les colonnes de debug supplémentaires.
Exécution
Dans l'IDE Arduino, sélectionnez la carte Arduino Nano et le processeur ATmega328P, choisissez le port série puis téléversez. L'alimentation 5 V de la carte convient aux capteurs 5 V ; sinon utiliser le 3,3 V des broches adaptées.
Variantes
Enregistrez chaque fenêtre en CSV pour l'analyse différée, ou tracez plusieurs colonnes (capteur + consigne) sur le même graphe.
nano_plot.py
#!/usr/bin/env python3
"""Trace en direct les valeurs serie d'un Arduino Nano.
Lit les lignes "valeur\t..." et dessine la premiere colonne.
Usage : python nano_plot.py [port]
"""
import sys
from collections import deque
import matplotlib.pyplot as plt
import serial
PORT = sys.argv[1] if len(sys.argv) > 1 else "COM7"
N = 200 # points affiches
def principal() -> None:
carte = serial.Serial(PORT, 115200, timeout=1)
serie = deque(maxlen=N)
fig, ax = plt.subplots()
ligne, = ax.plot([], [])
ax.set_ylim(0, 5.2)
ax.set_title("Nano A0 (V)")
plt.ion()
fig.show()
while True:
ligne_txt = carte.readline().decode(errors="replace")
try:
valeur = float(ligne_txt.split("\t")[0])
except ValueError:
continue
serie.append(valeur)
ligne.set_data(range(len(serie)), serie)
ax.set_xlim(0, max(len(serie), 50))
fig.canvas.draw_idle()
if __name__ == "__main__":
try:
principal()
except KeyboardInterrupt:
print("Arrete.")