terça-feira, novembro 13, 2012

Escolhendo um Shield Ethernet para o Arduino

Se você prestar atenção, perceberá  que os shields para a conexão do Arduino a redes Ethernet se dividem em dois grupos, com faixa de preços diferentes: um baseado no chip W5100 e outro no chip ENC28J60. Para entender a grande diferença entre eles é preciso conhecer um pouco sobre redes locais.



As Camadas da Rede


Quando se estuda redes, uma das primeiras coisas que se aprende é o modelo OSI, que organiza as funções de uma rede em camadas. A divisão em camadas é importante para poder domar a complexidade das redes e facilitar a substituição de partes sem afetar o todo.

Muitas implementações reais não seguem à risca o modelo OSI, mas também dividem as funções em camadas. Vou falar aqui nas redes Ethernet usando o protocolo TCP/IP, que é o caso mais comum atualmente. O TCP/IP está organizado em 4 camadas:


Quando uma mensagem é passada de uma camada para a inferior são anexadas informações adicionais (tipicamente cabeçalhos). Quando a mensagem faz o caminho inverso, estas informações são retiradas. Desta forma temos uma "conversa virtual" de cada camada na origem com a respetiva camada no destino.

A Camada Enlace (Link)

A camada Enlace engloba o hardware (a interface de rede) e o software que a controla (driver). Esta camada é normalmente dividia em duas partes: PHY e MAC. A subcamada PHY é o nível físico: a geração e interpretação dos sinais elétricos que correspondem aos bits e a sua conversão em bytes. MAC é o controle do acesso do meio (Media Control Access). Nas redes locais temos múltiplos dispositivos conversando através de um único meio, que precisa ser compartilhado; o MAC é o mecanismo que faz isto. No caso da Ethernet, temos um endereço de hardware (o endereço MAC) que é usado para determinar as origens e destinos dentro de um trecho da rede física e um procedimento para evitar que dois dispositivos tentem transmitir simultaneamente (e detectar e se recuperar caso ocorra esta colisão). A Ethernet trabalha com pacotes com até 1500 bytes de dados.

A Camada Rede (Network)

A camada de rede (IP) cria um endereçamento lógico (o endereço IP) e trata do roteamento de pacotes entre subredes. Do ponto de vista de comunicação, o protocolo IP é bastante pobre, é um mecanismo não confiável e que não armazena estado. Ele não verifica se um pacote enviado chegou ao outro lado nem garante que os pacotes chegarão ao destino na mesma ordem em que foram enviados. A única garantia é que os pacotes passados para a camada de cima estão íntegros (pelo menos quanto ao checksum utilizado). O IP suporta pacotes de até 65535 bytes, eles serão fragmentados conforme o limite da camada de enlace.

A Camada de Transporte

No TCP/IP a camada de transporte possui dois protocolos: UDP e TCP. O protocolo UDP é mais simples, com as mensagens (datagramas) sendo independentes e não existindo garantia de entrega. Cada datagrama corresponde a um pacote IP, exceto pela eventual necessidade de fragmentação. O que o UDP acrescenta ao IP é o conceito de portas, que é usado para rotear as mensagens para a aplicação adequada.

O protocolo TCP cria uma conexão confiável entre duas aplicações (identificadas também por portas), garantindo que bytes enviados em uma ponta chegarão ao outro lado e na mesma ordem (ou então sinalizará que a conexão foi interrompida). A aplicação não trabalha mais com pacotes, mas sim com um stream de bytes. Para isto, o TCP precisa manter informações sobre as conexões ativas e utilizar buffers internos para retransmitir, agrupar e re-ordenar pacotes.

O ENC28J60

Este CI (documentação aqui) implementa a camada Enlace. Ele possui um buffer de 8Kbytes, que é compartilhado pela transmissão e recepção. Ele é capaz de tratar o endereçamento MAC e faz automaticamente a detecção de colisão e a retransmissão do pacote neste caso.

O W5100

O W5100 (documentação aqui) possui, além da camada Link, as camadas de rede e transporte. Ele implementa internamente os protocolos IP e TCP (além dos protocolos acessórios ARP, ICMP e IGMP), suportando até quatro conexões TCP simultâneas. O buffer de transmissão e recepção é de 16 KBytes. Existem outras limitações, como o não suporte à fragmentação de pacotes IP.

Qual Shield Escolher?

Na minha opinião, salvo situações especiais, o melhor é gastar um pouco mais e usar o W5100.

Ao usar o Shield ENC28J60 o stack TCP/IP irá rodar no Arduino. Mesmo adotando algumas restrições, o protocolo TCP/IP é pesado, principalmente em termos de memória.Um Arduino UNO tem apenas 2K de Ram, o Mega sobe isto para 8K. As bibliotecas que eu vi não me inspiraram muita confiança, implementando um conjunto bem restrito dos protocolos e uma API desajeitada para a aplicação.

Com o W5100, o código no Arduino pode se concentrar na aplicação. A documentação sugere que a implementação dos protocolos é bem mais completa (mas como é código fechado não dá para conferir a qualidade). Outra vantagem é que o tratamento da comunicação corre em paralelo ao da aplicação. Uma vantagem que não deve fazer muita diferença nas aplicações típicas é que o W5100 suporta comunicação a 10 e 100 Mbps (o ENC28J60 somente a 10). Por último, as bibliotecas e exemplos do shield com W5100 fazem parte do pacote oficial do Arduino, o que pode economizar vários minutos de buscas e comparações na internet.

O ENC28J60 pode ser interessante se você quiser experimentar com o protocolo TCP/IP ou se aventurar com outros protocolos além dele (existem muitos outros protocolos que podem ser usados sobre Ethernet, a maioria deles assunto de arqueologistas).

Um comentário:

Anônimo disse...

Comprei uma shield ENC28J60 porque não queria gastar... Me arrependi, pois não funcionava direito e para não "jogar no lixo" encontrei um cara num forum que estava escrevendo uma lib nova para ele. Até que funcionou melhor que a lib original.