«

»

set 23

Stampa Articolo

Tutorial Arduino Ethernet e SD Card

Partecipando all’Arduino Camp 2011 ho approfitatto per acquistare del materiale tra cui la Ethernet Shield:

Arduino Ethernet Shield

Arduino Ethernet Shield

La shield ha anche una slot per micro SD fino a 2Gb utilizzabile per scrivere e leggere i propri file.
In questi giorni ho provato questa magnifica shield e tutte le possibilità offerte, come sempre sono partito dalla guida ufficiale presente sul sito arduino.cc e dal loro esempio per realizzare un WebServer.

Ho quindi fatto i miei primi esperimenti con lo sketch di esempio proposto anche nell’IDE, per poi sperimentare come mi piace fare, cose nuove.

L’idea

Ho immaginato di voler realizzare un server che possa avere più pagine, come se ospitasse un sito, in particolare la mia fantasia è andata oltre pensando di visualizzare questa pagina non solo su un computer ma anche su un dispositivo mobile, a mia didposzione houn iPhone 3 (vecchio, si ma fa ancora il suo dovere).

Per consentire al sito di avere più pagine e non dovermi preoccupare delle dimensioni dei file HTML ho deciso di utilizzare una micro-SD card da 2Gb su cui memorizzare i miei file HTML e da cui Arduino potesse prenderli ed utilizzarli come un comune webserver.

Vantaggi

Il primo vantaggio offerto è la possibilità di creare quante pagine desidero senza dover sottostare alle dimensioni della Flash Memory che nel mio Arduino Uno è 32 KB (ATmega328) of which 0.5 KB used by bootloader come recita la scheda tecnica del sito.

Il secondo vantaggio è che posso costruire e testare le pagine sul pc, senza dover continuamente uplodare lo sketch arduino, risparmiando:

  1. il tempo di attesa per ogni variazione
  2. il numero di riscritture dell’Arduino
  3. dover avere l’Arduino sempre collegato al computer

Terminate le prove in locale sulla SD Card, puoi inserire semplicemente la micro SD Card nello slot della Ethernet Shield e provare il tutto.

Realizzazione

Per fare questo ho prima preparato uno sketch che sfrutti le librerie: SPI.h e Ethernet.h per laparte di rete e SD.h per la lettura/scrittura sulla micro SD card.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2, 130 };
File htmlFile;
Server server(80);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  if (!SD.begin(4)) { return; }
}

void loop()
{
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          
          htmlFile = SD.open("index.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
                client.print(htmlFile.read(), BYTE);
            }
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

Passiamo allo sbroglio del programma per capirci qualcosa di più:

linee 1-3: includono le librerie appena viste;
linee: 5-8: impostano le variabili perchè lo sketch funzioni, 5 e 6 definiscono rispettivamente il MAC e L’IP della scheda Ethernet, io ho lasciato invariato il primo, in quanto deve essere un numero univoco formato da 12 cifre esadecimali dove le prime 6 individuano il vendor o costruttore della scheda e i successivi un un numero univoco sequenziale, o seriale della scheda, maggiori informazioni puoi trovarle su Wikipedia; mentre ho modificato l’IP per consentire alla scheda di essere vista nella mia rete. la linea 7 imposta la variabile di tipo File contenenete il nome del file html e la linea 8 imposta il server per rispondere sulla pora 80 (la porta HTTP);
linee 10-15: impostano la funzione di setup, in cui inizializzo la libreria Ethernet passando Mac e IP (12) impostati, inizializzo il server (13) e imposto il pin 4 come designato alla comunicazione con la micro SD card (14);
linee 17-51: definiscono la funzione loop, in particolare analizzo linea per linea quello che accade ad ogni ciclo di processo.
linee 19-20: verifico che esista una connesione da parte di un client, in assenza di tale connessione evito di eseguire alcun passaggio;
linea 21: imposto una variabile di tipo booleana a true che mi servirà in seguito;
linea 22: inizio un ciclo di tipo while all’interno del quale eseguirò delle operazioni solo fino a che la connessione del client è attiva;
linea 23: verifico per ogni ciclo del while che il client comunichi con il mio server, in caso contrario non eseguirò alcuna operazione e chiuderò la comunicazione, vedreai come alle linee 48 e 49.
linea 24: leggo dal client la richiesta della pagina;
linea 25: se la richiesta è un carattere di linea nuova (\n) e la variabile currentLineIsBlank è true inizio la mia comunicazione con il client;
linee 26-28: con il metodo println della classe client, similmente a quanto visto per l’analogo metodo della classe Serial, invio al mio client gli Header della mia pagina, questi sono standard HTML;
linea 30: finalmente leggo il mio file index.htm dalla SD card, è importante sottolineare che il nume dei file non può essere maggiore del valore 8.3 ossia 8 caratteri per il nome e 3 per l’estensione, per mia abitudine uso chiamare i miei file .html ma in questo caso non funzionerebbero in quanto la SD Library non supporta file con una estensione maggiore di 3 caratteri.
linea 31: verifico che sia riuscito a leggere il file;
linea 32: scorro lungo tutto il file, riga per riga fina alla sua conclusione;
linea 33: con il metodo print della classe client incio al mio browser (IE,Firefox,Safari,Chrome, ecc) il contenuto di tutte le linee, per ottimizzare il flusso ho utilizzato la funzione print e non println che invierebbe al termine di ogni linea un ritorno a capo;
linea 36: terminata la lettura e l’invio del file chiudo il file, questa operazione è molto imporatnte per non lasciare il file aperto ed impedire ad un successivo collegamento la possibilità di aprirlo nuovamente, causando un errore nella fase di lettura;
linee 40-45: verificano la comunicazione con il client e ricevendo una linea vuota (\n) reimpostano la currentLineIsBlank a true, in caso di ricezione di un carriege return (\r) impostano a false la stessa, impedendo al ciclo successivo di reinviare nuovamente gli header e il file già inviato (vedi linea 25);
linea 48: imposta un tempo di attesa di 1 millisecondo per ciascuna eseguzione della unzione loop.
linea 49: chiude la comunicazione con il client, avendo ultimato l’invio di informazioni e consentendo al server di rispondere alle richieste successive.

In queto esempio ho trattato la sola lettura di un file HTML, prossimamente eseguirò degli esperimenti in cui il file da leggere nonsia sempre lo stesso ma più di uno potendo inserire dei veri e propri link all’interno delle pagine.

Buon lavoro.

 

Important!


Gentilmente NON incollare sketch nei commenti, usa la casella info del blog che trovi nella pagina contatti.

Warning!


Gli sketch sono distribuiti in forma gratuita e senza alcuna responsabilità.
Leggendo questo articolo e decidendo di usare lo sketch proposto ti assumi ogni responsabilità.

Important!


Ti è stato utile questo articolo?
Sostienimi cliccando sugli sponsor, io potrò continuare ad acquistare materiale per scrivere articoli e aiutarti nei tuoi progetti.

Basta un solo click al giorno.

Be Sociable, Share!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/tutorial-arduino-ethernet-sdcard.html

87 comments

6 pings

Vai al modulo dei commenti

  1. pablos

    ciao. Non ci sono molti esempi in rete che utilizzano una pagina html caricata su SD e soprattutto la gestione di dati tra arduino e la pagina htm…. comunque io ho messo una pagina index.htm nella sd, ma non viene caricata non ho nessuno errore, si connette ma il browser è bianco candido, mi basterebbe un pulsante on e uno off e un pezzetto di sketch per capire come andare avanti … saluti

    1. Mauro Alfieri

      Ciao, sui pulsanti sto facendo degli esperimenti anche io, prima di passare a questa parte suggerirei di capire come mai non vedi nulla.
      Inizializza nel setup la seriale: Serial.begin(9600); e aggiungi dopo la riga:
      client.print(htmlFile.read(), BYTE);
      la
      Serial.print(htmlFile.read(), BYTE);
      Esegui l’upload e verifica cosa ti ritorna nel monitor seriale.

      Ciao

  2. Diego

    Ciao! un’informazione…. Ho appena acquistato uno shield ethernet A000056. Dove trovo scritta la dimensione massima della scheda microSD da inserire?

    1. Mauro Alfieri

      Ciao Diego,
      la scheda è la stessa che ho acquistato anche io all’Arduino Camp 2011, io ne utilizzo una da 2Gb con filesystem Fat16, che sul sito è indicato come filesystem da preferire.

  3. pablos

    grazie per la risposta :)
    allora ho risolto avevo toccato una libreria java

    ho messo questo html per provare e funziona

    ora sarebbe bello capire cosa mandare a ad arduino quando premo e come fargli riconoscere il char inviato

    Non so se usare il get o post, c’e’ chi dice che il get è nascosto quindi piu sicuro, pero’ implica l’utilizzo di jquery.js e vado ben oltre le mie conoscenze di programmatore niubbo autodidatta :)

    Il post si vede sulla riga e mi basterebbe solo prendere la parte del (char)client.read() non mi è ben chiaro come devo fare

    Ho cercato di modificare il TinyWebServer a questo link http://www.webweavertech.com/ovidiu/weblog/archives/000484.html con scarsi risultati, troppi salti tra librerie script java, non so cosa studiare per fare una cosa decente e fatta bene
    Ciao

    1. Leonid

      da quanto ne sapevo io, il post nasconde i dati e il con il get si vedono i dati :)

      comunque, per arduino non c’è tanta differenza

      1. Mauro Alfieri

        Ciao Leonid,
        ciò che scrivi è corretto ma vale per la comunicazione HTML, sei a un livello superiore di lavoro.

        Quando ti parlo di web server mi riferisco a come il codice che scrive per arduino serve le pagine, le immagini e tutti i file che tu chiedi.

        Per capirci: quando tu chiami un web server ( tipo apache ) lui risponde attutite le tue richieste con il protocollo HTML interpretando la tua richiesta e rispondendoti.

        Con arduino non hai apache a disposizione per cui ogni volta che chiedi un elemento della pagina come un css, js, image ecc… La richiesta arriva al tuo codice che deve essere in grado di interpretarla e rispondere.

        Scriversi un web server non è semplice e occorre conoscenza approfondita dei protocolli della comunicazione client-server e sopratutto del codice da interpretare, tutto questo in arduino devi fartelo tu o trovarti un web server già fatto.

        Mauro

      2. delta

        ciao,
        i dati passati per GET sono quelli visibili sulla URL tipo pagina.html?nome=valoer&nome2=valore2
        il GET e dopo il ?.
        in POST invece, i dati passano dentro al messeaggio HTTP e no sono visibili.

        se operi con arduino la differenza è la stessa, per leggere i dati io ho utilizzato questo sietema:
        dopo il comando: char c = client.read();
        metti: stringaLetta+=c;
        così alla fine hai tutto il messaggio ricevuto; ricordati poi di azzerare la variabile una volta concluso il tutto.

        poi prima di caricare Index.html
        fai: if (parametro.indexOf(“/pagina1.html”)!=-1){

        e tra le virgolette dell’indexof metti il testo da controllare, tipo se scrivi “/pagina1.html” nell’URL devi scrivere HTTP:// IP “/pagina1.html, altrimenti non carica nulla…

        su questo dei poi inporvvisare tu!

  4. pablos

    non mi ha incollato l’html di esempio per vedere se arduino faceva l’upload

  5. lui la plume

    Qualche anno fa’ ho acquistato una “Transcend SD Card 2GB” … e’ rimasta fino ad oggi sigillata ora ne tento l’utilizzo ma il sistema Vista (aggiornato) la vede come 1GB.

    Qualche idea sul motivo?

    1. Mauro Alfieri

      Potrebbe essere dovuto alla porta USB, hai provato con una porta differente o su un Pc diverso?
      Mauro

  6. lui la plume

    Acc …. Trovato
    Per leggere la SD ho utilizzato un dispositivo esterno… comodo ma poco raccomandabile viaggia connesso alla porta USB …. ed e’ nato come gestore usb 1.1 …. funziona ancora ma non vede ne sa’ gestire le sd superiori ad 1GB.

    Inserito nella scomodissima porta prevista nel portatile … va’ bene.
    Saluti.

    1. Mauro Alfieri

      Bene, sono contento che tu abbia risolto.
      Mauro

  7. David

    Ciao,
    leggendo il tuo codice ho visto che hai dichiarato File htmlFile;
    Volevo chiederti a quale libreria si rifà, visto che in arduino io non ho visto nulla riguardo i File, e poi nel codice non è definita
    Grazie

    1. Mauro Alfieri

      File appariene alla libreria SD, inclusa alla linea 03.

      Mauro

  8. Alberto

    Letto con interesse l’articolo,
    mi appresto ad acquistare anche la shield Ethernet oltre alla Arduino Uno rev. 3.

    Sarebbero di estremo interesse esempi con pagine web multiple.

    Grazie

    1. Mauro Alfieri

      Ciao Alberto,
      ottima scelta.
      Apprendo la richiesta e mi ripropongo di pubblicare qualche esempio.
      Il tuo progetto di cosa si occuperà?

      Mauro

  9. antonio

    salve, sto lavorando con una scheda ethernet appena acquistata. Ho realizzato un semplice webserver che funziona perfettamente e mi piacerebbe scrivere su SD anche lo stato di alcuni input di arduino (file txt).

    Se all’interno del loop e a client inattivo tento di scrivere su SD perdo la funzionalita’ ethernet e quindi tutta la parte webserver.

    Per quanto mi risulta il pin SS è il 10 (per la parte W5100) e il 4 per la parte SD. Non dovrebbero andare in conflitto. Sai darmi una dritta ?

    1. Mauro Alfieri

      Ciao Antonio,
      sono interessato a quello che stai realizzando, non mi è chiaro cosa accade puoi postarmi su info(chiocciola)mauroalfieri.it il tuo sketch?

      Grazie
      Mauro

  10. antonio

    ciao, lo sketch è il tuo con l’aggiunta di lettura da SD.Intanto ho tentato di leggere la porta da un file txt ma non sembra possibile dichiarare la “Server server(80)” dopo la lettura del file. Poi pensavo di poter scrivere lo status di alcuni IN/OUT su un file su SD (devo ancora completare i test).

  11. Antonio

    Ciao, ho riscontrato alcuni problemi nella compilazione di questo codice.Sto usando la Ide 1.0.1 con Ubuntu 12.04.1; ho dovuto modificare la linea 19:
    EthernetServer server(80);

    la linea 08 :
    <code EthernetClient client = server.available();

    e alla linea 33:
    client.print(htmlFile.read(), BYTE);
    anche la direttiva BYTE genera un errore di compilazione.
    E’ Ammesso: DEC, OCT ed HEX, ti risulta che sia stata modificata qualche libreria ?

    1. Mauro Alfieri

      Ciao Antonio,
      dalla versione 0022 alla 1.0 in poi sono cambiate tante cose e alcune riguardano proprio librerie come la Ethernet ed i tipi di dati.
      Siccome non riesco a riprovare tutti i miei esempi su tutte le versioni dell’IDE se vuoi condividere le correzioni che apporti fallo commentando gli articoli.

      Mauro

    2. Franco

      Salve,
      pure io ho riscontrato il problema indicato alle linee 19, 8 e 33.
      Mentre per le prime due righe iniziali ho risolto come proposto, la riga 33 continua a dare problemi, mi spiego:

      il parametro BYTE non viene accettato ed inserendo (oppure omettendo del tutto) DEC, OCT, HEX nel browsere mi appare una lunga riga contenenente solo numeri che cambiano di valore in base al parametro inserito.
      il file index.htm è composto solo da una semplice scritta

      Il codice è il seguente:

      Ciao io sono Franco

      Ciao io sono Franco

      Grazie per l’eventuale aiuto

      1. Mauro Alfieri

        Ciao Franco,
        prova a verificare nella libreria Ethernet cosa sia cambiato dalla versione per l’IDE 0022 e l’IDE 1.0 e successivi.
        Errori di questo tipo puoi risolverli con il manuale Arduino in cui ho trovato: http://arduino.cc/en/Reference/ServerPrint
        Il valore BYTE è stato sostituito da BASE che da come opzionale, per cui puoi ometterlo.
        Verificare se la soluzione risolve il problema, in alternativa prova a partire da un esempio presente nell’IDE e modificalo per fargli visualizzare la tua pagina.

        Mauro

        Mauro

  12. Gianfranco

    Ciao Mauro,

    volevo farti una domanda più banale: sulla SD card che andrà poi inserita in Arduino ethernet può essere scritto un qualsiasi sketch che verrebbe altresì scritto ad esempio su un arduino 2009, o si possono scrivere solo sketch di webserver?

    In pratica non capisco come sia possibile scrivere sketch su un Arduino ethernet non utilizzando una SD card.

    Grazie mille,
    Gianfranco

    1. Mauro Alfieri

      Ciao Gianfranco,
      l’SD Card che inserisci nell’arduino ethernet puoi usarla indipendentemente dalla parte ethernet, puoi ad esempio scrivere uno sketch di datalogger senza coinvolgere la comunicazione di rete.

      Mauro

  13. Gianfranco

    Ciao Mauro,

    sto eseguendo il tuo tutorial, e mi domandavo se fosse possibile installare un webserver PHP….ma probabilmente immagino di no.

    Grazie mille ciao!

    1. Mauro Alfieri

      Ciao Gianfranco,
      dovresti scriverti tu l’interprete e non basterebbe ne la memoria ne la capacità di calcolo di Arduino.

      Mauro

  14. Gianfranco

    Ok Mauro, e come lo vedi di implementare un webserver su un Raspberry pi, in modo tale che arduino possa accedere ad esso?

    Hai qualche esperienza sulla convivenza Raspberry+Arduino? Penso possa essere un’ottima idea circa l’utilizzo di Arduino con un webserver php a tutti gli effetti, senza necessariamente implementarlo su un PC desktop / laptop.

    Grazie :)

    1. Mauro Alfieri

      Ciao Gianfranco,
      non ho ancora avuto modo di provare la RaspberryPi, da quello che ho letto, si implementa facilmente un server web con Php.
      Sulla convivenza ci possono essere mille modi di farli colloquiare, ma la RaspberryPi dispone delle uscite GPIO da usare per controlli esterni, quindi potresti evitare Arduino.

      Mauro

  15. Gianfranco

    Si Mauro, ci ho anche pensato ad utilizzare il solo Raspberry.
    Giusto a titolo informativo per gli altri utenti, come ti dicevo, il mio obiettivo era quello di creare una trasmissione wireless tra un arduino dotato di un modulo trasmettitore NRF24L01 ed un altro arduino dotato a sua volta di un modulo ricevitore NRF24L0 (il NRF24L01 è un transceiver che si collega ad arduino e comunica con esso sfruttando l’interfaccia SPI). L’arduino in trasmissione, collegato ad un router tramite l’ethernet shield, è pilotabile tramite uno smartphone (sintonizzato sulla rete wi-fi) collegandosi al webserver installato sulla ethernet shield.

    Fin qui dovrebbe essere tutto chiaro. :)

    Ma nel momento in cui volessi implementare un webserver con i ficchio (piattaforma LAMP: Linux – Apache – Mysql – PHP), avrei bisogno di un PC, che può essere anche un Raspberry. Ma quello che sto sto cercando di capire adesso è se posso sostituire l’arduino in trasmissione (+NRF) direttamente con il Raspberry (+NRF) in modo che, lato ricezione, l’arduino (+NRF) possa effettivamente ricevere i dati inviati dal Raspberry (+NRF). In poche parole sto cercando di capire se funziona una cosa del tipo:

    Raspberry con webserver (+NRF) può comunicare con Arduino (+NRF)

    Spero di non essere stato confusionario con chi leggerà questo intervento….!!
    :)
    Grazie….!!
    Gianfranco

    1. Mauro Alfieri

      Ciao Gianfranco,
      la tua soluzione penso sia fattibile a patto di trovare o scrivere del codice in grado di mettere in comunicazione la RaspberryPi con il modulo NRF24L01 attraverso la SPI.
      Ho trovato questo articolo interessante sulla comunicazione SPI tra RaspberryPi e un display Nokia 3310: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=32&t=9814&hilit=nokia&sid=375a23c4a53a1524437a786ab6b09dba

      Spero possa esserti utile.

      Mauro

  16. gianfranco

    Ciao Mauro e grazie….

    Forse quest’altro topic è ancora piu azzeccato!!
    http://www.raspberrypi.org/phpBB3/viewtopic.php?f=45&t=17061&p=248264&hilit=nrf24l01#p248264

    ;)

    1. Mauro Alfieri

      Molto interesante !!!
      Mauro

  17. Davide

    Ciao Mauro sono molto interessato a questo articolo…. l’ho provato ma non visualizzo nulla…. ho dovuto modificare il tuo scketc perché uso un IDE 1.0.3 quindi certe cose mi davano errore..
    Comunque non mi vede il file e non riesco a capire come mai… Mi interessa tanto perchè sto portando avanti un progetto che si chiama domotica per tutti che utilizza appunto arduino.
    Mi piacerebbe anche sapere poi come fare a far interagire una pagina html messa su sd e il programma scritto su arduino … grazie

    1. Mauro Alfieri

      Ciao Davide,
      ho cancellato il codice che mi hai postato in quanto nel copia e incolla ha perso dei pezzi.
      Mi piace il tuo progetto e sono sicuro che sarà di interesse di molti.
      Se vorrai pubblicarlo, una volta ultimato, sarò lieto di poterti dedicare uno o più articoli.

      In merito alle tue domande:
      1. per trovare cosa non funziona non hai che da inserire dei debug via monitor seriale e verificare che lo sketch riesca ad accedere all’SD
      2. per interazione tra pagina e arduino trovi sul blog dei tutorial che puoi consultare.

      Mauro

  18. armando

    ciao Mauro
    ma se volessi registrare la temperatura letta dall’ lm35 e spedita al At328 ( in stand alone)
    l’eprom del 328 e limitata quindi per usare una sd card in questo caso ?
    Armando

    1. Mauro Alfieri

      Ciao Armando,
      non ho capito il progetto che vuoi realizzare.

      Mauro

  19. armando

    ciao mauro ,
    ho fatto il famoso termometro con il codice che conosciamo lo uploaddato sul at328 e visualizzato sull’lcd in modo autonomo senza mother board di arduino .Funzionante regolarmente
    adesso volevo almeno fare una prova per registrare sulla sd card o simili
    la sequanza dei valori di temperatura letti dall LM35 .

    Poi passare allo shield ethernet come indicato dalla tua lezione
    A..

    1. Mauro Alfieri

      Ciao Armando,
      leggi il mio tutorial sul datalogger, é sto pubblicato su molti siti di Arduino.
      Rispetto a quello che vuoi fare tu ha in più un RTC Shield, ma puoi toglierà se a te non serve.

      Mauro

  20. armando

    buon giorno mauro
    prima di iniziare..
    ho visto tanti tanti schemi di collegamento ce ne sono di svariati tipi . Non ho tanto chiaro lo schema elettrico in quanto ne ho trovati tanti e non vorrei sbagliare .. mi servirebbe uno schema di collegamento standard tra card reader e arduino .
    In particolare le alimentazioni + 5Vcc e 3.3Vcc ( come usarle ) e poi Mosi miso etc..
    Mi pare di aver capito che anche i segnali miso mosi etc… vanno abbassati dalla logica positiva = 5V a 3V
    mi puoi aiutare ?
    ciao
    Armando

    1. Mauro Alfieri

      Ciao Armando,
      hai individuato già il punto, devi collegare MISO, MOSI, Gnd e +3.3v
      Puoi seguire uno dei miei schemi o quello delle SD Shield in vendita on-line e di solito rilasciati open-source.

      Mauro

  21. armando

    quindi ricapitolando ,…

    se la sd e sola ( nel senso solo scheda) bisogna abbassare la tensione dei vari segnali .
    __________________________

    se la sd e’ gia corredata di circuito e componentistica varia ( vedi quelle in vendita gia pronte)
    non bisogna collegare circuiti intermedi ma basta collegarla direttamente al pinout di arduino (digitale)

    cosi mi pare di aver capito .

    1. Mauro Alfieri

      Ciao Armando,
      non ho mai provato a collegare una SD senza un suo circuito/shield per cui ciò che scrivi é interessante ma non posso confermartelo.

      Mauro

  22. Davide

    Ciao Mauro! Ho acquistato da poco l’ethernet shield per arduino e sto cercando di capirne il suo funzionamento. Il programma di questo articolo mi è abbastanza chiaro, eccetto un punto. Alla riga 38 non riesco a capire la funzione dell’istruzione break . Mi potresti dare delucidazioni? grazie mille!

    1. Mauro Alfieri

      Ciao Davide,
      l’istruzione break serve a interrompere il ciclo while che inizia alla linea 22.
      In pratica quando entri nella condizione di if della linea 25, esegui tutto quello che segue e arrivando alla linea 38 esci dal while.

      Mauro

      1. Davide

        Grazie mille, sei stato chiaro! Buona Pasqua!

  23. Macca96

    ciao Mauro

    un’ altra cosa se io utilizzo una micro sd da 4 gb per scrvere 2 paginette in html
    me lo legge lo stesso??
    non ho disponibile immediatamente una sd da 2 gb ovviamente dei 4gb ne userò una piccolissima
    parte.

    cosa ne pensi??

    grazie

    1. Mauro Alfieri

      Ciao Macca,
      dipende dalla Shield, alcune ignorano la dimensione accedendo solo ai 2Gb altre non leggono nulla.

      Mauro

  24. Luca

    Salve,

    Ho un dubbio.. Acquistando una Ethernet Shield, per la scrittura di un piccolo web server occorre una SD da 2GB. La SD è una qualsiasi o ne esiste una specifica per Arduino Uno Rv3?

    Inoltre, una volta comprata la SD, come si collega alla Ethernet? Esiste uno slot predisposto oppure devo acquistare un’altra specie di Shield dedicata alla SD e collegarla alla Ethernet? Nell’ultimo caso, come?

    Grazie infinite, buona sera.

    1. Mauro Alfieri

      Ciao Luca,
      la ethernet shield che utilizzo io è quella ufficiale Arduino che trovi sul loro sito.
      Ha già uno slot x microSD ed è già tutta cablata.

      Per la scrittura di un Web Server puoi cercare nel bog o in internet ci sono dei progetti interessanti.

      Mauro

  25. Matteo

    Ciao sono nei casini. Ho acquistato questa http://www.futurashop.it/images_la/8190-ETHSHIELDKIT.jpg shield ma non riesco a farla andare. Mi dai qualche consiglio?

    1. Mauro Alfieri

      Ciao Matteo,
      non conosco a shield, che chioserà monta?
      Futura di solito fornisce degli esempi, hai provato ad utilizzarli?

      Mauro

      1. Matteo

        Si ho scaricato una liberia che dovrebbe essere adatta a questa scheda, monta il chip ENC28J60, i led della lan sono accesi ma non riesco a fare il ping. Ho provato sia collegando la scheda direttamente al pc sia collegandola attraverso un router. Tu come hai collegato la scheda con il pc? Ci vuole un cavo cross? Non vorrei sia un problema di collegamento, però ho provato ma non riesco.
        Consigli??? :(

        1. Mauro Alfieri

          Ciao Matteo,
          se colleghi la scheda al Pc/Mac dovrai usare un cavo cross.
          Prova a verificare con dei debug via serial monitor che l’IP sia correttamente assegnato.
          Dopo il test precedente verifica con degli strumenti di rete (arp, arping, …) che il Mac Address dichiarato nello sketch sia associato a quell’Ip

          Mauro

          1. Matteo

            Ci sono riuscito finalmente!!!!
            Grazie.

          2. Mauro Alfieri

            Ciao Matteo,
            eccellente sono contento è questa una delle finalità del mio Blog: fornire gli strumenti conoscitivi per aiutarti nei tuoi progetti.

            Mauro

  26. Riccardo

    Ciao Mauro.

    Che formato deve avere il file “index.htm” all’interno della SD? e con quale programma compili il file index?

    grazie

    1. Mauro Alfieri

      Ciao Riccardo,
      il file è un comune file html e non devi compilarlo in nessun modo.

      Mauro

  27. Franco

    Ciao Mauro,
    ti segnalo che ho risolto il problema di lettura del sito caricato sulla SD e nello specifico:

    le righe da modificare nel tuo listato inizio pagina sono le seguenti

    modificare riga 11 in EthernetServer server(80);
    modificare riga 19 in EthernetClient client = server.available();
    modificare riga 33 in client.write(htmlFile.read());

    In particolare l’ ultima riga è stata risolutiva.
    La soluzione l’ho trovata sul listato presente a questo link (è corretto citarlo)
    http://linuxmx.it/elettronica/arduino/427-arduino-web-server.html#es1
    Ti ringrazio comunque per l’interessamento.
    Ciao

    1. Mauro Alfieri

      Grande Franco,
      sono sicuro che la tua soluzione sarà di aiuto a tanti, grazie per averla condivisa.

      Mauro

  28. Riccardo Matta

    Qualcuno di voi ha provato ad usare nel modulo Ethernet una sd più grande di 2Gb? E’ possibile usarle?
    Anche perché non sono più di facile reperibilità e lo sarà sempre di meno!!

    1. Mauro Alfieri

      Ciao Riccardo,
      le specifiche del produttore: Arduino, della SD Card utilizzabile sulla Ethernet Shield è al max di 2Gb.
      Potresti provare ad utilizzarne una di dimensione superiore creando delle partizioni a 1,9Gb.

      Mauro

  29. Mattia Dei

    Io ho riscontrato un problema sulla compilazione…
    nel pezzo di codice
    while(htmlFile.available()) {
    client.print(htmlFile.read(),BYTE);
    }
    il compilatore dell’IDE mi ha dato come errore questo messaggio: “Da Arduino IDE 1.0 la parola chiave ‘BYTE’ non è più supportata. Usa Serial.write() al suo posto”
    ho la versione 1.5.6 dell’IDE solo che non capisco come procedere, nel tuo codice hai inserito BYTE(che non so a cosa possa servire (mi serve anche la spiegazione di questo)) e invece dovrei ometterla…

    1. Mauro Alfieri

      Ciao Mattia, alcuni sketch non sono adatti a tutte le versioni dell’IDE arduino. Prova a é rificcare sulla documentazione ufficiale arduino come é cambiata la sintassi dell’IDE relativa all’oggetto client della Ethernet lib. probabilmente basta solo togliere BYTE, tuttavia devi verificare che il comando si comporti allo stesso modo.

      1. Mattia Dei

        Ciao Mauro…
        Ascolta ho riscontrato un ulteriore problema. Se carico la mia pagina “index.htm” da SD si carica bene, il problema è che la pagina index.htm è fornita di strutture CSS in un file esterno, sempre all’interno della SD, come posso fare per caricare la mia pagina con le istruzioni CSS?

        1. Mauro Alfieri

          Ciao Mattia,
          considera che, come ho scritto, devi scriverti tutta la parte di web server.
          Per capirci ogni volta che il browser incontra un tag HTML verifica se interpretarlo o se chiedere al server di servirgli la risorsa web, puoi leggere in internet uno dei tanti articoli su come funziona un webserver tipo apache.
          In arduino ogni volta che arriva una richiesta devi scrivere nello sketch come interpretarla e rispondere, al pari di come ho fatto per la pagina index.htm

          Il modo più semplice per non dover scrivere sketch complessi per le risorse css e js è inserirle nella pagina htm come testo e non come risorsa esterna.

  30. Mattia Dei

    In più mi serve una mano nel capire come aprire le pagine create in HTML (con arduino) da browser oppure direttamente faccio avviare il programma da arduino e mi si apre la pagina?

    1. Mauro Alfieri

      Ciao Mattia, non ho capito la tua richiesta, perdonami.

      1. Mattia Dei

        Praticamente quando avvio il programma con Arduino, come faccio a visualizzare a schermo il risultato della mia pagina HTML creata?

        1. Mauro Alfieri

          Ciao Mattia,
          devi collegarti con un browser all’indirizzo Ip assegnato nello sketch arduino.
          Come avrai letto l’arduino deve essere collegato alla stessa rete a cui hai collegato il Pc con il browser.

          1. Mattia Dei

            Ti spiego, Arduino è collegato direttamente al modem, mentre io sono collegato con la wifi (sempre della stessa rete)…
            Come dici tu, ho digitato l’indirizzo ip nel browser, il problema che mi dice: Impossibile collegarsi a….(il mio indirizzo ip).

          2. Mauro Alfieri

            Ciao Mattia, controlla che arduino abbia ricevuto l’IP a cui stai puntando, magari ne hai configurato uno già occupato e arduino non può averlo.

          3. Mattia Dei

            ho gia provato e un altro programma mi da proprio quell’indirizzo…

          4. Mauro Alfieri

            Ciao Mattia,
            il passo successivo è mettere nello sketch dei Serial.print e verificare che il client si connetta e fino a che punto arrivi.

            Mauro

  31. Daniele

    buon giorno,
    io ho creato un paio di pulsanti web per comandare delle luci di casa, ora vorrei per sfizio creare la pagina web e salvarla su sd . la cosa che non capisco è come richiamare i pulsanti da arduino se sono nella sd.
    grazie

    1. Mauro Alfieri

      Ciao Daniele,
      la pagina HTML la carichi direttamente sulla SD e se i pulsanti sono immegini devi scriverti tutto l’interprete, lato arduino, che comprenda la tua richiesta e ti esponga i file che chiedi.
      Non è una cosa semplice e prevede che tu conosca molto bene come funziona un web server a basso livello.
      In alternativa puoi disegnare i pulsanti con gli stili css e la visualizzazione sarà molto più semplice.

  32. Alessandro

    Salve! Io carico nella scheda microSd un file index.htm e vi scrivo una semplice stringa tipo ‘PROVA’.
    Quando vado a tentare di connettermi sul browser mi appare scritto ‘POA’ e, avendo aggiunto il serial print sul monitor seriale mi appare ’828613495352-1828613495352-1828613-1828613-1828613-1828613-1′ . Ho modificato come suggerito nei commenti le varie righe!Saprebbe aiutarmi? Grazie mille!

    1. Mauro Alfieri

      Ciao Alessandro,
      capitava anche a me.
      Devi mettere una pagina html con tanto di tag di apertura e chiusura perchè funzioni.

  33. Karim

    Ciao Mauro

    Vorrei poter memorizzare dei dati provenienti da una shield Host USB (esattamente dei dati provenienti da una tastiera USB) e salvarli all’interno della SD (e non nella memoria di Arduino), successivamente vorrei poter caricare questi dati attraverso su rete ethernet (esattamente come fatto da te ma con il file index.htm)….pensi sia possibile farlo? o potrebbero esserci dei problemi?

    1. Mauro Alfieri

      Ciao Karim,
      penso sia possibile farlo.
      Purtroppo non ho mai provato la shield usb host e non saprei dirti come.
      Un suggerimento a mio avviso potrebbe essere l’Arduino Yùn che è dotata di un linux, di una porta host e di due interfacce di rete ( ethernet e wifi ) per cui con poco più di 50€ hai tutto e sicuramente molta più potenza e semplicità.

  34. angelo

    salve
    ho letto molte spiegazioni su arduino ma non riesco a farlo funzionare.ho incollato la libreria webduino nella cartella library del programmino java ma poi quando inserisco lo sketch mi da più errori nella compilazione.vorrei sapere gentilmente come devo fare per pilotare 2 o 3 relè con arduino e la ethernet shield?
    grazie

    1. Mauro Alfieri

      Ciao Angelo,
      ti consiglio di leggere gli articoli sulla ethernet ed i led poi sostituisci i led con dei relé.
      Ogni relé che aggiungi devi scriverti tutto il codice arduino che ti serve per interpretare le comunicazioni tra ethernet e relé.

  35. Davide

    c’è una cosa che non mi è chiara, tu scrivi: ” in caso di ricezione di un carriege return (\r) impostano a false la stessa”. Invece nel sorgente c’è scritto:

     else if (c != ‘\r’) {
              currentLineIsBlank = false;

    Quindi, è in caso di mancata ricezione di un \r che imposta a false.

    In ogni caso, visto che questo sorgente non fa altro che inviare un file html ad ogni richiesta del client, una volta ricevuto il file, il client non dovrebbe fare più richieste, quindi non capisco a cosa serva la currentLineIsBlank.

    Potresti spiegarmelo?
    Grazie

    1. Mauro Alfieri

      Ciao Davide, hai ragione é espresso male. Nella realtà potrai verificare che quel codice e la variabile currentLineIsBlank servono ad evitare al server di reinviartela gli headers della risposta http e del file HTML fino a quando non arriva dal cliente un carriege return.

      1. Davide

        questo perchè la richiesta http si conclude in pratica con un doppio \r\n. Quindi se ho capito bene leggo un byte alla volta, i primi saranno caratteri, quindi currentLineIsBlank va a false, ad un certo punto trovo \r e salta il ciclo, poi riceve \n e va a true, ma subito dopo troverà un’altro carattere diverso e quindi torna a false. Finchè la richiesta non arriva alla fine, dove troverà \n e va a true, poi troverà \r e ignorerà il ciclo e finalmente con l’ultimo \n risponderà alla richiesta.

        Credo di aver capito. Grazie :)

        1. Mauro Alfieri

          Ciao Davide, non avrei saputo spiegarlo meglio.

  1. Mauro Alfieri » Blog Archive » Tutorial Arduino Ethernet e SD Card | Arduino - Ethernet | Scoop.it

    [...] Mauro Alfieri » Blog Archive » Tutorial Arduino Ethernet e SD Card Source: http://www.mauroalfieri.it [...]

  2. Mauro Alfieri » Blog Archive » Arduino, OSC e iPhone

    [...] Ci sono alcune linee che si riferiscono solo alla comunicazione Ethernet, sono linee che avrai già incontrato in altri tutorial di questo sito: Tutorial Arduino Ethernet e SD Card. [...]

  3. Mauro Alfieri » Blog Archive » Tutorial: Arduino, Ethernet e pagine multipre su SD Card

    [...] sei tra gli appassionati che hanno già letto il mio articolo su Arduino Ethernet e SD Card, e probabilmente come altri che mi hanno scritto ti sei chiesto se è possibile realizzare un [...]

  4. Tutorial: Arduino, Ethernet e pagine multiple su SD Card » Mauro Alfieri

    [...] sei tra gli appassionati che hanno già letto il mio articolo su Arduino Ethernet e SD Card, e probabilmente come altri che mi hanno scritto ti sei chiesto se è possibile realizzare un [...]

  5. Arduino Wifi Shield finalmente sullo store ufficiale » Mauro Alfieri

    [...] livello HIGH i pin 4 e 10 rispettivamente per la SD Card e la WiFi ( leggi l’articolo sulla Ethernet Shield [...]

  6. GPRS shield: arduino si connette a internet - Mauro Alfieri

    […] Vuoi connettere il tuo progetto con arduino a internet? Usa la GPRS shield. Per connettere il tuo progetto alla grande rete hai già letto come utilizzare la WiFi shield o Ethernet Shield […]

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>