Como usar um Shield Ethernet no Arduino
Usando um Shield Ethernet no Arduino
Uma das formas mais importantes de comunicação disponíveis com o Arduino é o padrão Ethernet. Trata-se de um protocolo de comunicação em redes que permite que dispositivos variados, como PCs, smartphones, roteadores, arduinos, etc., se comuniquem por meio do envio e recebimento de pacotes (frames / quadros, para ser mais exato), que são fluxos de dados organizados.
Cada dispositivo em uma rede possui seu próprio endereço IP, que é um endereço numérico que permite identificar cada dispositivo e dessa forma, se comunicarem entre si usando diferentes protocolos (padrões de software).
Shield Ethernet
No Arduino é bastante simples realizar essa comunicação via padrão Ethernet, com o uso de um Shield Ethernet e sua biblioteca correspondente. A imagem a seguir mostra um shield ethernet típico:
O Shield Ethernet na plataforma Arduino utiliza o chip WIZnet W5100 Ethernet, que fornece a pilha de rede TCP/IP, habilitando o dispositivo a se comunicar através de uma rede comum, tanto local quanto via Internet.
Esse shield possui um conector para cabo de rede RJ45, e sua taxa de transferência máxima é de 100 Mbps, podendo operar também em 10 Mbps (10/100).
Além disso, ele traz um slot para cartão microSD, que permite ler e armazenar dados no próprio shield (obviamente inserindo um cartão SD e executando a biblioteca SD).
Um shield ethernet realiza, basicamente, o papel que uma placa de rede executa em um computador comum. Antes de mostrarmos como funciona e como configurar esse shield, vamos discutir alguns termos relacionados a redes de computadores, que serão importantes no entendimento do processo de comunicação do Arduino.
Conceitos básicos de Redes
- Ethernet: Tecnologia de rede que permite a dispositivos enviarem dados entre si por meio de uma rede com fios, por meio de um endereço físico (identificação de hardware).
- Endereço MAC: Media Access Control / Controle de Acesso ao Meio, trata-se de um identificador (endereço) único que é atribuído aos dispositivos de rede, de modo que cada dispositivo seja identificado de forma única e possam assim se comunicar com outros dispositivos. Cada shield Ethernet para Arduino possui seu próprio endereço MAC, que nunca se repete.
- Protocolo de Rede: Um protocolo é uma linguagem de comunicação padronizada que permite que dispositivos troquem informações entre si (“conversem”). Para que essa comunicação seja possível, os dispositivos devem usar o mesmo protocolo, como se fosse a mesma “linguagem”. Um protocolo muito comum é o protocolo HTTP, que permite configurar um servidor Web (que podemos fazer com Arduino!).
- TCP/IP: Trata-se de uma pilha ou suíte de protocolos específica, ou seja, um grupo de protocolos que trabalham em conjunto para fornecer conectividade de rede a dispositivos. TCP significa “Protocolo de Controle de Transmissão”, e IP significa “Protocolo de Internet”, e esses dois são os protocolos mais importantes da pilha, que na verdade contém mais de 50 protocolos diferentes, cada um com uma função bem definida.
- Endereço IP: O IP é um endereço lógico, ou seja, não associado fisicamente a um dispositivo, mas que permite que os dispositivos de identifiquem em uma rede como a Internet.
- Gateway: Um gateway, também chamado de Gateway Padrão, é basicamente o endereço IP da porta de um roteador conectada à rede interna, a qual permite o roteamento (encaminhamento) dos pacotes para uma outra rede, geralmente a Internet.
A Biblioteca Ethernet
A biblioteca Ethernet, necessária para que seja possível utilizar o shield correspondente, é distribuída juntamente com o IDE do Arduino e permite a comunicação do Arduino com uma rede.
A tabela a seguir fornece uma descrição simplificada de algumas das funções mais comuns da biblioteca Ethernet, pertencentes às classes Ethernet, EthernetClient, EthernetServer e EthernetUDP:
Função | Descrição da Função |
Ethernet.begin(mac) Ethernet.begin(mac, ip) Ethernet.begin(mac, ip, gateway) Ethernet.begin(mac, ip, gateway,subnet) |
Função para inicialização da biblioteca, usando MAC, e opcionalmente IP e/ou gateway e máscara de sub-rede. |
Server(port) |
Permite criar um servidor que irá escutar em uma porta de comunicações específica. |
Server.begin() |
Função para inicializar o servidor, de modo a escutar as mensagens que chegam |
Server.write() |
Permite enviar dados para os dispositivos clientes conectados |
Server.available() |
Retorna um cliente, caso ele possua dados prontos para envio |
Server.print() |
Imprime dados para todos os clientes disponíveis. Esses dados são impressos na forma de uma sequência de dígitos ASCII. Por exemplo, o número 753 é retornado como os caracteres “7”, “5” e “3”. |
Server.println() |
Idem à função Server.print(), porém mudando de linha no final da mensagem |
Client(ip. porta) |
Permite criar um cliente que poderá se conectar ao endereço IP e à porta passadas à função. |
Client.connect() |
Inicia a conexão com o cliente |
Client.connected() |
Verifica se o cliente está ou não conectado ao servidor |
Client.write() |
Permite gravar dados no servidor |
Client.print() |
Imprime dados para o servidor. Esses dados são impressos na forma de uma sequência de dígitos ASCII. Por exemplo, o número 753 é retornado como os caracteres “7”, “5” e “3”. |
Client.println() |
Idem Client.print(), porém mudando de linha no final da mensagem |
Client.available() |
Retorna o número de bytes que estão disponíveis para serem lidos, enviados a partir do servidor. |
Client.read() |
Lê o próximo byte recebido do servidor |
Client.flush() |
Limpa todos os bytes escritos para o cliente, porém ainda não lidos |
Client.stop() |
Desconecta o cliente do servidor. |
EthernetUDP.begin(port) |
Inicializa o objeto UDP, especificando a porta a ser utilizada |
EthernetUDP.read(packetBuffer, MaxSize) |
Lê os pacotes UDP de um buffer |
EthernetUDP.write(mensagem) |
Envia uma mensagem UDP para a conexão remota |
EthernetUDP.beginPacket(ip. port) |
Executado antes de enviar uma mensagem, para especificar o endereço IP e a porta de destino |
EthernetUDP.endPacket() |
Função invocada após o envio da mensagem, para terminar a transmissão |
EthernetUDP.parsePacket() |
Verifica se existe mensagem para ser lida |
Ethernet.available() |
Retorna a quantidade de dados que foi recebida e também a que está disponível para ser lida na sequência. |
Nas próximas partes desse tutorial, vamos mostrar como utilizar o shield Ethernet e as bibliotecas listadas acima para criar diversas aplicações de rede com o Arduino, como por exemplo um servidor Web e um cliente de rede local.
Próximo: Projeto – Criando um Servidor Web com Arduino e um Shield Ethernet
Amigo dá aula via Skype? Abraço.
Sim amigo, dependendo do assunto e disponibilidade de horários.