Arduino: Ethernet: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
Linha 67: Linha 67:
Este laboratório 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  <ref>https://www.arduino.cc/en/Tutorial/LibraryExamples/WebServer</ref>.
Este laboratório 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  <ref>https://www.arduino.cc/en/Tutorial/LibraryExamples/WebServer</ref>.


===Exemplo===
Programa exemplo: [https://www.arduino.cc/en/Tutorial/LibraryExamples/WebServer Arquivo/Exemplos/Ethernet/Web Server]:
 
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
/*
/*
   Web Server para fornecer a temperatura usando sensor LM35
   Web Server
  O sensor de temperatura (LM35) é conectado a entrada analógica 0 do Arduino.
 
  Based in Sketche: Arduino -> Ethernet -> BarometricPressureWebServer
A simple web server that shows the value of the analog input pins.
  by Tom Igoe (2010)
using an Arduino Wiznet Ethernet shield.
 
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)
 
created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
modified 02 Sept 2015
by Arturo Guadalupi
  */
  */
#include <Ethernet.h>
 
#include <SPI.h>
#include <SPI.h>
// assign a MAC address for the ethernet controller.
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
 
// assign an IP address for the controller:
// Enter a MAC address and IP address for your controller below.
IPAddress ip(192,168,1,20);
// The IP address will be dependent on your local network:
IPAddress gateway(192,168,1,1);
byte mac[] = {
IPAddress subnet(255, 255, 255, 0);
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
// Initialize the Ethernet server library
};
EthernetServer server(80);
IPAddress ip(192, 168, 1, 177);
  //Sensor de temperatura LM35
 
//ConversaoGrausCelcius = 5 / 1023 * 100 = 0,488758553
// Initialize the Ethernet server library
  const float ConversaoGrausCelcius = 0.488758553;
// with the IP address and port you want to use
  float  SensorLM35;
// (port 80 is default for HTTP):
void setup() {
EthernetServer server(80);
     Serial.begin(9600);
 
  // start the Ethernet connection and the server:
void setup() {
  Ethernet.begin(mac, ip);
  // You can use Ethernet.init(pin) to configure the CS pin
  server.begin();
  //Ethernet.init(10); // Most Arduino shields
  delay(1000);  
  //Ethernet.init(5);  // MKR ETH shield
  Serial.print("server is at ");
  //Ethernet.init(0);  // Teensy 2.0
  Serial.println(Ethernet.localIP());
  //Ethernet.init(20); // Teensy++ 2.0
}
  //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet
void loop() {
  //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet
  // Faz a leitura do sensor periodicamente.
 
  Serial.print('.');
  // Open serial communications and wait for port to open:
  SensorLM35 = analogRead(A0) * ConversaoGrausCelcius;
  Serial.begin(9600);
  // listen for incoming Ethernet connections:
  while (!Serial) {
  listenForEthernetClients();
     ; // wait for serial port to connect. Needed for native USB port only
  delay(1000);
  }
}
  Serial.println("Ethernet WebServer Example");
void listenForEthernetClients() {
 
  // listen for incoming clients
  // start the Ethernet connection and the server:
  EthernetClient client = server.available();
  Ethernet.begin(mac, ip);
  if (client) {
 
    Serial.println("Got a client");
  // Check for Ethernet hardware present
    // an http request ends with a blank line
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    boolean currentLineIsBlank = true;
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (client.connected()) {
    while (true) {
      if (client.available()) {
      delay(1); // do nothing, no point running without Ethernet hardware
        char c = client.read();
    }
        Serial.write(c);  
  }
        if (c == '\n' && currentLineIsBlank) {
  if (Ethernet.linkStatus() == LinkOFF) {
          // send a standard http response header
    Serial.println("Ethernet cable is not connected.");
          client.println("HTTP/1.1 200 OK");
  }
          client.println("Content-Type: text/html");  
 
          client.println("Connection: close");   
  // start the server
          client.println();
  server.begin();
          client.println("<!DOCTYPE HTML>");
  Serial.print("server is at ");
          client.println("<html>");        
  Serial.println(Ethernet.localIP());
          // output the value of temperature         
}
          client.print("Temperatura interna (oC) = ");
 
          client.print(SensorLM35);
 
          client.println("</html>");  
void loop() {
          break;
  // listen for incoming clients
        }
  EthernetClient client = server.available();
        if (c == '\n') {
  if (client) {
          currentLineIsBlank = true;
    Serial.println("new client");
        }  
    // an http request ends with a blank line
        else if (c != '\r') {
    boolean currentLineIsBlank = true;
          currentLineIsBlank = false;
    while (client.connected()) {
        }
      if (client.available()) {
      }
        char c = client.read();
    }
        Serial.write(c);
    delay(1);
        // if you've gotten to the end of the line (received a newline
    client.stop();
        // character) and the line is blank, the http request has ended,
    Serial.println("client disonnected");  
        // so you can send a reply
  }
        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");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        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();
    Serial.println("client disconnected");
  }
}
</syntaxhighlight>
</syntaxhighlight>



Edição das 13h03min de 30 de outubro de 2021

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.
Comunicação entre dois Arduínos
  • Conectar com um par de fios os dois Arduínos através das portas seriais de ambos os microcontroladores: 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);
 }
 }
  • Observar a comunicação serial a partir do led piscando no receptor e também monitorar a troca de mensagens a partir do monitor serial.

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 partir da IDE a porta de comunicação que está sendo 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 usando módulo Ethernet

O módulo Ethernet (Ethernet Shield), juntamente com a biblioteca Ethernet [1], permite que um Arduíno se conecte a Internet. Esta biblioteca provê funcionalidades tanto para cliente quanto par servidor, além de permitir a conexão com a rede local tanto usando IP fixo, DHCP e também usando DNS.

O Ethernet Shield 2 permite conectar o Arduíno a rede local e a Internet com conector RJ45 e velocidade de 10/100 Mbps. A conexão do shield com o Arduíno é realizada pelo barramento SPI (Serial Peripheral Interface), que faz uso dos pinos 10, 11, 12 e 13 do Arduíno para comunicação e necessita da biblioteca SPI.h. O SPI é uma interface de comunicação serial síncrona usada para comunicação em distâncias curtas. 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.

Para uso do módulo Ethernet há uma serie de exemplos prontos (Examples from Libraries).

Labortório 2: Web Server

Este laboratório 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 [2].

Programa exemplo: Arquivo/Exemplos/Ethernet/Web Server:

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 02 Sept 2015
 by Arturo Guadalupi
 
 */

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // You can use Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new 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 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 == '\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");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        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();
    Serial.println("client disconnected");
  }
}

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:

  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;

Referências


Evandro.cantu (discussão) 19h13min de 29 de outubro de 2021 (-03)