Pular navegação

Usando gráficos python e arduino

Usando gráficos python e arduino

Bom final de dia Galerinha do Módulo 2!

Segue um pequeno exemplo de como juntar o arduino com o pyhon.

Este gráfico permite até 6 linhas simultaneamente, basta conectar o arduino ao micro e executar o script. Ele vai perguntar em qual porta está conectado o arduino (em geral é a opção 0) e pronto, ele vai começar a fazer o gráfico. Para fazer o gráfico o arduino deve mandar as seguintes informações: Número do gráfico (de 1 a 6); Valor em X; Valor em Y:

Esse é um exemplo para fazer o gráfico das portas analógicas 0 e 1:

Aqui o código que vai para o arduino:

void setup(){
// initialize serial comms
Serial.begin(9600);
}
void loop(){
// print to serial
Serial.print('1');
Serial.print(";");
Serial.print(millis());
Serial.print(";");
Serial.print(analogRead(0));
Serial.println("");
delay(50);
Serial.print('2');
Serial.print(";");
Serial.print(millis());
Serial.print(";");
Serial.print(analogRead(1));
Serial.println("");
delay(50);
}

Aqui o código do python:

DX=000

import sys, serial,glob,os
import numpy as np
from time import sleep
from collections import deque
from matplotlib import pyplot as plt
color=['red','blue','yellow','magenta','cyan','burlywood','black', 'chartreuse', 'navy']

#timeout = None
def read_until(con, until):
    buf=""
    ler = con.read(1)
    buf+=ler
    while ler!=until:
        ler = con.read(1)
        if ler == '' :
            sleep(0.02)
            continue
        buf = buf + ler
    return buf


# class that holds analog data for N samples
class AnalogData:
  # constr
  def __init__(self, maxLen,j):
    self.ax = [[]]
    self.ay = [[]]
    for k in range(j):
        self.ax.append([])
        self.ay.append([])
    self.maxLen = maxLen
 
  # ring 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) == 3)
    self.ax[int(data[0])].append(data[1])
    self.ay[int(data[0])].append(data[2])

########################################
# PLOT CLASS
########################################
class AnalogPlot:
  # constr
  def __init__(self, analogData):
    # set plot to animated
    plt.ion()
    self.axline=[]
  def init(self,analogData,j):
    for i in range(j):
        self.axline.append(plt.plot(analogData.ax[i],analogData.ay[i],color=color[i]))
    plt.ylim([0, 10])
    plt.xlim([0, 1000])
 
  # update plot
  def update(self, analogData, j):
#    print self.axline
    self.axline[j][0].set_xdata(analogData.ax[j])
    self.axline[j][0].set_ydata(analogData.ay[j])
    xmin, xmax = plt.xlim()
    xmax2=max(analogData.ax[j])
    if xmax2 > xmax:
        xmax=1.3*xmax2
        if DX > 0:
            plt.xlim([xmax2-DX,xmax2])
        else:
            plt.xlim([0,xmax])
    ymin, ymax = plt.ylim()
    ymax2=max(analogData.ay[j])
    ymin2=min(analogData.ay[j])
    if ymax2 > ymax:
        ymax=1.3*ymax2
        if ymin<ymin2:
            plt.ylim([0,ymax])
        else:
            plt.ylim([1.2*ymin2,ymax])
#    self.axline[1][0].set_xdata(analogData.ax[1])
#    self.axline[1][0].set_ydata(analogData.ay[1])

    plt.draw()
 
# main() function
def main():
    # plot parameters
 
    x_label="X"
    y_label="Y"
    data_label=[""]
    ##############################
    # START GRAPH COMUNICATION
    ##############################
    os.system('clear')
    print "Starting graph configuration"
    num_line=6
#    num_line=input("How many lines you will plot (1-6)?   ")
#    num_line=int(num_line)
#    while num_line>6 or num_line<1:
#        print "Please, don't mess with me!"
#        num_line=input("How many lines you will plot? (1-6)")
#        num_line=int(num_line)
#    for k in range(num_line):
#            data_label.append("");
#    final="end"
#    while final!="end":
#        i=raw_input("command: ")
#        i=i.split("=")
#        final=i[0]
#        if(final=="xlabel"):
#            x_label=i[1]
#        elif(final=="ylabel"):
#            y_label=i[1]
#        elif(final=="label"):
#            data_label[int(i[1])-1]=i[2]
#        elif (final== "end"):
#            print "Rock'n Roll Baby!"
#        else:
#            lixo = raw_input("Need any help?")
#            sleep(1)
#            print "Read the Fucking Manual! =)"
    
    
    analogData = AnalogData(500,num_line)
    
    
    ##############################
    # START ARDUINO COMUNICATION
    ##############################
    os.system('clear')
    print "======= List of USB devices ======="
    serial_ports = glob.glob('/dev/ttyUSB*')
    while(len(serial_ports)==0):
        print "Connect the Arduino..."
        sleep(5);
        serial_ports = glob.glob('/dev/ttyUSB*')
    for i in range(len(serial_ports)):
        print i, " - ", serial_ports[i]
    port=raw_input("Choose the arduino port (e.g. 0): ")
    #    port=0
    ser = serial.Serial(serial_ports[int(port)], 9600)
    sleep(1);
    line=''
    while(len(line)!=3):
        line=read_until(ser,"\n").split(";")
    print "Arduino connected moving on..."
    
    analogPlot = AnalogPlot(analogData)
    analogPlot.init(analogData,num_line)
    while True:
        try:
            line=read_until(ser,"\n").rstrip()
            data = [float(val) for val in line.split(";")]
            data[0]=data[0]-1.
            if(len(data) == 3):
                analogData.add(data)
                analogPlot.update(analogData,int(data[0]))
        except KeyboardInterrupt:
            print 'exiting'
            break
    ser.flush()
    ser.close()
 
# call main
if __name__ == '__main__':
  main()

O arquivo do python esta em anexo também!

Boa sorte!

Pré-visualizarAnexoTamanho
grafico.py.txt4.51 KB

Comentários

Precisa de ajuda?

Blog

O blog permite que os membros de um projeto se comuniquem, discutindo e publicando novidades. É um ótimo lugar para compartilhar processos, desafios e explorar ideias.