COMANDO REMOTO ETHERNET CON ARDUINO MEGA
In
questa pagina presento un sistema che permette di comandare
individualmente, mediante browser, lo stato di 20 pin presenti sulla
scheda ArduinoMega dotata di Ethernet shield. Notate bene che il
comando e' solo locale ovvero inerente alla rete LAN, non si puo'
quindi comandare da computer che non siano connessi, tramite ETHERNET o
WIFI al router di casa (o dell'ufficio).
Questa limitazione puo'
essere compensata dal fatto che anche localmente puo' essere utile
comandare a distanza diverse utenze usando un solo cavo (cancello, luci
ed altri azionamenti vari), poi c'e' sempre il gusto di sperimentare.
Comunque in questa pagina trovate tutti gli strumenti per potere comandare da Internet il sistema qui descritto.
Cerchero'
di spiegare nei dettagli il funzionamento di questo sistema,
se volete apportare qualche miglioramento al programma o
correggere il mio lessico non molto tecnico in materia informatica,
fatelo.
Per la spiegazione faro' riferimento al numero delle righe
di istruzione del programma, quindi vi consiglio di attivare sul vostro
IDE la visualizzazione dei numeri di riga.
Iniziamo dal seguente gruppo di istruzioni (dalla riga 3 alla 5):
La
prima istruzione fa riferimento all'indirizzo MAC che e' univoco per
ogni scheda elettronica di rete esistente al mondo, non ci dovrebbero
essere mai due MAC identici. L'indirizzo MAC e' in genere stampato su
una etichetta attaccata da qualche parte sulla scheda shield Ethernet,
se non la trovate vuol dire che avete comprato materiale cinese che
fornisce shield senza MAC. L'indirizzo MAC viene rilasciato da una
apposita autorita' di controllo e si paga...(si paga?? Plefeliamo non
folnillo se no dovlemmo diminuile gli stipendi agli opelai o
aumentale le lolo ole di lavolo che gia' ne fanno tante. E se ci fosse
poi una livolta?).
Comunque in questa sede non ha importanza il MAC e se la vostra scheda non lo possiede usate quello che ho utilizzato io.
La
seconda istruzione fa riferimento all'indirizzo IP del vostro arduino,
questo lo dovrete inserire obbligatoriamente. Per decidere quale IP
mettere dovete procedere in questo modo:
1) Inserite la shield Ethernet su arduino mega (attenzione a non piegare i pin).
2) Collegate Arduino alla USB e caricate il programma.
3) Collegate Ethernet shield, mediante cavo di rete, al router.
4)
Su Windows posizionatevi con il mouse su start, cliccare sul tasto
sinistro del mouse e poi con il destro su esegui, nella finestra che
appare scrivete "cmd". Verra' visualizzata la finestra nera del DOS
5)
Scrivete "ipconfig", appariranno gli IP ed i MAC di tutti i dispositivi
collegati alla LAN, questi indirizzi IP non potrete usarli, ne dovrete
scegliere uno diverso a vostro piacimento. Per sapere quanti ne avete a
disposizione liberi fate riferimento alla subnet mask.
Dovrete
sottrarre l'ultimo numero (nel mio caso zero) a 255 il risultato dara'
il numero di IP disponibili. La mia rete ha una subnet mask
255.255.255.0 un router (Gateway predefinito, 192.168.0.1) ed un
computer 192.168.0.102, quindi posso scegliere altri 252 indirizzi IP,
ho scelto 192.168.0.89.
La funzione "EthernetServer server(80)" crea una connessione tramite la porta 80 adatta per il trasferimento di dati HTML.
Qui di seguito tutte le variabili che potrete controllare, esse sono contenute in due righe fatte di asterischi.
Con la seguente istruzione potrete cambiare il testo del titolo (per centrarlo si veda oltre).
Con
la seguente istruzione potete cambiare il colore di sfondo della
pagina. Tenete conto che valori "255, 255, 255" corrispondono a bianco,
valori "0, 0, 0" al nero , valori intermedi ad una vasta
gamma di colori, quelli che ho scelto io corrispondono ad un rosa.
Con
le seguenti istruzioni potrete cambiare i pin associati ai tasti,
tenete conto che non potrete usare i pin 10, 11, 12, 13, 50, 51,
52, 53 perche' vengono utilizzati per la comunicazione tra
arduino ed ethernet shield.
Con le seguenti istruzioni potrete cambiare il nome dentro al tasto.
NOTA: nel sistema arduino e' il server e il browser e' il client.
FUNZIONAMENTO DEL SISTEMA
Arduino,
appena fornitegli alimentazione, si mette in ascolto per eventuali
richieste da parte del browser tramite la seguente funzione (riga 106):
Se
nessuna richiesta viene ricevuta, il corpo della "if(client)" non viene
eseguito ed il programma salta alla riga 551 e da li torna alla
riga 106 tramite "void loop()", arduino si rimette in ascolto.
Una
volta aperto il vostro Browser (il mio e' Google Chrome) scrivete nella
barra degli indirizzi il numero IP del vostro Arduino (nel mio
e': 192.168.0.89) e cliccate enter;
il
browser inviera' allora una richiesta testuale ad arduino del
tipo : "GET / HTTP/1.1 GET /favicon.ico HTTP/1.1" e la funzione
"EthernetClient client = server.available()"; avendo ricevuta una
richiesta dal client, permettera' al corpo della
"if(client)" di essere eseguito.
La serie di istruzioni che si incontrano nel corpo della "if(client)" sono le seguenti (a partire dalla riga 109):
L'istruzione
condizionale "while(client.connected()" eseguira' il suo corpo fino a
che non e' stato ricevuto l'ultimo carattere del testo "GET / HTTP/1.1
GET /favicon.ico HTTP/1.1" compreso "/n", in
particolare l'istruzione condizionale "if
(client.available())", la prima che si incontra nel blocco del
"while(client.connected()", esegue il suo corpo se e' disponibile un
carattere da leggere, se il responso e' affermativo il carattere viene
prima scritto nella variabile "c" e poi concatenato nella variabile
"query" (che alla fine del ciclo conterra' il messaggio testuale
completo), quest'ultima variabile ci servira' piu' in la'.
Fintanto
non viene letto il carattere di accapo (/n) la "if (c == 'n')"
non esegue il suo corpo e il "while" torna a ripetere il suo
ciclo.
Quando viene letto il carattere "/n" la "if (c == 'n')"
suddetta esegue il suo corpo e viene inviata la risposta testuale al
browser "HTTP/1.1 200 OK" , "Content-Type: text/html" ed enter
tramite le istruzioni alle righe 117,118 e 119, il collegamento tra
client e server e' ora attivato.
A questo punto Arduino deve
spedire al browser una pagina HTML contenente le scritte ed i tasti che
avete visto nella prima foto in alto, dato che a questo punto del
programma la pagina non e' stata ancora spedita, tutte le "if"
dalla riga 123 alla riga 382 non eseguono i loro corpi, come
vedremo queste "if" gestiscono i tasti ed i relativi colori che,
ripeto, adesso ancora non appaiono nel browser.
Il programma
salta quindi alla riga 384 e le prime istruzioni per costruire la
pagina nel browser che si incontrano sono le seguenti:
In
esse le chiamate "client.print" inviano le istruzioni in
linguaggio HTML al browser per il colore di sfondo della pagina, noi
possiamo intervenire solo sulla variabile RGB che serve ad impostarne
il colore e della quale abbiamo gia' parlato precedentemente.
Successivamente si incontra l'istruzione condizionale "for(i = 0 ; i < 6 ; ++i)" (riga 388):
Questa
istruzione condizionale serve a creare dello spazio (instruzione
) tra il bordo sinistro della pagina ed il primo carattere
del titolo "COMANDO REMOTO ETHERNET By Fabio" per farlo stare a centro
(piu' o meno) dello schermo. Cambiando il valore numerico nella
"for(i = 0 ; i < 6 ; ++i)" o togliendo o aggiungendo l'istruzione
nel corpo della "for" stessa, si puo' centrare
qualsiasi testo si desideri appaia nella pagina.
Subito dopo, a partire dalla riga 390, vengono eseguite le seguenti istruzioni:
Che
servono ad inserire il titolo nella pagina, la variabile "TITOLO" e'
accessibile, come gia' detto, nel caso si voglia cambiarlo.
Ovviamente per tenere al centro dello schermo il nuovo titolo nel
caso non avesse lo stesso numero di caratteri del mio, si dovra' agire
sulla "for" appena descritta sopra. La seconda istruzione serve invece
a distanziare il titolo dai primi tasti in alto, ogni istruzione
</br> e' un accapo e una nuova riga.
Dalla riga 392 alla
riga 405 ci sono un insieme di istruzioni che riguardano la coppia dei
tasti "Utenza 01" e "Utenza 11" che si trovano subito sotto il titolo:
L'istruzione
condizionale "for(i = 0 ; i < 7 ; ++i)" serve a creare uno spazio
tra il bordo sinistro della pagina e il tasto a sinistra della
pila (in questo caso il tasto "Utente 01") per tenere la coppia dei
tasti affiancati al centro dello schermo.
Seguono
due gruppi di istruzioni simili relative alla prima coppia di
tasti, il primo gruppo gestisce il tasto "Utenza 01" ed il secondo il
tasto "Utenza 11". I comandi evidenziati in rosso sono di vitale
importanza per il funzionamento del sistema, infatti quando si preme,
ad esempio, il tasto "utenza 1" nella barra degli indirizzi
appare la seguente scritta:
Ovvero
appare l'indirizzo di arduino con attaccato quel valore che, come
vedremo verra' successivamente usato per attivare delle azioni
collegate solo a quel tasto discriminando tuti gli
altri, in poche parole e' il nome univoco del tasto premuto (attenzione
a non confonderlo con il nome stampigliato dentro il tasto,
quest'ulitimo si puo' cambiare a proprio piacimento l'altro no). Subito
dopo incontriamo la variabile "colore" che contiene il valore colore
del tasto che assume due valori, "white" (pin arduino corrispondente
basso) e "red" (pin arduino corrispondente alto), tali valori sono
accessibili all'utente anche se consiglio di non modificarli.
Per
ultimo incontriamo il valore "U1" ("U11") che contiene il testo che
appare nel tasto, in questo caso "Utente 01" ("Utente 11"). Questo
valore puo' essere cambiato dall'utente come gia' detto. Tenete conto
che la dimensione del tasto varia al variare del numero dei caratteri
che usate per il testo, se avete parole di diversa lunghezza dovrete
aggiungere spazi a quelle piu' piccole per far si che tutti i tasti
abbiano la stessa dimensione.
Questo gruppo di istruzioni si
ripetono per tutti gli altri tasti e alla fine viene eseguita
l'istruzione break; che interrompe il ciclo "while" e vengono eseguite
le tre istruzioni dalla riga 548:
Dopo
il piccolo ritardo di 1mS il client viene disconnesso dal server e
viene cancellato il registro "query". Tramite la funzione loop()
arduino torna in ascolto (riga 106).
Premiamo ora, per
esempio, il tasto "Utente 1", come gia' descritto arduino legge i
dati provenienti dal browser ma questa volta essi sono diversi da
quelli che aveva letto all'inizio. Nel registro "query", alla fine
della lettura, saranno contenute le seguenti stringhe:
GET /utenza1 HTTP/1.1
GET /favicon.ico HTTP/1.1
Nella prima stringa e' presente il nome del tasto premuto.
In maniera consueta arduino risponde con le solite due stringhe:
"HTTP/1.1 200 OK"
"Content-Type: text/html"
e invia l'accapo.
Dalla
riga 123 si incontrano una serie di blocchi di istruzioni simili tra
loro, dato che abbiamo premuto il tasto "Utenza 1" faremo riferimento
al primo blocco:
La
funzione "query.indexOF("utenza1") compara il contenuto nella variabile
"query" con la stringa "utente1", se i due valori sono uguali ne
restituisce uno maggiore di zero e la "if (query.indexOf("utenza1")
> 0)" esegue le istruzioni nel suo corpo. La "if(colore1 ==
"white")" interna confronta il valore nella variabile "colore" (colore
del tasto) con la stringa "white", se i due valori sono uguali
manda alto il pin di arduino relativo al tasto "Utente 1" e scrive
nella variabile "colore" la stringa "red", in caso contrario
manda basso il pin e scrive la stringa "white". Il colore dei
tasti pero' ancora non e' stato cambiato.
Uscito dal corpo della "if
(query.indexOf("utenza1") > 0)" il programma salta i restanti
blocchi relativi agli altri tasti perche' non premuti e arriva alla
riga 384 e nuovamente manda al browser la pagina aggiornata con il
colore del tasto "Utente1" cambiato, scollega il client dal server e
torna ad ascoltare. Le stesse azioni si ripetono nello stesso modo per
gli altri tasti.
Potrete aggiungere tasti inserendo nel programma nuovi gruppi di istruzioni e di variabili.
File sorgente
File sorgente zip
Fabio