LEZIONE 8

I sensori di linea utilizzati per il robot sono 4, due centrali e due laterali, come in foto.



I due sensori centrali ci permettono di rimanere sulla linea, mentre i sensori laterali, ci permettono di sapere dove si trova la curva, eventualmente il robot esca di strada.

Potete aggiungere altri sensori se lo ritenete opportuno, in questo modo si aumenta la precisione del robot.

I sensori sono stati montati su una piccola basetta di cartone, potete usare tranquillamente un pezzo di legno o plastica



La basetta, successivamente è stata montata sotto il robot, come in foto



I sensori sono collegati alla scheda nel seguente modo:

Sensore centrale sinistro uscita 8
Sensore centrale destro uscita 2
Sensore sinistro uscita 7
Sensore destro uscita 4

I sensori sono visti da sopra, potete cambiare la posizione delle uscite, ma dovrete cambiare il sorgente di esempio, altrimenti non funzionerà.

Adesso si passa ad un programma esempio, per testare i sensori.
Questo sorgente può essere usato come base per un programma più raffinato per le gare di linee follower.


  //***************************************************************************
  //Programma test per il robot Poor versione 2
  //Ipotizzo una linea bianca su sfondo nero larga quando due sensori ravvicinati
  //Setto le porte di uscita per le funzioni:
  //Integrato trovato sulla macchinetta SM6135W oppure RX2-C
  //Avanti    PIN 10  ---- Integrato 10
  //Indietro  PIN 9   ---- Integrato 11
  //Destra    PIN 5   ---- Integrato 6
  //Sinistra  PIN 6   ---- Integrato 7
  //Sensore di linea destra           PIN 4
  //Sensore di linea centrodestra     PIN 2
  //Sensore di linea sinistra         PIN 7
  //Sensore di linea centrosinistra   PIN 8
  //
  //Realizzato da: Daniele Loddo alias Ivotek
  //Data: 25/09/2015
  //Web: www.mignololab.org     www.ivotek.it
  //Email: info@mignololab.org      ivotek@gmail.com
  //***************************************************************************

  //Dichiaro le variabili per utilizzare i nomi al posto dei numeri
  //Spreco memoria ma il codice risulta leggibile al principiante
  int Destra = 5;
  int Sinistra = 6;
  int Avanti = 10;
  int Indietro = 9;
  int LineaDx = 4;
  int LineaSx = 7;
  int LineaCDx = 2;
  int LineaCSx = 8;


  //Variabili per contenere i valori dei sensori
  int vLineaDx; 
  int vLineaSx; 
  int vLineaCDx;
  int vLineaCSx;
  
void setup() {

  //Setto i PIN come out o in per pilotare i motori e i sensori di linea del robot.
  pinMode(Avanti,OUTPUT);        //Setto la porta Avanti come uscita
  pinMode(Indietro,OUTPUT);      //Setto la porta Indietro come uscita
  pinMode(Destra,OUTPUT);        //Setto la porta Destra come uscita
  pinMode(Sinistra,OUTPUT);      //Setto la porta Sinistra come uscita
  pinMode(LineaDx, INPUT);      //Setto la porta LineaDx come ingresso
  pinMode(LineaSx, INPUT);      //Setto la porta LineaSx come ingresso
  pinMode(LineaCDx, INPUT);      //Setto la porta LineaCDx come ingresso
  pinMode(LineaCSx, INPUT);      //Setto la porta LineaCSx come ingresso
  
}

void loop() {
  //Prelevo i valori dai sensori di linea
  vLineaDx = digitalRead(LineaDx);
  vLineaSx = digitalRead(LineaSx);
  vLineaCDx = digitalRead(LineaCDx);
  vLineaCSx = digitalRead(LineaCSx);

    
  //Controllo costantemente i sensori di linea
  //In base a quale è attivo effettuo un azione

  //I sensori sono tutte e due sulla linea bianca
  if (vLineaCDx == HIGH and vLineaCSx == HIGH) 
  {
    //Il robot va avanti, cambiare il numero 255 per variare la velocità
    analogWrite(Avanti, 255);   // Il robot cammina alla massima velocità 
    analogWrite(Indietro, 0);   // Il robot cammina alla massima velocità  
    //Lo sterzo è dritto
    digitalWrite(Destra, LOW);     
    digitalWrite(Sinistra, LOW);   
    
  }
  else if (vLineaCDx == HIGH and vLineaCSx == LOW) // La linea si trova sotto il sensore centrale destro
    {
      //Il robot gira a destra andando sempre avanti
        digitalWrite(Destra, HIGH);   // Il robot gira tutto a destra  
        digitalWrite(Sinistra, LOW);   
        //Il robot va avanti, cambiare il numero 255 per variare la velocità
        analogWrite(Avanti, 255);   // Il robot cammina alla massima velocità 
        analogWrite(Indietro, 0);   // Il robot cammina alla massima velocità   
    }
  else if (vLineaCSx == HIGH and vLineaCDx == LOW) // La linea si trova sotto il sensore centrale sinistro
    {
      //Il robot gira a sinistra andando sempre avanti
        digitalWrite(Sinistra, HIGH);   // Il robot gira tutto a sinistra
        digitalWrite(Destra, LOW);   
        //Il robot va avanti, cambiare il numero 255 per variare la velocità
        analogWrite(Avanti, 255);   // Il robot cammina alla massima velocità 
        analogWrite(Indietro, 0);   // Il robot cammina alla massima velocità
    }
  else if (vLineaSx == LOW and vLineaDx == HIGH) // La linea si trova sotto il sensore  destro
    {
      //Il robot gira a destra andando sempre avanti
        digitalWrite(Destra, HIGH);   // Il robot gira tutto a destra 
        digitalWrite(Sinistra, LOW);    
        //Il robot va avanti, cambiare il numero 255 per variare la velocità
        analogWrite(Avanti, 255);   // Il robot cammina alla massima velocità 
        analogWrite(Indietro, 0);   // Il robot cammina alla massima velocità
    }
  else if (vLineaSx == HIGH and vLineaDx == LOW) // La linea si trova sotto il sensore  sinistro
    {
      //Il robot gira a sinistra andando sempre avanti
        digitalWrite(Sinistra, HIGH);   // Il robot gira tutto a sinistra 
        digitalWrite(Destra, LOW);   
        //Il robot va avanti, cambiare il numero 255 per variare la velocità
        analogWrite(Avanti, 0);   // Il robot cammina alla massima velocità 
        analogWrite(Indietro, 0);   // Il robot cammina alla massima velocità
    }
  else
    {
      // Il robot si è perso
        //Lo sterzo è dritto
        digitalWrite(Destra, LOW);    
        digitalWrite(Sinistra, LOW);   
        // lo faccio fermare
        digitalWrite(Indietro, 0);   
        digitalWrite(Avanti, 0);
    }   
}

Per testarlo è sufficiente posizionare un pezzo di carta bianca sotto i sensori centrali e poi spostarlo a destra ed a sinistra per vedere la reazione delle ruote.

ATTENZIONE: Per motivi tecnici, il programma segue una linea bianca su sfondo nero, ma le gare di linee follower sono piste nere su sfondo bianco.
Si può modificare il programma cambiando semplicemente la verifica dei sensori da HIGH a LOW.

Un altra cosa da conoscere quando si usano questi sensori, è che sono sensibili alle interferenze della luce solare e quella artificiale, quindi se avete comportamenti anomali, verificate anche queste situazioni:

Luce solare diretta verso i sensori
Luce artificiale diretta verso i sensori

LEZIONE9
LEZIONE7