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.
Aggiunta il link al corso Linux Uno su Udemy.
Aggiunto il tutorial per la realizzazionedi un Arcade con materiale di riciclo.