Arduino: Ethernet
Arduíno: Comunicação e Rede
Comunicação Serial
- Conceitos sobre comunicação serial e paralela
Comunicação Serial no Arduíno
Veja referência sobre comunicação Serial no Arduíno.
O Arduíno UNO possui uma porta serial (Serial) (também referida como UART) e se comunica através dos pinos 0 (RX) e 1 (TX), assim como com o computador via USB. Se você utiliza a comunicação serial não pode utilizar os pinos 0 e 1 como entradas e saídas.
Também é possível utilizar o monitor serial, disponível na IDE do Arduíno, para comunicação bidirecional com uma placa Arduíno conectada em uma porta USB.
Não é possível utilizar as portas seriais do Arduíno diretamente em uma comunicação com uma interface RS232, pois esta usa tensões de -12 V e 12 V.
- Outras placas Arduíno
- O Arduíno Leonardo usa a Serial exclusivamente para comunicação com a porta USB. Para comunicação serial nos pinos 0 (RX) and 1 (TX) deve-se utilizar a Serial1.
- O Arduíno Mega tem três portas de comunicação serial adicionais: Serial1, Serial3 e Serial3.
Laboratório 1: Comunicação serial entre dois Arduínos
- Monitor Serial
- O monitor serial permite enviar dados do computador ao Arduíno pela interface serial USB.
- Carregar programa exemplo Arquivo/Exemplos/Communication/PhysicalPixel e acionar o led do pino 13 a partir de comandos H e L enviados pelo monitor serial.
- Conectar os dois Arduínos através das portas seriais: TX->RX e RX<-TX;
- Carregar no receptor o programa exemplo Arquivo/Exemplos/Communication/PhysicalPixel;
- Carregar no emissor o código abaixo:
//emissor
int num = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write('H');
delay(2000);
Serial.write('L');
delay(2000);
}
}
Configuração do SimulIDE para comunicação serial com Arduíno
É possível realizar comunicação serial entre um Arduíno rodando no SinulIDE e um Arduíno conectado a porta USB do computador.
- No Arduíno conectado a USB, verificar a porta de comunicação utilizada: ttyACM0 (p.ex.);
- No Arduíno no SimulIDE, clicar com o botão direito do mouse sobre a placa e selecionar Open Serial Port;
- No bloco Uart que vai abrir, clicar com o botão direito do mouse e selecionar properties;
- Escrever em port name o nome da porta serial;
- Clicar em Open para ativar a porta (deve indicar sucesso com o botão vermelho).
Comunicação com o Ethernet Shield
Este exemplo mostra como utilizar um Ethernet Shield juntamente com o Arduíno para criar um Web Server que forneça informações sobre sensores conectados a entradas analógicas (Ver: https://www.arduino.cc/en/Tutorial/WebServer).
Usando a biblioteca Ethernet.h, o Arduíno pode responder a requisições HTTP através do Ethernet Sheild.
O Ethernet Shield permite conectar o controlador Ethernet WizNet ao Arduíno usando o barramento SPI. O barramento SPI (Serial Peripheral Interface) é um interface de comunicação serial síncrona usada para comunicação em distâncias curtas, e usa a biblioteca SPI.h. O barramento SPI usa os pinos 10, 11, 12 e 13 do Arduíno para implementar a conexão SPI com o WizNet. O Ethernet Shield possui ainda um slot para cartão SD e usa o pino 4 para controlar o pino de seleção do cartão SD.
Exemplo
/*
Web Server para fornecer a temperatura usando sensor LM35
O sensor de temperatura (LM35) é conectado a entrada analógica 0 do Arduino.
Based in Sketche: Arduino -> Ethernet -> BarometricPressureWebServer
by Tom Igoe (2010)
*/
#include <Ethernet.h>
#include <SPI.h>
// assign a MAC address for the ethernet controller.
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// assign an IP address for the controller:
IPAddress ip(192,168,1,20);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255, 255, 255, 0);
// Initialize the Ethernet server library
EthernetServer server(80);
//Sensor de temperatura LM35
//ConversaoGrausCelcius = 5 / 1023 * 100 = 0,488758553
const float ConversaoGrausCelcius = 0.488758553;
float SensorLM35;
void setup() {
Serial.begin(9600);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
delay(1000);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// Faz a leitura do sensor periodicamente.
Serial.print('.');
SensorLM35 = analogRead(A0) * ConversaoGrausCelcius;
// listen for incoming Ethernet connections:
listenForEthernetClients();
delay(1000);
}
void listenForEthernetClients() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("Got a client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of temperature
client.print("Temperatura interna (oC) = ");
client.print(SensorLM35);
client.println("</html>");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println("client disonnected");
}
}
Comunicação com Módulo Bluetooth
O módulo Bluetooth permite interagir com o Arduíno, por exemplo, utilizando um aplicativo em um smartphone.
Um módulo Bluetooth bastante utilizado é o HC06 (ver: http://www.instructables.com/id/Add-bluetooth-to-your-Arduino-project-ArduinoHC-06):
Pinagem e conexão com o Arduíno
Este módulo apresenta 6 pinos, mas com apenas 4 pinos é possível colocar o mesmo para funcionar e fazer o Arduíno interagir dispositivos Bluetooth.
_________ | | | | | | |Bleutooth| | | | HC06 | | | | | |_________| | | | | Vcc ----+ | | +---- Txd Gnd ------+ +------ Rxd
Cuidados com a conexão do módulo Bluetooth HC06 com o Arduíno:
- O HC06 funciona com alimentação Vcc=3,3V, a qual também é fornecida pelo Arduino ao lado da alimentação de 5V;
- Na comunicação serial, como o Arduíno fornece 5V, é necessário utilizar um divisor de tensão na entrada Rxd do HC06, conforme exemplo abaixo:
VRxd = R2/(R1 + R2).5
- Exemplo:
R1=470 Ω, R2=1 KΩ -> VRxd = 3,4 V
Teste do módulo bluetooth
- PhysicalPixel
- Permite acender e apagar led a partir de aplicativo Android pareado com módulo Bluetooth:
- Carregar no Arduíno o programa exemplo Arquivo/Exemplos/Communication/PhysicalPixel;
- Abrir aplicativo Bluetooth Terminal e parear com módulo Bluetooth;
- Acender a apagar led 13 com caracteres H e L.
Exemplos de programas de aplicação
Fonte: http://www.instructables.com/id/Add-bluetooth-to-your-Arduino-project-ArduinoHC-06
- Echo Code
- Permite enviar uma string ao Arduíno via Bluetooth e receber de volta a mesma string no monitor serial.
String message; //string that stores the incoming message
void setup()
{
Serial.begin(9600); //set baud rate
}
void loop()
{
while(Serial.available())
{//while there is data available on the serial monitor
message+=char(Serial.read());//store string from serial command
}
if(!Serial.available())
{
if(message!="")
{//if data is available
Serial.println(message); //show the data
message=""; //clear the data
}
}
delay(1000); //delay
}
- Led Code
- Permite acender e apagar um led conectado ao Arduíno enviando caracteres via Bluetooth de um smartphone ou outro dispositivo Bluetooth.
char blueToothVal; //value sent over via bluetooth
char lastValue; //stores last state of device (on/off)
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop()
{
if(Serial.available())
{//if there is data being recieved
blueToothVal=Serial.read(); //read it
}
if (blueToothVal=='n')
{//if value from bluetooth serial is n
digitalWrite(13,HIGH); //switch on LED
if (lastValue!='n')
Serial.println(F("LED is on")); //print LED is on
lastValue=blueToothVal;
}
else if (blueToothVal=='f')
{//if value from bluetooth serial is n
digitalWrite(13,LOW); //turn off LED
if (lastValue!='f')
Serial.println(F("LED is off")); //print LED is on
lastValue=blueToothVal;
}
delay(1000);
}
Smartphone Android
Para enviar caracteres de um Smartphone Android para o módulo Bluetooth pode-se utilizar aplicativos como o Bluetooth Serial Port Terminal ou Bluetooth V2.1 SPP Terminal
- Arduíno Leonardo
- O Arduíno Leonardo usa a Serial exclusivamente para comunicação com a porta USB. Para comunicação serial TTL (5V) nos pinos 0 (RX) and 1 (TX) deve-se utilizar a Serial1.
Comunicação sem fio com Wireless Shield e Xbee
O Wireless Shield permite a comunicação serial sem fio baseado no módulo Xbee da Digi.
Configuração do Wireless Shield
A placa Wireless Shield possui uma chave de configuração da comunicação serial entre o módulo Xbee e o microcontrolador do Arduino e o conversor serial USB (ver: https://www.arduino.cc/en/Main/ArduinoWirelessShield):
- Posição micro: O pino Dout do módulo Wireless é conectado ao pino RX do microcontrolador do Arduino e o pino Din ao pino TX do microcontrolador. O módulo sem fio se comunica de forma serial com o microcontrolador do Arduino. Destaca-se que os pinos TX e RX do microcontrolador também continuam conectados aos pinos RX e TX do conversor serial USB. Desta forma, dados transmitidos pelo microcontrolador serão enviados simultaneamente ao módulo sem fio e a serial USB. Neste modo o microcontrolador do Arduino não pode ser programado via USB.
- Posição USB: O pino Dout do módulo Wireless é conectado ao pino RX do conversor serial USB e o pino Din ao pino TX do conversor serial USB. O módulo sem fio se comunica diretamente com o computador. Para usar este modo o microcontrolador do Arduíno deve ser programado com um sketch vazio:
void setup() { } void loop() { }
- Xbee Explorer USB
- A placa Wireless Shield com a chave na posição USB e o microcontrolador do Arduíno programado com sketch vazio se comporta como um módulo Xbee Explorer USB, com o Xbee se comunicando diretamente com o computador.
Exemplo de utilização
Exemplo de comunicação usando a configuração padrão dos módulos Xbee, apresentado em https://www.arduino.cc/en/Guide/ArduinoWirelessShield:
- Para fazer a carga de programas no microcontrolador do Arduíno, colocar a chave do módulo wireless na posição USB.
- Em um dos Arduínos com módulo Wireless carregar o programa
Exemples->Communication->Physical Pixel
- Este programa faz o Arduíno acender ou apagar o led da porta 13 a partir do envio do caracter H ou L a partir do monitor serial. Testar o funcionamento do programa com a chave do módulo wireless na posição USB. Em seguida desconectar o Arduíno da interface USB e mudar a chave do módulo wireless para a posição micro.
// Physical Pixel
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == 'H') {
digitalWrite(ledPin, HIGH);
}
if (incomingByte == 'L') {
digitalWrite(ledPin, LOW);
}
}
}
- Em outro Arduíno com módulo wireless, carregar o programa abaixo com chave do módulo wireless na posição USB. Verificar o funcionamento do programa no monitor serial. Depois de carregado o programa mudar a chave do módulo wireless para a posição micro.
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print('H');
delay(1000);
Serial.print('L');
delay(1000);
}
- Para testar a comunicação serial sem fio, conectar o primeiro Arduíno na fonte de alimentação e verificar se a comunicação entre os Arduínos acontece, fazendo o led piscar.
- Caso não haja comunicação, tente restabelecer a configuração padrão (default) nos módulos Xbee (veja abaixo).
- Arduíno Leonardo
- O Arduíno Leonardo usa a Serial exclusivamente para comunicação com a porta USB. Para comunicação serial TTL (5V) nos pinos 0 (RX) and 1 (TX) deve-se utilizar a Serial1.
Endereçamento dos módulos Xbee
Vários parâmetros precisam ser configurados para que os módulos Xbee possam se comunicar:
- Os dispositivos precisam estar na mesma rede, definida pelo parâmetro ID;
- Os dispositivos precisam usar o mesmo canal, definido pelo parâmetro CH;
- O endereço destino (DH e DL) determina qual módulo da rede receberá os dados:
- Se o DH = 0 e o DL < 0xFFFF (i.e. 16 bits), o dado transmitido pelo módulo será recebido por qualquer módulo cujo endereço de 16-bit MY é igual a DL;
- Se o DH = 0 e o DL = 0xFFFF, o dado transmitido será recebido por todos os módulos (broadcast);
- Se o DH ≠ 0 e o DL > 0xFFFF, o dado transmitido será recebido somente pelo módulo cujo número serial seja igual ao endereço destino (i.e. SH = DH e SL = DL).
Síntese de alguns parâmetros:
Parâmetro | Descrição | Valor default |
ID | Identificador de rede | 3332 |
CH | Canal | C |
SH SL | Numero de série | Diferente para cada módulo |
MY | Endereço do módulo | 0 |
DH DL | Endereço destino | 0 |
BD | Vazão da comunicação serial (bps) | 3 (9600 bps) |
Configuração do módulo Xbee
Para a configuração do módulo Xbee é interessante utilizar o software XCTU da Digi ou o moltosenso Network Manager, os quais apresentam facilidades para configuração e atualização dos módulos wireless.
- Exemplo de configuração com o software moltosenso Network Manager
- Baixar e instalar o software moltosenso Network Manager IRON 1.0 (Free):
- Na guia Port Setup é possível verificar a configuração da porta, clique em Open Port e verifique se o dispositivo foi detectado;
- Clique no dispositivo e verifique as informações do mesmo em Current Device;
- Na guia Node Settings é possível selecionar o módulo e verificar seus parâmetos de configuração;
- Para restaurar os parâmetros default do dispositivo clique em Restore All e depois em Write Permanently;
Referências
Evandro.cantu (discussão) 19h13min de 29 de outubro de 2021 (-03)