36
Python e Arduino Python e Arduino: Analisando dados em tempo real. Dr. Eduardo S. Pereira. @duducosmos/ [email protected] https://github.com/duducosmos 01/04/2017 Dr. E. S. Pereira 1

Arduino Day 2017 - Python + Arduino

Embed Size (px)

Citation preview

Page 1: Arduino Day 2017 - Python + Arduino

Python e Arduino

Python e Arduino: Analisando dados em tempo real.

Dr. Eduardo S. Pereira.@duducosmos/ [email protected]

https://github.com/duducosmos

01/04/2017

Dr. E. S. Pereira 1

Page 2: Arduino Day 2017 - Python + Arduino

Python e Arduino

Sumario

1 Introducao

2 Medida de Temperatura com LM35

3 Comunicacao Serial - python-serial

4 Gerador de Graficos em tempo Real

5 Suavizacao de Dados Coletados

6 Resultados

Dr. E. S. Pereira 2

Page 3: Arduino Day 2017 - Python + Arduino

Python e Arduino

Introducao

Introducao

Dr. E. S. Pereira 3

Page 4: Arduino Day 2017 - Python + Arduino

Python e Arduino

Introducao

A linguagem Python

A linguagem Python

Python e uma linguagem interpretada desenvolvida por GuidoVan Rossum em 1991;

E multiparadigma, porem tudo em python e objeto;

E livre, aberta e com baterias incluıdas;

Versoes 2.7.X e 3.X; (Existem projetos que nao foram migrados -E que provavelmente nao serao em python 2.X);

Dr. E. S. Pereira 4

Page 5: Arduino Day 2017 - Python + Arduino

Python e Arduino

Introducao

A linguagem Python

A linguagem Python

Python e uma linguagem interpretada desenvolvida por GuidoVan Rossum em 1991;

E multiparadigma, porem tudo em python e objeto;

E livre, aberta e com baterias incluıdas;

Versoes 2.7.X e 3.X; (Existem projetos que nao foram migrados -E que provavelmente nao serao em python 2.X);

Dr. E. S. Pereira 5

Page 6: Arduino Day 2017 - Python + Arduino

Python e Arduino

Introducao

A linguagem Python

A linguagem Python

Python e uma linguagem interpretada desenvolvida por GuidoVan Rossum em 1991;

E multiparadigma, porem tudo em python e objeto;

E livre, aberta e com baterias incluıdas;

Versoes 2.7.X e 3.X; (Existem projetos que nao foram migrados -E que provavelmente nao serao em python 2.X);

Dr. E. S. Pereira 6

Page 7: Arduino Day 2017 - Python + Arduino

Python e Arduino

Introducao

A linguagem Python

A linguagem Python

Python e uma linguagem interpretada desenvolvida por GuidoVan Rossum em 1991;

E multiparadigma, porem tudo em python e objeto;

E livre, aberta e com baterias incluıdas;

Versoes 2.7.X e 3.X; (Existem projetos que nao foram migrados -E que provavelmente nao serao em python 2.X);

Dr. E. S. Pereira 7

Page 8: Arduino Day 2017 - Python + Arduino

Python e Arduino

Medida de Temperatura com LM35

Medida de Temperatura com LM35

Dr. E. S. Pereira 8

Page 9: Arduino Day 2017 - Python + Arduino

Python e Arduino

Medida de Temperatura com LM35

O experimento

Evolucao da temperatura com o tempo

LM35 - Sensor que apresenta saıda de tensao linear proporcionala temperatura em que o mesmo se encontra, tendo em sua saıdaum sinal de 10mV para cada Grau Celsius de temperatura;

Opera na faixa de [−50o,1500]C.

Dr. E. S. Pereira 9

Page 10: Arduino Day 2017 - Python + Arduino

Python e Arduino

Medida de Temperatura com LM35

O experimento

Evolucao da temperatura com o tempo

A saıda do LM35 sera conectada a porta analogica A0; O valordo sinal de A0 ira variar entre 0 a 1023, com 0 correspondendo a0 Volts e 1023 correspondendo a 5 Volts.

Como para cada variacao de 1oC o sensor registra umamudanca de 10mV, entao:

VA0 = (Vlido ∗ (5/1023)); (1)

T =VA0/0.01; (2)

com VA0 a voltagem da saıda do sensor, Vlido e o valor lido naporta analogica A0 e T e a temperatura em graus Celsius;

Dr. E. S. Pereira 10

Page 11: Arduino Day 2017 - Python + Arduino

Python e Arduino

Medida de Temperatura com LM35

O experimento

Evolucao da temperatura com o tempo

A saıda do LM35 sera conectada a porta analogica A0; O valordo sinal de A0 ira variar entre 0 a 1023, com 0 correspondendo a0 Volts e 1023 correspondendo a 5 Volts.

Como para cada variacao de 1oC o sensor registra umamudanca de 10mV, entao:

VA0 = (Vlido ∗ (5/1023)); (1)

T =VA0/0.01; (2)

com VA0 a voltagem da saıda do sensor, Vlido e o valor lido naporta analogica A0 e T e a temperatura em graus Celsius;

Dr. E. S. Pereira 11

Page 12: Arduino Day 2017 - Python + Arduino

Python e Arduino

Medida de Temperatura com LM35

O experimento

Conexao com Arduino

Dr. E. S. Pereira 12

Page 13: Arduino Day 2017 - Python + Arduino

Python e Arduino

Medida de Temperatura com LM35

O codigo

LM35 v0.1

#include "Arduino.h"const int LM35 = A0;float temperatura;unsigned long t0 = millis();unsigned long t1 = t0;

void setup(){Serial.begin (9600);

}void loop(){

temperatura = (float(analogRead(LM35)) * 5 / 1023) / 0.01;if(millis() - t1 >= 1000) {

t1 = millis();unsigned long t2 = (t1 - t0) / 1000;Serial.print(t2, DEC);Serial.print(’,’);Serial.println(temperatura ,DEC);

}}

Dr. E. S. Pereira 13

Page 14: Arduino Day 2017 - Python + Arduino

Python e Arduino

Comunicacao Serial - python-serial

Comunicacao Serial - python-serial

Dr. E. S. Pereira 14

Page 15: Arduino Day 2017 - Python + Arduino

Python e Arduino

Comunicacao Serial - python-serial

Comunicacao Serial

Comunicacao Serial

Para a comunicacao serial e preciso instalar a biblioteca pyserial

Para usuarios de sistemas tipo debian: sudo apt-get installpython-serial

Dr. E. S. Pereira 15

Page 16: Arduino Day 2017 - Python + Arduino

Python e Arduino

Comunicacao Serial - python-serial

Comunicacao Serial

Comunicacao Serial

Para a comunicacao serial e preciso instalar a biblioteca pyserial

Para usuarios de sistemas tipo debian: sudo apt-get installpython-serial

Dr. E. S. Pereira 16

Page 17: Arduino Day 2017 - Python + Arduino

Python e Arduino

Comunicacao Serial - python-serial

O codigo

pyserial

# / u s r / b i n / env py t ho n#−∗− co d i ng : UTF−8 −∗−’ ’ ’S i s t e m a de comunicacao v i a p o r t a s e r i a l com a r d u i n o .’ ’ ’_author = "E. S. Pereira"_date = "31/03/2017"_version= "0.0.1"

import serial

ser = serial.Serial("/dev/ttyUSB0", 9600)ser.write(’5’)print ser.read()

Dr. E. S. Pereira 17

Page 18: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

Gerador de Graficos em tempo Real

Dr. E. S. Pereira 18

Page 19: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

O codigo

Gerador de Graficos Parte -1

# / u s r / b i n / env py t ho n#−∗− co d i ng : UTF−8 −∗−’ ’ ’S i s t e m a de comunicacao v i a p o r t a s e r i a l com a r d u i n o .’ ’ ’_author = "E. S. Pereira"_date = "31/03/2017"_version= "0.0.1"

import serialimport matplotlib.pyplot as pltplt.ion()

ser = serial.Serial("/dev/ttyUSB0", 9600)ser.read()

Dr. E. S. Pereira 19

Page 20: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

O codigo

Gerador de Graficos Parte -2

def serOut(ser):tmp = ser.read()a = tmpwhile(tmp != ’\n’):

tmp = ser.read()a += tmp

b = a.split(’\r’)[0]b = b.split(’,’)return b[0], b[1]

Dr. E. S. Pereira 20

Page 21: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

O codigo

Gerador de Graficos Parte -3

class DynamicUpdate():# Suppose we know t h e x rangemin_x = 0max_x = 20

def on_launch(self):# S e t up p l o tself.figure , self.ax = plt.subplots(# s u b p l o t k w= d i c t ( p r o j e c t i o n =’ p o l a r ’ ))self.lines , = self.ax.plot([], [], ’o’)# A u t o s c a l e on unknown a x i s and known l i m s on t h e o t h e rself.ax.set_autoscaley_on(True)# s e l f . ax . s e t x l i m ( s e l f . min x , s e l f . max x )# s e l f . ax . s e t y l i m ( s e l f . min x , s e l f . max x )# Other s t u f fself.ax.grid()

Dr. E. S. Pereira 21

Page 22: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

O codigo

Gerador de Graficos Parte -4

def on_running(self , xdata , ydata):# Update da ta ( w i t h t h e new a n d t h e o l d p o i n t s )self.lines.set_xdata(xdata)self.lines.set_ydata(ydata)# Need bo th o f t h e s e i n o r d e r t o r e s c a l eself.ax.relim()self.ax.autoscale_view()# We need t o draw ∗and∗ f l u s hself.figure.canvas.draw()self.figure.canvas.flush_events()

Dr. E. S. Pereira 22

Page 23: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

O codigo

Gerador de Graficos Parte -5

def __call__(self):import numpy as npimport timeself.on_launch()xdata = []ydata = []i = 0for x in np.arange(0, 100000, 1):

x0, y0 = serOut(ser)

if(len(x0) <= 6):if(y0 != ’’ and x0 != ’’):

print(x0, y0)xdata.append(float(x0))ydata.append(float(y0))self.on_running(xdata , ydata)

return xdata , ydata

Dr. E. S. Pereira 23

Page 24: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

O codigo

Gerador de Graficos Parte - 6

if(__name__ == "__main__):d = DynamicUpdate()d()

Dr. E. S. Pereira 24

Page 25: Arduino Day 2017 - Python + Arduino

Python e Arduino

Gerador de Graficos em tempo Real

Codigo Disponıvel GitHub

Codigo Disponıvel GitHub

https://github.com/duducosmos/arduinoday2017

Dr. E. S. Pereira 25

Page 26: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

Suavizacao de Dados Coletados

Dr. E. S. Pereira 26

Page 27: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

Suavizacao de Dados de sensores

Suavizacao de Dados de sensores

Ao inves de coletar o dado direto, iremos passar o valor mediodos ultimos N dados coletados;

Lembrando que o valor medio representa o valor esperado, ou ovalor mais provavel de ser o correto;

Dr. E. S. Pereira 27

Page 28: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

Suavizacao de Dados de sensores

Suavizacao de Dados de sensores

Ao inves de coletar o dado direto, iremos passar o valor mediodos ultimos N dados coletados;

Lembrando que o valor medio representa o valor esperado, ou ovalor mais provavel de ser o correto;

Dr. E. S. Pereira 28

Page 29: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

O codigo

LM35 v0.1 - Parte 1

#include "Arduino.h"const int LM35 = A0;float temperatura;unsigned long t0 = millis();unsigned long t1 = t0;

/ / Smooth Temp Dataconst int readsSize = 30;unsigned int readIndex = 0;unsigned int reads[readsSize];unsigned int totalReads;unsigned int averageReads;

Dr. E. S. Pereira 29

Page 30: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

O codigo

LM35 v0.1 - Parte 2

void smoothTemp(){totalReads = totalReads - reads[readIndex];

reads[readIndex] = analogRead(LM35);

totalReads = totalReads + reads[readIndex];readIndex += 1;if(readIndex >= readsSize) {

readIndex = 0;}

averageReads = totalReads / readsSize;

}

Dr. E. S. Pereira 30

Page 31: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

O codigo

LM35 v0.1 - Parte 3

void setup(){Serial.begin (9600);for(int i = 0; i < readsSize; i++ ) {reads[i] = 0;}

}

Dr. E. S. Pereira 31

Page 32: Arduino Day 2017 - Python + Arduino

Python e Arduino

Suavizacao de Dados Coletados

O codigo

LM35 v0.1 - Parte 3

void loop(){/ / t e m p e r a t u r a = ( f l o a t ( analogRead ( LM35 ) ) ∗ 5 / 1023) / 0 . 0 1 ;

smoothTemp();

temperatura = (float(averageReads) * 5 / 1023) / 0.01;

if(millis() - t1 >= 1000) {t1 = millis();unsigned long t2 = (t1 - t0) / 1000;Serial.print(t2, DEC);Serial.print(’,’);Serial.println(temperatura ,DEC);

}}

Dr. E. S. Pereira 32

Page 33: Arduino Day 2017 - Python + Arduino

Python e Arduino

Resultados

Resultados

Dr. E. S. Pereira 33

Page 34: Arduino Day 2017 - Python + Arduino

Python e Arduino

Resultados

Leitura de Dados Nao Suavizados

Comunicacao Serial

Dr. E. S. Pereira 34

Page 35: Arduino Day 2017 - Python + Arduino

Python e Arduino

Resultados

Leitura de Dados Suavizados

Comunicacao Serial

Dr. E. S. Pereira 35

Page 36: Arduino Day 2017 - Python + Arduino

Python e Arduino

Resultados

FIM

FIM

MUITO OBRIGADO.

Dr. E. S. Pereira 36