Tag

, , , , , , ,

Arduino come server

Utilizzare Arduino come server è molto entusiasmante, ma presenta un grosso difetto: lo spazio. Per il nostro codice, infatti, abbiamo a disposizione appena 32kb, che sono oggettivamente pochi per un server web! Senza una SD card esterna, troveremo impossibile riuscire a ottenere un servizio che non sia davvero semplice. Per fortuna, sulla Ethernet shield è già incluso uno slot per microSD! In futuro vedremo come utilizzarlo. Anche se non abbiamo una microSD, comunque, possiamo pensare a qualche applicazione per utilizzare Arduino come un server web: potremmo interrogare Arduino tramite una pagina web (anche da fuori casa) e chiedergli di leggere oppure di scrivere il valore di un pin (questo si traduce, nel mondo reale, come: “Arduino, che temperatura fa in casa?” oppure: “Puoi accendere le luci in giardino?”) – in quest’ottica, possiamo pensare ad un Arduino come a un “servitore” (server, appunto), che faccia cose per noi, in base a una nostra richiesta.

Arduino come client

Utilizzare Arduino come client, invece, presuppone che sia Arduino a fare le cose autonomamente. Ovviamente, dobbiamo prima spiegargli cosa deve fare, non è un’intelligenza artificiale! Ma programmato nel modo giusto, Arduino è in grado di collegarsi a una pagina web, controllare il tempo atmosferico, il traffico, la borsa – e può persino suggerirci come vestirci, oppure mostrare le statistiche del nostro account di Facebook, gli ultimi messaggi ricevuti su Twitter, o dirci se abbiamo della posta non letta. Tutto questo è elettrizzante no? Bene, allora vediamo di realizzare qualcosa di pratico!

Requisiti

Per un approfondimento su come installare una Ethernet shield, e su come utilizzare il nostro Arduino come un piccolo client, vi rimando alla pagina in cui l’argomento è stato trattato. In questo studio, ci occuperemo invece di come utilizzare Arduino con Ethernet shield per creare un servizio lato server.

Un esempio pratico

Vediamo allora come creare un piccolo circuito e controllarlo da una pagina web!

Necessario

Tutto quello che ci serve è il nostro Arduino, una Ethernet shield, 3 LED (verde, arancio e rosso) e 3 resistenze da 220 Ohm. Per quanto riguarda il software, ci servirà soltanto un computer con l’IDE di Arduino.

Schema

Dato che non si può progettare niente senza avere le idee chiare, ho dedicato un po’ di tempo a disegnare lo schema del circuito che andremo a riprodurre sulla breadboard. In questo caso, lo schema è stato fatto con un software molto valido e gratuito: Fritzing.

Arduino Semaforo Schema

Arduino Circuito 3 LED Schema

Funzionamento

Diciamo che vogliamo controllare questo semplice circuito da una pagina web. In questo caso prima di tutto dobbiamo scrivere uno sketch per Arduino grazie al quale sia possibile accendere o spegnere ognuno dei 3 LED.

Una volta realizzato lo sketch, dobbiamo attivare il servizio web su Arduino, per fare in modo che – collegato il nostro browser al server – Arduino ci dia informazioni sullo stato di ogni singolo LED.

Infine, aggiungeremo alla pagina alcuni link, per controllare da remoto l’accensione dei 3 LED e il loro spegnimento.

Il circuito

Il funzionamento del circuito è molto semplice: partiamo con un messaggio di avvio, per essere certi che tutto funzioni; dopo di che scriviamo una funzione che andremo a usare per accendere o spegnere ognuno dei tre LED:

void loop() 
{
  toggle(pinVerde);
  delay(1000);
  toggle(pinArancio);
  delay(1000);
  toggle(pinRosso);  
  delay(1000);
}

void toggle(int pin)
{
  int stato = digitalRead(pin);
  if ( stato == LOW ) { digitalWrite(pin, HIGH); }
  else if ( stato == HIGH ) { digitalWrite(pin, LOW); }
}

Servizio web

Impostiamo adesso il servizio web sul nostro Arduino: dobbiamo poter aprire il nostro browser all’indirizzo dell’Arduino e visualizzare lo stato del circuito. A differenza di altri studi trattati sul blog, in questo caso non useremo né PHP né Apache, ma faremo fare tutto ad Arduino.

Prima di tutto, impostiamo la Ethernet shield con un MAC address e un indirizzo IP. In questo caso utilizzeremo un IP statico, invece di fare affidamento sul DHCP, altrimenti l’indirizzo del web server potrebbe essere cambiato, la prossima volta che cercheremo di raggiungerlo!

Come abbiamo già visto, collegare Arduino in rete con una Ethernet shield è piuttosto semplice. L’unica cosa diversa, qui, è che abbiamo impostato un servizio server, tramite la chiamata: EthernetServer server(80); – ossia, abbiamo detto ad Arduino di rimanere in ascolto per rispondere a delle chiamate esterne sulla porta 80 (la porta di default per la comunicazione web).

byte mac[] = { 0xDD, 0xAB, 0xCE, 0xFF, 0xEE, 0xED }; // MAC address
byte ip[] = { 192, 168, 1, 10}; // Indirizzo IP statico del server

void setup() 
{ 
  // Connetto la Ethernet shield e attivo il server 
  Ethernet.begin(mac, ip); 
  server.begin();
}

Arduino sul browser

A questo punto, Arduino è pronto in ascolto sulla porta 80: se riceve una chiamata, ad esempio dal nostro browser, dovrà accendere i LED se sono spenti, e spegnerli se sono accesi. Inoltre, dovrà mostrare lo stato dei tre LED, formattato magari in maniera un po’ carina.

La procedura è piuttosto semplice: basta controllare se c’è un client connesso e – se c’è – finché è connesso e raggiungibile, facciamo stampare al server lo stato dei LED. Dato che stampiamo su una pagina web, il nostro output sarà formattato in HTML:

void loop() 
{
  // Controllo se un client sta inviando richieste al server
  EthernetClient client = server.available();

  // Se esiste...
  if (client) 
  {
    // Accendo o spengo i 3 LED
    toggle(pinVerde);
    toggle(pinArancio);
    toggle(pinRosso);

    // ... fino a quando e' connesso...
    while (client.available()) 
    {
      // .. e raggiungibile
      if (client.connected()) 
      {
        // Stampo la pagina HTML
        server.println("HTTP/1.1 200 OK");
        server.println("Content-Type: text/html");
        server.println();

        // Leggo il valore dei LED
        int verde = digitalRead(pinVerde);
        int arancio = digitalRead(pinArancio);
        int rosso = digitalRead(pinRosso);

        // Stampo lo stato del pulsante Verde
        server.print("LED Verde: ");
        server.print(verde);
        server.print("<br />");

        // Stampo lo stato del pulsante Arancio
        server.print("LED Arancio: ");
        server.print(arancio);
        server.print("<br />");

        // Stampo lo stato del pulsante Rosso
        server.print("LED Rosso: ");
        server.print(rosso);
        server.print("<br />");

        break; // Fondamentale, per evitare un loop.
      }
    }

    // Quando la richiesta e' stata elaborata, fermo il client
    delay(1);
    client.stop();
  }
}

Se proviamo a collegarci all’indirizzo IP del server (ossia, al nostro Arduino) e a caricare la pagina un paio di volte, vediamo che il server accenderà e spegnerà alternativamente i 3 LED e mostrerà lo stato del circuito.

NB: se i LED lampeggiano, invece di accendersi e spegnersi, forse state usando Chrome: provate a testare l’esempio con un browser diverso.

Chiamata al server

Per interagire attivamente con il servizio web, proviamo ad aggiungere tre link, per fare in modo che si possano accendere o spegnere i LED direttamente dalla pagina web. Ogni link dovrà puntare all’indirizzo del server, con l’aggiunta di un parametro che indicherà il LED da accendere. Andiamo ad inserire il nostro codice nella funzione loop():

// Indirizzo IP del server
IPAddress serverIPAddress = Ethernet.localIP();

// Pulsanti per controllare i 3 LED
// Verde
client.print("<br />");
client.print("<a href='http://");
client.print(serverIPAddress);
client.print("?v'>");
client.print("Accendi Verde");
client.print("</a>");

// Arancio
client.print("<br />");
client.print("<a href='http://");
client.print(serverIPAddress);
client.print("?a'>");
client.print("Accendi Arancio");
client.print("</a>");

// Rosso
client.print("<br />");
client.print("<a href='http://");
client.print(serverIPAddress);
client.print("?r'>");
client.print("Accendi Rosso");
client.print("</a>");

Infine, non ci resta che aggiungere il codice che consentirà al server di interpretare il link e capire, in base al parametro passato, quale sia il LED da accendere o spegnere. Nel nostro caso, il parametro viene passato al server con il metodo GET – in quanto è scritto direttamente nella barra degli indirizzi – quindi controlliamo se ci sono parametri in GET!

if (client.available()) 
{
  // Se c'e' un parametro nella richiesta
  if ( client.find("GET /") ) 
  {
    // Analizzo il carattere tra il simbolo "?" e il fine riga.
    // Ad esempio: http://192.168.1.10?x qui il carattere è "x"
    if(client.findUntil("?", "\n\r")){
      char type = client.read();
      // Fondamentali gli apici singoli (')
      if ( type == 'v' ) { toggle( pinVerde ); }
      if ( type == 'a' ) { toggle( pinArancio ); }
      if ( type == 'r' ) { toggle( pinRosso ); }
  }

  // Stampo la pagina HTML
  ...
  break;
}

Se lanciamo il browser e apriamo una pagina web all’indirizzo del nostro server, dovremo essere in gradi di accendere, spegnere e leggere lo stato dei nostri 3 LED. Benissimo! Un servizio web semplice, ma efficiente.

Se volessimo tentare qualcosa di più articolato potremmo provare a passare al server un parametro più lungo di un singolo carattere, oppure un secondo parametro. Nell’esempio che segue, faremo in modo che sulla pagina compaia un menu a tendina, per scegliere il LED, e un campo di testo per inserire il valore della luminosità (da minima a massima).

Ma per farlo, bisognerà attendere la seconda parte di questo studio! Questo è tutto!

Download: Arduino_LED_server.zip

Annunci