Progetto 12 Auto Intelligente a Inseguimento Ultrasonico

1. Descrizione
In questo progetto, cercheremo di rilevare la distanza tra l’auto intelligente 4WD e gli ostacoli davanti tramite un sensore ultrasonico per azionare due motori in modo che l’auto si muova e faccia mostrare alla scheda LED 8*8 un motivo facciale sorridente.
2. Diagramma di Flusso

| Rilevamento | Distanza misurata degli ostacoli frontali | distanza (unità: cm) |
| Impostazione | La scheda LED 8*16 mostra un motivo sorridente. | |
| Imposta il servo a 90° | ||
| Condizione | distanza≥20 e distanza≤50 | |
| Stato | Avanti | |
| Condizione | distanza>10 e distanza<20 | |
| distanza>50 | ||
| Condizione | fermo | |
| Condizione | distanza≤10 | |
| Condizione | Indietro |

Collegamenti:
1). GND, VCC, SDA e SCL della scheda LED 8*8 sono collegati a G (GND), V (VCC), A4 e A5 della scheda di espansione.
2). VCC, Trig, Echo e Gnd del sensore ultrasonico sono collegati a 5V (V), D12 (S), D13 (S) e Gnd (G).
3). Il servo è collegato a G, V e A3. Il filo marrone è collegato a Gnd (G), il filo rosso è collegato a 5V (V) e il filo arancione è collegato ad A3.
4). L’alimentazione è collegata alla porta BAT.
4. Codice di Test
//*******************************************************************************
/*
keyestudio 4wd BT Car
lesson 12
Flowing Car
http://www.keyestudio.com
*/
#define SCL_Pin A5 //Imposta il pin clock su A5
#define SDA_Pin A4 //Imposta il pin dati su A4
//Array, usato per memorizzare i dati del motivo, può essere calcolato da soli o ottenuto dallo strumento modulo
unsigned char smile[] = {0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00};
const int servopin = A3;//Imposta il pin del servocomando
#include "SR04.h" //definisce la libreria di funzioni del sensore ultrasonico
#define TRIG_PIN 12// imposta il segnale del sensore ultrasonico su D12
#define ECHO_PIN 13// imposta il segnale del sensore ultrasonico su D13
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long distance;
int left_ctrl = 2;//definisce i pin di controllo direzione del motore gruppo B
int left_pwm = 5;//definisce i pin PWM di controllo 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 PWM di controllo del motore gruppo A
void setup() {
pinMode(left_ctrl,OUTPUT);//imposta i pin di controllo direzione del motore gruppo B come OUTPUT
pinMode(left_pwm,OUTPUT);//imposta i pin PWM di controllo 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 PWM di controllo del motore gruppo A come OUTPUT
pinMode(TRIG_PIN, OUTPUT); //Imposta il pin trig come output
pinMode(ECHO_PIN, INPUT); //Imposta il pin echo come input
pinMode(SCL_Pin,OUTPUT);//Imposta il pin clock come output
pinMode(SDA_Pin,OUTPUT);//Imposta il pin dati come output
servopulse(servopin,90);//Imposta l'angolo iniziale del servocomando a 90°
delay(500); //attende 500ms
matrix_display(smile); //mostra il motivo dell'espressione sorridente
}
void loop() {
distance = sr04.Distance();//la distanza rilevata dal sensore ultrasonico
if(distance <= 10)//se la distanza è inferiore a 10
{
back();//indietro
}
else if((distance > 10)&&(distance< 20 ))//se 10<distanza<20
{
Stop();//fermo
}
else if((distance >= 20)&&(distance <= 50))//se 20≤distanza≤50
{
front();//inseguimento
}
else//altrimenti
{
Stop();//fermo
}
}
void front()//definisce lo stato di avanzamento
{
digitalWrite(left_ctrl,HIGH);
analogWrite(left_pwm,100);
digitalWrite(right_ctrl,HIGH);
analogWrite(right_pwm,100);
}
void back()//definisce lo stato di retromarcia
{
digitalWrite(left_ctrl,LOW);
analogWrite(left_pwm,150);
digitalWrite(right_ctrl,LOW);
analogWrite(right_pwm,150);
}
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);
}
void servopulse(int servopin,int myangle)//Angolo di rotazione del servomotore
{
for(int i=0; i<30; i++)
{
int pulsewidth = (myangle*11)+500;
digitalWrite(servopin,HIGH);
delayMicroseconds(pulsewidth);
digitalWrite(servopin,LOW);
delay(20-pulsewidth/1000);
}
}
//questa funzione è utilizzata per la visualizzazione su 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 in cui 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
quindi impostare l’interruttore DIP su ON. Impostare il servo a 90°, la smart car si muoverà evitando gli ostacoli e la scheda LED 8X16 mostrerà “smile”.