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.

 

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/tutorial-arduino-ethernet-sdcard.html

152 pings

Skip to comment form

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

  2. […] 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. […] 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. […] 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. […] livello HIGH i pin 4 e 10 rispettivamente per la SD Card e la WiFi ( leggi l’articolo sulla Ethernet Shield […]

  6. […] 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

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.