Professional Documents
Culture Documents
Laboratório I
COMUNICAÇÃO ENTRE DISPOSITIVOS
Uberlândia
8 de novembro de 2018
Rafael Batista Cardoso (11321EMT026)
Rubens Rodrigues Teixeira Filho(11021EMT012)
Tiago Martins Paris (11421EMT005)
Laboratório I
COMUNICAÇÃO ENTRE DISPOSITIVOS
Uberlândia
8 de novembro de 2018
Sumário
Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1 OBJETIVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 MATERIAIS E MÉTODOS . . . . . . . . . . . . . . . . . . . . . . . 5
2.1 Materiais Utilizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.1 Comunicação Serial (Exercício 1) . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.2 Comunicação I2C do tipo Mestre-Escravo (Exercício 2) . . . . . . . . . . . 10
2.2.3 Comunicação Ethernet (Exercício 3) . . . . . . . . . . . . . . . . . . . . . 12
2.2.4 Comunicação Wireless (Exercício 4) . . . . . . . . . . . . . . . . . . . . . 14
3 RESULTADOS ENCONTRADOS . . . . . . . . . . . . . . . . . . . 17
3.1 Comunicação Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Comunicação I2C do tipo Mestre-Escravo . . . . . . . . . . . . . . . 17
3.3 Comunicação Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Comunicação Wireless . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 CONCLUSÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
APÊNDICE A – EXERCICIO 1 . . . . . . . . . . . . . . . . . . . . 23
APÊNDICE B – EXERCICIO 2 . . . . . . . . . . . . . . . . . . . . 26
APÊNDICE C – EXERCICIO 3 . . . . . . . . . . . . . . . . . . . . 30
APÊNDICE D – EXERCICIO 4 . . . . . . . . . . . . . . . . . . . . 34
3
Introdução
Nos dias atuais o ambiente industrial vem cada vez mais se automatizando, através
de sistemas que para realizar suas funções, utilizam se de eletrônica, informatica, mecânica
e controle. Esses sistemas dependem de uma comunicação entre diferentes dispositivos que
compõe o sistema e realizam atividades distintas por sua vez. Essa comunicação deve ser
veloz e confiável para garantir que o sistema funcione como projetado.
O cenário industrial atual envolve um sistema centralizado e com uma solução para
essa comunicação um tanto conservadora, mas com o desenvolvimento cada vez maior
de microprocessadores e com a redução no custo desse dispositivo, o próximo passo seria
implementar um sistema descentralizado com o uso desse dispositivos.
No relatório a seguir foi implementados diversos tipos de comunicação com o uso
de Arduinos, para desenvolver o conhecimento básico necessário para implementação de
uma rede a partir dessa nova perspectiva
4
1 Objetivo
2 Materiais e Métodos
• Pistão pneumático;
• Arduino Uno;
• Módulo XBee;
• Computador;
• Jumpers;
• Protoboard.
Capítulo 2. Materiais e Métodos 6
2.2 Métodos
Este modulo consistiu em 4 atividades, onde o objetivo era a operação de um
atuador pneumático utilizando diferentes tipos de comunicação entre os dispositivos. As
comunicações abordadas foram:
• Comunicação Serial
• Comunicação Ethernet
• Comunicação Wireless
O sistema a ser operado foi o mesmo em todas as atividades e o seu esquema pode ser
visto a seguir.
configuração do XBee como definir um Router, End Device, nome da rede, entre outras
configurações.
O funcionamento continua igual aos anteriores, exceto por não ter o comando via
serial, nem a vizualização dos status dos sensores, pois o XBee faz uso dessa comunicação
com o Arduino. O exercício consiste em montar uma rede utilizando dois Arduinos,
equipados com shield XBee. Deve-se utilizar o modo API para comunicação entre os
mesmos.
O primeiro Arduino é responsável por ler o status dos fins de curso e dos botões e
implementar a lógica do funcionamento, enviando apenas o comando para o segundo se
ele deve ou não acionar a válvula.
O esquema da montagem pode ser visto a seguir.
Capítulo 2. Materiais e Métodos 16
3 Resultados Encontrados
• Serial.println(): imprime dados na porta serial como texto ASCII e pula uma linha.
O codigo utilizado pode ser visto no Apêndice A com comentarios sobre a utilização
de cada função que foi usada
O codigo desnvolvido conseguiu cumprir os requisitos requeridos pelo sistema.
• Wire.write(valor): envia o valor (sempre 1 byte) pela SDA para o dispositivo infor-
mado anteriormente. O dispositivo possui um registrador (ou memória) aguardando
pela informação, e os outros dispositivos ignoram esta comunicação. O comum é
enviarmos uma informação (um byte) em cada operação.
para recuo. O codigo pode ser observado no Apêndice C. Após as modificações o sistema
se comportou como o esperado.
4 Conclusão
Referências
APÊNDICE A – Exercicio 1
24 void loop() {
25 //Iniico logica da ativacao pelo botao
26 estadobt1= digitalRead(bt1); //le o estado do botao
27 // Compara o estado atual do botao com o ultimo estado
28 if (estadobt1!= ultimoestadobt1){
29 // Verifica se o botao foi pressionado
30 if (estadobt1==LOW){
31 // Acrescenta o acionador
32 if(acionador==0){
33 acionador++;
34 tempobaseretorno=millis();
35 //decrementa o acionador
36 }else{
37 acionador--;
38 }
39 }
40 }
41 ultimoestadobt1=estadobt1;
42 // Fim da logica de ativacao pelo botao
43
44 //Inicia logica de ativacao pelo Monitor Serial
45 if (Serial.available()>0) { // Se receber algum valor pelo
serial monitor
46 c = Serial.read() - ’0’; // Le o numero e converte para
decimal
47 Serial.flush(); // espera completar a transmissao
dos dados e limpa o buffer
48 if(c==1) { // Se o valor lido for igual a 1
49 acionador=1; // Avanca o atuador
50 tempobaseretorno=millis(); // Se o atuador for acionado seta
o tempo para o retorno automatico
51 }
52 if(c==0) { //Se o valor lido for 0
53 acionador=0; //Recua o Atuador
54 }
55 }
56 // Fim da logica de ativacao pelo Monitor Serial
57
58 //Retorno apos 4s
APÊNDICE A. Exercicio 1 25
59 if (millis()-tempobaseretorno>=retorno){
60 acionador=0;
61 }
62 //Acionamento do atuador
63 if (acionador==1){
64 digitalWrite(led,HIGH);
65 }
66 if (acionador==0){
67 digitalWrite(led,LOW);
68 }
69
70 //Print dos Sensores
71 if (millis()-tempobasesensor>=printsensor){
72 Serial.print("Sensor A0: ");
73 Serial.println(digitalRead(a0));
74 Serial.print("Sensor A1: ");
75 Serial.println(digitalRead(a1));
76 tempobasesensor=millis();
77 }
78 }
26
APÊNDICE B – Exercicio 2
Codigo do escravo
1 #include<Wire.h>
2 #define bte 5 //definindo o pino do botao de emergencia
3 #define bt 2 //definindo o pino do botao
4 #define a0 3 //definindo o sensor do cilindro recuado
5 #define a1 4 //definindo o sensor do cilindro
avancado
6
7
8 void setup() {
9 Wire.begin(2); //Inica a biblioteca wire e define o endereco
do escravo
10 Wire.onRequest(com); //Registre uma funcao a ser chamada
quando um mestre solicitar dados deste dispositivo escravo.
11 pinMode( a0, INPUT_PULLUP);
12 pinMode( a1, INPUT_PULLUP);
13 pinMode( bt, INPUT_PULLUP);
14 pinMode( bte, INPUT_PULLUP);
15 }
16
17 void loop(){
18 }
19
20 void com(){ //funcao a ser chamada
21 char buf[4];
22 buf[0] = digitalRead(bte); // le o botao
23 buf[1] = digitalRead(bt); // le o sensor A0
24 buf[2] = digitalRead(a0); // le o sensor A1
25 buf[3] = digitalRead(a1); // le o botao de emergencia
26 Wire.write (buf, 4); // Envia o estados dos
sensores e do botao para o mestre
27 }
APÊNDICE B. Exercicio 2 27
Codigo do Mestre
1 #include <Wire.h>
2 #define led 8
3 int bt,bte,a0,a1,ultestbt,ultestbte,acionador;
4 char c=0;
5 unsigned long tempobaseretorno=0; //tempo base para o retorno
do atuador
6 const long retorno=4000; //tempo para o retorno do
atuador
7 unsigned long tempobasesensor=0; //tempo base para os
sensores
8 const long printsensor=3000; // tempo para informacao dos
sensores
9
10 void setup() {
11 Wire.begin(); //Inica a biblioteca wire e define o
disposiivo como mestre
12 Serial.begin(9600); //Iniciando a comunicacao Serial
13 pinMode(led, OUTPUT); // define o led como saida
14 }
15
16 void loop() {
17 Wire.requestFrom(2,4); //Requisita 4 bytes do escravo 2
18 while (Wire.available()) { //Leitura dos dados enviados pelo
escravo
19 bte=Wire.read();
20 bt = Wire.read();
21 a0 = Wire.read();
22 a1 = Wire.read();
23 }
24 //Iniico logica da ativacao pelo botao
25 // Compara o estado atual do botaocom o ultimo estado
26 if (bt != ultestbt){
27 // Verifica se o botaofoi pressionado
28 if (bt==0){
29 acionador=1;
30 tempobaseretorno=millis(); // Se o atuador for acionado
seta o tempo para o retorno automatico
31 }
APÊNDICE B. Exercicio 2 28
32 }
33 ultestbt=bt;
34 // Fim da logica de ativacao pelo botao
35
36 //Iniico logica da ativacao pelo botao de emergencia
37 // Compara o estado atual do botaocom o ultimo estado
38 if (bte != ultestbte){
39 // Verifica se o botao foi pressionado
40 if (bte==0){
41 acionador=0;
42 }
43 }
44 ultestbte=bte;
45 // Fim da logica de ativacao pelo botaode emergencia
46
47 //Inicia logica de ativacao pelo Monitor Serial
48 if (Serial.available()>0) { // Se receber algum valor pelo
serial monitor
49 c = Serial.read() - ’0’; // le o numero e converte para
decimal
50 Serial.flush(); // espera completar a transmissao
dos dados e limpa o buffer
51 if(c==1) { // Se o valor lido for igual a 1
52 acionador=1; // Avanca o atuador
53 tempobaseretorno=millis(); // Se o atuador for acionado seta
o tempo para o retorno automatico
54 }
55 if(c==0) { //Se o valor lido for 0
56 acionador=0; //Recua o Atuador
57 }
58 }
59 // Fim da logica de ativacao pelo Monitor Serial
60
61
62 if (acionador==1){ //Aciona o Atuador
63 digitalWrite(led,HIGH);
64 }
65 if (acionador==0){ // Recua o Atuador
66 digitalWrite(led,LOW);
APÊNDICE B. Exercicio 2 29
67 }
68 if(millis()-tempobaseretorno>=retorno){ //Recuo automatico do
atuador
69 digitalWrite(led,LOW);
70 }
71 }
30
APÊNDICE C – Exercicio 3
Codigo do Emissor
1 #include <SPI.h>
2 #include <Ethernet.h>
3 #include <EthernetUdp.h>
4 #define btee 5 //definindo o pino do botao de
emergencia
5 #define btt 2 //definindo o pino do botao
6 #define a00 3 //definindo o sensor do cilindro
recuado
7 #define a11 4 //definindo o sensor do cilindro
avancado
8
9 EthernetUDP Udp;
10 byte mac[]={0x90,0xA2,0xDA,0x00,0x64,0x44};
11 byte ip[]={192,168,1,200};
12 byte remoteip[]={192,168,1,80};
13 char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
14 unsigned int port =8888;
15 int bt=0;
16 int bte=1;
17 int a1=1;
18 int a0=0;
19 int ultestbt,ultestbte,ultesta1;
20 char acionador;
21 unsigned long tempobaseretorno=0; //tempo base para o retorno
do atuador
22 const long retorno=4000; //tempo para o retorno do
atuador
23 bool flag=false;
24 void setup (){
25 Ethernet.begin(mac,ip);
26 Udp.begin(port);
27 Serial.begin(9600);
28 pinMode( a00, INPUT_PULLUP);
29 pinMode( a11, INPUT_PULLUP);
APÊNDICE C. Exercicio 3 31
Codigo do Receptor
1 #include <SPI.h>
2 #include <Ethernet.h>
3 #include <EthernetUdp.h>
4 #define led 8
5
6 EthernetUDP Udp;
7 byte mac[]={0x90,0xA2,0xDA,0x00,0x64,0x50};
8 byte ip[] = {192,168,1,80};
9 unsigned int port = 8888;
10 char acionador=0;
11 char c=0;
12 char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
13
14 void setup(){
15 Ethernet.begin(mac,ip);
16 Udp.begin(port);
17 Serial.begin(9600);
18 pinMode( led, OUTPUT);
19 }
20
21 void loop(){
22 int packetSize = Udp.parsePacket();
23 if (packetSize){
24 Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
25 acionador=packetBuffer[0];
26 }
27 if(packetBuffer[0] == ’1’){
28 digitalWrite(led,HIGH);
29 }
30 if(packetBuffer[0] == ’0’){
31 digitalWrite(led,LOW);
32 }
33
34 if (Serial.available()>0) { // Se receber algum valor pelo
serial monitor
35 c = Serial.read() - ’0’; // Le o numero e converte para
decimal
36 Serial.flush(); // espera completar a transmissao dos dados
APÊNDICE C. Exercicio 3 33
e limpa o buffer
37 if(c==1) { // Se o valor lido for igual a 1
38 digitalWrite(led,HIGH); // Coloca o pino 8 como nivel logico
alto
39 }
40 if(c==0) { // Se o valor lido for igual a 0
41 digitalWrite(led,LOW); // Coloca o pino 8 como nivel logico
baixo
42 }
43 }
44 }
34
APÊNDICE D – Exercicio 4
Codigo do Emissor
1 #include <XBee.h>
2 XBee xbee = XBee();
3 XBeeAddress64 add64 = XBeeAddress64(0x0013A200, 0x40B8F669);
4 uint8_t payload[1] ;
5 #define btt 2 //definindo o pino do botao
6 #define a00 3 //definindo o sensor do cilindro
recuado
7 #define a11 4 //definindo o sensor do cilindro
avancado
8
9 int bt=0;
10 //int bte=1;
11 int a1=1;
12 int a0=0;
13 int ultestbt,ultestbte,ultesta1;
14 char acionador;
15 unsigned long tempobaseretorno=0; //tempo base para o retorno
do atuador
16 const long retorno=4000; //tempo para o retorno do
atuador
17 bool flag=false;
18
19 void setup (){
20 Serial.begin(9600);
21 xbee.setSerial(Serial);
22
23 pinMode( a00, INPUT_PULLUP);
24 pinMode( a11, INPUT_PULLUP);
25 pinMode( btt, INPUT_PULLUP);
26 //pinMode( btee, INPUT_PULLUP);
27
28 }
29
30 void loop(){
APÊNDICE D. Exercicio 4 35
31 bt = digitalRead(btt); // le o sensor A0
32 a0 = digitalRead(a00); // le o sensor A1
33 a1 = digitalRead(a11); // le o botao de emergencia
34
35 // Compara o estado atual do botao com o ultimo estado
36 if (bt != ultestbt){
37 // Verifica se o botao foi pressionado
38 if (bt==1){
39 payload[0]=’a’;
40 ZBTxRequest data = ZBTxRequest(add64, payload, sizeof(
payload));
41 xbee.send(data);
42 tempobaseretorno=millis();
43 }
44 }
45 ultestbt=bt;
46
47 if (a1 != ultesta1){
48 // Verifica se o botao foi pressionado
49 if (a1==1){
50 tempobaseretorno=millis();
51 flag=true;
52 }
53 }
54 ultesta1=a1;
55
56 if((millis()-tempobaseretorno>retorno)&&(flag)){
57 payload[0]=’r’;
58 ZBTxRequest data = ZBTxRequest(add64, payload, sizeof(
payload));
59 xbee.send(data);
60 flag=false;
61 }
62 }
APÊNDICE D. Exercicio 4 36
Codigo do Receptor
1 #include <XBee.h>
2 XBee xbee = XBee();
3 ZBRxResponse rx = ZBRxResponse();
4 #define led 8
5
6 void setup(){
7 xbee.setSerial(Serial);
8 Serial.begin(9600);
9 pinMode( led, OUTPUT);
10 }
11
12 void loop(){
13 uint8_t resposta;
14 xbee.readPacket();
15 if (xbee.getResponse().isAvailable()) {
16 if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
17 xbee.getResponse().getZBRxResponse(rx);
18 resposta = rx.getData(0);
19 }
20 }
21
22 if(resposta == ’a’){
23 digitalWrite(led,HIGH);
24 }
25 if(resposta == ’r’){
26 digitalWrite(led,LOW);
27 }
28 }