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.
Aggiunta la sezione corsi.