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