Home › Tag Archives › redes

Como localizar automaticamente seu projeto na rede

Neste post, ao menos por enquanto, eu não vou dar nenhum código. Apenas explicar em linhas gerais o processo.

Considerações gerais

Os três protocolos mais usados para comunicação com seu projeto são UDP, TCP e HTTP. Cada um deles tem suas vantagens e desvantagens, mas o único realmente apropriado para localização é o UDP, porque é o único que pode enviar mensagens sem ficar esperando por uma resposta.

Digamos que sejam dois dispositivos: cliente e servidor.

  • No cliente, emita um broadcast (mensagem para 255.255.255.255) UDP na rede com uma mensagem do tipo: “onde você está”?. Todos os dispositivos no mesmo segmento de rede recebem o broadcast;
  • No servidor você deve responder essa pergunta de uma forma que o cliente saiba que a resposta vem do dispositivo certo. Você pode responder direto para o cliente (nem sempre é possível) ou fazer também um broadcast com a resposta (recomendável). Por exemplo, se a consulta tiver a pergunta “MEUSERVIDOR?” a resposta pode ser “MEUSERVIDOR!” ou “MEUSERVIDOR1”, “MEUSERVIDOR2”, etc;
  • Na ponta que fez a consulta, extraia da resposta o IP de quem enviou;
  • Se o IP do servidor não estiver na mesma faixa do cliente você vai precisar reconfigurar algo. Se estiver…
  • Pronto, agora você pode usar esse endereço IP para se conectar ou enviar mensagens por outros protocolos, como TCP e HTTP.

Outras considerações

Isso não é gambiarra. Produtos comerciais usam esse mesmo método geral de localização automática. Por exemplo, câmeras IP;

Em condições normais, broadcasts não são propagados através de roteadores. Seria um pesadelo se fossem;

Ao fazer broadcast para 255.255.255.255 o servidor responderá mesmo que esteja em outra sub-rede lógica. Por exemplo, se o cliente tiver um IP do tipo 10.0.0.x e por alguma razão o servidor estiver configurado para 192.168.0.x , ainda assim haverá resposta para o broadcast, mas o cliente só a receberá se a resposta também for um broadcast. Isso é útil para localizar equipamentos mal configurados, mas você não poderá estabelecer uma conexão HTTP ou TCP enquanto não trouxer o servidor para a mesma sub-rede lógica que o cliente. Se quiser que o broadcast somente localize dispositivos na mesma sub-rede lógica, deve mandar a mensagem para o endereço de broadcast da sub-rede. Por exemplo, numa rede do tipo 10.0.0.x o endereço de broadcast é 10.0.0.255.

Sempre que seu servidor iniciar é recomendável fazer o broadcast de sua identificação. Faça também com que o cliente esteja atento a esses broadcasts para detectar automaticamente a presença do servidor.

 

Dicas sobre o acesso ao Arduino pela internet

Isto não é um tutorial. Meu objetivo aqui é apenas listar algumas coisas que você tem que ter em mente antes de quebrar a cabeça tentando acessar seu projeto pela internet.

  • O endereço IP de acesso ao seu projeto quando você se conecta de fora da sua casa não é o mesmo que você usa para conexão dentro de sua casa. Você precisa encontrar meios de saber seu IP externo. E esse IP muda a cada vez que seu modem for reiniciado a não ser que você tenha pago ao provedor por IP fixo (geralmente, só em empresas);
  • Testar o acesso externo de dentro de sua própria rede geralmente não funciona. Mesmo usando o IP externo, você não consegue acesso. Você pode até testar de dentro do mesmo recinto, mas tem que usar outra conexão completamente distinta (um acesso 3G, por exemplo). Alternativamente peça a um amigo que mora em outra casa (e que nao compartilha internet com você) para fazer o teste;
  • Você precisa se familiarizar com o conceito de “portas de rede” e “encaminhamento de portas” (port forwarding). Sem entender o que é isso você pode até conseguir fazer seguindo cegamente algum tutorial, mas se qualquer coisa der errado você não vai saber resolver;
  • Você precisa encaminhar as portas de que precisa em todos os roteadores no caminho até o arduino. Isso vale para o modem ADSL, se for roteado (para modem bridge não é necessário);
  • O procedimento de encaminhamento é diferente em cada modem e roteador existente, por isso não faz sentido eu tentar explicar aqui. O que você deve fazer é anotar os modelos de cada um de seus roteadores e pesquisar na internet (se não estiver no manual) como se faz o encaminhamento neles.
  • Internet compartilhada é dor de cabeça. Se você divide internet com alguém e não tem acesso livre ao modem, vai ter dificuldade para fazer esse encaminhamento;
  • Internet via rádio é internet compartilhada. E nessa só quem tem acesso ao modem é o provedor. Sem a colaboração dele seu projeto não vai funcionar. Mas dependendo do indivíduo, você pode conseguir com ele o encaminhamento de uma série de portas para você. Existem mais de 65 mil portas disponíveis em um conexão e qualquer provedor pode perfeitamente reservar umas 10 para cada cliente. Muitos pode reservar 100. Não é uma situação ideal, porque se isso não fizer parte do pacote de serviços padrão desse provedor qualquer mudança que ele faça na rede dele pode fazer o encaminhamento deixar de funcionar e você terá que ligar para o suporte pedindo a reconfiguração. O provedor também pode não ser capaz de reservar para você exatamente as portas que você quer. Aproveite o fato de que na maioria dos casos é possível escolher com facilidade a porta no sketch.
  • A porta aberta para a internet não precisa necessariamente ser a mesma que o seu projeto usa, mas isso depende do roteador que você tem, pois em muitos a porta externa precisa ser igual à interna. Aproveite o fato de que você sempre pode definir a porta em seu projeto

Roteador wi-fi portátil com modo cliente.

roteador_wifi_cliente_IMG_1660_automalabs.com.br

Com este roteador você pode transformar qualquer dispositivo que tenha uma conexão de rede por cabo em um aparelho Wi-Fi. Seja o arduino, uma TV, um Media Player… qualquer coisa.

Shields Wi-Fi para o arduino sofrem, na minha opinião, dos seguintes problemas:

  • São caríssimos;
  • Exigem programação específica. Você não pode pegar o seu projeto que já opera em rede e simplesmente transformar em Wi-Fi
  • Você programa às cegas. Não existe uma GUI onde você possa localizar redes disponíveis e fazer diagnóstico;

Tendo isso em mente eu saí procurando alternativas e essa é a melhor que encontrei. Eu vendo o kit roteador + shield ethernet mais barato do que você normalmente encontra por aí o shield Wi-Fi e você ainda tem mais vantagens:

  • Você não precisa mexer em nada no seu projeto. Basta configurar o roteador usando um computador e um browser e depois plugar no conector de rede;
  • O diagnóstico fica mais simples. Deixou de funcionar? Você pode desplugar o roteador e testar o seu projeto com fio;
  • Se algo der defeito, é mais barata a reposição. Ou você trocará o shield ethernet ou o roteador;
  • O roteador (que é também a antena) pode ficar até 100m do seu projeto, via cabo de rede. Você pode posicioná-lo exatamente onde houver melhor sinal. Você até pode, usando un shield, esticar o cabo da antena. Mas isso gera perdas que muitas vezes não compensam o reposicionamento da antena. Como regra geral, quanto mais curto o cabo da antena, melhor;

 

roteador_wifi_cliente_IMG_1661_automalabs.com.br

roteador_wifi_cliente_IMG_1663_automalabs.com.br

roteador_wifi_cliente_IMG_1664_automalabs.com.br

roteador_wifi_cliente_IMG_1666_automalabs.com.br

roteador_wifi_cliente_IMG_1670_automalabs.com.br

Adaptador PoE (Power Over Ethernet)

Muita gente não sabe disso mas normalmente em uma rede ethernet CAT5 ou CAT5e apenas 4 dos 8 fios são de fato usados. O padrão PoE surgiu para aproveitar esses quatro fios que sobram para alimentar aparelhos como câmeras IP, roteadores, etc.  Em um sistema PoE “real” o próprio switch se encarrega de alimentar os aparelhos. Mas esses switches são caríssimos!. Dá para fazer algo parecido usando esses adaptadores, mas é preciso saber o que se está fazendo e levar em conta as perdas no cabo.

Você sempre precisa de um par. De um lado é conectada a fonte e do outro é conectado o aparelho onde a fonte seria plugada.

Mais sobre PoE

Uma instalação PoE “real” pode ser capaz de transmitir energia até mesmo pelos pares que estão sendo usados para dados (indispensável em redes Gigabit). Mas para isso tanto o switch quanto o aparelho do outro lado tem que ser compatíveis com a técnica “Phantom Power”.

PoE “real” usa no mínimo 44V, porque quanto maior a tensão, menor a corrente para uma determinada potência. Isso não impede você de fazer PoE “doméstico” com meros 12V, mas precisa ter em mente que dependendo da distância pode chegar bem menos que 12V do outro lado. A técnica mais comum é aplicar uma tensão alta no cabo para reduzir a corrente trafegando por ele (e consequentemente o calor e as perdas) e na ponta de consumo usar um conversor DC-DC chaveado com saída ajustada para a tensão requerida.

Ethernet shield w5100: Teste completo

O teste completo envolve o uso do slot microSD. Você pode usar apenas ele ou pode usar o w5100 sem o acesso ao cartão. Aproveitando essa independência, certifique-se de que você já tenha sido capaz de colocar o shield para funcionar usando os exemplos que vem com o IDE Arduino. Não tente partir direto para um teste completo, quando você pode testar as partes primeiro.

Tenha em mente que ao lidar com arquivos no arduino você vai precisar voltar no tempo e relembrar (ou se familiarizar com) as diferenças entre FAT16 (FAT) e FAT32 e suas limitações. Em geral, o menor denominador comum, garantido de funcionar em todos os casos, será um cartão de até 2GB formatado em FAT16 (FAT). Maior que isso ou formatado com outro sistema e você poderá ter problemas.

Testando o w5100 (arduino 0022 ou 1.01):

File->Examples->Ethernet->Webserver

Altere o endereço IP no sketch para que combine com sua rede e tente acessá-lo usando o browser. Se tudo correr bem você verá uma lista dos valores nas entradas analógicas do arduino.

Testando o slot microSD  (arduino 0022 ou 1.01):

File->Examples->SD->Files

Coloque o cartão no slot e abra o monitor serial. Se tudo estiver OK você verá algo parecido com isto:

Se você encontrar algo muito diferente, como a mensagem “initialization failed!”, não adianta prosseguir com o teste completo. Verifique se o cartão está corretamente formatado. Testado com um cartão FAT16 de 2GB e com um cartão FAT32 de 8GB.

Teste completo

Requerimentos:

  • Um cartão microSD corretamente formatado. Eu padronizei meus testes com um cartão de 2GB formatado com FAT16, mas já testei sem problemas com um cartão de 8GB formatado com FAT32.
  • O IDE Arduino 0022 (veja em “Previous IDE versions”). Todos os meus testes são feitos com essa versão, mas se quiser usar a versão 1.01, veja o final deste texto.
  • A biblioteca SDFATlib – Extraia o conteúdo do ZIP e coloque o diretório SDfat no diretório libraries. Importante: use a versão do meu link. A versão mais recente não compila no arduino 0022.
  • O sketch SDWebBrowse da Adafruit (use a versão .pde)

Mude o sketch para o IP refletir a configuração da sua rede (digamos que seja 192.168.254.177).

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 254, 177 };
Server server(80);

Coloque um cartão no slot e faça o upload do sketch

Importante: sem um cartão corretamente formatado e com arquivos no slot, o exemplo da adafruit vai ficar travado. Nem sequer responderá a um ping.

Agora, de qualquer browser, tente acessar o arduino direto pelo IP:  http://192.168.254.177/

A resposta deverá ser a lista de arquivos no cartão. Atenção: este sketch não tem a capacidade de entrar em pastas, nem exibir imagens. Mas você conseguirá ver o conteúdo de arquivos .txt.

Outro modo de testar é abrindo o monitor serial. Se algo der errado, ele exibirá apenas algo assim:

Mas se estiver tudo certo aparecerá uma lista completa do conteúdo do cartão.

Mensagens de erro

“‘Sd2card’ does not name a type’ – você não instalou a biblioteca SDFatlib corretamente

“cannot declare aparameter ‘client’ to be of abstract type client” – você está usando uma versão do sketch que só funciona com o Arduino 002x, no Arduino 1.x.

Arduino 1.0.1

Para que funcione na versão mais nova do IDE, siga todo o meu procedimento, fazendo as seguintes alterações:

Apesar de eu não ter migrado ainda para essa versão do IDE, fiz um teste aqui e tudo pareceu normal

Para mais informações sobre o funcionamento dos sketches, visite a página da autora.

Dúvidas comuns sobre o shield ethernet Wiznet W5100

O que é esse “HanRun” e esses códigos em cima do conector ethernet? 

Esse conector é especial. É fabricado pela HanRun e dentro dele existem dois LEDs e um componente essencial chamado de “magnetics”. O código HR911105A é o modelo do conjunto. Datasheet abaixo.

Por quê você chama de “Wiznet W5100”?

Porque Wiznet é o fabricante do componente principal do shield, cujo modelo é W5100. É para ele que você tem que procurar exemplos. Veja o que está escrito no quadrado preto no centro da placa.

Por que o arduino não aparece na lista de dispositivos conectados do meu roteador?

Aquela lista não é de dispositivos “conectados” nem “detectados”. É uma lista de dispositivos que pediram um endereço IP ao roteador, através de DHCP.  Se seu sketch não usa DHCP (a maioria usa IP fixo), o seu arduino não vai aparecer na lista de nenhum roteador.

Qual o endereço MAC do shield?

Nem o shield nem o chip tem endereço MAC. O MAC é definido no seu sketch, geralmente desta forma:

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

Por um lado, isso te dá liberdade de usar o endereço que quiser. Por outro, pode dar uma baita dor de cabeça por causa da regra inviolável que diz que não podem existir dois MACs iguais em uma mesma rede. Enquanto você estiver brincando apenas com um shield não há problema, mas ao adicionar o segundo você vai ter que estar permanentemente alerta.  Por exemplo, se você já tem um Arduino em rede na sua casa e quiser debugar o programa usando um arduino na sua mesa, precisa se lembrar que o sketch de teste não pode ter o mesmo MAC do que está “em produção” (nem o mesmo IP) e também precisa lembrar que ao fazer o upload do código que  estava em teste para o arduino em produção, tem que alterar o MAC (e o IP).

O melhor modo de evitar dor de cabeça com isso é fazer seus sketches lerem o MAC de uma memória externa, que pode ser um cartão SD (perceba que o shield wiznet tem um slot) ou uma EEPROM. Você grava as memórias com MACs diferentes, bota uma etiqueta em cada uma dizendo qual é (só por organização), e esquece o problema.

Que LEDs precisam estar acesos?

Mesmo que o shield não esteja sendo usado (nenhum sketch que o use carregado), ao plugar o cabo de uma rede de 100Mbps devem acender-se quatro LEDs: PWR, LINK, 100M e FULLD. Se não acenderam esses quatro, o problema pode estar no shield ou no cabo.

Que pinos são usados pelo shield?

D4 (apenas para o SD), D10, D11,D12, D13, alimentação e o conector ICSP.

Por que o shield 1602 com keypad não funciona em conjunto com o Wiznet?

Porque o desenvolvedor do shield escolheu o pino 10 para desligar o backlight, colidindo com o requerido pelo shield Wiznet. Entorte o pino 10 do shield 1602 para que ele não entre e assim ambos vão funcionar.

Por que o sensor ultrassônico não funciona quando conecto o shield Wiznet?

Não sei. Não é defeito do sensor, nem do shield. Basta o shield estar plugado para que o sensor ultrassônico sempre retorne uma distância de 2-4cm. É como se a simples presença do shield interferisse com a temporização da função que mede o tempo de resposta do sensor. Ainda não tenho uma explicação e muito menos solução para isso.

Por que ao desligar a alimentação do arduino, quando a alimentação volta ele “sumiu” da rede?

Esse é um problema curioso que depende da sua placa base (seu arduino). Com algumas nunca acontece e com outras, você sempre precisa apertar o botão RESET   para que a rede volte a responder. É um problema que ocorre com todos os shields da mesma versão, incluindo os fabricados pela Sparkfun e pela Adafruit. Existem artifícios de hardware que podem ser usados para contornar isso, caso ocorra com você.

Ao energizar, os LEDs PWR e FULLD acendem. Plugar o cabo de rede não faz efeito.

Nem é preciso plugar o cabo para perceber que há algo errado, porque apenas PWR devia estar aceso sem um cabo de rede conectado. Apertando o botão RESET funciona? Se sim, o shield está com um problema de inicialização. Os shields com esse problema são rejeitados pelo meu controle de qualidade e reservados para meu uso apenas. Se acontecer com você no período de garantia, solicite a troca.

Datasheet HR911105A
Datasheet HR911105A
HR911105A.pdf
304.6 KiB
1135 Downloads
Detalhes...

Módulo Ethernet Baseado em ENC28J60

O módulo deve ser conectado conforme este diagrama:

Os pinos mudam porque trata-se da porta SPI, que está associada a pinos diferentes no mega.

Não é realmente necessário usar o pino ENC-INT. A Biblioteca Ethershield só usa interrupções em um dos exemplos. E nos meus testes programas simples funcionaram sem qualquer problema com esse pino desconectado.

Os pinos de entrada do ENC28J60 são tolerantes a 5V. Você deve alimentar com 3.3V, mas não há problema se o I/O for 5V, como é o caso do Arduino (exceto DUE).

Para download da biblioteca, que já vem com vários exemplos de uso, siga as instruções deste link.

Limitações

Ao rodar os exemplos de webserver da biblioteca, verá que são bem simples. Sem graça mesmo. Mas isso parece ser inevitável. Entre as limitações do ENC28J60 está o fato de que ele não pode lidar com múltiplos pacotes TCP-IP, então ele tem que mandar toda a página de uma vez, em um único pacote. Porém o tamanho de um pacote TCP-IP está limitado por padrão a algo em torno de 1500 bytes já contando com o overhead; então por segurança os exemplos usam buffers limitados a 500 bytes (não deveria ser tão drástico, mas talvez a biblioteca tenha outra limitação). Ou seja: o webserver não pode dar nenhuma resposta cujo HTML tenha mais que 500 bytes no total, mas código HTML não é nada “econômico” nesse sentido. O sintoma é que o webserver deixa de responder, ficando travado.

O tamanho desse buffer é definido nesta linha dos exemplos:

#define BUFFER_SIZE 500

Para complicar, o Arduino UNO/Duemilanove (ATMEGA328) tem apenas 2KB de RAM (o ATMEGA168 só tem 1KB) para ser usado por todo o seu sketch. Por isso, ao tentar contornar o problema aumentando o tamanho do buffer você corre o risco de travar todo o seu programa.

Veja bem: isso significa que não dá para fazer algo bonito como a GUI de um modem ADSL moderno com um ENC28J60 e um Arduino, porém não é esse o único propósito de uma conexão ethernet. O ENC28J60 é perfeitamente capaz como um meio de enviar comandos simples (por GET, por exemplo) e receber status via rede. Com 500 bytes por comando ou resposta dá para fazer muita coisa. Se você realmente não pode viver com essa limitação, precisa de um shield baseado em um chip com mais recursos, como o Wiznet W5100.

Nota: o ENC28J60 tem outras limitações. Eu só estou citando uma porque foi nessa que eu esbarrei.

 

Biblioteca Ethercard

O próprio autor da biblioteca ethershield anunciou que não atualizará mais a biblioteca e recomenda o uso da biblioteca Ethercard. Essa biblioteca é compatível com o módulo sem problemas, mas o pino CS precisa ser ligado ao pino D8 do Arduino UNO. Essa é a única diferença de conexão. Mas a biblioteca permite a escolha fácil do CS, que agora é definido na inicialização que é feita no sketch.

Por exemplo, para mudar o pino CS para 10, troque nos exemplos:

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) //sem o parâmetro opcional, é usado D8.

por

  if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0) // define D10 como CS