enc28J60 e Arduino (2)

by luca
27 comments

Ecco il programma per Arduino:

#include <EtherCard.h>
static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
byte Ethernet::buffer[700];
 
void setup () {
 
  Serial.begin(57600);
  Serial.println("DHCP Demo");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
 else 
   Serial.println("Ethernet controller initialized");
 
  if (!ether.dhcpSetup())
    Serial.println("Failed to get configuration from DHCP");
  else
    Serial.println("DHCP configuration done");
 
  ether.printIp("IP Address:\t", ether.myip);
  ether.printIp("Netmask:\t", ether.mymask);
  ether.printIp("Gateway:\t", ether.gwip);
}
 
void loop() {
 
  ether.packetLoop(ether.packetReceive());
}

Notiamo per prima cosa che non viene più definito come costante l’indirizzo IP ma solo il MAC address; l’inizializzazione del controller Ethernet inizia con il metodo abituale begin().

ether.dhcpSetup()

Il metodo dhcpSetup() esegue tutti i passi indicati sopra: cerca un server DHCP in rete, analizza le risposte, sceglie un indirizzo IP e ne ottiene la conferma dal server. Tale metodo aspetta 30 secondi, passati i quali restituisce un errore.

 ether.printIp()

Il metodo printIp() è un modo comodo per stampare su seriale un indirizzo IP (memorizzato nel buffer come array di uint8_t).

Se tutto funziona correttamente potremo nuovamente pingare Arduino:

E il nostro server DHCP mostrerà un nuovo dispositivo in rete (la libreria sceglie come nome Arduino-XX con XX l’ultimo ottetto del MAC address):

Related Posts

27 comments

lucadentella.it – enc28J60 e Arduino (3) 19 febbraio 2012 - 21:55

[…] aver imparato come collegare Arduino alla rete (con indirizzi statici oppure sfruttando un server DHCP) vediamo ora come inviare/ricevere informazioni attraverso un sito […]

Reply
trinciaMenischi 11 settembre 2012 - 01:23

Ciao, sto seguendo la tua guida utilizzando windows: purtroppo su linux la libreria che utilizzi mi da i seguenti errori:

/usr/share/arduino/libraries/EtherCard/tcpip.cpp: In function ‘word wwwclient_internal_datafill_cb(byte)’:
/usr/share/arduino/libraries/EtherCard/tcpip.cpp:459:20: error: variable ‘c’ must be const in order to be put into read-only section by means of ‘attribute((progmem))’
/usr/share/arduino/libraries/EtherCard/tcpip.cpp:468:20: error: variable ‘c’ must be const in order to be put into read-only section by means of ‘attribute_((progmem))’

Sapresti aiutarmi?
p.s. Complimenti per i tutorial, meglio di un corso universitario 🙂 a presto!!

Reply
luca 11 settembre 2012 - 08:39

Ciao! L’errore è davvero strano, sto guardando il file tcpip.cpp alle righe indicate ma non c’è una variabile “c”… stai usando l’ultimo IDE per Linux e l’ultima versione della libreria? Fammi sapere, magari attivo una VM con Linux e faccio una prova!

Reply
trinciaMenischi 11 settembre 2012 - 23:36

Si, certo ultimo ide eultima versione della libreria.
Graxie mille!!!

Reply
francesco 21 giugno 2013 - 13:55

ciao ! ho provato questo codice per iniziare a usare il tuo n13 (che nonmi va) e anche in questo la seriale mi restituisce valori tipo:
d•9\Súõ
ã—\»Z;ÿ
ecc
ho provato solo codici semplici ma funzionano senza problemi sulla ethernet shield(impostagli un ip fisso e poi pingarlo e caricare il “hello word” …. )sai per caso oveposso sbagliare?

Reply
Filippo 22 ottobre 2013 - 21:53

Ciao Luca, complimenti per il blog, è davvero ben realizzato!
Ti spiego la mia situazione:
Impostando manualmente l’IP riesco a pingare la scheda.
Caricando lo sketch del primo web server riesco ad accedere.
Con lo sketch per la risoluzione del dns niente, non riesco a risolvere il nome, credo per colpa del dhcp: non c’è verso che funzioni (sui pc ovviamente assegna gli indirizzi).
Puoi aiutarmi con il dhcp? Con il tuo sketch si ferma per un minuto sulla ricerca e poi dice che non è riuscito a trovare il server dhcp. Ti ringrazio

Reply
Filippo 22 ottobre 2013 - 21:56

@ Francesco: controlla che il baud rate del monitor seriale corrisponda al Serial.begin impostato nello sketch

Reply
mohamed 23 dicembre 2013 - 11:17

ciao,

ho provato sia questo sketch che quello precedente ma non funzionano.

con questo sketch trovo questo sul Serial monitor:

Ethernet controller initialized
Failed to get configuration from DHCP
IP Address: 0.0.0.0
Netmask: 0.0.0.0
Gateway: 0.0.0.0

mentre con il primo sketch non da errori ma non riesco a pingare l’arduino.

Reply
luca 24 dicembre 2013 - 08:47

ciao, sembra proprio che il tuo router non assegni un indirizzo IP ad Arduino.
Per usare il primo sketch (IP statico) dovrai invece modificare l’IP in modo che sia “coerente” con quello della tua rete…

Reply
mohamed 6 gennaio 2014 - 23:25

Queste prove le sto facendo sul mio posto di lavoro perchè mi hanno chiesto di sviluppare un progetto, quindi penso che la rete sia diversa da una domestica.
Quali informazioni sul tipo di rete devo avere per poter correggere lo sketch? (sia questo che il primo esempio).
c’è modo di saperle attraverso dei comandi tipo “ipconfig all” da terminale?

Reply
luca 14 gennaio 2014 - 18:54

ciao, ho risposto alla mail che mi hai mandato

Reply
enrico 27 aprile 2014 - 16:20

ciao luca nel compilare mi da errore sulla penutlima istruzione del setup…
col primo mi funziona a meta’ forse… aggiungendo 255,255,255,126 mi pinga benissimo ma sul monitor seriale mi appare solamente ping demo… 🙁

Reply
luca 29 aprile 2014 - 20:59

ciao enrico, anche qui… davvero strano: la penultima istruzione è solo un printIp, identica a quelle sopra… mi sa che c’è un problema nel tuo IDE! Ho appena riprovato per scrupolo e compila tranquillamente.

Reply
Alessandro 24 giugno 2014 - 10:02

provate a sostituire il mac da 0xDD a 0x01..
così ho risolto …

Reply
Antony 1 luglio 2014 - 14:28

Estimados,

Me da un error al compilar debido al comando utilizado para la mascara de subred. Verificando la librería, se debería realizar el siguiente cambio en el sketch:
ether.printIp(“Netmask:\t”, ether.mymask);
por:
ether.printIp(“Netmask:\t”, ether.netmask);

Otra cosa que encontre en la librería, es que asignan el pin 8 al CS:

static uint8_t begin (const uint16_t size, const uint8_t* macaddr, uint8_t csPin =8);

Tanto en el archivo EtherCard.h como en enc28j60.h.

Luca, si se especifica el pin CS como 10 (UNO) o 53 (MEGA) no habría complicación?

Reply
luca 8 luglio 2014 - 08:17

Hi Antony

please note that the CS pin depends on the shield your using: it’s the PIN connected to the CS “signal” of the enc28j60… from the Arduino side, it can be any digital PIN.

Reply
José Carlos 10 luglio 2014 - 01:41

Hi Luca,

This is José form Peru.

I`m starting with Arduino and your web has lots of interesting info.

Well, I’m testing your code from “enc28J60 and Arduino (1)” and “enc28J60 and Arduino (2)”, but when I ping the arduino board, the response is not at 100%, When 4 packets are sent, only 3,2,1 and sometimes none comes. I tried several times but never got 100%.

What could be wrong?

Thank you for your time.

José Carlos

Reply
luca 14 luglio 2014 - 15:25

Hi Jose

are you using a wired connection? How is the ethernet shield connected to your network? Direct to your PC? Using a network switch/router?

Reply
Fabio 9 dicembre 2014 - 16:04

Ciao
grazie x il tutorial che hai condiviso.
In realtà avevo già avuto modo di ringraziarti perché avevo già partecipato, in particolare i commenti della lezione 7 firmati fabio del settembre 2012 (passa il tempo!).
Ho voluto riprendere il tutorial, ho riscaricato la libreria Ethercard, probabilmente sono stati fatti degli aggiornamenti nella librerie stessa: ad esempio il metodo mymask non viene più riconosciuto (quindi genera errore di compilazione)
grazie fabio

Reply
luca 13 dicembre 2014 - 17:29

grazie Fabio, ho sistemato tutti gli esempi e verificato che compilino tutti con l’ultima versione della libreria… prendi i sorgenti da Github

Reply
Fabio 14 dicembre 2014 - 19:06

Ti ringrazio infinitamente
un saluto
fabio milano

Reply
enrico 11 febbraio 2015 - 18:48

ciao luca…
nel compilare mi da come errore la 21esima riga… xo se la escludo le altre cose funzionano a dovere

enrico__

Reply
luca 11 febbraio 2015 - 20:45

Ciao Enrico, hai ragione quello era il metodo vecchio… su github dovresti trovare il codice aggiornato che non da errore (cmq come scrivi giustamente, quella riga è ininfluente)

Reply
LucaB 25 novembre 2017 - 14:36

Buongiorno Luca,

sto cercand senza successo di riprodurre il tuo sketch2.
Uso Arduino Mega, ENC28J60 e libreria EtherCard (pin aggiornati per mega), ma ricevo sempre il seguente output:
>DHCP
>ethernet controller initialized
>failed to get configuration from dhcp
>ip address 0.0.0.0
>netmask 0.0.0.0
>gateway 0.0.0.0

Seguendo le indicazioni che hai già dato ad un altro utente con il medesimo problema ho provato anche ad utilizzare IP e Gateway statici (sketch 1), ma comunque ottenendo un risultato per me abbastanza ambiguo:
>PING
>Failed to access ethernet controller
>Ethernet controller configuration done

Pingando l’IP statico associato ad arduino questo non risponde correttamente, inoltre sembra che lo step precendente (di accesso alla scheda ethernet) non vada a buon fine…
Potresti cortesemente darmi qualche consiglio su come procedere?
Grazie
Luca

Reply
luca 25 novembre 2017 - 14:49

ciao Luca, “Failed to access ethernet controller” significa che in realtà la libreria non è riuscita a parlare con il chip enc28j60. Ricontrolla tutti i collegamenti e magari prova lo stesso shield/modulo con un Arduino UNO per assicurarti che non sia guasto.

Reply
LucaB 9 dicembre 2017 - 12:10

Buongiorno Luca,

grazie mille per la risposta.
ho ricontrollato diverse volte i collegamenti ma ancora niente.
Appena connetto Arduino con collegato il modulo ethernet al PC, il led D1 del modulo ENC28J60 si accende (rosso) è normale? è l’unico led acceso, nonché l’unico segno di vita della scheda.
Inoltre ogni volta che lancio il processo di assegnazione IP, impiega parecchio tempo (almeno 10 minuti) prima di darmi un output.

Reply
luca 10 dicembre 2017 - 17:03

ciao Luca, da quello che scrivi temo proprio che il tuo modulo abbia problemi…

Reply

Leave a Comment

quindici + 15 =