Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ENGENHARIA
necessrio
para
conseguirmos
utiliza
lo.
Raspberry
um
Pgina 1 de 38
ROBUSTA
ENGENHARIA
ele
gratuito
pode
ser
obtido
no
link
ROBUSTA
ENGENHARIA
clicando em option e selecionando as opes FORMAT TYPE : QUICK e
FORMAT SIZE ADJUSTEMENT : ON , ento clicamos em format.
Com o carto formatado, precisamos realizar o download dos arquivos do S.O.
( Sistema Operacinal ) que tambm gratuito e pode ser obtido no link
( https://www.raspberrypi.org/downloads/ ), como o arquivo baixado estava em um
formato compacto foi necessrio primeiro extrair os arquivos para ento copia los
para o carto microSD. Feito isso nosso carto estava pronto e poderia ser usado no
nosso Raspberry. Uma observao importante que o carto usado precisa ter no
mnimo 8Gb de memria e aconselhadamente ser da classe 10.
Com o carto j pronto e plugado no nosso Raspberry, podemos liga lo para ento
configurarmos o nosso SO. Para isso foi necessrio uma fonte de alimentao
microUSB de 5V DC com capacidade de corrente de at 2A, um mouse, um teclado e
um monitor com entrada HDMI. Tendo conectado primeiro todos os acessrios, ento
ligamos o Raspberry e ele nos apresentou a sua tela inicial de instalao de sistema
operacional, como queremos trabalhar com o Raspbian ele foi selecionado. Como
mostra a figura a seguir:
Pgina 3 de 38
ROBUSTA
ENGENHARIA
Pgina 4 de 38
ROBUSTA
ENGENHARIA
Quando selecionamos o nosso SO e prosseguimos com a instalao o Raspberry
terminou a instalao e deu reboot j voltando com no SO Raspbian como mostra a
figura a seguir:
Pgina 5 de 38
ROBUSTA
ENGENHARIA
c) GPIOs.
O Raspberry possui sadas GPIOs que so melhores representadas na imagem
abaixo:
Figura 4 GPIOs
Para testarmos algumas portas foi implementado um cdigo em Python por j ser
uma linguagem compatvel com o Raspberry. O cdigo teve como objetivo testar
umas das portas GPIO, para realizar o teste foi escolhido um exemplo o BLINK, que
no faz nada mais que piscar um led que est conectado a porta, abaixo segue o
cdigo que foi implementado e o circuito que foi montado.
1.
2.
import time
3.
GPIO.setmode(GPIO.BOARD)
Pgina 6 de 38
ROBUSTA
ENGENHARIA
4.
GPIO.setup(18, GPIO.OUT)
while(1):
print("LED ACESO\n")
GPIO.output(18, 1)
8.
time.sleep(1)
//Delay de 1 segundo
9.
print("LED APAGADO\n")
alto
GPIO.output(18, 0)
baixo (0)
11.
time.sleep(1)
//Delay de 1 segundo
Cdigo Python.
Figura 5 Circuito.
Pgina 7 de 38
ROBUSTA
ENGENHARIA
d) Comunicao.
Para testarmos a nossa comunicao serial do Raspberry Pi, montamos uma
comunicao simples entre um arduino e o Raspberry Pi.
O primeiro passo foi abrir o terminal do Raspberry e atualizar a biblioteca de
comunicao serial, digitando o seguinte cdigo:
Pgina 8 de 38
ROBUSTA
ENGENHARIA
Pgina 9 de 38
ROBUSTA
ENGENHARIA
boto
1.
// porta do boto
2.
// porta do LED
3.
4.
5.
int buttonState;
// estado do boto
6.
7.
char leitura;
estado do LED
pino
8.
int c1 = 0;
// contador auxiliar
9.
int c2 = 0;
// contador auxiliar
10.
long lastDebounceTime = 0;
11.
12.
void setup() {
13.
14.
pinMode(ledPin, OUTPUT);
15.
Serial.begin(9600);
// inicializando serial
16.
digitalWrite(ledPin, ledState);
17.
18.
void loop() {
LED
19.
20.
de estado.
21.
lastDebounceTime = millis();
22.
23.
if ((millis() - lastDebounceTime) > debounceDelay) { // quando
passa o tempo do debounce
24.
if (reading != buttonState) {
diferente do valor atual do botao
25.
26.
27.
if (buttonState == HIGH) {
ledState = !ledState;
28.
pela serial
Serial.println(ledState);
29.
30.
31.
// se o valor lido
}
}
32.
33.
raspberry
34.
leitura = Serial.read();
Pgina 10 de 38
ROBUSTA
ENGENHARIA
nova
35.
ledState = HIGH;
36.
c1 = 1;
realizar a tarefa de novo
37.
c2 = 0;
proxima mudana
boto
38.
Serial.println(ledState);
39.
40.
41.
ledState = LOW;
42.
c1 = 0;
43.
c2 = 1;
44.
Serial.println(ledState);
45.
46.
digitalWrite(ledPin, ledState);
47.
48.
lastButtonState = reading;
Pgina 11 de 38
ROBUSTA
ENGENHARIA
Pgina 12 de 38
ROBUSTA
ENGENHARIA
1. import serial # importando biblioteca de comunicacao serial
2. import time
tecla
7.
ser.write("1")
8.
time.sleep(2)
# delay
9.
10.
11.
12.
time.sleep(2) # delay
13.
14.
15.
16.
Pgina 13 de 38
ROBUSTA
ENGENHARIA
Figura 6 Circuito 2.
e) Rs 485, ModBus;
Para a leitura dos nossos dados do sistema, estaremos utilizando um
Multimedidor Trifsico Mult K da Kron instrumentos eltricos.
Pgina 14 de 38
ROBUSTA
ENGENHARIA
Figura 8 Tenses
O pacote de dados mostrado na figura abaixo :
Pgina 15 de 38
ROBUSTA
ENGENHARIA
Pgina 16 de 38
ROBUSTA
ENGENHARIA
Depois de entender melhor o protocolo, partimos para as configuraes que
devem ser feitas no Medidor para que possamos utiliza lo. Temos a seguir um passo
a passo obtido do manual do equipamento, que explica de forma clara o que deve ser
feito para a configurao da interface serial.
1. Selecione a funo End (endereo) atravs das teclas e ;
2. Pressione modo para entrar no modo de edio do endereo;
3. A tecla modo seleciona o prximo dgito e as teclas e incrementam ou
decrementam o dgito selecionado. A faixa vlida para este parmetro de 1 at 247
(o valor 254 indica que o equipamento est sem endereo atribudo) Aps ajustar o
ltimo dgito, pressione modo para gravar o valor no multimedidor;
4. Selecione a funo bAU (baud rate velocidade) atravs das teclas e ;
5. Pressione modo para alternar entre as velocidades de 9.6, 19.2, 38.4 ou
57.6 kbps;
6. Selecione a funo StP (formato de bits) atravs das teclas e ;
7. Pressione modo para entrar no modo de seleo de paridade e stop bits;
8. Com as teclas e selecione a configurao desejada (8n1, 8n2, 8E1,
8O1) e com a tecla modo confirme sua escolha.
No nosso caso definimos o endereo como 001, o baud rate como 9.6 e a
paridade e stop bits como 8n1.
Para testarmos o funcionamento do medidor utilizamos o software fornecido
pela prpria empresa ( KRON ), o nome do programa redeMB, fornecido
gratuitamente
pela
empresa
atravs
http://www.kronweb.com.br/br/downloads_softwares.php
do
),
aps
link
o
(
download
instalao do software foi possvel realizar o teste, a seguir temos a tela inicial do
programa.
Pgina 17 de 38
ROBUSTA
ENGENHARIA
ROBUSTA
ENGENHARIA
Pgina 19 de 38
ROBUSTA
ENGENHARIA
Pgina 20 de 38
ROBUSTA
ENGENHARIA
Pgina 21 de 38
ROBUSTA
ENGENHARIA
Pgina 22 de 38
ROBUSTA
ENGENHARIA
Pgina 23 de 38
ROBUSTA
ENGENHARIA
Aps realizarmos estas ligaes, podemos realizar as conexes da
comunicao, entretanto como o nosso computador no possui uma sada para Rs
485, necessrio utilizar um conversor de Rs 485 para USB. Logo o nosso
dispositivo est instalado e pronto pra ser testado. Entretanto, primeiro vai ser
necessrio configurarmos o nosso dispositivo atravs da interface homem maquina
que o equipamento dispe.
A interface do equipamento possui: Trs linhas de 3 dgitos de LED de 7
segmentos de alto brilho, para visualizao do valor numrico das grandezas, Seis
LEDs para indicao da grandeza que est sendo apresentada no display, Trs teclas
para navegao e parametrizao do instrumento e LEDs indicativos da escala da
grandeza que est sendo apresentada.
O medidor possui trs modos de operao, o modo instantneo onde ele
mostra os valores de algumas das grandezas eltricas instantneas no display
( tenso, corrente, freqncia e etc) , o modo energia onde ele mostra os valores das
grandezas eltricas acumulativas no display ( demanda, consumo e etc) e o modo
funes onde possvel configurar o nosso equipamento. Para os fins desejados
apenas os modos: instantneo e de parametrizao sero utilizados.
Ao ligar o equipamento o mesmo j se encontra no modo instantneo. Para
podermos configura lo teremos de mudar o modo para funes, para isso, temos que
pressionar as teclas e
primeira linha do display numrico e todos os LEDs comearem a piscar. Caso aps
soltar as teclas, aparea a mensagem SEn em L1 ( Primeira linha do display ), entre
com a senha 021 para acesso ao modo Funes. Com a tecla modo se movimente
entre os dgitos e utilize e para incrementar ou decrementar o dgito selecionado.
De forma a identificar que o instrumento est no modo Funes, os LEDs k e M
ficaro piscando durante todo o processo de parametrizao.
No modo funo ser possvel configurar os seguintes parmetros: tP
( Relao de transformador de potencial ), tC ( Relao de transformador de
corrente ), tL ( Esquema de ligao ultilizado), tI ( Intervalo de integrao para o
calculo da demanda) , PEn ( Programao de sada de pulsos), End ( Endereo
Modbus), bAU ( Baud rate), StP ( Stop bits), rSt ( Reset dados de energias, demandas
e Max tenso e corrente), CEr ( Leitura de cdigo de erro), SOF ( Leitura de verso
do software interno), Sen ( Habilitar/Desabilitar senha de acesso).
Pgina 24 de 38
ROBUSTA
ENGENHARIA
Para modificar qualquer um dos parmetros, basta selecionar o parmetro
desejado atravs das teclas e e pressionar a tecla modo, para editar a constante
ento voc editar os valores atravs das teclas e e confirmar a edio atravs da
tecla modo.
Sobre o ponto flutuante do aparelho ou seja a forma de representao de
nmeros reais utilizada na comunicao. Ela feita da seguinte maneira h um
deslocamento da vrgula de forma que se obtenha um nmero menor ou prximo de
1. Esse deslocamento feito por meio de notao cientfica. Esclarecendo: o nmero
25,456 em notao corresponde ao 0,25456 x 10 2. Ento os dados so separados da
seguinte maneira: parte fracionaria base e expoente. O pacote de dados fica da
seguinte forma : 1 bit para o sinal do numero, 1 bit para o sinal do expoente, 4 bits
para o expoente e 10 bits para a mantissa ( parte fracionaria) .
O problema que a ordem desses bits pode ser mudada, e para que
possamos ter sucesso na comunicao a ordem dos bits enviados tem que ser a
mesma da leitura, ou no iremos realizar uma leitura correta. No nosso caso a ordem
dos bits de ponto flutuante do modbus poll e do labview era diferente da ordem dos
bits do medidor da kron. Porm o medidor permite que voc altere essa ordem, logo
foi necessrio realizar a troca dessa ordem de forma a obter a leitura correta.
Para realizar a mudana, foi utilizado o modbus poll, devido a praticidade de se
realizar a mudana atravs do mesmo. Primeiro conecte o medidor ao computador e
abra o ModBus poll, clique no menu Functions e ento em test Center. A seguinte
tela dever aparecer:
Pgina 25 de 38
ROBUSTA
ENGENHARIA
Agora poderemos alterar o ponto flutuante do medidor, para isso vamos enviar
a seguinte mensagem para o medidor:
01 06 01 2C 23 01
Onde
01 Endereo do medidor.
06 Funo do Modbus ( single register ).
01 2C Posio de memria do ponto flutuante.
23 01 Ordem dos bits ( os bits sempre sero 0,1,2 e 3 o que altera a ordem
).
Ao enviar est mensagem o medidor estar com a mesma ordem do modbus
poll e voc conseguir ler os dados do medidor de forma correta.
g) Montagem de quadro para medio do sistema fotovoltaico.
Foi realizada a montagem de um quadro para o medidor, que foi colocado junto
ao inversor de um sistema fotovoltaico, que servir para realizarmos medidas e
testarmos o medidor. Segue abaixo fotos do quadro.
Pgina 26 de 38
ROBUSTA
ENGENHARIA
Pgina 27 de 38
ROBUSTA
ENGENHARIA
Pgina 28 de 38
ROBUSTA
ENGENHARIA
Pgina 29 de 38
ROBUSTA
ENGENHARIA
1. import array
2. import struct
3. import sys
4. import serial
5. import random
6. import time
7. #Sub Programa
8. #Clculo CRC modbus
9. def CRCcal(msg):
10.
CRC = 0xFFFF
11.
CRCHi = 0xFF
12.
CRCLo = 0xFF
13.
CRCLSB = 0x00
14.
for i in range(0, len(msg)-2,+1):
15.
CRC = (CRC ^ msg[i])
16.
for j in range(0, 8):
17.
CRCLSB = (CRC & 0x0001);
18.
CRC = ((CRC >> 1) & 0x7FFF)
19.
20.
21.
22.
23.
if (CRCLSB == 1):
CRC = (CRC ^ 0xA001)
CRCHi = ((CRC >> 8) & 0xFF)
CRCLo = (CRC & 0xFF)
return (CRCLo,CRCHi)
24.
#Validao CRC
25.
def CRCvalid(resp):
26.
CRC = CRCcal(resp)
27.
if (CRC[0]==resp[len(resp)-2])
1]):return True
28.
return False
&
(CRC[1]==resp[len(resp)-
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
#CRC
CRC = CRCcal(message)
50.
#index6= CRC Lo
Pgina 30 de 38
ROBUSTA
ENGENHARIA
51.
52.
53.
message[len(message) - 2] = CRC[0]#CRCLo
#index7 = CRC Hi
message[len(message) - 1] = CRC[1]#CRCHi
54.
55.
56.
57.
58.
59.
60.
if ser.isOpen:
ser.write("".join(chr(h) for h in message))
responseFunc3total = 5 + 2 * Number_of_Points
reading = ser.read(responseFunc3total)
response = [0 for i in range(len(reading))]
for i in range(0, len(reading)):
response[i] = ord(reading[i])
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
if len(response)==responseFunc3total:
CRCok = CRCvalid(response)
if CRCok & (response[0]==slave) & (response[1]==Function):
#Byte Count in index 3 = responseFunc3[2]
#Number of Registers = byte count / 2 = responseFunc3[2] / 2
registers = ((response[2] / 2)& 0xFF)
values = [0 for i in range(registers)]
for i in range(0, len(values)):
#Data Hi and Registers1 from Index3
values[i] = response[2 * i + 3]
#Move to Hi
values[i] <<= 8
#Data Lo and Registers1 from Index4
values[i] += response[2 * i + 4]
negatif = values[i]>>15
if negatif==1:values[i]=values[i]*-1
return values
return ()
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
#Main Program
#Definio parametros da comunicao
try:
ser = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 9600,
bytesize = serial.EIGHTBITS,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
timeout = 0.5
)
except Exception, e:
raise ValueError(e)
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
print "START"
Pgina 31 de 38
ROBUSTA
ENGENHARIA
103. Corrente = 0.0
104. Frequencia = 0.0
105. Potencia = 0.0
106. Potenciagerada = 0.0
107.
108. #Declarao da variavel de endereo, que ir dar suporte para
que se faa a leitura de todos os endereos
109.
110. end = 0
111.
112. #Criao do Arquivo de texto
113.
114. arq = open("Relat.txt", "w")
115. arq.write("RELATORIO")
116. arq.write("\n")
117. arq.close()
118.
119. #inicio do loop de leitura
120.
121. while 1:
122. #Serial Open Check
123. if not ser.isOpen:ser.open()
124. time.sleep(0.5)
125. #Read of Registers
126. Func04ArrayValue = Func04Modbus(1,end,2);#slave,start,number
of registers
127. if len(Func04ArrayValue)>0:
128. for i in range(0, len(Func04ArrayValue)):
129. #print
"Read
of
Registers"
+
str(i)
+
"
=
"
+
str(Func04ArrayValue[i])
130. if (i == 0):
131. j=0
132. while j<16 :
133. if ((Func04ArrayValue[i]) & (32768>>j)):
134. b1[j] = 1
135. else:
136. b1[j] = 0
137. j= j + 1
138. #print (b1)
139. if ( i == 1) :
140. j=0
141. while j<16 :
142. if ((Func04ArrayValue[i]) & (32768>>j)):
143. b2[j] = 1
144. else:
145. b2[j] = 0
146. j= j + 1
147. b3 = b1 + b2
148.
149. #Tratamento dos dados
150.
151. if b3[0]==1:
152. sinal = -1
153. if b3[0]==0:
154. sinal = 1
155. #print (sinal)
156. exp = 0
157. for i in range(1,8):
Pgina 32 de 38
ROBUSTA
ENGENHARIA
158. exp = exp + b3[i]*(2**(8-i))
159. #print (exp)
160. mantissa = 0.0
161. for i in range(9,31):
162. partmantissa = b3[i] + 0.0
163. mantissa = mantissa + partmantissa/(2**(i-8))
164. #print (mantissa)
165. f = sinal*(1 + mantissa)*2**(exp - 127)
166. #print(f)
167. if end == 14 :
168. Frequencia = f
169. if end == 16 :
170. Tensao = f
171. if end == 22 :
172. Corrente = f
173. if end == 28 :
174. Potencia = f
175. if end == 54 :
176. Potenciagerada = f
177. end = 0
178.
179. #Exposio dos dados na tela para acompanhamento
180.
181. print "#################################"
182. print("\n Tensao ")
183. print(Tensao)
184. print("\n Frequencia ")
185. print(Frequencia)
186. print("\n Corrente ")
187. print(Corrente)
188. print("\n Potencia ")
189. print(Potencia)
190. print("\n Potencia kwh ")
191. print(Potenciagerada)
192. print "#################################"
193.
194. #Alterando e salvando dados no arquivo de texto
195.
196. arq = open("Relat.txt", "a")
197. arq.write(" Tensao: ")
198. arq.write(str(Tensao) + " V")
199. arq.write("\n")
200. arq.write(" Corrente: ")
201. arq.write(str(Corrente) + " A")
202. arq.write("\n")
203. arq.write(" Potencia: ")
204. arq.write(str(Potencia)+ " kW")
205. arq.write("\n")
206. arq.write(" Potencia Gerada: ")
207. arq.write(str(Potenciagerada)+ " kWh")
208. arq.write("\n")
209. arq.write("############################")
210. arq.write("\n")
211. arq.close()
212.
213. #incrementando variavel de endereo, para ler
endereo
214.
Pgina 33 de 38
proximo
ROBUSTA
ENGENHARIA
215. end = end + 2
Pgina 34 de 38
ROBUSTA
ENGENHARIA
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Ento a instalao se inicia e assim que terminar, ela pedi que se escolha uma
senha para o MySQL, no caso usei password como senha.
Depois disso j podemos visualizar uma pagina exemplo que j acompanha o
MySQL. Para acessar est pagina basta entra no navegador digitando o IP do
Raspberry como caminho http://<IP ADDRESS>, ao entrar no link aparece uma
pagina escrito que est funcionando, a pagina pode ser alterada no seguinte caminho
: /var/www/index.html.
Para criar uma base de dados no MySQL, basta entrar no terminal do
Raspberry, e digitar o comando de execuo do MySQL:
mysql ppassword
Pgina 35 de 38
ROBUSTA
ENGENHARIA
Depois disso pode se criar um banco de dados com o seguinte comando:
create database Monitoring;
E se cria a tabela:
create table EnergyMed (Tempo INTEGER UNSIGNED,Tensao DECIMAL(5,1),
Corrente
DECIMAL(5,1),
Potencia
DECIMAL(5,1),
PotenciaG
DECIMAL(5,1),
PotenciaR DECIMAL(5,1));
Consultas:
http://devlinuxbr.blogspot.com.br/2015/03/vamos-falar-de-python-threading.html
http://www.simplymodbus.ca/faq.htm#Modbus
http://www.cerne-tec.com.br/Modbus.pdf
Pgina 36 de 38
ROBUSTA
ENGENHARIA
http://www.modbus.org/specs.php
http://forums.ni.com/t5/Industrial-Communications/troubles-with-rs-485-on-Labview/mp/3132522/highlight/false#M2434
http://www.kronweb.com.br/br/downloads_manuais.php
Acompanhamento do cronograma:
1. Estudo Raspberry Pi;
- Noobs;
- Debian;
- Desenvolvimento em Python;
- GPIOs;
- Comunicao;
2. Comunicao Serial;
- Pacotes;
3. Comunicao Modbus;
- Modbus RTU;
- Desenvolvimento de software;
4. Adaptao do Software e criao do Banco de dados;
5. Multitarefa (Threds);
6. Entrega do prottipo funcional de aquisio;
Objetivos
Especficos
1
2
3
4
5
6
Abr
Mai
Jun
Jul
Ago
Set
Out
Nov
Dez
Jan
Fev
Mar
ROBUSTA
ENGENHARIA
No.
Pgina 38 de 38