Ecco la prima versione dello sketch Arduino per controllare il Rover da Web browser.
La scheda Arduino Yùn integra:
- un microcontrollore "Arduino"
- un micro PC sul quale "gira Linux" e un web server .
- una scheda wifi.
Ho realizzato il seguente sketch Arduino partendo dalla descrizione della libreria Bridge e Servo che potete leggere qui e qui.
//includo le librerie necessarie
#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>
#include <Servo.h>
//creo il server per la comunicazione con la parte Linux
YunServer server;
//creo gli oggetti per comandare i servi
Servo myservoL;
Servo myservoR;
// variabile di modo di funzionamento (avanti, sinistra destra, fermo)
int mode;
//variabile di timeout per evitare che il rover continui a muoversi in assenza di comandi
int timeout;
//la routine di inizializzazione Arduino
void setup() {
//definisco i pin che devono pilotare i servi
myservoL.attach(9);
myservoR.attach(10);
//inizializzo le variabili di funzionamento
mode=0;
timeout=0;
myservoL.write(90);
myservoR.write(90);
//inizializzo il pin13. Può servire per il debug
pinMode(13,OUTPUT);
//avvio la comunicazione Bridge con Linux
Bridge.begin();
server.listenOnLocalhost();
server.begin();
}
void loop() {
digitalWrite(13, HIGH);
//legge i comandi da Linux
YunClient client = server.accept();
if (client) {
//se c'è un messaggio provo a leggerlo
process(client);
client.stop();
}
//comando il rover in funzione del "mode" corrente
if (mode == 1) {
gostraight();
}
if (mode == 2) {
turnleft();
}
if (mode == 3) {
turnright();
}
if (mode == 4) {
stopmode();
}
//lampeggio led per controllo funzionamento
digitalWrite(13, LOW);
//non serve andare veloce
delay(50);
}
void process(YunClient client) {
String command = client.readStringUntil('/');
if (command == "mode") {
//se è un comando "mode"
modeCommand(client);
}
if (command == "state") {
//se è un comando "state"
stateCommand(client);
}
}
void modeCommand(YunClient client) {
//cambio la modalità di funzionamento
mode = client.parseInt();
if (client.read() == '/') {
//setto il nuovo timeout per il nuovo comando
timeout = client.parseInt();
}
//rispondo con il "modo" e il "timeout" corrente
client.print(mode);
client.print(F("#"));
client.print(timeout);
client.println("");
}
//rispondo con il "modo" e il "timeout" corrente
void stateCommand(YunClient client) {
client.print(mode);
client.print(F("#"));
client.print(timeout);
client.println("");
}
//comanda i servi - avanzamento
void gostraight() {
if (timeout > 0) {
myservoL.write(-180);
myservoR.write(180);
timeout = timeout -1;
}
else {
stopmode();
}
}
//comanda i servi - rotazione sinistra
void turnleft() {
if (timeout > 0) {
myservoL.write(-180);
myservoR.write(-180);
timeout = timeout -1;
}
else {
stopmode();
}
}
//comanda i servi - rotazione destra
void turnright() {
if (timeout > 0) {
myservoL.write(180);
myservoR.write(180);
timeout = timeout -1;
}
else {
stopmode();
}
}
//comanda i servi - stop
void stopmode() {
myservoL.write(90);
myservoR.write(90);
timeout = 0;
mode=0;
}
Nel prossimo post il web server Linux.
Nessun commento:
Posta un commento