Progetto 10 Auto Intelligente Restrittiva

644a1976bf17a6b64e0aed1a7240ff1e

1. Descrizione

In questo progetto, cerchiamo di combinare le conoscenze di un sensore di tracciamento linea e moduli driver per motori per realizzare un’auto intelligente restrittiva. Nell’esperimento, puntiamo a utilizzare il sensore di tracciamento linea per rilevare se c’è una linea nera intorno all’auto intelligente, e quindi controllare la rotazione dei due motori in base ai risultati del rilevamento in modo da bloccare l’auto intelligente in un cerchio disegnato con linea nera.

2. Diagramma di Flusso

img

La logica specifica dell’auto intelligente 4WD restrittiva è mostrata nella tabella.

Img

3. Schema 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
 lesson 10
 Restricting Smart Car
 http://www.keyestudio.com
*/ 
//Dati dal 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 ( L_val == 0 && M_val == 0 && R_val == 0 ) { //quando non vengono rilevate linee nere, l'auto procede avanti
    Car_front();
  }
  else { //Altrimenti, se uno qualsiasi dei sensori rileva una linea nera, fa retromarcia e gira a sinistra
    Car_back();
    delay(500);
    Car_left();
    delay(500);
  }
}

void Car_front()
{
  digitalWrite(left_ctrl, HIGH);
  analogWrite(left_pwm, 180);
  digitalWrite(right_ctrl, HIGH);
  analogWrite(right_pwm, 180);
}
void Car_back()
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm, 80);
  digitalWrite(right_ctrl, LOW);
  analogWrite(right_pwm, 80);
}
void Car_left()
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm, 100);  
  digitalWrite(right_ctrl, HIGH);
  analogWrite(right_pwm, 150);
}

void Car_Stop()
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm, 0);
  digitalWrite(right_ctrl, LOW);
  analogWrite(right_pwm, 0);
}

//questa funzione è utilizzata 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 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. Risultato del Test

Dopo aver caricato con successo il codice sulla scheda V4.0, collegare i cablaggi secondo lo schema elettrico, accendere l’alimentazione esterna poi impostare l’interruttore DIP su ON. Posizionare la smart car nel cerchio nero, quindi si muoverà esclusivamente nel cerchio.