Problema com W5100 Ethernet

Opa Pessoal, obrigado pela atencao:

Entao,

o roteador principal esta distribuindo DHCP normalmente. Eu setei o arduino manualmente para receber um IP na minha faixa de rede 192.168.0.20 por exemplo. Ja havia tentado resetar(tirando a energia dele e colocando de volta) e nada.

Ontem fiz um teste e consegui colocar ele na rede atraves do roteador (WDS repetidor), porem,quando a energia acaba o arduino nao reconecta novamente sozinho, eu tenho que ficar tirando e colocando o cabo nas portas LAN do roteador repetidor ate ele conectar.

Irei verificar hoje o caso do resistor, mas acredito que como eu consegui colocar ele na rede, provavelmente deva estar com o valor correto, mas verei e informarei voces.

O que pode ser isso a respeito da falta de energia e nao reconectar sozinho tambem ?

Muito obrigado pessoal pela ajuda por enquanto!

Irei verificar hoje o caso do resistor, mas acredito que como eu consegui colocar ele na rede, provavelmente deva estar com o valor correto, mas verei e informarei voces.

No meu caso, com o resistor incorreto ele funcionava diretamente no PC e não funcionava em um roteador ou switch (ou ao contrário, não lembro).
Corrigindo o resistor, funcionou em ambos.

O que pode ser isso a respeito da falta de energia e nao reconectar sozinho tambem ?

Alterando a biblioteca do W5100, acrescentei um comando de Keep Alive que fecha as conexões, pois quando tirava o cabo, a conexão travava pra sempre.
Caso necessário, posso fornecer.

Legal!!

giova014, eu vi aqui, o meu resistor e' 511.

Achei uma foto no meu celular aqui no qual anexei aqui, que eu havia tirado do shield e por sorte eu consigo ver o 511 marcado.

Voce poderia por favor me passar a solucao, como alterar ? Qual os passos ?

Muito Obrigado!

A solução é soldar dois resistor de 100 Ohms no lado de baixo da placa, de modo que fiquem em paralelo com cada 510 Ohms.

De acordo com a numeração dos pinos abaixo:

Soldar um resistor de 100 Ohms entre os pinos 1 e o 2
e soldar um resistor de 100 Ohms entre o pinos 3 e 6.

No final fica assim:

Depois, vai funcionar normalmente.

Tem que ser 100ohms ? Se usar 120ohms nao funciona ? Pq tenho de 120ohms, senao vou comprar de 100ohms amanha.

Eu vou desoldar esses resistores que vieram e colocar esses, seguindo a pinagem que voce me passou.

E outra coisa, como funciona o negocio do "keep alive" ?? Eh ele que resolve o problema de quando eu reinicio a energia ele reconecta automaticamente o arduino ? Porque eh foda toda vez quando desligo e ligo a energia, eu tenho que ficar espetando o cabo em cada porta LAN do router ate ele ligar.

Tem alguma solucao isso ?

Obrigadao!

Tem que ser 100ohms ? Se usar 120ohms nao funciona ? Pq tenho de 120ohms, senao vou comprar de 100ohms amanha.

Use 100 Ohms.

Eu vou desoldar esses resistores que vieram e colocar esses, seguindo a pinagem que voce me passou

Se você está falando em dessoldar a rede resistiva 511, não o faça. Apenas acrescente os de 100 Ohms.

E outra coisa, como funciona o negocio do "keep alive" ?? Eh ele que resolve o problema de quando eu reinicio a energia ele reconecta automaticamente o arduino ? Porque eh foda toda vez quando desligo e ligo a energia, eu tenho que ficar espetando o cabo em cada porta LAN do router ate ele ligar.

Tem alguma solucao isso ?

Não vou conseguir elaborar agora pois não estou em casa, mas assim que der lhe mostro.

Maravilha!!

Muito obrigado por enquanto!! :slight_smile:

Para implementar o "Keep alive", deve alterar a biblioteca do W5100, que normalmente fica na pasta:

"C:\Program Files (x86)\Arduino\libraries\Ethernet\src"

No arquivo "EthernetServer.h" adicione na classe EthernetServer o protótipo do método:

static void keepAlive(uint32_t interval = 5000);

E no arquivo "EthernetServer.cpp", adicione a definição:

void EthernetServer::keepAlive(uint32_t interval){
	
	static uint32_t lastKeepAlive = 0;
	
	if (millis() - lastKeepAlive > interval) {
		lastKeepAlive = millis();

		for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
			EthernetClient client(sock);

			if (client.status() == SnSR::ESTABLISHED) {
				W5100.execCmdSn(sock, Sock_SEND_KEEP);
			}
		}
	}
}

No arquivo "Ethernet.cpp", dentro no método:

int EthernetClass::begin(uint8_t *mac_address, unsigned long timeout, unsigned long responseTimeout)

acrescente:

// Configurate timeout = 3,22 seconds
  W5100.setRetransmissionTime(512); //miliseconds * 10
  W5100.setRetransmissionCount(5);

Os três arquivos alterados estão em anexo para facilitar.

No seu código, normalmente no loop(), adicione antes de:

EthernetClient client = server.available();

A chamada do método:

server.keepAlive();

Em meus testes, o W5100 fecha as conexões travadas em dois momentos: quando falha ao enviar algum dado e usando o keep alive.
O problema do keep alive é que se você transmitir algo para os clientes logo após o invocar, o keep alive é "anulado", então são necessário testes.

Ethernet.cpp (3.93 KB)

EthernetServer.cpp (2.17 KB)

EthernetServer.h (443 Bytes)

Muito obrigado! Tentarei isso e lhe informo. :slight_smile:

Opa giova014!!

Tudo bem ?

Comprei ontem os resistores de 100ohms e acabei de soldar. Funcionou perfeitamente!!! \ :slight_smile: /

Fiz do jeito que vc disse, foi perfeitamente!! E o legal eh que quando desligo a energia e volto novamente, ele reconecta automatico, sem precisar desplugar e plugar novamente.

Muito obrigado viu!! Vlw mesmo por essa dica!!!

Grande abssss!!!

Funcionou. Instalei os dois resistores de 100r conforme mencionado acima. :slight_smile:

Para corroborar: também funcionou comigo soldar os dois resistores de 100ohms.
Muito obrigado pela dica!

Em outros lugares da internet vi algumas pessoas sugerindo dessoldar o resistor de 510ohms - que é minúsculo - e soldar outros resistores no lugar. Se já tive dificuldade em soldar esses de 100ohms porque achei o espaço pequeno, imagina substituir o outro... sem chance.

Importante: esse shield chinês com resistor errado funciona corretamente no meu modem antigo da GVT (de 2011, eu acho). Quando troquei a internet de casa por NET, com um modem bem mais novo, ele parou de funcionar. Ou seja: se o resistor veio errado, vale soldar os resistores mesmo que esteja funcionando atualmente.

Pra mim não funcionou, coloquei os resistores de 100 ohms e nada.....quando tendo logar o webserver com o IP da minha rede 192.168.0.121 ele antes logava mostravam as entradas analógicas flutuando, depois de 2 minutos aparecia na tela " Esta página Expirou ".
Agora não entra mais só aparece que Expirou.

Com a colocação dos resistores ficou pior ainda os LEDs nem acendem mais como antes......

Há aquele LED amarelo perto do AREF/GND fica aceso direto, na rede do meu vizinho ele só pisca de vez em quando mas não loga .......aparece também " Esta página expirou "

Vejam abaixo o meu relato detalhado da falha...

Estou com problemas no meu Shield W5100 + Arduino UNO R3

Carreguei o exemplo de webserver do Arduino, alterando somente o IP, inicialmente funcionou as portas Analógicas flutuando os valores, e após algum tempo ( 2min) as portas analógicas pararam de flutuar.
Consultei um amigo, ele me pediu para filmar os estados da placa e da tela do browser para ver.
Segundo ele há um problema, o LED amarelo próximo ao AREF/GND fica aceso direto, mesmo sem nenhum Sketch gravado nele.
Com um Sketch webserver gravado neles eu não estou conseguindo mais ver no browser da internet as portas Analógicas flutuarem, a mensagem agora é ” A página Expirou “.
Comecei a procurar na internet algo para resolver ou que me desse uma luz, e num forum dizia : ” se estiver acontecendo isto verifique a ponte resistiva próximo ao RJ45 de 49R9 ohms, se tiver em seu lugar uma ponte de 511 ao invés de 49R9 ou 510 faça o seguinte ( coloque 2 resistores de 100 ohms soldados entre os pinos 1 e 2 e 3 e 6 do conector RJ45 que o problema desaparece……eu fiz…mas não mudou nada piorou…..então retirei tudo novamente…
Em contato com o amigo que identificou a falha, eu mencionei à ele ” Como posso saber se o problema está na Shield ou no Arduino” , ele falou: ” Teste as portas Analógicas individualmente com um trimpot e veja seu funcionamento” eu testei com um Sketch de teste para portas analógicas e o resultado foi positivo a” as portas Analógicas estão funcionando perfeitamente no Arduino UNO.

Tentei na rede do meu vizinho com modem router da DLink o comportamento dos LEDs na Shield foi diferente mas também expirou a página.....

Os arquivos são: os resistores de 100 Ohms e o ping no router do meu vizinho

Minha dúvida agora é: ” Posso condenar a placa Shield W5100, estaria ela com defeito mesmo ou não?”

Façam contato comigo via Whatsapp (34) 993405248

Por favor me ajudem!!!

giova014, parabéns pela dica. Salvou meu projeto. Estava já arrancando meus cabelos e sua dica foi matadora. Funcionando perfeitamente!!!

Obrigado!!!!!

Ola.
Estava com um problema parecido com o relatado pelo CristianoRipi ao utilizar uma placa W5100.
Conectava normalmente no roteador principal porem nao conectava num outro usado como repetidor.
Verifiquei a rede resistiva conforme indicado. Está errada (511).
Soldei os dois resistores de 100 ohms conforme indicado pelo hugo007 e funcionou normalmente, com o exemplo webserver do arduino.
Obrigado hugo007.

giova014:
A solução é soldar dois resistor de 100 Ohms no lado de baixo da placa, de modo que fiquem em paralelo com cada 510 Ohms.

De acordo com a numeração dos pinos abaixo:

Soldar um resistor de 100 Ohms entre os pinos 1 e o 2
e soldar um resistor de 100 Ohms entre o pinos 3 e 6.

No final fica assim:

Depois, vai funcionar normalmente.

Olá, teria como mandar as indicações nas imagens novamente? Estou com o mesmo problema nesta placa.

Vamos lá! Vou postar minha solução depois de muitos testes e muita frustração.
Parece que o Ethernet Shield com W5100 tem algum bug, muita gente com problemas do tipo "preciso apertar o reset para voltar a funcionar"...
Algumas soluções indicam um resistor de 10K ou outro valor entre o reset e 3.3v ou 5v e um capacitor de 10nf ou outro valor entre reset e negativo do sistema.
Testei de tudo quanto foi forma e não tive sucesso.
Fazendo testes aleatórios conectei o RESET ao AREF e, para minha surpresa, funcionou perfeitamente.
O Arduino ethernet reseta na primeira vez e logo em seguida sobe funcionando a rede normalmente.
Pelos testes que fiz não vi nenhuma anomalia no sistema e nunca mais tive problemas.
Então a dica é essa, ligar um jumper do RESET ao AREF, sem entortar nenhum pino, sem resistor ou capacitor. Aqui funcionou com meus cinco arduinos que foram comprados em datas diferentes, então acredito que deva funcionar para outros casos também!
Espero que ajude e se alguém souber de algum problema em fazer isso, por favor, nos avise.

1 Like

O esquema do arduino tem um condensador de 100nF no pino de AREF... porque não indicar uma solução um pouco mais correcta?