Tag

, , , , ,

Se non potesse comunicare con il mondo esterno, Arduino sarebbe soltanto un giocattolo e poco altro: solo uno strumento divertente per imparare i fondamentali dell’elettronica. Fortunatamente, Arduino è molto più e con l’aiuto di una semplice Ethernet shield possiamo metterlo in contatto con il mondo reale, tramite internet.

Vediamo allora come utilizzare la nostra Ethernet shield per interagire con il web!

Per prima cosa montiamo la shield su Arduino, colleghiamo un cavo di rete al router e il cavo USB ad Arduino. La shield si incastra senza problemi, due pin restano fuori ma fa lo stesso. Una volta sistemato il tutto, siamo pronti per “entrare in contatto” con internet.

La prima cosa da fare è aprire l’IDE di Arduino e importare le librerie <SPI.h> e <Ethernet.h>; se andate in alto, nel menu: Sketch > Importa libreria… e scegliete Ethernet, vedrete che in automatico verranno importate molte librerie. Potete cancellarle tutte tranne le due appena menzionate, non ci serviranno.

Per poter collegare Arduino al web, occorre prima di tutto indicare l’indirizzo MAC della Ethernet shield. Non è così complicato, potete trovare l’indirizzo sul retro della scheda oppure metterne uno fittizio. L’indirizzo MAC è solo per identificare la scheda nel caso ne abbiate più di una in rete, ma potete anche inventarne uno. L’unica cosa da ricordare è che va scritto in formato esadecimale (ossia, basta aggiungere 0x prima di ogni coppia di lettere e numeri), la seconda è che va dichiarato come un array di bytes. In realtà è molto semplice, vediamo:

byte mac[] = { 0xDD, 0xAB, 0xCE, 0xFF, 0xEE, 0xED }; // MAC address

Fatto questo, dobbiamo assegnare alla scheda un indirizzo IP, affinché non venga confuso con altri dispositivi presenti nella nostra rete locale. Per fare questo, possiamo impostare noi un indirizzo valido a piacere, oppure fare in modo che sia il ruoter ad assegnarcene uno (DHCP). Vediamo prima come impostarlo da soli:

byte ip[] = { 192, 168, 1, 10 }; // Scrivi un indirizzo valido per la tua rete locale

Bene! Tutto è pronto per partire. Per prima cosa, assicuriamoci che Arduino sia davvero in rete. Scriviamo con calma il codice per la connessione: per farlo dobbiamo utilizzare la funzione Ethernet.begin() che accetta come parametri il MAC address, l’indirizzo IP, il DNS, il gateway e la subnet. Tranquilli, sono quasi tutti facoltativi. Ci servono, in realtà, soltanto i due che abbiamo già creato: MAC e IP.

Ethernet.begin(mac,ip); // Connessione con IP pre-impostato

Se vogliamo utilizzare invece le funzionalità del DHCP (bisogna ovviamente che il nostro router abbia il DHCP abilitato), possiamo lasciare che sia il router ad assegnare in maniera automatica un IP ad Arduino. In questo caso, per connetterci, scriveremo soltanto:

Ethernet.begin(mac) // Connessione con IP assegnato tramite DHCP

La connessione con IP auto-assegnato (che è poi il DHCP) è l’unica variante di Ethernet.begin() che restituisce un valore, che è 1 quando la connessione ha successo. Ma proviamo a connetterci, e vedere se tutto funziona:

void setup()
{
  // Imposto una connessione seriale per verificare i dati
  Serial.begin(9600);
  // Connessione Ethernet usando MAC e DHCP (IP dinamico)
  Ethernet.begin(mac);

  // Diamo alla Ethernet shield un secondo per inizializzarsi
  delay(1000); 

  // Stampa sul monitor seriale l'indirizzo IP di Arduino
  Serial.print("Indirizzo IP: ");
  IPAddress myIPAddress = Ethernet.localIP();
  Serial.println(myIPAddress);
}

Fantastico! Il nostro Arduino è in rete!!

Quali fantastiche possibilità ci sono aperte, adesso? Tantissime! Arduino può lavorare in rete sia come server (per rispondere a delle chiamate, mostrare pagine web, o controllare i pin da un browser) – oppure come client, per inviare informazioni a un server o per leggere dati da un servizio o da pagina web. Vediamo di esplorare un po’ meglio quest’ultima possibilità.

Un esempio pratico

Mettiamo allora che siamo interessati alle quotazioni in borsa di una grossa azienda, e vogliamo che Arduino si colleghi ad internet per controllare l’andamento delle nostre azioni. Potremmo anche dirgli di salvarle su scheda microSD, o in un database, per ottenere delle statistiche; ma diciamo che per adesso vogliamo soltanto sapere le quotazioni odierne di Google (GOOG).

Arduino Ethernet Google Finanza

Arduino Ethernet Google Finanza

Per prima cosa, scriviamo l’indirizzo IP del server che vogliamo contattare. Se non sappiamo l’indirizzo IP, ma soltanto il nome del sito, possiamo lasciare che sia il software a tradurre l’indirizzo automaticamente per noi. È un servizio che si chiama DNS, ma lo vedremo tra breve. Per adesso diciamo che vogliamo andare all’indirizzo di www.google.com:

byte server[] = { 74,125,129,99 }; // Google (http://www.google.com)

Per contattare un sito, si procede in questo modo. È semplice. Basta aggiungere, nella funzione setup(), dopo la funzione Ethernet.begin(), il codice per la connessione. Mettiamo anche il codice per controllare se è tutto a posto.

EthernetClient client; // Imposto Arduino come client

if (client.connect(server, 80)) { // Mi collego a Google
 Serial.println("Connesso");
} else {
 Serial.println("Connessione fallita");
}

Se volessimo lasciare al DNS, il compito di tradurre il nome del sito nel corrispondente indirizzo IP, dovremmo invece dichiarare il nome del sito come array di caratteri (che è il modo in cui un linguaggio di programmazione come quello utilizzato da Arduino “vede” le parole o le frasi), e poi collegarci in questo modo:

char serverName[] = "www.google.com";
EthernetClient client; // Imposto Arduino come client
client.connect(serverName, 80); // Mi collego a Google

A questo punto, se tutto ha funzionato, chiediamo a Google la pagina del servizio finanziario che contiene tutte le informazioni relative all’andamento in borsa di Google. Bastano due righe di codice:

client.println("GET /finance?q=google HTTP/1.0");
client.println(); // FONDAMENTALE per poter leggere i risultati ottenuti!

Nella funzione loop(), andiamo a controllare che tutto stia procedendo correttamente:

void loop()
{
 if (client.available()) { // Se la richiesta della pagina ha avuto successo
   char c = client.read(); // Leggo la risposta, carattere per carattere
   Serial.print(c); // Stampo i dati ricevuti sul monitor seriale
 }
 if (!client.connected()) { // Quando ho finito, mi scollego
   Serial.println("Disconnetto.");
   client.stop();
   while(true) ; // Dato che non c'è più nulla da fare, lascio Arduino in attesa (loop infinito).
 }
}

Dopo un paio di secondi, vedrete comparire sul monitor seriale delle parole senza senso. Google purtroppo non formatta il codice delle sue pagine – un po’ per risparmiare spazio, un po’ per rendere più difficile leggere i suoi segreti. Ma se vedete quelle scritte, allora tutto ha funzionato!

Per vedere qual è il valore delle nostre azioni, dobbiamo solo cercarlo all’interno della pagina, e dire ad Arduino di stamparlo! Tecnicamente quello che cerchiamo è il tag <span class=”pr”>: dopo quello c’è un tag che non ci interessa e poi il valore della quotazione.

// Cerco il valore che mi interessa
// Gli apici (",') all'interno delle stringhe vanno scritti con lo slash davanti (\",\')
if (client.find("<span class=\"pr\">")) {
  // Salto al successivo '>'
  client.find(">"); 
  // Ottengo il valore
  float value = client.parseFloat(); 
  // Stampo il risultato
  Serial.print("Il valore delle azioni di Google: ");
  Serial.println(value);
}

Questo è tutto!

Download: arduino_ethernet.zip