Gráfico en tiempo real de un sensor con Arduino y Python

Hoy en la Buhardilla vamos a aprender como utilizar Python para hacer un gráfico en tiempo real de los datos enviados por un Arduino. Para ello vamos a utilizar los módulos PySerial y Matplotlib de Python. De forma muy sencilla lo que vamos ha hacer sera enviar datos des de nuestro Arduino (que pueden representar los valores leídos por un sensor) a nuestro ordenador utilizando el puerto USB. Una vez tengamos los datos enviados a nuestro puerto USB los leeremos y los representaremos gráficamente.

En el caso de Arduino, tendremos un sencillo programa que nos leerá el valor de una entrada analógica y lo enviara por el puerto serial, o lo UBS. Para facilitar el script la lectura de la entrada analógica no se a escalado a ninguna unidad. A continuación el script:

int value = 0;
int inPin = A1;
void setup() {
 Serial.begin(9600);
 }
 void loop() {
 value = analogRead(inPin);
 Serial.println(value);
 delay(10);
 }

Una vez visto lo que hace Arduino pasemos a ver el script en Python, el cual nos va a permitir transformar la información enviada des del Arduino en un gráfico en tiempo real de la información.

import serial
import matplotlib.pyplot as plt
import time


arduino = serial.Serial('/dev/ttyUSB0', 9600, timeout=0)
point = 0
fig, ax = plt.subplots()
plt.ion()

maxlen = 20
x = []
y = []

while True:
    data = arduino.readline().decode().strip()
    time.sleep(0.2)
    if data:
        data = int(data)
        x.append(point)
        y.append(data)
        if len(x) > maxlen:
            x = x[1:]
            y = y[1:]
        plt.plot(x, y, color='r')
        point += 1
        plt.pause(0.05)

        ax.clear()
        plt.ylim([0, 1023])
        plt.show()

Como veis el programa que hemos creado es muy sencillo, con esto vamos a ser capaces de representar gráficamente el valor leído por nuestro Arduino. Veamos a continuación nuestro programa por partes y comentemos los puntos mas relevantes.

import serial
import matplotlib.pyplot as plt
import time

De las primeras lineas poco que comentar, aquí importamos todas las bibliotecas que vamos a utilizar en nuestro programa. la biblioteca serial, se utiliza para leer los datos del puerto USB, matplotlib.pyplot lo utilizamos para hacer el gráfico, finalmente en este caso también utilizamos la librería time para poder pausar momentáneamente el programa para que no se colapse, aunque se podría prescindir de esta ultima.

arduino = serial.Serial('/dev/ttyUSB0', 9600, timeout=0)

En este punto creamos la conexión propiamente dicha. El primer término hace referencia al puerto USB en la que esta conectado el Arduino. En caso de usar Windows aquí tendréis que poner el famoso ‘COMx’, donde x es el numero del puerto USB. El segundo término es el baudrate de comunicación, este valor tiene que coincidir con el valor que hemos puesto en el Serial.begin() en el Arduino.

maxlen = 20
x = []
y = []

En este punto marcamos la longitud máxima de puntos que queremos mostrar en nuestro gráfico (maxlen), en este caso vamos a mostrar solo 20 los últimos 20 puntos leídos. Los puntos leídos los iremos almacenando de manera temporal en las listas x, y.

        x.append(point)
        y.append(data)
        if len(x) > maxlen:
            x = x[1:]
            y = y[1:]

Si la cantidad de valores almacenados en la lista son mayores que el valor
máximo que queremos representar eliminamos los valores mas antiguos
hasta tener solo el numero de puntos que queremos mostrar.

      plt.pause(0.05)

Para dar tiempo al programa a representar todos los datos es importante
darle una pequeña pausa para no suturarlo, evitando así que pueda surgir algún error. Con 0,05 segundos es mas que suficiente.

        ax.clear()
        plt.ylim([0, 1023])
        plt.show()

Finalmente solo nos queda, borrar el dibujo que teníamos previamente,
eliminando los puntos que ya no nos interesan. Para esta finalidad usamos la función ax.clear().
Como queremos mostrat el valor de la variable y utilizando siempre los mismos rangos en el eje y, fijamos los valores mínimos y máximos del  mismo con plt.ylim().
Una vez tenemos todo el trabajo hecho solo nos queda decirle que nos muestre nuestro impresionante gráfico por pantalla, para hacer tal cosa solo tenemos que poner al final de nuestro programa la orden plt.show().

Como veis la representación gráfica en tiempo real de los valores leídos
por un sensor es una tarea muy fácil si utilizamos las herramientas
adecuadas, como son un Arduino y un pequeño script casero de Python.

Espero que esta entrada os sea de utilidad y no dudéis en dejar cualquier duda o comentario que os haya despertado despertado.

Saludos y hasta la próxima aventura

2 comentarios sobre “Gráfico en tiempo real de un sensor con Arduino y Python

Agrega el tuyo

Deja un comentario

Blog de WordPress.com.

Subir ↑