Progetto 10 Auto Intelligente Restrittiva

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

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

3. Schema 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
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.