Arduino: Ethernet

De Wiki Cursos IFPR Foz
Revisão de 20h01min de 29 de outubro de 2021 por Evandro.cantu (discussão | contribs)
Ir para navegaçãoIr para pesquisar

Arduíno: Módulos de Comunicação

Comunicação Serial

Informações sobre comunicação serial e paralela

Comunicação Serial entre dois Arduíno

Emissor
Insere na porta serial os valores 0 e 1 de maneira alternada a cada dois segundos.
Receptor
Faz a leitura dos valores escritos pelo emissor e controla o LED.
  • 0 -> LED apagado.
  • 1 -> LED aceso.

Código do Arduíno emissor

 //emissor  
 int num = 0;
 void setup(){
  Serial.begin(9600);
 }
 void loop(){
  num = 0;
  Serial.write(num);
  delay(2000);
  num = 1;
  Serial.write(num);
  delay(2000);
 }

Código do Arduíno receptor

 //receptor
 int recByte;
 int led = 13;
 void setup(){
  Serial.begin(9600);
  pinMode(led,OUTPUT);
 }
 void loop(){
  if (Serial.available ()> 0)
    {
        recByte = Serial.parseInt();
        //parseInt() retorna o primeiro número inteiro válido do buffer serial.
        //Caracteres e não inteiros são ignorados.
    }
  if(recByte == 0){
    digitalWrite(led,LOW);
  }else if(recByte == 1){
    digitalWrite(led,HIGH);
  }
 }

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.

Autoria
Matheus Marques / CST Análise e Desenvolvimento de Sistemas - IFPR - Câmpus Foz do Iguaçu

Comunicação com o Ethernet Shield

Este exemplo mostra como utilizar o 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);
 }
<syntaxhighlight>

===''Smartphone'' Android===
Para enviar caracteres de um '''''Smartphone'' Android''' para o módulo '''Bluetooth''' pode-se utilizar aplicativos como o [https://play.google.com/store/apps/details?id=com.ucconnect.ucbtadapter_hex&hl=pt-BR Bluetooth Serial Port Terminal] ou [https://play.google.com/store/apps/details?id=project.bluetoothterminal&hl=pt-BR 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 '''[https://www.arduino.cc/en/Main/ArduinoWirelessShield Wireless Shield]''' permite a '''comunicação serial sem fio''' baseado no módulo '''[http://www.digi.com/products/wireless-wired-embedded-solutions/zigbee-rf-modules/zigbee-mesh-module/xbee-zigbee Xbee]''' da Digi.

[[Arquivo:Arduino_WirelessSDShield.jpg|300px]]

===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):

[[Arquivo:WirelessShield_SD_switchUSB.png|100px]]

*'''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.

[[Arquivo:XbeeExplorerUSB.png|200px]]

===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'''.

<syntaxhighlight lang="c">
 //  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.

<syntaxhighlight lang="c">

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.print('H');
  delay(1000);
  Serial.print('L');
  delay(1000);
}

</syntaxhighlight">

  • 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:

  1. Os dispositivos precisam estar na mesma rede, definida pelo parâmetro ID;
  2. Os dispositivos precisam usar o mesmo canal, definido pelo parâmetro CH;
  3. 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;
Adaptação e autoria
--Evandro.cantu (discussão) 20h19min de 12 de julho de 2015 (BRT)

Referências



Adaptação e autoria
--Evandro.cantu (discussão) 19h00min de 12 de agosto de 2015 (BRT)