domingo, 14 de julho de 2013

11º Projeto: Arduino e shield Ethernet

    Há  cerca de uma semana chegou minha tao estimada compra no dealextreme.com/ e dessa vez chegou para mim um arduino Mega e o tão famoso shield Ethernet.
    Já de cara quis aprender a mexer com esse shield tão poderoso, verifiquei que há muitos projetos na net mas poucos projetos didáticos, então decidir criar algo fácil de entender.
    No caso eu decidir criar um sketch cujo tal o usuário apertava um botão e um led acendesse, coisa simples porém queria já criar um ambiente em html. Então...decidir estudar e foi esse o resultado

   Mas antes vamos entender um pouco sobre o shield Ethernet:





    O shield que eu usei em questao foi WiZnet W5100, como podemos notar ele possui uma entrada RJ-45 que faz a conexão com a LAN/WLAN possibilitando o Arduino interagir com a rede pessoal ou internet, podendo então fazer uma interação remota.
   Podemos notar pelas fotos que as pernas de conexão do shield com o Arduino e bem grande e também possui conectores fêmeas para a conexão de outros shields se for preciso. Note também que o shield possui uma entrada para microSD, que pode ser usado para armazenar dados da rede,  até onde pesquisei a biblioteca sdfatlib é a que funciona melhor.
    Arduino comunica tanto com o W5100 e o cartão SD usando o barramento SPI (através do cabeçalho ICSP).São os pinos digitais 11, 12 e 13 no Duemilanove e pinos 50, 51 e 52 no mega. Em ambas placas, pino 10 é usado para selecionar o W5100 e o pino 4 para o cartão SD. Esses pinos não pode ser usado em geral para   i / o. No Mega, o pino SS hardware, de 53 anos, não é usado para selecionar o W5100 ou o cartão SD, mas deve ser mantido como uma saída ou a interface SPI não vai funcionar.
    A conexão com o Arduino mais o protoboard que eu montei está representada pela foto abaixo:


Material:


   - Arduino
     - Protoboard
     - Fios Jumpers
     - Resistor 220 ohms
     - Led



Código:




   
 #include <SPI.h>  
 #include <Ethernet.h>  
 //A linha abaixo permite que voce defina o endereço fisico (MAC ADDRESS) da placa de rede  
 byte mac[] = { 0xAB, 0xCD, 0x12, 0x34, 0xFF, 0xCA };  
 //Os valores abaixo definem o endereço IP, gateway e máscara. Configure de acordo com a sua rede.  
 IPAddress ip(192,168,0,170);     //<<<<<<<<<<<<<<<<<<<<<Define o endereço IP  
 IPAddress gateway(192,168,0,1);   //Define o gateway  
 IPAddress subnet(255, 255, 255, 0); //Define a máscara de rede  
 //Inicializa a biblioteca da placa ethernet com as configurações de IP fornecidas  
 EthernetServer server(80);  
 char link[]="http://arduinoprog.blogspot.com.br//"; //link   
 boolean ledState = false; //estado do led   
 int botao1 = 6;  //Botao que aciona o led vermelho  
 int led = 2; //pino do led  
 int estado = 0; //Armazena o valor de leitura do botao1  
 char mensagem[20];  //Mensagem a ser apresentada para o botao1  
 void setup()  
 {  
  pinMode(botao1, INPUT);  
  pinMode(led, OUTPUT);  
  Serial.begin(9600);  
  //Inicializa a conexao ethernet e o servidor web na porta 80  
  Ethernet.begin(mac, ip);  
  server.begin();  
  Serial.print("server is at ");  
  Serial.println(Ethernet.localIP());  
 }  
 void loop(){  
   estado=digitalRead(botao1);  //Verifica o status do Botao1 e imprime mensagem no browser  
   switch(estado){  
   case HIGH:  
   acionaBotao(); // chama a função que aciona o botão  
   break;      
    }  
 }  
  void acionaBotao(){  
   char mensagem[] = "Botao acionado. Led Aceso !!!"; // mensagem que apresenta no browser  
     dados(mensagem);  
     ledState =~ ledState;  
     delay(150);  
     if (ledState==false) //condição de apresentação de mensagem na tela se led estiver apagado  
     dados("Loading... Led apagado "); //Imprime mensagem padrao, aguardando novo acionamento  
     Serial.println("botao Acionado");  
     digitalWrite(led, ledState);  
  }  
 //Rotina que recebe os valores de Mensagem, imprimindo o resultado no browser  
 void dados(char msg[])   
 {  
  // listen for incoming clients  
  EthernetClient client = server.available();  
  if (client) {  
   Serial.println("new client");  
   boolean currentLineIsBlank = true;  
   while (client.connected()) {  
    if (client.available()) {  
     char c = client.read();  
     Serial.write(c);  
      if (c == '\n' && currentLineIsBlank) {  
      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: 0"); // refresh the page automatically every 5 sec  
      client.println();  
      client.println("<!DOCTYPE HTML>");  
      client.println("<html>");  
      //BackGround  
      client.print("<body style=background-color:white>"); //cor do background  
      client.print("<title> Teste do Shield Ethernet </title>");  
      // Configuração da página do HTML  
      client.print("<h1><p align=center> Teste Shiled - Arduino </center></h1>"); //alinhamento do testo centralizado e cabeçalho tipo h1  
      client.print("<hr width=30% noshade"); //linha horizontal abaixo do texto: Teste Shield - Arduino  
      client.print("<h3>Link >> </h3>"); //Linha duvidas  
      /*link pra pagina arduinoprog.blogspot.com.br*/  
      client.print("<a href=");  
      client.print(link);  
      client.print(">ArduinoProg</a>");  
      client.print("<br /br>"); //quebra de linha  
      client.print("<p align=center> Leitura do botao: </center>");  
      client.print(msg);  
      client.print("<hr width=30% noshade"); //linha horizontal abaixo do texto: Teste Shield - Arduino  
      client.println("<br /br>");  
      client.print("<h6> Esse texte foi desenvolvido por Felipe S. Amaral. </h6>");  
      break;  
     }  
     if (c == '\n') {  
      currentLineIsBlank = true;  
     }   
     else if (c != '\r') {  
      currentLineIsBlank = false;  
     }  
    }  
   }  
   delay(1);  
   client.stop();  
   Serial.println("client disonnected");  
  }  
  }  


Imagens:


      Ao carregar o sketch no seu arduino você deverá entrar com o ip que você selecionou no começo do programa se tudo ocorrer certo estas telas deverão ser apresentadas.


No caso do led desligado.


No caso do led aceso.


Conclusão:


    O programa desenvolvido é de fácil compreensão e fácil montagem. O uso do shield ethernet e bastante amplo, pode ser usado desde uma simples interação com sua LAN ou até mesmo com sua redeWLAN.
     Espero que tenham gostado e aprendido.
     Estou a disposição para futuras discussões. 


7 comentários:

  1. Parabéns Felipe, excelente material.

    Para projetos onde a iteração remota é essencial, com essa shield, uma conta do no.ip e alguns ajustes no model ADSL fica fácil monitorar ou acionar algo em qualquer parte do mundo.

    ResponderExcluir
  2. Muito bom este exemplo, mas me tira uma duvida, eu defini um endereço IPAddress ip(192,168,0,170) como IPAddress ip(192,168,0,123), e o mac tambem mudei de byte mac[] = { 0xAB, 0xCD, 0x12, 0x34, 0xFF, 0xCA } para byte mac[] = { 0xCC, 0x14, 0x62, 0x22, 0xAC, 0xED } quando eu coloco o endereco de ip que defini no browser nao acontece nada, tem algum erro que nao sei o que e'. vc poderia me ajudar? No aguardo

    ResponderExcluir
    Respostas
    1. Rafel, desculpe a demora em responde-lo, semana de provas...e ainda estou nela!!! Mas vamos la, acredito eu que ao mudar seu MAC vc declarou o errado da sua placa, afinal cada placa de shield Ethernet possui uma MAC diferente.
      Este é o endereço de hardware exclusivo que é usado para comunicar diretamente com seu shield através da Ethernet. Então, tente usar esse:

      byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

      Agora sou eu que espero o retorno para ter a certeza que funcionou. Grato!!!

      Excluir
  3. Internet Arduino com Ethernet Shield, sabe informar se esta placa usa protocolo de gerenciamento SNMP?

    ResponderExcluir
    Respostas
    1. Sim é possível, mas é limitado. Dê uma olhada aqui:
      https://code.google.com/p/agentuino/

      Excluir
  4. Quando vou importar o agentuino aparece um erro " Specified folder/zip file does not contain a valid library"

    se alguem souber me ajude

    ResponderExcluir
    Respostas
    1. Deve-se baixar a library correta para utilizar o ethernet shield: https://github.com/Wiznet/WIZ_Ethernet_Library. No seu compilador, clique em Sketch - Include Library - Add .ZIP Library. Espero ter lhe ajudado!

      Excluir