nano_plot.py

Arduino Nano (Classic, ATmega328P) · Fichier : nano_plot.py · Langage : Python · Usage : Tracer les séries du Nano avec matplotlib

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.")

← Retour à la fiche