Progetto 11 Auto Intelligente con Tracciamento Linea

eff7a15e697e8b78bde391f806ea024d

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

img

Img

3.Diagramma di Collegamento

88422b5f1464ad447e28ccbb8c39a8d4

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.