Con questo articolo, inizia una serie di tutorials sull’uso del controller Ethernet enc28j60 con Arduino.
Introduzione
Lo shield Ethernet ufficiale per Arduino è basato sul chip Wiznet W5100 e per tale shield sono state scritte le librerie Ethernet incluse nell’IDE di Arduino: http://arduino.cc/en/Reference/Ethernet
Un altro controller Ethernet molto diffuso è il chip enc28j60 di Microchip: su Internet sono disponibili – spesso ad un costo inferiore rispetto allo shield ufficiale – shield o breakout boards basate su tale chip.

Giustamente Testato mi ha suggerito di aggiungere una nota sulle differenze tra i due controller: quella principale, che sicuramente ha guidato il team Arduino nella scelta del W5100, è che tale chip implementa in hardware tutto lo stack TCP/IP liberando risorse lato MCU.
Libreria
Diversi produttori e hobbisti hanno sviluppato librerie per gestire questo controller con Arduino; per questi tutorials utilizzerò la libreria EtherCard di JeeLabs Café.
JeeLabs ha pubblicato la propria libreria su GitHub; per prima cosa scarichiamo l’ultima versione in formato ZIP:

Apriamo la cartella principale dove abbiamo installato l’IDE (tipicamente C:\arduino-1.0) e scompattiamo l’archivio appena scaricato all’interno della sottocartella libraries. All’interno dello ZIP, i files della libreria sono contenuti in una cartella chiamata “jcw-ethercard-xxx“: rinominiamo tale cartella in EtherCard:

Lanciamo ora l’IDE e verifichiamo che la libreria sia disponibile:

Parametri di rete
Prima di poter collegare il nostro shield alla rete, abbiamo bisogno di alcuni parametri:
- il MAC address, è un numero di 48bit che identifica univocamente ogni dispositivo collegato in rete. Perché sia univoco, ad ogni produttore è assegnato un codice (OUI) che compone i primi 24 bit dell’indirizzo;
- l’indirizzo IP è un numero di 32bit (IPv4) che identifica il dispositivo all’interno della rete locale;
- la maschera di rete è un numero di 32bit che consente di identificare tutti i dispositivi appartenenti alla medesima rete locale;
- (eventualmente) il gateway è l’indirizzo IP di quel dispositivo di rete (router…) che consente di raggiungere dispositivi non appartenenti alla propria rete locale.
Per quanto riguarda il MAC address, possiamo sceglierne uno che non sia già utilizzato da altri dispositivi nella nostra rete… spesso negli esempi si utilizzano MAC address con codice produttore non ancora assegnato (es. DD-DD-DD).
I parametri IP (indirizzo, maschera, gateway) devono essere invece coerenti con quelli già assegnati agli altri dispositivi nella nostra rete; in particolare indirizzo IP univoco, mentre maschera di rete e gateway uguali.
A volte è disponibile in rete un server DHCP che consente di impostare automaticamente i parametri sui vari dispositivi: vedremo in un prossimo esempio come utilizzare anche con Arduino tale funzionalità.
Nella prossima pagina inizieremo a scrivere uno sketch…
Pagine: 1 2






Ciao Luca, articolo molto interessante l’ho twittato per farlo leggere ad altri appassionati Arduino.
Ciao Luca,
anche io sto usando (combattendo con ) uno shield con ENC28J60. Avrei bisogno di settare la subnet mask ma nessuna libreria o esempio che ho trovato permettono di farlo. Hai qualche suggerimento?
grazie, saluti
Ciao Roby,
hai ragione… che strana dimenticanza, visto che se usi il setup via DHCP questo è in grado di impostarla correttamente.
Comunque mi pare si possa risolvere così:
static byte staticmask[] = {255,255,255,128};
…
ether.copyIp(mymask, staticmask);
fammi sapere se funziona, magari lo metto in un prossimo articolo
Dove hai preso la shield con ENC ???
Grazie
Ciao
eBay…
Ok cerco anch’io Grazie
Ciao Luca,
Complimenti per tutto.
Attualmente ho sviluppato un progettino su W5100 con l’uso anche di SD. Pero’ come sappiamo, per la verita’ l’ho imparato sucessivamente (non ho guardato bene), il chip suddetto ha un bug hardware. Pensavo di disaccoppiare lo shield procuramdomi un SD shield e l’ENC da sostituire. Il progetto e’ su mega e attualmente pesa circa 45k e sfrutta meno di 1k in ram quindi non avrei problemi di spazio, dato che l’enc ne ha bisogno. Inoltre per la parte in tcp, lo scambio di dati, avviene solo tramite bytes, nessuna stringa.
Dato che ho gia’ definito il protocollo di scambio dati tra client e server, con una traduzione all’enc risolverei definitivamente il problema hardware?
Comunque sia il w5100 fino ad ora non ha dato problemi. E lo uso in modalita’ sia con SD che con ETH.
Ciao Axel, grazie per i complimenti!
Sicuramente il chip enc28j60 ha dato prova in vari progetti di essere molto affidabile. A differenza del W5100 non gestisce in hardware il protocollo TCP/IP ma con un Mega non avrai di certo problemi di carico sulla CPU. Sul forum di Arduino c’è una discussione in corso su questo “bug” del chip W5100 e ci sono utenti che hanno riportato progetti attivi da giorni/settimane senza blocchi. Se a te non ha dato ancora problemi, è possibile che il tuo codice non vada a “toccare” quella funzionalità che lo manda in blocco.
Ciao Luca,
Grazie per la risposta.
Ma soprattutto grazie per il tuo articolo con la quale mi permette di provare questa soluzione. Blocchi non me ne ha dati, ma per sicurezza e per avvantaggiarmi, penso di proprio di convertire il progetto. Per ora problemi non ne ho avuti è vero, ma nei (piccoli) ritagli di tempo penso di cominciare ad occuparmi dell’enc.
Tutti i risultati futuri, che non saranno a breve, prometto di postarteli.
Ciao
Ciao Luca
Ho seguito il tuo tutorial ma non riesco a far funzionare arduino come web server.
Dopo aver assegnato l’ip 192.168.2.100 subnet 255.255.255.0 il gateway è l’indirizzo del router 192.168.2.1 anche se lo pingo non vedo i dati ricevuti, dal cmd mi risponde ma dallo stato connessione i ricevuti sono fermi a 0 mentre gli inviati vanno avanti.
Dove sbaglio?
Grazie e complimenti per i tuoi post.
Ciao!
tu stai pingando il tuo Arduino da un altro PC in rete locale giusto? Che indirizzo ha questo PC? E quando da prompt di dos dai il comando “ping 192.168.2.100″ cosa vedi come risposta?
Sono giorni che ci sto sbattendo la testa , ho acquistato su Futura elettronica ETHERNET SHIELD CON ENC28J60 in kit. Ho il pc connesso ad internet tramite wifi su un ip 192.168.2.2, il router è 2.1 finale firewall disabilitato.La scheda la connetto il lan con cavo cross con ip 192.168.2.200. attraverso il tuo script cerco di pingare la scheda( ip che è nello script 192.168.2.201) il gateway è lostesso per tutti 255.255.255.0 ma non risponde, ho provato un’altro tuo script demo dhcp ma in seriale mi dice
HCP Demo
Failed to access Ethernet controller.Dallo stato di connessione lan del pc i dati inviati camminano ma i ricevuti sono fermi a zero,ho solo arduino connesso in lan.Il kit è semplice da montare ho rivisto le saldature sto battendo le piste con il tester ma sembra tutto ok.Ho riletto e riletto i tuoi tutorial e script e credo che sia la sceda che non funziona. Come posso fare un test per accertarmi?
Grazi eluca per avermi risposto
Rott
ho provato questo script per testare la scheda :
#include
#define REQUEST_RATE 5000 // milliseconds
// ethernet interface mac address
static byte mymac[] = { 0×74,0×69,0×69,0x2D,0×30,0×31 };
// ethernet interface ip address
static byte myip[] = { 192,168,2,203 };
// gateway ip address
static byte gwip[] = { 192,168,2,1 };
// remote website ip address and port
static byte hisip[] = { 74,125,79,99 };
// remote website name
char website[] PROGMEM = “google.com”;
byte Ethernet::buffer[300]; // a very small tcp/ip buffer is enough here
static long timer;
// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
Serial.print(“<< timer + REQUEST_RATE) {
timer = millis();
Serial.println(“\n>>> REQ”);
ether.browseUrl(PSTR(“/foo/”), “bar”, website, my_result_cb);
}
}
Sul monitor seriale settato a 57600baud comparare solo la scritta [getStaticIP] e cosi rimane.
pingando 192.168.2.203 mi da richiesta scaduta
Butto la scheda?
Ciao!
Tutti i miei esempi come prima cosa inizializzano il chip enc28j60 e devono scriverti “Ethernet controller initialized” altrimenti c’è sicuramente qualcosa che non va nel dialogo tra arduino e la schedina.
Ho guardato il kit che hai acquistato e sembra “compatibile” con gli esempi di questo tutorial (ad es. il PIN CS è sul PIN 10 di Arduino)… purtroppo sembra proprio che la tua scheda non funzioni.
anch’io sto riscontrando lo stesso identico problema di Rott con il modulo enc28J60.
Gradirei avere notizie su come è stato risolto e s’è stato risolto il problema. Grazie
Ciao Giovanni,
anche tu con un modulo di Futura Elettronica? Anche a te non appare nulla?
proprio così
il modulo l’ho importato dall’ Inghilterra credo ci sia incompatibilità con arduino mega 1280. Comunque spero di risolvere il problema acquistando un altro modulo che mi costerà meno della metà del primo.
Ethernet Shield W5100 For Arduino 2009 UNO Mega 1280 2560
Ciao Giovanni,
sicuramente per utilizzarlo con un Mega1280 dovrai collegare correttamente i PIN della interfaccia SPI, guarda la tabella presente sul sito di Arduino:
http://arduino.cc/en/Reference/SPI
Grazie Luca se non era per i tuoi tutorial vagavo in rete senza speranza.. prendero un’altro kit e riprovero anche se stavolta prendero anche la shield ufficiale.
Grazie ancora Rott
Come riferito qui da Luca:
attiviamo la libreria con il metodo begin(), passando come parametri la dimensione del buffer, il MAC address e il PIN di Arduino a cui è collegato il PIN ChipSelect del modulo (normalmente è il PIN 10, verificate la documentazione del vostro shield);
è possibile che alcuni shield o “minischede” non sia il PIN10 ma il PIN 8.
Provare per credere
Ciao Luca, complimenti per i tuoi ottimi tutorial.
Ho un modulo enc28j60 simile a quello visibile in foto, ma non riesco a farlo funzionare. Hai usato accorgimenti particolari per connettere i pin SPI ad arduino ( visto che lavorano a tensioni diverse) ?
Grazie
Matteo
Ciao Matteo,
in realtà sto utilizzando uno shield con il chip enc28j60; per la differenza di tensione di alimentazione puoi utilizzare un partitore resistivo oppure un circuito tipo questo: http://www.robot-italy.com/product_info.php?products_id=2508
fammi sapere se funziona!
qui c’è un esempio carino
http://jeelabs.org/2010/06/07/etherbbbreadboard/
Ciao! Quello è proprio il sito ufficiale della libreria Ethercard… se guardi nello ZIP tra gli esempi inclusi un paio sono quelli di questo blog
I bought the card pictured and downloaded from github. Renaming jcw-ethernet-xxxxxxx gives message “ethercard_test_1.cpp:3:23: error: EtherCard.h: No such file or directory
ethercard_test_1:5: error: ‘Ethernet’ has not been declared
ethercard_test_1.cpp: In function ‘void setup()’:
ethercard_test_1:12: error: ‘ether’ was not declared in this scope
ethercard_test_1:12: error: ‘Ethernet’ has not been declared
ethercard_test_1:15: error: ‘ether’ was not declared in this scope
ethercard_test_1.cpp: In function ‘void loop()’:
ethercard_test_1:21: error: ‘ether’ was not declared in this scope”. moving subdirectory EtherCard without renaming compiles and prints “PING demo” in serial monitor but gives a “request timed out” when I ping the IP address. All I changed is static byte myip[] = {192,168,0,10}; and Serial.begin(9600);.
I’m going through a Iogear wireless to ethernet adapter but my netbook works fine through it! Could it still be the problem?
Jim
Hi Jim!
Are you pinging Arduino from a PC in the same subnet (192.168.0.x)? Are you able to ping other devices in the same network?
thanks!
Hi!
Thanks for your informative blog posts about ENC28J60 and Arduino Uno. Trying to get the same setup working. Could you please verify the connections that you give here: http://arduino.cc/forum/index.php/topic,112444.msg845718.html#msg845718
Thanks a lot!
-lazyboy
Hi!
I read that pescadito answered your post in Arduino forum, were you able to solve with the connections he suggested?
Hi Luca!
I’m studing this library and I found that the socket used to browse a page never close after the page download is complete.
I mean the browseUrl() functions always open a new socket and do not close those that where used.
I’m trying to implement a raw socket, is the most simple network communication method, but I can’t close the used socket after the data is complete.
Have some ideas?
I think that keept opens socket will crash the application and the ENC.
Best Regards
Frank
Hi Frank!
enc28j60 is different from wiznet chip (which can only keep 4 sockets open): all the tcp/ip stack is managed by Arduino’s library.
Ethercard library correctly sends a TCP FIN packet at the end of the request (open tcpip.cpp and have a look to packetLoop method).
bye
Ciao Luca
innanzitutto grazie per i tuoi esempi ,ma al momento ho riscontrato un problema :
caricando il programma al mio arduino mega , quando apro il serial monitor vedo Ping DEMO , ma niente altro , e facendo il ping , non ricevo mai una risposta , sempre host non raggiungibile .Pero’ se inverto i PIN SO e SI , vedo un errore failed access ethernet controller .Non capisco dove sia l’errore , ,tu cosa pensi che sia?
Grazie
Ciao Marco,
l’errore è normale se i PIN non sono collegati correttamente… hai provato l’esempio in DHCP (seconda parte del tutorial)? In questo caso che cosa ti appare sul serial monitor?
Ciao Luca
ho provato anche con la seconda parte del tutorial , ma il serial monitor si ferma a
DHCP Demo , da qui non si schioda .
Non ho idea di cosa possa fare o controllare
Ciao Luca
ho trovato il problema : utilizzando un arduino Mega , il pin del chip select nel mio caso e’ il 53 !adesso funziona !grazie
ottimo!
Hi, I followed your example but I am getting this error message:
sketch_feb03a:3: error: ‘Ethernet’ has not been declared
sketch_feb03a.cpp: In function ‘void setup()’:
sketch_feb03a:10: error: ‘ether’ was not declared in this scope
sketch_feb03a:10: error: ‘Ethernet’ has not been declared
sketch_feb03a:13: error: ‘ether’ was not declared in this scope
sketch_feb03a.cpp: In function ‘void loop()’:
sketch_feb03a:19: error: ‘ether’ was not declared in this scope
any suggestion
Hi! It seems you don’t have the Ethercard library installed… make sure:
- in the “libraries” folder of your Arduino installation you have an “EtherCard” folder containing files (EtherCard.cpp…)
- you closed and re-opened Arduino IDE after having installed the library
Hi Luca,
I have the library installed with EtherCard.cpp in it but the problem is still there.
Hi! Did you include the library (#include) on the top of your sketch?
In the “Examples” menu of the Arduino’s IDE do you find EtherCard examples? Try compiling one of them and let me know if you get the same errors…
yes, I copied your example then verified before uploading but I get the same error message. I even used the examples from EtherCard lib. but still nothing. I am getting this error:
pings:8: error: ‘Ethernet’ has not been declared
pings.cpp: In function ‘void gotPinged(byte*)’:
pings:13: error: ‘ether’ was not declared in this scope
pings.cpp: In function ‘void setup()’:
pings:20: error: ‘ether’ was not declared in this scope
pings:20: error: ‘Ethernet’ has not been declared
pings:22: error: ‘ether’ was not declared in this scope
pings:25: error: ‘ether’ was not declared in this scope
pings.cpp: In function ‘void loop()’:
pings:45: error: ‘ether’ was not declared in this scope
Hi
I try start my arduino mega 2560 with ENC28j60 module and I have a problem with communication with router-livebox 2.0 from Orange – router “sees” arduino (name: Arduino->=, IP address is given y DHCP and “sees” ENC’s MAC address). I tried with almost your examples, but anyone does not work….:(
I changed:
mac: 0xDE, 0xAD, 0xBE, 0xDE, 0xFE, 0xED
PIN: 53
buffer: 1500 – after changing this and first values, the router began to see Arduino.
Conectings:
VCC, GND
PIN 50: SO
PIN 51: SI
PIN 52: SCK
PIN 53: CS
Sometimes after uploading or reseting Arduino I get this:
DHCP Demo
Ethernet controller initialized
DHCP configuration done
IP Address: 192.168.1.14
Netmask: 255.255.255.0
Gateway: 192.168.1.1
But ping reports: destination host unreachable
After reseting Arduino:
DHCP Demo
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
After second reset:
DHCP Demo
Ethernet controller initialized
Failed to get configuration from DHCP
IP Address: 0.0.0.0
Netmask: 255.255.255.0
Gateway: 192.168.1.1
PING:
Response from 192.168.1.13 (my computer’s IP): destination host unreachable
After third reset:
DHCP Demo
Ethernet controller initialized
DHCP configuration done
IP Address: 192.168.1.14
Netmask: 255.255.255.0
Gateway: 192.168.1.1
PING returns the same as the last…
Can anyone help?
Hi Lucasz,
when your Arduino gets the correct IP address from DHCP, try – after ping – to find if your PC was able to resolve the mac address with the command “arp -a” and let me know the result
Salve stavo cercando le stesse librerie per la ethercard enc28j da utilizzare però in bascom in quanto l’implementazione del codice con questo linguaggio comportava una maggiore facilità di scrittura e una sensibile riduzione di codice macchina da caricare sull’atmega328… qualche giorno fa girando fra i siti e i link vari avevo trovato chi si stava occupando del porting… purtroppo non ho salvato quella pagina e nemmeno il link… qualcuno ha informazioni in merito? grazie
…dimenticavo: lo shield montato e funzionante con enc28j è quello di futuranet (codice prodotto 8190-ETHSHIELDKIT) purtroppo la sola inclusione della libreria $ethercard utilizzando l’ide di arduino con qualche riga di codice e una striminzita pagina html che fa da server occupa già metà dei 30kbyte disponibili con l’atmega328-pu… per ulteriori sviluppi sarà quindi necessario aggiugere uno shield sdcard se si vuole implementare un minimo di database-sql e html decente …nell’attesa di trovare la libreria per bascom-avr mi sto occupando di generare codice html compresso inviando codice all’atmega via seriale il quale provvederà a creare le opportune pagine…
.
Hi Luca,
I tried the above code to test my enc28j60 shield…but am not getting the ping results..the connections to my arduino uno were as follows..VCC – 3.3V
GND – GND
SCK – Pin 13
SO – Pin 12
SI – Pin 11
CS – Pin 10
in the serial monitor of arduino IDE, am getting Ping demo..
Hi!
Has EtherCard library same limitation as ETHER_28J60? That issue about sending only 1 packet sized 500K bytes?
Thanks,
Renato Aloi
Yes, the limit is about 500 bytes of payload.
Ciao Luca, volevo chiederti se sapevi perchè quando faccio il ping dal prompt seguendo questo tutorial mi dice host non raggiungibile ed arriva un solo pacchetto e 3 li perde?
grazie.
ciao, stai usando esattamente lo sketch del tutorial?
si, però ora ho risolto, ho ricontrollato la continuità dei connettori ed un filo era spezzato. L’ho sostituito ed ora funziona tutto perfettamente. Grazie per i tuoi tutorial mi risultano molto utili.
Hi ! (sorry for may english, i´m spanish… )
I´m trying to connect Arduino UNO with ethernet card, to my iPhone , using NetIO App.
But don,t work…
i activate http protocol in the app, and add a button,
when press the button, the app send to arduino´s ip a message… ( i send a word… LED)..
i open a serial port, to print messages using…
#include
static byte mymac[] = {0xDD,0xDD,0xDD,0×00,0×00,0×01};
static byte myip[] = {192,168,1,100};
byte Ethernet::buffer[700];
static byte gwip[] = { 192,168,1,1 };
void setup () {
Serial.begin(9600);
}
void loop() {
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if(pos) {
Serial.print((char *)Ethernet::buffer + pos );
}
}
but don´t write anything…
i need to send , an special word to initialize ?
( using the led example, works fine )…
Hi! The sketch seems ok! What happens if, instead of using the iPhone APP, you use the iPhone browser? Does Arduino print the received “GET” command?
Hello Luca, I`m here again commenting on your posts. I had an Arduino Duemilanove working perfect with an enc28j60 module, but in order to increase the project I bought an Arduino Mega 2650, I tried a lots of things but without success to have it working with the enc28j60 module, could you please help me ?
Hi Fabio! The Arduino Mega has different PINs for SPI (the interface used to communicate with the enc28j60 chip), you need to compare the two pinouts and make the correct connections: you can’t simply insert the shield in the Mega.
Read this thread about the correct connections and let me know if it works for you!