Você está na página 1de 26

UNIVERSIDADE FEDERAL DE UBERLNDIA

FACULDADE DE ENGENHARIA MECNICA


UBERLNDIA

MDULO I
COMUNICAO SERIAL E ETHERNET COM
ARDUINO

REDES INDUSTRIAIS
JOS JEAN-PAUL ZANLUCCHI DE SOUZA TAVARES

Data

Editor

Revisor

03/10/2014

Marco Vincius Muniz Ferreira

Jos Jean-Paul Z. S. Tavares

30/03/2015

Marco Vincius Muniz Ferreira

Jos Jean-Paul Z. S. Tavares

24/08/2015

Jos Jean-Paul Z. S. Tavares

Jos Jean-Paul Z. S. Tavares

Sumrio

INTRODUO.............................................................................................................. 3
OBJETIVOS ................................................................................................................. 4
FUNDAMENTAO TERICA .................................................................................... 5
ARDUINO ................................................................................................................. 5
COMUNICAO SERIAL ......................................................................................... 9
COMUNICAO ETHERNET ................................................................................. 10
IDE (Integrated Development Environment) ............................................................ 11
Exerccio 1 (3 Pontos) ....................................................................................... 15
Exerccio 2 (3 Pontos) ....................................................................................... 18
COMUNICAO ENTRE ARDUINOS .................................................................... 19
Exerccio 3 (4 Pontos) ....................................................................................... 21
Exerccio Extra (1 Ponto) .................................................................................. 24
BIBLIOGRAFIA ........................................................................................................... 25

INTRODUO
A comunicao de dados trata da troca de informaes entre computadores e
outros dispositivos microprocessados atravs de um meio de transmisso comum. A
comunicao envolve no mnimo uma rede e dois dispositivos capazes de trocar
informaes. Os dispositivos envolvidos na comunicao podem estar distanciados em
alguns metros (por exemplo no sistema Bluetooth) ou por distncias ilimitadas (como
no caso da Internet).
Este mdulo apresenta dois tipos de comunicaes entre dispositivos. A
primeira apresentada a comunicao serial. Chamamos de comunicao serial o
mtodo de transmisso de dados por meio de um nico par de cabos e o envio da
informao ocorre de forma sequencial
A segunda comunicao apresentada via rede Ethernet. A Ethernet a rede
mundialmente utilizada para comunicao de PCs. Um grande desafio levar a
Ethernet TCP/IP para a Indstria.

OBJETIVOS
O objetivo principal deste Mdulo ensinar o aluno a estabelecer uma
comunicao entre dispositivos de duas formas: serial e via ethernet.
Os objetivos especficos consistem em implementar um programa de
comunicao:

Serial entre Arduino e um Monitor Serial em um PC;

Ethernet entre Arduino e um PC usando browser e cdigo URL;

Serial entre dois Arduinos e

Ethernet entre dois Arduinos.

FUNDAMENTAO TERICA
ARDUINO

Mesmo que as pessoas no se deem conta, utilizamos, hoje em dia, uma


mdia de nove microcontroladores diariamente. Dentre estes, os mais comuns esto
inseridos em televisores, mquinas de lavar (roupa ou loua), controle remoto, DVD e
alarmes.
Microcontroladores so equipamentos compostos por uma central aritmtica,
capaz de fazer clculos matemticos, uma memria capaz de manipular e armazenar
dados e programas, e diversos componentes de entrada e sada para comunicao
com o exterior. Simplificando, o microcontrolador um computador encapsulado em
um nico chip.
Os microcontroladores possuem baixo custo, so fceis de encontrar no
mercado, possuem compiladores para linguagem de alto nvel e integrao com
controladores ethernet.
ARDUINO uma plataforma livre de prottipos eletrnicos baseada em
flexibilidade, e facilidade de usar o hardware e o software. Ele destinado a artistas,
designers, hobbistas e qualquer pessoa interessada em criar objetos interativos ou
ambientes.
O hardware de fcil aquisio e seu IDE (Integrated Development
Environment ou Ambiente de Desenvolvimento Integrado) est disponvel para
download gratuito no site http://arduino.cc/.
A seguir so apresentadas algumas declaraes, funes, parmetros
utilizados na programao de um ARDUINO.

Constantes e Variveis
As constantes booleanas so valores predefinidos que nunca podem ser
alterados. Na linguagem C do ARDUINO so 3 os grupos de constantes booleanas; os
dois componentes de cada grupo sempre podem ser representados pelos nmeros
binrios 1 e 0.

TRUE/FALSE: so constantes booleanas que definem estados lgicos. Verdadeiro


qualquer valor que no seja zero. Falso sempre o valor zero.
HIGH/LOW: so constantes que definem as tenses nos pinos digitais do ARDUINO.
Alto uma tenso de 5 Volts e baixo (ou terra) uma tenso de 0 Volts.
INPUT/OUTPUT: so constantes programadas pela funo pinMode() para os pinos
do ARDUINO. Eles podem ser entrados (sensores) ou sadas (de controle).
As variveis so posies na memria de programa do ARDUINO marcadas
com um nome e o tipo dessa informao que iro guardar. Essas posies podem
estar vazias ou podem receber um valor inicial.
BYTE: armazena 8 bits (0-255);
INT: armazena nmeros inteiros de at 16 bits;
LONG: armazena nmeros inteiros de at 32 bits;
FLOAT: armazena nmeros fracionrios de at 32 bits.
CHAR: armazena um tipo de dado que ocupa 1 byte de memria
STRING: armazena um vetor de dados do tipo char

Lgica e Aritmtica
Smbolos compostos so aqueles que combinam os smbolos aritmticos entre
si e com o sinal de atribuio. A Tabela 1 apresenta as principais operaes.
Tabela 1: Lista de smbolos para as operaes aritmticas
x ++

x = x +1

x --

x = x -1

x += y

x=x+y

x -= y

x=xy

x *= y

x = x*y

x /= y

x = x/y

Operadores de comparao comparam uma varivel com uma constante, ou


variveis entre si. So usados para testar se uma condio verdadeira. Os principais
operadores esto descritos na tabela 2.

Tabela 2: Principais operadores de comparao


x == y

x igual a y

x != y

x no igual a y

x<y

x menor que y

x>y

x maior que y

x <= y

x menor ou igual a y

x >= y

x maior ou igual a y

Operadores lgicos so usados para comparar duas expresses. Retornam 1


ou 0 (TRUE/FALSE). A Tabela 3 mostra os principais operadores lgicos.
Tabela 3: Principais operadores lgicos
&&

AND

porta lgica E

||

OR

porta lgica OU

NOT

porta lgica NO

Funes matemticas e de tempo


As funes existentes podem ser conhecidas no site arduino.cc em Learning/
Example. A funes de tempo mais utilizada a delay(ms) e a funo
random(min,max) ser apresentada abaixo para serem utilizadas posteriormente
nesse documento.
delay(ms): essa funo pausa o programa por um perodo em milissegundos indicado
pelo parmetro em parnteses. Durante o perodo em que essa funo est ativa
qualquer outra funo no programa suspensa.
random(min,max): gera nmeros pseudo-aleatrios entre os limites min e max
especificados como parmetros. O parmetro min opcional e se excludo o limite
mnimo 0.

Funes das portas de Entrada e Sada


pinMode(pino, modo): serve para estabelecer a direo do fluxo de informaes em
qualquer dos 14 pinos digitais, para o caso do Arduino Uno. Dois parmetros devem
ser passados funo: o primeiro indica qual pino vai ser usado; o segundo, se esse

pino pode ser configurado como entrada (modo INPUT) ou sada digital (modo
OUTPUT). Essa funo sempre escrita dentro do bloco de funo setup().
digitalRead(pino): l a informao (estado lgico verdadeiro/falso) presente no pino e
armazena em uma varivel (HIGH/ LOW). necessrio configurar previamente o pino
como entrada ou sada com a funo pinMode().
digitalWrite(pino, valor): serve para enviar um nvel lgico para qualquer pino digital.
Dois parmetros so requeridos: o nmero do pino e o estado lgico (HIGH/ LOW) em
que esse pino deve permanecer. necessrio configurar previamente o pino como
entrada ou sada com a funo pinMode().
analogRead(pino): l o nvel analgico presente no pino indicado pelo parmetro
entre parnteses e, aps a converso para o seu equivalente em bits, o guarda em
uma varivel determinada pelo programador. Os pinos analgicos so reconhecidos
tanto como A0 a A5 como 14 a 19 no Arduino Uno.

Funes para controle de fluxo


if um controle de fluxo usado para selecionar uma ou mais instrues
baseado no resultado de um teste de comparao. Todas as instrues entre as
chaves { } so executadas somente se o resultado desse teste for verdadeiro.
if (expresso) {
Bloco de instrues

// executa se expresso for verdadeiro

if...else um controle de fluxo para fazer um teste novo quando o resultado da


expresso for falsa.
if (expresso) {
Bloco de instrues

// executa se expresso for verdadeiro

}
Else {
Bloco de instrues 2
}

// executa se expresso for falsa

switch...case o comando que permite comprar uma mesma varivel inteira


ou uma expresso que retorne um inteiro com vrios valores possveis
switch (expresso) {
case 1: bloco de instrues 1;
break;
case 2: bloco de instrues 2;
break;
defaut: bloco de instrues 3;
}

while um comando em que o programa repete um grupo de instrues at


que uma condio inicialmente verdadeira se torne falsa.
while (expresso) {
bloco de instrues;
}

for um comando parecido com o while, porm com um contador que registra
cada execuo do bloco de instrues. A varivel inicializada normalmente com 0
ou 1; o parmetro expresso deve conter o valor mximo ou mnimo que o contador
deve alcanar e o incremento o valor que ser incrementado ou decrementado da
varivel cada vez que o bloco de instrues executado.
for (varivel; expresso; incremento) {
Bloco de instrues;
}

COMUNICAO SERIAL
O Arduino Uno capaz de se comunicar serialmente pelas portas RX e TX. Outros
modelos de Arduino possuem mais portas de comunicao serial. Esse tipo de
comunicao envia dados sequencialmente pela porta TX e recebe dados sequenciais
pela porta RX. possvel configurar a velocidade de comunicao. As principais
funes so as seguintes:
Serial.begin(taxa): define a taxa de transferncia em bits por segundo.
Serial.println(): imprime dados na porta serial como texto ASCII e pula uma linha.

Serial.available(): pega o nmero de bytes (caracteres) disponveis para leitura na


porta serial.
Serial.read(): l os dados que chegam na porta serial.
Serial.write(): escreve dados binrios na porta serial.
Serial.flush(): espera a transmisso de dados acabar e limpa o buffer.

COMUNICAO ETHERNET
Ethernet uma arquitetura de interconexo para redes locais - Rede de rea
Local (LAN) - baseada no envio de pacotes. Ela define cabeamento e sinais eltricos
para a camada fsica, e formato de pacotes e protocolos para a subcamada de
controle de acesso ao meio (Media Access Control - MAC) do modelo OSI. A Ethernet
foi padronizada pelo IEEE como 802.3 (barramento CSMA). A partir dos anos 90, ela
vem sendo a tecnologia de LAN mais amplamente utilizada e tem tomado grande parte
do espao de outros padres de rede como Token Ring, FDDI e ARCNET.1

USER DATAGRAM PROTOCOL (UDP)


O User Datagram Protocol (UDP) um protocolo simples da camada de
transporte. Ele permite que a aplicao escreva um datagrama encapsulado num
pacote IPv4 ou IPv6, e ento enviado ao destino. Mas no h qualquer tipo de garantia
que o pacote ir chegar ou no pois no h conexo entre as partes. O UDP
utilizado em comunicaes sem necessidade de segurana no envio e recebimento de
dados ou quando a velocidade de comunicao mais importante que a perda do
pacote trafegado.
O protocolo UDP no confivel. Caso garantias sejam necessrias, preciso
implementar uma srie de estruturas de controle, tais como timeouts, retransmisses,
acknowlegments ou aviso de recebimento, controle de fluxo dentre outros. Cada
datagrama UDP tem um tamanho e pode ser considerado como um registro indivisvel,
diferentemente do TCP, que um protocolo orientado a fluxos de bytes sem incio e
sem fim.
Tambm dizemos que o UDP um servio sem conexo, pois no h
necessidade de manter um relacionamento longo entre cliente e o servidor. Assim, um
cliente UDP pode criar um socket, enviar um datagrama para um servidor e

imediatamente enviar outro datagrama com o mesmo socket para um servidor


diferente. Da mesma forma, um servidor poderia ler datagramas vindos de diversos
clientes, usando um nico socket.
O UDP tambm fornece os servios de broadcast e multicast, permitindo que
um nico cliente envie pacotes para vrios outros na rede.
O cabealho UDP extremamente simples, contendo apenas os nmeros de
porta, comprimento da mensagem e o dgito verificador ou checksum. O cabealho
dos datagramas UDP colocado a seguir ao cabealho IP. A Figura 1 apresenta a
estrutura da mensagem Ethernet.
Porta origem Porta destino

Comprimento da mensagem

Checksum

Figura 1: Estrutura da mensagem para protocolo Ethernet UDP


Cada campo da mensagem composto por 2 bytes (16 bits).
Os campos em laranja so opcionais. A porta de origem geralmente especifica
a porta desejada de resposta, mas pode ser omitida. Isso tipicamente ocorre em
comunicaes broadcast ou mensagens de pnico, que notificam sobre a queda de
um equipamento.

IDE (Integrated Development Environment)


O download do IDE do ARDUINO disponibilizado gratuitamente no site
http://arduino.cc/en/Main/Software. Aps efetuar o download e executar o programa
ser aberta uma rea como a da Figura 2.

Figura 2: IDE do Arduino.

Para efetuar o download do programa no ARDUINO a ser utilizado clique em


Tools => Board para selecionar o microcontrolador. Neste caso deve-se escolher a
opo ARDUINO Uno. Para escolher por qual porta ser realizada a comunicao
basta clicar em Tools => Serial Port => COMX, no qual X representa a porta que o
ARDUINO foi instalado. O nmero da porta pode ser encontrado em Gerenciador de
Dispositivos => Portas (COM e LPT) como mostra a Figura 3.

Figura 3: Gerenciador de Dispositivos.

O cdigo a ser executado no microcontrolador deve conter minimamente trs


partes distintas:
1) Declarao de Variveis
As variveis que sero utilizadas na parte principal devem ser declaradas como
apresentado abaixo:
int led = 3;

// Declara que uma varivel do tipo inteira

char c;

// Declara uma varivel do tipo caractere

2) Setup de rotinas
Devem ser definidos os pinos usados como entradas ou sadas, as
comunicaes realizadas como apresentado abaixo:
void Setup() {
Serial.begin(9600);

// Inicia a comunicao Serial na taxa de

9600bps
pinMode(2, OUTPUT);

// Define um pino 2 como sada

pinMode(led, INPUT);

// Define o pino led como entrada

Sempre que o ARDUINO resetado estas configuraes so refeitas.


3) Programa principal
Dentro do loop deve ser inserido toda lgica que ser executada pelo
ARDUINO enquanto estiver ligado. A sintaxe apresentada abaixo:
void loop() {
// Todo cdigo deve ser inserido neste local
}

Comunicao Serial
Conforme j mencionado, a comunicao Serial utilizada entre o ARDUINO e
um computador ou outros dispositivos. Todo ARDUINO possui pelo menos uma porta
serial. A comunicao utiliza os pinos digitais 0 (RX) e 1 (TX). A utilizao da
comunicao serial invalida as entradas e sadas digitais dos pinos 0 e 1 no caso do
ARDUINO Uno. Pode-se tambm utilizar o Serial Monitor do IDE para comunicar com
o ARDUINO. Para acess-lo basta clicar em Tools => Serial Monitor.
Os valores inseridos no Serial Monitor apesar de apresentar em decimal esto
de acordo com a tabela ASCII (http://www.asciitable.com/). Assim ao digitar o valor 5
no Serial Monitor lido pelo ARDUINO como 35 de acordo com a tabela ASCII no
Anexo 1.
O cdigo apresentado na Tabela 4 um exemplo para utilizar a comunicao
serial. Se o usurio digitar 2 no Serial Monitor o microcontrolador acende um LED que
ligado ao pino 2. Se o usurio digitar 3 o microcontrolador apaga este mesmo LED.
O esquema da Figura 3 mostra como foi feita a ligao no protoboard para testar o
cdigo.

Figura 1: Esquema para Cdigos da Tabela 4 e 5.


Tabela 4: Cdigo de Comunicao Serial com Arduino

Cdigo 1 utilizando o Serial Monitor


char c;

// define uma varivel do tipo char

void setup() {
pinMode(2,OUTPUT);

// define o pino 2 como sada

Serial.begin(9600);

// define a taxa de transmisso da comunicao serial

void loop()
{
if (Serial.available()>0)

// Se receber algum valor pelo serial monitor

{
c = Serial.read() - '0';

// L o nmero e converte para decimal

Serial.flush();

// espera completar a transmisso dos dados e limpa o buffer

if(c==2)

// Se o valor lido for igual a 2

{
digitalWrite(2,HIGH);

// Coloca o pino 2 como nivel lgico alto

}
if(c==3)
{
digitalWrite(2,LOW);

// Coloca o pino 2 como nvel lgico baixo

}
}
}

Uma outra forma de programar apresentada na Tabela 5. Neste caso sempre


que o usurio digitar o valor 2 verificado o status do pino. Se estiver em nvel lgico

baixo passa a ter nvel logico alto (acende o LED). Se estiver em nvel lgico alto
passa a ter nvel lgico baixo (desliga o LED).
Tabela 5: Cdigo para Envio do Nmero 2 via Comunicao Serial do Arduino

Cdigo 2 utilizando o Serial Monitor


char c;

void setup(){
pinMode(2,OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available()>0)
{
c = Serial.read()-'0';
Serial.flush();
digitalWrite(c,!digitalRead(c));

// escreve na porta c o oposto do sinal que o ARDUINO l nesta

porta, ou seja, se estivar HIGH escreve LOW e se estiver LOW escreve HIGH
}
}

Exerccio 1 (3 Pontos)
O exerccio consiste acionar uma sada digital do ARDUINO pela porta serial
por 5 segundos, dado o comando de avano enviado pelo do Serial monitor. O
programa tambm dever escrever o status do sensor fim de curso do cilindro, A0 e
A1, no Serial Monitor em intervalos de tempos definidos de 1 em 1 segundo,
independente se a sada digital estiver sendo acionada. A Figura 4 mostra o equema
pneumtico do exerccio.

Figura 4: Esquema pneumtico do exerccio 1

Comunicao Ethernet

O cdigo para acender ou apagar um LED no pino 2 por comando URL, de acordo
com o esquema na Figura 5, est apresentado na Tabela 6.

Figura 5: Esquema do Arduino para Cdigo da Tabela 6.


Tabela 6: Cdigo para Comunicao Ethernet com Arduino.

Cdigo alterar o status de um LED atravs de um comando URL.


/*
Permite ligar e desligar um LED por um commando em
Para ligar:
http://your-IP-address/$1
Para desligar:
http://your-IP-address/$2
*/

#include <SPI.h>
#include <Ethernet.h>

// inclui a biblioteca SPI que utiliza o arduino como mestre


// inclui a biblioteca Ethernet para utilizar as funes de Ethernet

boolean incoming = 0;

// Entra com o endereo MAC e endereo de IP

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x64, 0x50 };// deve ser o endereo MAC especfico do Shield
Ehernet do Arduino

IPAddress ip(192,168,1,121); //<<< Entre com o endereo IP aqui!!!

// (porta 80 default para HTTP):


EthernetServer server(80);

void setup() {
pinMode(2, OUTPUT);

// inicia a conexo Ethernet e server.


Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
}

void loop()
{
// escuta por clients disponveis
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply

//reads URL string from $ to first blank space


if(incoming && c == ' '){
incoming = 0;
}
if(c == '$'){
incoming = 1;
}

//Checks for the URL string $1 or $2


if(incoming == 1){
Serial.println(c);

if(c == '1'){
Serial.println("ON");
digitalWrite(2, HIGH);
}
if(c == '2'){

Serial.println("OFF");
digitalWrite(2, LOW);
}

if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}

Exerccio 2 (3 Pontos)

Repetir o mesmo exerccio 1, mas agora acionando a sada da vlvula atravs


de comando enviados por browser utilizando cdigo URL.

COMUNICAO ENTRE ARDUINOS


MESTRE ESCRAVO I2C
Em um sistema mestre/escravo (Figura 6), somente a estao chamada de
mestre pode agir como detentora do direito de transmisso. Esse direito de acesso ao
meio fsico distribudo por ela para as estaes escravas por um determinado tempo.
Tal configurao deixa o sistema dependente da estao central, mas mesmo assim
bastante utilizado em instalaes industriais. Este mtodo garante um tempo entre
transmisses consecutivas a qualquer estao da rede, pela realizao de um controle
distribudo com superviso centralizada (ROSARIO, 2005).

Figura 6: Exemplo de um esquema da Comunicao Mestre-Escravo I2C entre Dois


Arduinos.

H diversas formas de se montar uma comunicao mestre-escravo entre


Arduinos, uma delas a do tipo I2C ou Inter-Integrated Circuit (Circuito Interintegrado). Nesse caso, conforme a Figura 6, a comunicao estabelecida de forma
serial pelos mesmos pinos das entradas analgicas A4 e A5, no caso do Arduino Uno.
Cada tipo de Arduino podem ter pinos distintos para essa comunicao.
Existem duas formas de implementao dessa comunicao. A primeira
denominada Mestre Escritor/ Escravo Recebedor. Nesse o escravo apenas recebe
dados do mestre e executa as aes previamente implementadas em seu cdigo. A
Tabela 7 e 8 apresenta exemplo desse cdigo.
Tabela 7: Cdigo para Mestre Escritor para comunicao I2C
Cdigo Mestre Escritor
//

Wire

Master

#include <Wire.h>
void setup()

Writer

by

Nicholas

Zambetti

http://www.zambetti.com

{
Wire.begin(); // inicia i2c bus (endereo opc para mestre)
}
byte x = 0;
void loop()
{
Wire.beginTransmission(4); // transmite ao equip #4
Wire.write("x is ");
Wire.write(x);

// envia 5 bytes tipo char


// envia 1 byte (x=0)

Wire.endTransmission();

// para transmisso

x++; // incremente x
delay(500); // espera 0,5s
}

Tabela 8: Cdigo para Escravo Recebedor para comunicao I2C


Cdigo Escravo Recebedor
#include <Wire.h>
void setup(){
Wire.begin(4);

// inicia i2c bus com endereo #4

Wire.onReceive(receiveEvent); // registra evento como escravo


Serial.begin(9600);

// inicia canal serial para sada

}
void loop(){
delay(100);}
void receiveEvent(int howMany)// define funo receiveEvent
{
while(1 < Wire.available()) // para cada caracter
{char c = Wire.read(); // receibebyte como um caracter
Serial.print(c);

// imprime o caracter

}
int x = Wire.read();

// receib byte como um integer

Serial.println(x);

// imprime o integer

A segunda forma de implementao dessa comunicao denominada Mestre


Leitor/ Escravo Enviador. Nesse o escravo envia os dados ao mestre. A Tabela 7 e 8
apresenta exemplo desse cdigo.
Tabela 7: Cdigo para Mestre Recebedor para comunicao I2C
Cdigo Mestre Recebedor
//

Wire

Master

#include <Wire.h>
void setup()
{

Writer

by

Nicholas

Zambetti

http://www.zambetti.com

Wire.begin();

// inicia i2c bus

Serial.begin(9600); // inicia canal serial para sada


}
void loop()
{
Wire.requestFrom(2, 6);
while(Wire.available())

// requer 6 bytes do escravo #2


// escravo deve enviar mensagem at o tamanho definido

{
char c = Wire.read(); // receibe um byte como caracter
Serial.print(c);

// imprime o caracter

}
delay(500);
}

Tabela 8: Cdigo para Escravo Enviador para comunicao I2C


Cdigo Escravo Enviador
#include <Wire.h>
void setup()
{
Wire.begin(2);

// inicia i2c bus com endereo #2

Wire.onRequest(requestEvent); // registra evento


}
void loop()
{
delay(100);
}
void requestEvent()

//

define

funo

requestEvent

{
Wire.write("hello "); // responde com menssagem de 6 bytes como esperado pelo mestre
}

Exerccio 3 (4 Pontos)
O exerccio consiste em controlar uma vlvula simples solenoide para avano e
retorno de um cilindro pneumtico de acordo com o Exerccio 1. Um Arduino deve ser
o mestre responsvel pelo acionamento da vlvula enquanto que o outro deve o
escravo que verificar o status dos sensores fim de curso e boto de acionamento e
alerta o mestre quando solicitado pelo mesmo. Ao se acionar o boto e estando o
cilindro recuado (A0 =1 e A1=0 para a Figura 4), o Arduino escravo (responsvel pelo
coletar os dados dos sensores e boto) dever enviar mensagem de avano via I2C

para o Arduino Mestre responsvel pelo controle da vlvula. O Arduino Mestre aciona
a vlvula A+ e solicita ao Arduino Escravo, aps 5s, o status do fim de curso A1. O
Arduino Escravo responde o status do fim de curso A1 ao Arduino Mestre e esse
desliga a vlvula se o sinal for 1 (fim de curso A1 acionado).

EXTRA: COMUNICAO ETHERNET


Na comunicao ethernet necessrio definir os endereos IP dos dispositivos. Nesse
caso os IPs devem ser distintos. A Figura 6 e a Tabela 7 apresentam um exemplo de
comunicao ethernet entre dois dispositivos.

Figura 6: Esquema da Comunicao Ethernet entre Dois Arduinos.

Tabela 1: Cdigo para Comunicao Ethernet entre dois Arduinos.

Emissor

Receptor

#include <SPI.h>

#include <SPI.h>

#include <Ethernet.h>

#include <Ethernet.h>

#include <EthernetUdp.h>

#include <EthernetUdp.h>

EthernetUDP Udp;
EthernetUDP Udp;

byte mac[]={0x90, 0xA2, 0xDA, 0x00, 0x64, 0x50};

byte mac[]={0x90, 0xA2, 0xDA, 0x00, 0x64, 0x44};

byte ip[] = {192,168,1,151};

byte ip[] = {192,168,1,131};

unsigned int port = 8888;

byte remoteip[] = {192,168,1,151};


char
unsigned int port = 8888;

packetBuffer[UDP_TX_PACKET_MAX_SIZE];
int led = 2;

char

packetBuffer[UDP_TX_PACKET_MAX_SIZE];

void setup(){

int led = 2;

Ethernet.begin(mac,ip);
Udp.begin(port);

void setup(){

Serial.begin(9600);

Ethernet.begin(mac,ip);

pinMode(led,OUTPUT);

Udp.begin(port);

Serial.begin(9600);
}

void loop(){
int packetSize = Udp.parsePacket();

void loop(){
Udp.beginPacket(remoteip, port);

if(packetSize)
{

Udp.write('1');

Udp.read(packetBuffer,

Serial.println('1');

UDP_TX_PACKET_MAX_SIZE);

Udp.endPacket();

Serial.println(packetBuffer[0]);

delay(3000);

if(packetBuffer[0] == '1'){

Udp.beginPacket(remoteip, port);

digitalWrite(led,HIGH);

Udp.write('2');

Serial.println('2');

if(packetBuffer[0] == '2'){

Udp.endPacket();

digitalWrite(led,LOW);

delay(3000);

}
}

delay(10);
}

possvel avaliar se o dispositivo est se comunicando via ethernet atravs do


comando ping IP via CMD do Windows, conforme Figura 7.

Figura 7: A configurao dos 2 ARDUINOS foram confirmadas atravs do MS-DOS.

Exerccio Extra (1 Ponto)

Repetir o exerccio 3 agora com comunicao Ethernet e sem mestre e


escravo. Os dispositivos devem executar o programa de duas formas: manual e
automtico. Na forma manual os acionamentos so realizados como no exerccio 2,
enviando comandos por um Browser. Na forma automtica os acionamentos so
enviados via mensagem UDP.

BIBLIOGRAFIA
[1]

http://www.asciitable.com/

[2]

http://arduino.cc/

ANEXO 1 Tabela AscII

Você também pode gostar