Nel precedente tutorial abbiamo visto come uno sketch in esecuzione sull’ATMega di Arduino Yun possa, utilizzando la libreria Bridge, eseguire dei processi (comandi, script…) su Linino.
In questo tutorial vedremo come poter fare il contrario: inviare comandi da Linino verso lo sketch in esecuzione sul microcontrollore.
YunServer & YunClient
All’interno dello sketch utilizzeremo due oggetti della libreria Bridge:
[checklist]
- YunServer, per mettere l’ATMega in attesa di nuove connessioni;
- YunClient, per inviare/ricevere dati dal client che si è connesso.
[/checklist]
Yun offre una comoda interfaccia REST per raggiungere direttamente l’oggetto YunServer in ascolto. Ogni connessione web a indirizzi tipo:
http://<yun_ip>/arduino/something
viene passata allo sketch e, utilizzando il metodo readString() di YunClient è possibile ottenere la porzione di URL successiva ad /arduino/ (nell’esempio in grassetto).
E’ possibile proteggere l’interfaccia REST con una password (di default è arduino) attraverso l’interfaccia web di Yun:
YunLedToggle
Lo sketch sviluppato per questo esempio si trova nel mio repository su Github. Il suo compito è quello di cambiare di stato ad un LED (per semplicità quello onboard, connesso al PIN 13) alla ricezione del comando toggle.
All’interno del setup() è necessario inizializzare la libreria Bridge e mettere l’oggetto YunServer in ascolto (per sicurezza ho utilizzato il metodo per accettare connessioni solo da localhost):
Bridge.begin(); [...] server.listenOnLocalhost(); server.begin(); |
Nel loop() il metodo server.accept() tiene lo sketch in attesa di una connessione. Quando un client si collega, viene creato un oggetto YunClient che gestirà il trasferimento dati:
YunClient client = server.accept(); |
Il comando inviato dal client viene letto e pulito (trim) da eventuali spazi:
String command = client.readString(); command.trim(); |
Se il comando è “toggle”, viene cambiato lo stato del LED:
if(command == "toggle") { digitalWrite(LED_PIN, !digitalRead(LED_PIN)); |
Infine viene chiusa la connessione con il client:
client.stop(); |
E’ possibile provare il funzionamento dello sketch con un browser web:
callArduino
Il metodo sopra descritto può essere utilizzato anche da pagine PHP ospitate su Linino per inviare dati ad uno sketch.
Ho preparato un semplice esempio (sempre nel repository su Github) che mostra come usare cURL, anche se l’interfaccia REST è protetta da password:
Ciao, grazie mille del tutorial. Ho seguito tutto alla lettera ma quando digito myip/arduino/test appare questo messaggio: Could not connect to YunServer 146 Connection refused
Potresti aiutarmi?
ciao Marco, sembra che lo Yun non accetti le connessioni… prova a fare un PING per verificare se almeno è correttamente in rete
Ciao Luca,
grazie mille per la risposta. Ho effettuato il ping di yun e lo vede correttamente. Non è che ho sbagliato qualcosa nella procedura? Io ho messo il file php nella cartella /arduino/www/
Oltre a ciò ho solo reso statico l’indirizzo ip di yun perchè mi entrava sempre in confitto con la stampante..
Qualche idea?
ciao, ma se provi da browser web (senza php) funziona?
Ciao Luca, in realtà ho sempre provato da browser web.. Mi da quell’errore quando provo a connettermi da internet..
Marco per raggiungere lo Yun via internet devi configurare il tuo router per effettuare il NAT e dovrai puntare all’indirizzo IP pubblico, non al nome “yunserver” o simile…
Ciao Luca, per quanto riguarda la configurazione del router ho impostato le porte puntandole allo YUN con codifica HTTP (http://www.mauroalfieri.it/informatica/router-port-mapping.html) . per quanto riguarda l’indirizzo, mi da errore anche puntandolo dall’indirizzo pubblico come descritto in tua guida (http://www.lucadentella.it/2012/04/28/enc28j60-e-arduino-6/2/).
Qualche idea?