Escolar Documentos
Profissional Documentos
Cultura Documentos
MDULO I
COMUNICAO SERIAL E ETHERNET COM
ARDUINO
REDES INDUSTRIAIS
JOS JEAN-PAUL ZANLUCCHI DE SOUZA TAVARES
Data
Editor
Revisor
03/10/2014
30/03/2015
24/08/2015
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:
FUNDAMENTAO TERICA
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.
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
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
AND
porta lgica E
||
OR
porta lgica OU
NOT
porta lgica NO
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.
}
Else {
Bloco de instrues 2
}
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.
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
Comprimento da mensagem
Checksum
char c;
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);
9600bps
pinMode(2, OUTPUT);
pinMode(led, INPUT);
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.
void setup() {
pinMode(2,OUTPUT);
Serial.begin(9600);
void loop()
{
if (Serial.available()>0)
{
c = Serial.read() - '0';
Serial.flush();
if(c==2)
{
digitalWrite(2,HIGH);
}
if(c==3)
{
digitalWrite(2,LOW);
}
}
}
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
void setup(){
pinMode(2,OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (Serial.available()>0)
{
c = Serial.read()-'0';
Serial.flush();
digitalWrite(c,!digitalRead(c));
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.
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.
#include <SPI.h>
#include <Ethernet.h>
boolean incoming = 0;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x64, 0x50 };// deve ser o endereo MAC especfico do Shield
Ehernet do Arduino
void setup() {
pinMode(2, OUTPUT);
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
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)
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);
Wire.endTransmission();
// para transmisso
x++; // incremente x
delay(500); // espera 0,5s
}
}
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();
Serial.println(x);
// imprime o integer
Wire
Master
#include <Wire.h>
void setup()
{
Writer
by
Nicholas
Zambetti
http://www.zambetti.com
Wire.begin();
{
char c = Wire.read(); // receibe um byte como caracter
Serial.print(c);
// imprime o caracter
}
delay(500);
}
//
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).
Emissor
Receptor
#include <SPI.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <EthernetUdp.h>
EthernetUDP Udp;
EthernetUDP Udp;
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);
}
BIBLIOGRAFIA
[1]
http://www.asciitable.com/
[2]
http://arduino.cc/