[pyar] Consulta de matplotlib

Sebastián Seba ssebastianj en gmail.com
Mie Ene 21 00:59:15 ART 2015


Para un sistema en Python que tenía que comunicarse mediante puerto serie
con un microcontrolador me inspiré en una aplicación hecha por Eli
Bendersky [0] para mostrar "live"

[0]
http://eli.thegreenplace.net/2009/08/07/a-live-data-monitor-with-python-pyqt-and-pyserial
.

Saludos.

El mié, ene 21, 2015 00:01, Leonel Caraccioli <leonel en backupnet.com.ar>
escribió:

> Gente, buenas, hoy estuve probando para una conocida un graficador de
> valores analógicos en python.
>
> Es para la facultad de bioquimica de la UBA. Necesitan un adquisidor de
> datos para un equipo de perfusión [1]. El equipo mide presiones y las
> saca los valores analógicos de tensión.
>
> El problema que tienen ahora es que necesitan mandar estos datos a una
> PC para poder hacer unos cálculos.
>
> Les propuse hacerlo con Arduino/Python. Empecé a probar algunas cosas, y
> vi de usar matplotlib.
>
> Anda lindo, adjunto el video [2]
>
> Pero es lento, me carga el microprocesador mucho y les puse poco tiempo
> de muestreo al Arduino, si le pongo más rápido la PC se empieza a
> atrasar mucho y deja de ser en tiempo real que es lo que necesito para
> tener un dalay (por supuesto acumulativo). No se como mejorarlo. Les
> pego al final del correo el código.
>
> La idea es arrancar con esto y empezar a probar más opciones y
> agrandarlo (loguear, sacar derivadas, picos, etc.)
>
> Alguien me puede dar un mano para ver si se puede hacer más rápida la
> ejecución soy medio queso en python. También pensé en usar otra opción
> no matplotlib.
>
> El programa va a ser libre y estar en los repos de OpenMolo [3].
>
> Saludos
>
> Leonel
>
> [1] -
> http://es.wikipedia.org/wiki/Relaci%C3%B3n_ventilaci%C3%B3n_perfusi%C3%B3n
> [2] - https://www.youtube.com/watch?v=5Yxf22UblQs
> [3] - www.OpenMolo.com.ar
>
>
>
> ###########################################################
> ###  Arduino:
> ###########################################################
>
>
> // analog-plot
> //
> // Read analog values from A0 and A1 and print them to serial port.
> //
> // electronut.in
>
> #include "Arduino.h"
>
> void setup()
> {
> // initialize serial comms
> Serial.begin(115200);
> }
>
> void loop()
> {
> // read A0
> int val1 = analogRead(0);
> // read A1
> int val2 = analogRead(1);
> // print to serial
>   byte b1, b2;
>   b1 = val1 & 0xFF;
>   b2 = ( val1 >> 8 ) & 0xFF;
>   Serial.write(b1);
>   Serial.write(b2);
>   b1 = val2 & 0xFF;
>   b2 = ( val2 >> 8 ) & 0xFF;
>   Serial.write(b1);
>   Serial.write(b2);
>   Serial.println();
> // wait
> delay(100);
> }
>
>
>
> ###########################################################
> ###  Python:
> ###########################################################
>
>
>
> """
> ldr.py
>
> Display analog data from Arduino using Python (matplotlib)
>
> Author: Mahesh Venkitachalam
> Website: electronut.in
> """
>
> import sys, serial, argparse
> import numpy as np
> from time import sleep
> from collections import deque
>
> import matplotlib.pyplot as plt
> import matplotlib.animation as animation
>
>
> # plot class
> class AnalogPlot:
>    # constr
>    def __init__(self, strPort, maxLen):
>        # open serial port
>        self.ser = serial.Serial(strPort, 115200)
>
>        self.ax = deque([0.0]*maxLen)
>
>
>        self.ay = deque([0.0]*maxLen)
>
>
>        self.maxLen = maxLen
>
>
>
>
>
>    # add to buffer
>
>
>    def addToBuf(self, buf, val):
>        if len(buf) < self.maxLen:
>            buf.append(val)
>        else:
>            buf.pop()
>            buf.appendleft(val)
>
>    # add data
>    def add(self, data):
>        assert(len(data) == 2)
>        self.addToBuf(self.ax, data[0])
>        self.addToBuf(self.ay, data[1])
>
>    # update plot
>    def update(self, frameNum, a0, a1):
>        try:
>               # line = self.ser.readline()
>               # data = [float(val) for val in line.split()]
>            data = [0,0];
>            b1 = ord(self.ser.read(1))
>            b2 = ord(self.ser.read(1))
>            data[0] = b1 + b2*256
>            b1 = ord(self.ser.read(1))
>            b2 = ord(self.ser.read(1))
>            data[1] = b1 + b2*256
>            line = self.ser.readline()
>            # print data
>            if(len(data) == 2):
>                self.add(data)
>                a0.set_data(range(self.maxLen), self.ax)
>                a1.set_data(range(self.maxLen), self.ay)
>        except KeyboardInterrupt:
>            print('exiting')
>
>        return a0,
>
>    # clean up
>    def close(self):
>        # close serial
>        self.ser.flush()
>        self.ser.close()
>
> # main() function
> def main():
>    # create parser
>    parser = argparse.ArgumentParser(description="LDR serial")
>    # add expected arguments
>    parser.add_argument('--port', dest='port', required=True)
>
>    # parse args
>    args = parser.parse_args()
>
>    #strPort = '/dev/tty.usbserial-A7006Yqh'
>    strPort = args.port
>
>    print('reading from serial port %s...' % strPort)
>
>    # plot parameters
>    analogPlot = AnalogPlot(strPort, 100)
>
>    print('plotting data...')
>
>    # set up animation
>    fig = plt.figure()
>    ax = plt.axes(xlim=(0, 100), ylim=(0, 1023))
>    a0, = ax.plot([], [])
>    a1, = ax.plot([], [])
>    anim = animation.FuncAnimation(fig, analogPlot.update,
>                                   fargs=(a0, a1),
>                                   interval=50)
>
>    # show plot
>    plt.show()
>
>    # clean up
>    analogPlot.close()
>
>    print('exiting.')
>
>
> # call main
> if __name__ == '__main__':
>    main()
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150121/5bc2c9f8/attachment.html>


More information about the pyar mailing list