enc28J60 e Arduino (2)

luca 13/02/2012 23

In questo secondo articolo vedremo come utilizzare un server DHCP per configurare automaticamente i parametri di rete.

Al termine del primo articolo abbiamo scritto un semplice sketch dove tutti i parametri di rete erano definiti come costanti; questo ci obbliga, se dobbiamo cambiare la rete a cui collegare Arduino, a ricompilare e ricaricare lo sketch.

Spesso all’interno delle reti locali è attivo un server DHCP (Dynamic Host Configuration Protocol), ovvero un servizio che consente di configurare automaticamente i dispositivi connessi in rete.

Senza approfondire troppo il protocollo, il suo funzionamento base è il seguente:

  • il dispositivo (client) che vuole un indirizzo IP, invia un pacchetto broadcast (ovvero un pacchetto che raggiungerà tutti i dispositivi in rete) di DISCOVERY, per “scoprire” se esistono server DHCP attivi;
  • se vi sono dei server DHCP in ascolto, questi rispondono con un pacchetto di OFFER, “proponendo” al client che ne ha fatto richiesta un indirizzo IP disponibile;
  • il client sceglie uno degli indirizzi IP offerti e invia un pacchetto di REQUEST indicando la sua volontà ad utilizzare tale indirizzo;
  • il server che lo ha proposto risponde con un ACK per confermare l’assegnazione dell’indirizzo IP.

Fortunatamente :) tutto questo è stato già implementato per noi nel file di libreria dhcp.cpp: nella prossima pagina vedremo un semplice sketch per utilizzare tale funzionalità…

Pagine: 1 2

23 Comments »

  1. trinciaMenischi 11/09/2012 at 01:23 - Reply

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

    • luca 11/09/2012 at 08:39 - Reply

      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!

      • trinciaMenischi 11/09/2012 at 23:36 - Reply

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

  2. francesco 21/06/2013 at 13:55 - Reply

    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?

  3. Filippo 22/10/2013 at 21:53 - Reply

    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

  4. Filippo 22/10/2013 at 21:56 - Reply

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

  5. mohamed 23/12/2013 at 11:17 - Reply

    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.

    • luca 24/12/2013 at 08:47 - Reply

      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…

  6. mohamed 06/01/2014 at 23:25 - Reply

    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?

    • luca 14/01/2014 at 18:54 - Reply

      ciao, ho risposto alla mail che mi hai mandato

  7. enrico 27/04/2014 at 16:20 - Reply

    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… :(

    • luca 29/04/2014 at 20:59 - Reply

      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.

  8. Alessandro 24/06/2014 at 10:02 - Reply

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

  9. Antony 01/07/2014 at 14:28 - Reply

    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?

    • luca 08/07/2014 at 08:17 - Reply

      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.

  10. José Carlos 10/07/2014 at 01:41 - Reply

    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

    • luca 14/07/2014 at 15:25 - Reply

      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?

  11. Fabio 09/12/2014 at 16:04 - Reply

    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

    • luca 13/12/2014 at 17:29 - Reply

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

  12. Fabio 14/12/2014 at 19:06 - Reply

    Ti ringrazio infinitamente
    un saluto
    fabio milano

  13. enrico 11/02/2015 at 18:48 - Reply

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

    enrico__

    • luca 11/02/2015 at 20:45 - Reply

      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)

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi