Snail

SORGENTE:

Il sorgente usato per i test è il seguente, ricordatevi di collegare i sensori e i motori rispettando le porte usate da me per non avere grossi problemi.
I valori utilizzati si possono ottimizzare per aumentare la velocità del robot, comunque sono da variare in base alla distanza dei sensori tra di loro e dal suolo, non chè dall'aderenza delle ruote usate.


//*********************************************************
//Pogramma test per il controllo del robot line follower
//
//Realizzato da Daniele Loddo alias Ivotek
//data: 06/02/2018
//Versione 0.0.1
//Proggetto completo all'indirizzo www.ivotek.it
//
//PIN 5 - 6  Motore sinistro
//PIN 9 - 10 Morore destro 
//PIN A3 Sensore sinistro esterno
//PIN A2 Sensore sinistro interno
//PIN A1 Sensore destro interno
//PIN A0 Sensore destro esterno
//
//*********************************************************

void setup() {

  //Setto le porte di motori come uscita
  pinMode(5,OUTPUT);    //Motore sinistro
  pinMode(6,OUTPUT);    //Motore sinsitro
  pinMode(9,OUTPUT);    //Motore destro
  pinMode(10,OUTPUT);   //Motore destro

  //Setto le porte sei sensori come ingresso
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);

}

void loop() {

  //Prelevo i segnali dai sensori
  bool sx= digitalRead(A2);     //Sensore sinistro interno
  bool dx= digitalRead(A1);     //Sensore destro interno
  bool sxe= digitalRead(A3);     //Sensore sinistro esterno
  bool dxe= digitalRead(A0);     //Sensore destro esterno
  
  //Linea al centro, vado avanti
  //Sensore destro e sinistro centrali
  if(sx==false && dx==false) avanti();
  
  //Linea sul sensore destro, giro a destra
  else if (dx==false) destra1();
  
  //Linea sul sensore sisnitro, giro a sinsitra
  else if (sx==false) sinistra1();
  
  //Linea sul sensore destro centrale e destro esterno
  //Giro a destra più velocemente
  else if (dxe==false && dx==false) destra2();

  //Linea sul sensore sinistro centrale e sinistro esterno
  //Giro a sinsitra più velocemente 
  else if (sxe==false && sx==false) sinistra2();

  //Linea sul sensore destro esterno
  //Giro a destra molto rapidamente
  else if (dxe==false) destra3();

  //Linea sul sensore sinistro
  //Giro a sinistra molto rapidamente
  else if (sxe==false) sinistra3();

}

void avanti(){
  //Avanti
  analogWrite(5,255);
  analogWrite(6,LOW);
  analogWrite(9,210);
  analogWrite(10,LOW);
}

void destra1(){
  //Destra
  analogWrite(5,235);
  analogWrite(6,LOW);
  analogWrite(9,100);
  analogWrite(10,LOW);
}

void destra2(){
  //Destra
  analogWrite(5,235);
  analogWrite(6,LOW);
  analogWrite(9,80); 
  analogWrite(10,LOW);
}

void destra3(){
  //Destra
  analogWrite(5,255);
  analogWrite(6,LOW);
  analogWrite(9,60);
  analogWrite(10,LOW);
}

void sinistra1(){
  //Sinistra
  analogWrite(5,100);
  analogWrite(6,LOW);
  analogWrite(9,235);
  analogWrite(10,LOW);
}

void sinistra2(){
  //Sinistra
  analogWrite(5,80);
  analogWrite(6,LOW);
  analogWrite(9,210);
  analogWrite(10,LOW);
}

void sinistra3(){
  //Sinistra
  analogWrite(5,60);
  analogWrite(6,LOW);
  analogWrite(9,255); 
  analogWrite(10,LOW);
}




Analizziamo il codice pezzo per pezzo:


void setup() {

  //Setto le porte di motori come uscita
  pinMode(5,OUTPUT);    //Motore sinistro
  pinMode(6,OUTPUT);    //Motore sinsitro
  pinMode(9,OUTPUT);    //Motore destro
  pinMode(10,OUTPUT);   //Motore destro

  //Setto le porte sei sensori come ingresso
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);

}


Nella funzione Setup settiamo le varie porte come ingresso e come uscita.
Le porte di uscita sono collegate ai motori mentre le oprte d'ingresso sono collegate ai sensori.


//Prelevo i segnali dai sensori
  bool sx= digitalRead(A2);     //Sensore sinistro interno
  bool dx= digitalRead(A1);     //Sensore destro interno
  bool sxe= digitalRead(A3);     //Sensore sinistro esterno
  bool dxe= digitalRead(A0);     //Sensore destro esterno


Con le istruzioni digitalRead() prelevo le informazioni dai sensori e le assegno alle variabili associate.
Le variabili sono di tipo booleano perchè il valore dei sensori è soltano 1 o zero.


//Linea al centro, vado avanti
  //Sensore destro e sinistro centrali
  if(sx==false && dx==false) avanti();
  
  //Linea sul sensore destro, giro a destra
  else if (dx==false) destra1();
  
  //Linea sul sensore sisnitro, giro a sinsitra
  else if (sx==false) sinistra1();
  
  //Linea sul sensore destro centrale e destro esterno
  //Giro a destra più velocemente
  else if (dxe==false && dx==false) destra2();

  //Linea sul sensore sinistro centrale e sinistro esterno
  //Giro a sinsitra più velocemente 
  else if (sxe==false && sx==false) sinistra2();

  //Linea sul sensore destro esterno
  //Giro a destra molto rapidamente
  else if (dxe==false) destra3();

  //Linea sul sensore sinistro
  //Giro a sinistra molto rapidamente
  else if (sxe==false) sinistra3();


In base a quale sensore si trova sulla linea nera, richiamo la funzione di movimento.
Le funzioni variano in base alla velocità che si desidera avere sulla ruota destra o sinistra.


void avanti(){
  //Avanti
  analogWrite(5,255);
  analogWrite(6,LOW);
  analogWrite(9,210);
  analogWrite(10,LOW);
}

void destra1(){
  //Destra
  analogWrite(5,235);
  analogWrite(6,LOW);
  analogWrite(9,100);
  analogWrite(10,LOW);
}

void destra2(){
  //Destra
  analogWrite(5,235);
  analogWrite(6,LOW);
  analogWrite(9,80); 
  analogWrite(10,LOW);
}

void destra3(){
  //Destra
  analogWrite(5,255);
  analogWrite(6,LOW);
  analogWrite(9,60);
  analogWrite(10,LOW);
}

void sinistra1(){
  //Sinistra
  analogWrite(5,100);
  analogWrite(6,LOW);
  analogWrite(9,235);
  analogWrite(10,LOW);
}

void sinistra2(){
  //Sinistra
  analogWrite(5,80);
  analogWrite(6,LOW);
  analogWrite(9,210);
  analogWrite(10,LOW);
}

void sinistra3(){
  //Sinistra
  analogWrite(5,60);
  analogWrite(6,LOW);
  analogWrite(9,255); 
  analogWrite(10,LOW);
}


Le funzioni richiamate variano la velocità dei motori variando il valore inserito nella funzione analogWrite().
I valori e quindi le velocità devono cambiare in base alla pista ed al tipo di robot, vi conviene fare dei tentativi sino a quando non ottenete il valore desiderato.

Montaggio
Indice