Progetto 11 Auto Intelligente con Tracciamento Linea

1.Descrizione
Basandoci sul principio di funzionamento del sensore di tracciamento linea, realizziamo un’auto intelligente con tracciamento linea.
In questo progetto, rileviamo se c’è una linea nera sotto l’auto intelligente tramite un sensore di tracciamento linea, e poi controlliamo la rotazione dei due gruppi di motori in base ai risultati della rilevazione in modo da far muovere l’auto intelligente lungo la linea nera.
2.Diagramma di Flusso


3.Diagramma di Collegamento

G, V, S1, S2 e S3 del sensore di tracciamento linea sono collegati a G (GND), V (VCC), D11, D7 e D8 della scheda di espansione sensori.
L’alimentazione è collegata alla porta BAT.
4.Codice di Test
//*************************************************************************
/*
keyestudio 4wd BT Car
lezione 11
Auto con Tracciamento
http://www.keyestudio.com
*/
//Dati del pattern sorriso ottenuti dallo strumento touch
unsigned char start01[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
#define SDA_Pin A4 //Imposta il pin dati su A4
#define SCL_Pin A5 //Imposta il pin clock su A5
int left_ctrl = 2;//definisce i pin di controllo direzione del motore gruppo B
int left_pwm = 5;//definisce i pin di controllo PWM del motore gruppo B
int right_ctrl = 4;//definisce i pin di controllo direzione del motore gruppo A
int right_pwm = 6;//definisce i pin di controllo PWM del motore gruppo A
int sensor_L = 11;//definisce il pin del sensore di tracciamento linea sinistro
int sensor_M = 7;//definisce il pin del sensore di tracciamento linea centrale
int sensor_R = 8;//definisce il pin del sensore di tracciamento linea destro
int L_val,M_val,R_val;//definisce queste variabili
void setup() {
Serial.begin(9600);//avvia il monitor seriale e imposta la velocità a 9600 baud
pinMode(left_ctrl,OUTPUT);//imposta i pin di controllo direzione del motore gruppo B come OUTPUT
pinMode(left_pwm,OUTPUT);//imposta i pin di controllo PWM del motore gruppo B come OUTPUT
pinMode(right_ctrl,OUTPUT);//imposta i pin di controllo direzione del motore gruppo A come OUTPUT
pinMode(right_pwm,OUTPUT);//imposta i pin di controllo PWM del motore gruppo A come OUTPUT
pinMode(sensor_L,INPUT);//imposta i pin del sensore di tracciamento linea sinistro come INPUT
pinMode(sensor_M,INPUT);//imposta i pin del sensore di tracciamento linea centrale come INPUT
pinMode(sensor_R,INPUT);//imposta i pin del sensore di tracciamento linea destro come INPUT
//Imposta i pin come output
pinMode(SCL_Pin, OUTPUT);
pinMode(SDA_Pin, OUTPUT);
matrix_display(start01);//Mostra il pattern di avvio
}
void loop()
{
tracking(); //esegue il programma principale
}
void tracking()
{
L_val = digitalRead(sensor_L);//legge il valore del sensore di tracciamento linea sinistro
M_val = digitalRead(sensor_M);//legge il valore del sensore di tracciamento linea centrale
R_val = digitalRead(sensor_R);//legge il valore del sensore di tracciamento linea destro
if(M_val == 1){//se lo stato del sensore centrale è 1, significa che rileva la linea nera
if (L_val == 1 && R_val == 0) { //Se viene rilevata una linea nera a sinistra, ma non a destra, gira a sinistra
left();
}
else if (L_val == 0 && R_val == 1) { //Altrimenti, se viene rilevata una linea nera a destra e non a sinistra, gira a destra
right();
}
else { //Altrimenti, avanti
front();
}
}
else { //Nessuna linea nera rilevata al centro
if (L_val == 1 && R_val == 0) { //Se viene rilevata una linea nera a sinistra, ma non a destra, gira a sinistra
left();
}
else if (L_val == 0 && R_val == 1) { //Altrimenti, se viene rilevata una linea nera a destra e non a sinistra, gira a destra
right();
}
else { //Altrimenti, fermati
Stop();
}
}
}
void front()//definisce lo stato di avanzamento
{
digitalWrite(left_ctrl,HIGH);
analogWrite(left_pwm,155);
digitalWrite(right_ctrl,HIGH);
analogWrite(right_pwm,155);
}
void back()//definisce lo stato di retromarcia
{
digitalWrite(left_ctrl,LOW);
analogWrite(left_pwm,100);
digitalWrite(right_ctrl,LOW);
analogWrite(right_pwm,100);
}
void left()//definisce lo stato di svolta a sinistra
{
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 100);
digitalWrite(right_ctrl, HIGH);
analogWrite(right_pwm, 155);
}
void right()//definisce lo stato di svolta a destra
{
digitalWrite(left_ctrl, HIGH);
analogWrite(left_pwm, 155);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 100);
}
void Stop()//definisce lo stato di stop
{
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm,0);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm,0);
}
//questa funzione è usata per il display a matrice di punti
void matrix_display(unsigned char matrix_value[])
{
IIC_start(); //la funzione che richiama la condizione di inizio trasferimento dati
IIC_send(0xc0); //seleziona l'indirizzo
for (int i = 0; i < 16; i++) //i dati del pattern sono 16 byte
{
IIC_send(matrix_value[i]); //Trasmette i dati del pattern
}
IIC_end(); //Termina la trasmissione dei dati del pattern
IIC_start();
IIC_send(0x8A); //Controllo display, seleziona larghezza impulso 4/16
IIC_end();
}
//Condizioni sotto le quali inizia la trasmissione dati
void IIC_start()
{
digitalWrite(SDA_Pin, HIGH);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW);
}
//Indica la fine della trasmissione dati
void IIC_end()
{
digitalWrite(SCL_Pin, LOW);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, HIGH);
delayMicroseconds(3);
}
//trasmette dati
void IIC_send(unsigned char send_data)
{
for (byte mask = 0x01; mask != 0; mask <<= 1) //Ogni byte ha 8 bit e viene controllato bit per bit partendo dal livello più basso
{
if (send_data & mask) { //Imposta i livelli alto e basso di SDA_Pin a seconda che ogni bit del byte sia 1 o 0
digitalWrite(SDA_Pin, HIGH);
} else {
digitalWrite(SDA_Pin, LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH); //Alza il pin clock SCL_Pin per fermare la trasmissione dati
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW); //Abbassa il pin clock SCL_Pin per cambiare il SEGNALE di SDA
}
}
//*************************************************************************
5. Risultati del Test
Dopo aver caricato con successo il codice sulla scheda V4.0, collegare i cablaggi secondo lo schema elettrico, alimentare la fonte esterna e quindi impostare l’interruttore DIP su ON. A questo punto l’auto intelligente seguirà le linee.