Problema com W5100 Ethernet

Boa tarde, a todos.

Estou com um problema com uma placa W5100, o exemplo do arduino webserver só funciona quando ligo um cabo de rede direto do computador para ele, porém se eu liga-lo em um roteador, ele não funciona, mas tenho uma outra placa que funciona normal, existem alguns modelos dessa placa, mais antigas por exemplo, que mudou as características delas?

Obrigado.

Boas existem muitos factores que podem influenciar.Posta o teu codigo, como ligaste isso, que tipo de cabo usas-te (directo ou crossover), fizeste um simples ping à tua placa W5100 quando ligaste ao router para confirmar se tens conectividade?
O teu pc tem ip fixo ou recebe por DHCP?
Podes ter os ips configurados incorrectamente ...
Para ja tenta responder a todas estas questões.
Bons estudos

Cabo direto, quando dou o ping ele responde mas diz que esta inacessível, mas se ligo direto no pc sem hub ele funciona, o ip de minha rede é fixo, e o programa é igual ao web server, exemplo do arduino. O problema é que tenho duas placas W5100, em uma funciona pela rede normal, e na outra não, enviei e troquei a placa, porém ela veio igual a que não funcionou (mesmo lote), e também não funcionou.

quando dou o ping ele responde mas diz que esta inacessível,

O que quer isto dizer?Falha todos os pacotes de ICMP ou nao?
Quando ligas a tua W5100 ao switch acendem os Leds na ficha RJ45?

Sim, falha os pacotes. Quando ligo a W5100 acende normal os leds. Vou tentar trocar o Hub, mas acredito que não tenha nada a ver, existe algum histórico de falha nessa comunicação com alguns tipos de hub´s. Li em outro tópico que a HanRun 14/16 da W5100, deu problema com outra pessoa, é exatamente a mesma numeração que esta em meu shield. O que acham?

Por acaso ja nao uso hub's à anos.Sabes que o hub é half-duplex certo?
Isto quer dizer que nao consegues comunicar ao mesmo tempo que recebes.Porque nao usas um switch.O switch é full-duplex e evita colisoes.

O que eu estava chamando de hub, é uma switch mesmo. Mesmo assim desconfiei dela, com isso liguei a placa W5100 em outra switch e depois interliguei com a switch que não estava funcionando, ahí a placa respondeu. Portanto realmente existe diferença nas placas ethernet W5100, pois com uma funciona normalmente e com outra não funciona (é visivel a diferença do ano de fabricaçãp de uma para outra).
Muito obrigado, Hugo, devo instalar o equipamento nessa semana em seu local real, espero não ter problemas, ateh mais, muito obrigado msm.

Estou tendo esse problema tambem, porem quando ligo direto no meu roteador que esta conectado ao modem da operadora de internet ele funciona, ai quando ligo em outro roteador(que esta funcionando como repetidor WDS) ele nao funciona, "nao pega IP", mas se eu ligar o meu notebook nesse segundo roteador(WDS) ele funciona normal. O que pode ser ?

Estas a reniciar a placa quando mudas o cabo?
Tens DHCP a fluir nesse repetidor do teu router principal?
Que ip ganha o arduino quando ligas no repetir(Faz um serial.print ...)

Verifique a seguinte rede resistiva que esta na sua placa W5100:

Se o valor dela for 511 (510 ohms) está errada. Se for 510 (51 ohms) está correto.
Esta rede é responsável pelo sinal diferencial do Ethernet.

Caso esteja errada, nos diga que indicarei uma solução simples.

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!!!