nano_plot.py

Arduino Nano (Classic, ATmega328P) · Archivo : nano_plot.py · Lenguaje : Python · Uso : Tracer les séries du Nano avec matplotlib

El trazador integrado del IDE tiene límites: este puente Python + matplotlib muestra en directo la primera columna de las medidas del Nano, con desplazamiento sobre 200 puntos. Una dependencia más (matplotlib) para curvas compartibles.

Hardware

Un Arduino Nano clásico (ATmega328P a 16 MHz, formato DIL de 30 patillas para breadboard, USB mini-B, lógica de 5 V, pin RESET abajo a la izquierda). PC con Python 3, pyserial, matplotlib; Nano emitiendo valores por Serial (p. ej. potentiomete-plot.ino).

Cableado

Cable USB estándar; el ritmo 115200 del sketch debe coincidir con el script.

Funcionamiento

Un deque de longitud fija desplaza la ventana; set_data + draw_idle redibuja sin recrear la figura. El reparto por tabulación tolera columnas de depuración extra.

Ejecución

En el IDE de Arduino, selecciona la placa Arduino Nano y el procesador ATmega328P, elige el puerto serie y carga. El rail de 5 V de la placa conviene a sensores de 5 V; si no, usa 3,3 V en pines compatibles.

Variantes

Guarda cada ventana en CSV para el análisis diferido o traza varias columnas (sensor + consigna) en la misma gráfica.

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

← Volver a la ficha