Arduino – Comunicação UDP Parte1

Opa, pessoal tudo belezinha? Depois de um tempo sem postar nada de Arduino com o Ethernet Shield e o foco saiu bastante com comunicação serial (USB CDC) agora vou postar como realizar a comunicação de um computador, servidor local ou remoto com um Arduino via Ethernet, nessa primeira parte vou mostrar a biblioteca que utilizei arduino_uip escrita por Norbert Truchsess baseado na Stack uIP de Adam Dunkels, porém neste caso esta biblioteca foi escrita especialmente para um ENC28J60 que é o que eu precisei e a uIP foi a base para eu construir a minha própria quando fiz minha monografia.

A biblioteca completa com exemplos pode ser adquirida no link abaixo:

https://github.com/ntruchsess/arduino_uip

Esta biblioteca possui suporte completo para aplicação cliente/servidor TCP e UDP além de recursos ARP, ICMP, DHCP e DNS, mas o foco deste post é UDP.

Acho que não tem segredo quanto baixar a biblioteca e copia no diretório libraries do Arduino tanto em Linux quanto em Windows, no caso estou usando Arduino IDE 1.0.5 e arduino_uip 1.0.1.

Nosso pequeno projeto consiste em baseado num IP fornecido iremos enviar a string “copa2014” eu pensei em “copa2014SQN” hehe mas “copa2014” ta em ritmo ainda :), então vamos lá…

Acho que ficou bem comentado e bem direto, temos o IP do Arduino e depois IP do servidor e a porta que você pode trocar ambos, agora vamos ver o código utilizado do lado do servidor.

Salvei este código com o nome ArduinoUDPServer.py, no caso estou utilizando uma VM Linux e você deve setar a permissão +x (execução) para todos.

Agora vamos iniciar a aplicação Python e ver a saída:

Agora ligando o Arduino + EthernetShield já com o firmware gravado, vamos monitorar pelo Monitor Serial da própria IDE:

Após ligar o Arduino + Ethernet Shield vamos ver como esta nossa aplicação ArduinoUDPServer.py que ficara em um loop infinito:

Hum, legal heim? Mas e se nosso programa em Python mostrar na tela Data/Hora de cada recebimento seria legal para acompanhar, vamos tentar?

Vamos ver agora como fica a saída do nosso ArduinoUDPServer.py baseado no envio de 5 segundos que configuramos no Arduino:

Espero que tenham gostado e vamos aguardar o próximo!

Dica: Hum, usei Python em uma VM Linux, pensou em usar esta aplicação no RaspberryPI ou BeagleBone Black para comunicar? :)

Duvida ou problemas post nos comentários.

Até a próxima!

Referências

Norbert Truchsess
https://docs.python.org/2/library/socket.html
https://github.com/ntruchsess/arduino_uip
http://en.wikipedia.org/wiki/UIP_(micro_IP)

Share Button

CC BY-NC-SA 4.0 Arduino – Comunicação UDP Parte1 by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

  • rafael

    estou tentando usar o modulo enc28j60 como cliente so tenho que enviar e receber uma string para um servidor local estou usando a lib ethercard-master
    mais nao estou conseguindo nada alguem pode me ajudar

    • Temos dois problemas:

      1) Você esta tentando enviar e receber no caso do post eu apenas enviei com o Arduino sendo o client e a minha VM Linux como servidor apenas recebendo a string UDP.

      2) Eu usei a pilha TCP para ENC28J60 da UIP desenhada para este CI, a que você esta usando é a Ethercard-master do Guido Socher e Pascal Stang e não tem nada haver, você pode baixar e usar a que eu escrevi no post sem problemas, não irá conflitar. Mas eu já usei Ethercard-master mudei algumas coisas para adaptar para minha como é GPLv3 eu teria que disponibilizar o código, mas não fico legal na época sem contar que aquele buffer[] que deve ser definido me assusta.

      Tanto é que Norbert Truchsess usa os headers e cpp do Pascal porém é modificado, e devido a algumas libs possui a licença GPLv2 mas UIp de Adams é BSD, por isso existem varios portes, é uma lib muito interessante e é BSD o tipo de licença.

      Espero ter sanado sua duvida.

      Abraço

      • rafael

        o problema e que eu nao consigo receber os dados no arduino e a biblioteca arduino_uip gera um arquivo muito grande e acredito que nao vai caber nos 32k do arduino

  • Rafael

    oioi renato ainda continuo tentando sem sucesso enviar e receber uma string para um servidor local.
    você já conseguiu rodar o exemplo UDP Client da biblioteca arduino_uip eu só recebo os dados no computador mas não no arduino.
    Desde já muito obrigado pela ajuda.

    • Neste exemplo a VM é o UDPServer e o Arduino UDPClient, é possível implementar como UDPClient na VM e UDPServer no Arduino e sendo ambos Client e Server nos dois lados, pretendo escrever sobre os três modos aqui no blog, mas já consegui fazer funcionar das três maneiras com uIP.

  • Rafael

    Então Cleiton o meu problema e exatamente a parte de implementar o cliente e o server UDP no Arduíno que esta me deixando louco.
    Vc poderia postar o código ou alguma coisa que pudesse me ajudar com relação a isso ?

  • Agnno Marinho

    Muito interessante, onde encontro mais sobre esse assunto?

    • Que bom que gostou Agnno, o assunto você consegue pesquisando sobre implementação com UDP, e pode estudar o protocolo em si e as camadas para trabalhar com o mesmo.
      Este post vai ter continuação e mais artigos sobre UDP e embarcados, até já tem um pronto mas estou refinando e dando os últimos retoques.

  • Cesco Ferraro

    Tu acabou de responder uma pergunta minha no SO. Acabei caindo no teu blog. É legal achar pessoas interessadas pelo mesmo assunto. UDP não é menos confiável que TC

  • Cesco Ferraro

    Tu acabou de responder uma pergunta minha no SO. Acabei caindo no teu blog. É legal achar pessoas interessadas pelo mesmo assunto. UDP não é menos confiável que TCP? Eu trabalho com automação residencial e uso a Ethernet.h mesmo. Tu enxerga alguma vantagem sobre dessa library sobre a Ethernet.h convencional? Já usou com Wi-Fi shield? Esp8266?

    • Olá Cesco, não sei onde respondi sua pergunta mas espero ter ajudado. Sobre UDP e TCP existem propósitos para um e outro, e não sei que termo você quis dizer com confiável, pois UDP é mais “simples” porém não tem a confirmação da entrega de pacote, se for por este ponto de confiança, sim é menos confiável e ae esse tratamento você deverá implementar, agora se for sobre segurança diria que não.
      A lib do Ethernet.h usei apenas para protótipos, já a lwip uso em produtos comerciais, assim como ENC28J60 e o Wiznet W5100, mas normalmente retrabalhei nas libs para uma melhor encaixe como produto.
      Não tive oportunidade de trabalhar com os modulos que informou.

      Abraço

  • Paulo Cesar Santos

    Olá Cleiton não entendo nada de nada teria algo sobre comunicação bilateral dados do rfid pro servidor com retorno de dados ao arruino cliente, tipo o arduino lê a tag envia ao servidor o servidor retorna um comando ao arduino

  • Tiago Teixeira

    Olá estou iniciando no mundo arduino estou precisando receber pacotes via udp no módulo ESP8266 usei um exemplo:
    #include
    #include

    const char* ssid = “xxxxxx”;
    const char* password = “xxxx”;

    WiFiUDP UDPTestServer;
    unsigned int UDPPort = 20777;

    const int packetSize = 1024;
    byte packetBuffer[packetSize];

    void setup() {
    Serial.begin(115200);
    delay(10);

    Serial.println();
    Serial.println();
    Serial.print(“Connecting to “);
    Serial.println(ssid);

    WiFi.begin(ssid, password);
    WiFi.config(IPAddress(192, 168, 0, 60), IPAddress(192, 168, 0, 1), IPAddress(255, 255, 255, 0));

    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(“.”);
    }

    Serial.println(“”);
    Serial.println(“WiFi connected”);
    Serial.println(“IP address: “);
    Serial.println(WiFi.localIP());

    UDPTestServer.begin(UDPPort);

    }

    int value = 0;

    void loop() {
    handleUDPServer();
    delay(1);
    }

    void handleUDPServer() {

    int cb = UDPTestServer.parsePacket();

    if (cb) {
    UDPTestServer.read(packetBuffer, packetSize);

    String myData = “”;
    Serial.println(“#######################”);
    for (int i = 0; i < packetSize; i++) {
    myData += (char)packetBuffer[i];
    }
    Serial.println(myData);
    Serial.println("#######################");
    }
    }

    Só que após eu enviar uma série de pacotes o arduino fica travado nem o ping responde ae parece que ele reinicia e volta, ele tem uma limitação sabe o que pode ser que está acontecendo ele recebe uns 15 pacotes e não consegue mais processar