venerdì 31 gennaio 2014

Confessioni di un pilota FPV. Il Rover parte 2.

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