sexta-feira, 1 de agosto de 2014

Shield Ethernet Wiznet W5100 - como utilizá-lo

Olá pessoal,

No post anterior vimos que algumas mudanças seriam necessárias ao projeto e uma delas é de fundamental importância: a emissão de alertas via e-mail ou SMS. Para isso tinha que adquirir novos componentes que adicionassem essas funcionalidades ao projeto. O primeiro desses componentes que vamos ver hoje é o shield Ethernet Wiznet W5100.
Um shield é uma placa para Arduino que adiciona novas funcionalidades e dá a capacidade de "empilhar" uma placa na outra. Para que tenhamos a capacidade de enviar e-mail temos que ter o shield e um servidor de e-mail que pudéssemos utilizá-lo para enviar mensagens através de uma conexão SMTP. Também seria necessário criar uma conta válida de e-mail neste servidor para utilizar no Arduino.
Assumindo que a conta de e-mail já está criada e o shield já adquirido vamos à implementação individual do shield (sem outras conexões do projeto) para entendermos como ele funciona:




Esquema de ligação:

Basta encaixar o shield Ethernet no Arduino.




Lembrando um pouco de redes agora:

A tecnologia Ethernet implementa a parte física da rede (camada 1 do modelo OSI) e a parte mais em baixo nível da lógica de acesso à rede (camada 2 do modelo OSI). O shield Ethernet W5100 utiliza a biblioteca padrão Ethernet do Arduino e esta biblioteca implementa as funções de acesso à rede (camada 2), implementa também a camada de rede (camada 3 do modelo OSI) para ser utilizado em redes IP e implementa as funções de camada de transporte (camada 4 do modelo OSI). Cada dispositivo Ethernet deve ter um MAC address único e alocar um IP exclusivo dentro de uma rede.
Essas três camadas devem estar funcionando adequadamente para que a comunicação em rede seja realizada. Você deve ter uma rede já funcional (com equipamentos de rede como roteadores ou switches) e o shield Ethernet deverá alocar um IP dessa rede.
O teste básico de rede para verificar se há comunicação entre dois dispositivos configurados com IP na mesma rede é com o utilitário ping, presente nos mais diversos sistemas operacionais. Você deve testar assim em um prompt de comando ou terminal:

ping <o ip que se quer testar>

E se houver comunicação o outro dispositivo irá responder à solicitação.

Para testarmos basta carregar o sketch de exemplo WebServer:


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

// O MAC address dave ser setado aqui. Ele deve ser único na sua
// rede
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Se você utiliza DHCP na sua rede não precisa definir esta 
// variável. Se não utiliza coloque os quatro octetos do endereço
// separados por vírgula. Esse IP tem que estar dentro da sua
// rede IP já configurada
IPAddress ip(192,168,1,177);

// Como este sketch é para servidor devemos configurar uma porta
// que será utilizada pelo servidor para escutar solicitações.
// Como é um web server a porta padrão para o serviço Web (HTTP)
// é a porta 80
EthernetServer server(80);

void setup() {
 // Inicia a serial 
  Serial.begin(9600);
   while (!Serial) {
    ; // Espera a porta serial para conexão. Necessário somente quando estiver usando o Arduino Leonardo
  }


  // Inicia o dispositivo Ethernet e fica aguardando conexões
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // Ouvindo para clientes
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // Uma requisição http finaliza com uma linha em branco
    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");
  }
}

Este sketch irá iniciar um web server no Arduino, o endereço IP será o 192.168.1.177 e inicializará a porta 80 e a colocará em escuta.
Você pode testar se a comunicação IP está correta utilizando o ping. 

ping 192.168.1.177

Se der resposta a comunicação até o Arduino estará correta. 

Use um navegador e digite o endereço 192.168.1.177. Se aparecer a página o web server está respondendo solicitações na porta 80 e está respondendo com um conteúdo (neste sketch ele mostra o valor das entradas analógicas do Arduino).


Com este teste básico conseguimos colocar para funcionar o shield. No próximo post vamos ver como é realizado o envio de e-mail.




4 comentários:

  1. Estou montando meu primeiro projeto de automação residencial com arduino, e gostaria de controlar alguns reles, assim como simular um controle de TV, pelo Smartphone interagindo com o Ethernet Shield e o infravermelho. Consigo fazer eles(ethernet e o emissor ir) funcionarem separadamente, mas não consigo fazer os dois funcionarem no mesmo código. Debugando o codigo percebi que as funções funcionam normalmente, o problema é que quando conecto o shield ethernet o IR para de funcionar, eu não consigo faze-los funcionar de jeito algum se puder me ajudar agradeço.

    ResponderExcluir
  2. Olá Eduardo, desculpe-me pela demora em responder. Qual o shield Ethernet que você está utilizando? Se os dois funcionam separadamente dê uma olhada no site shieldlist.org os pinos que o seu shield Ethernet está usando e veja se não está conflitando com o pino do emissor IR. Certifique-se que não há mais nada que possa estar utilizando o pino do emissor IR.
    Se puder me enviar o seu código para eu dar uma olhada seria melhor.

    ResponderExcluir
  3. temo como fazer um circuito para bomba de água com thimer e sensor icos com arduino
    Daniel

    ResponderExcluir
  4. Boa noite Fernando, meus parabéns pelo blog.
    gostaria de tirar uma duvida contigo, tenho um projeto onde utilizarei o Shield Ethernet Wiznet W5100, como poderia utilizar ele junto com o sensor dht 1 e enviar os dados para o browser, como webservice, isto é ele enviar os mesmos dados que aparece no display lcd 16x2, eu nao estou conseguindo fazer funcionar.

    ResponderExcluir