Arduino: Ethernet

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar

Comunicação e Shields para Arduíno

Comunicação Serial

Informações sobre comunicação serial e paralela
Comunicação Serial entre dois Arduínos
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);
}

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.

Referências



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