enc28J60 e Arduino (1)

luca 12/02/2012 143

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

143 Comments »

  1. Mauro 14/02/2012 at 08:36 - Reply

    Ciao Luca, articolo molto interessante l’ho twittato per farlo leggere ad altri appassionati Arduino.

  2. Roby 14/02/2012 at 10:57 - Reply

    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

  3. luca 14/02/2012 at 19:48 - Reply

    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 ;)

  4. mario 01/03/2012 at 19:14 - Reply

    Dove hai preso la shield con ENC ???
    Grazie
    Ciao

    • luca 01/03/2012 at 20:30 - Reply

      eBay…

  5. mario 01/03/2012 at 20:59 - Reply

    Ok cerco anch’io Grazie

  6. Axel 08/03/2012 at 17:24 - Reply

    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.

    • luca 08/03/2012 at 20:40 - Reply

      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.

  7. Axel 09/03/2012 at 21:58 - Reply

    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

  8. Rott 10/03/2012 at 23:27 - Reply

    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.

    • luca 11/03/2012 at 20:26 - Reply

      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?

      • Rott 12/03/2012 at 15:10 - Reply

        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 :DHCP 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

  9. Rott 12/03/2012 at 18:48 - Reply

    ho provato questo script per testare la scheda :

    #include

    #define REQUEST_RATE 5000 // milliseconds

    // ethernet interface mac address
    static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    // 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?

    • luca 12/03/2012 at 19:41 - Reply

      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.

    • Giovanni 23/11/2012 at 22:25 - Reply

      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

      • luca 23/11/2012 at 22:57 - Reply

        Ciao Giovanni,

        anche tu con un modulo di Futura Elettronica? Anche a te non appare nulla?