Lezione 26/31: Auto Intelligente Parte 4: Evitare Ostacoli Utilizzando il Sensore a Ultrasuoni | SunFounder Robojax
In questa lezione, aggiorniamo la tua auto intelligente con la capacità di vedere e reagire al suo ambiente utilizzando un sensore a ultrasuoni. Misurando la distanza dagli oggetti davanti a sé, l'auto può prendere decisioni intelligenti: avanzerà quando il percorso è libero, si fermerà quando un oggetto si trova in una zona di cautela e farà retromarcia quando un ostacolo è troppo vicino. Questo progetto si basa sui fondamenti del controllo motore e dei sensori che hai già imparato, dando vita a un veicolo davvero autonomo.
Questo non è solo un giocattolo; è un passo fondamentale verso la costruzione di progetti robotici più complessi. La logica che implementerai qui—percepire, pensare, agire—è la stessa utilizzata in tutto, dai robot aspirapolvere all'automazione industriale. Ecco alcune idee per ispirare le tue creazioni:
- Rover Autonomo: Crea un robot che possa esplorare una stanza o un corridoio senza sbattere contro muri o mobili.
- Sistema di Allarme di Prossimità: Monta il sensore a ultrasuoni su un servo per scansionare un'area e attivare un allarme o una luce quando un intruso entra in una zona definita.
- Assistente di Parcheggio Intelligente: Costruisci un sistema che utilizzi le letture di distanza per guidare un veicolo in uno spazio stretto, fornendo feedback visivo o acustico.
Questa guida si basa sul kit Arduino 3-in-1 di SunFounder e sul suo progetto "Play with Ultrasonic Module". Esamineremo il cablaggio, spiegheremo il codice decisionale e dimostreremo l'auto in azione.
Come Funziona la Logica di Evitamento Ostacoli
Il cuore di questo progetto è un albero decisionale semplice ma potente. Il sensore a ultrasuoni misura costantemente la distanza dall'oggetto direttamente davanti a sé. Questo valore di distanza viene poi utilizzato per controllare i motori dell'auto, come mostrato nel diagramma sottostante.
- Se distanza > 25 cm: Il percorso è libero, quindi l'auto avanza.
- Se 10 cm < distanza <= 25 cm: Un oggetto viene rilevato in una "zona di cautela", quindi l'auto si ferma per evitare una collisione.
- Se 2 cm < distanza <= 10 cm: Un oggetto è pericolosamente vicino. L'auto fa retromarcia per creare più spazio.
- Se distanza <= 2 cm: La lettura è probabilmente un errore (troppo vicino per misurare con precisione), quindi l'auto si ferma come misura di sicurezza.
Componenti Hardware
Per costruire questo progetto, avrai bisogno dei seguenti componenti, tutti inclusi nel kit SunFounder 3-in-1.
- 1x Arduino Uno (o scheda compatibile)
- 1x Telaio per auto intelligente con due motori con ingranaggi
- 1x Modulo Driver Motore L298N
- 1x Sensore di Distanza a Ultrasuoni HC-SR04
- 1x Breadboard
- Cavi jumper
- Alimentazione per l'auto (es. pacco batterie)
Guida al Cablaggio
Il cablaggio collega il driver motore, il sensore a ultrasuoni e l'Arduino. Il driver motore controlla le ruote dell'auto, mentre il sensore a ultrasuoni funge da suoi "occhi".
Ecco il diagramma di connessione dalla documentazione SunFounder:
Analizziamo le connessioni. Innanzitutto, alimenta le barre positive e negative della breadboard dai pin 5V e GND dell'Arduino. Il sensore a ultrasuoni viene quindi collegato come segue:
- VCC (Alimentazione): Collegato alla barra positiva sulla breadboard.
- GND (Terra): Collegato alla barra negativa sulla breadboard.
- Trig (Trigger): Collegato al pin digitale 3 sull'Arduino. Questo pin invia l'impulso ultrasonico.
- Echo (Ricezione): Collegato al pin digitale 4 sull'Arduino. Questo pin riceve l'impulso riflesso.
Le connessioni del driver motore sono le stesse delle lezioni precedenti. I quattro pin di controllo (IN1, IN2, IN3, IN4) sono collegati ai pin digitali 5, 6, 9 e 10 dell'Arduino. Questi pin controllano la velocità e la direzione dei due motori. Assicurati che l'alimentazione e la massa del driver motore siano correttamente collegate al pacco batterie e alla massa dell'Arduino. (nel video a 02:24)
Spiegazione del Codice
Il codice per questo progetto controlla il comportamento dell'auto in base alla lettura della distanza dal sensore a ultrasuoni. La logica è semplice e facile da personalizzare. Esaminiamo le parti chiave e configurabili dall'utente.
1. Definizioni dei Pin
All'inizio dello sketch, vengono definiti i pin per i motori e il sensore a ultrasuoni. Puoi cambiarli se hai collegato i componenti a pin Arduino diversi.
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int trigPin = 3;
const int echoPin = 4;
Qui, A_1A, A_1B, B_1A e B_1B controllano i motori sinistro e destro tramite il driver L298N. trigPin e echoPin sono per il sensore a ultrasuoni.
2. Variabili di Comportamento e Logica
Il comportamento principale è controllato all'interno della funzione loop(). È qui che puoi regolare la "personalità" dell'auto.
void loop() {
float distanza = readSensorData();
if (distanza > 25) {
moveForward(200);
}
else if (distanza < 10 && distanza > 2) {
moveBackward(200);
} else {
stopMove();
}
}
Ecco come personalizzarlo:
- Soglie di distanza: I numeri
25e10definiscono le zone "sicura" e "pericolo" in centimetri. Aumenta25per far fermare l'auto prima, o diminuiscilo per permetterle di avvicinarsi di più agli ostacoli. Il2è un margine di sicurezza per ignorare letture errate da oggetti troppo vicini. - Velocità del motore: Il
200passato amoveForward()emoveBackward()imposta la velocità dell'auto. Questo valore può variare da 0 a 255. Un valore più basso, come 150, farà muovere l'auto più lentamente e con più cautela.
Il resto del codice consiste nella funzione readSensorData(), che gestisce la temporizzazione del sensore a ultrasuoni per calcolare la distanza, e nelle funzioni moveForward(), moveBackward() e stopMove(), che controllano il driver del motore per eseguire l'azione desiderata.
Affrontare un errore comune
Potresti incontrare un errore come 'moveForward' was not declared in this scope. Questo accade perché l'IDE di Arduino legge il codice dall'alto verso il basso. Quando raggiunge la funzione loop(), non conosce ancora le funzioni definite più sotto. Per risolvere, devi aggiungere "prototipi di funzione" prima della funzione setup(). Queste sono semplicemente dichiarazioni del nome della funzione e del tipo di ritorno, che terminano con un punto e virgola.
void moveForward(int velocità);
void moveBackward(int velocità);
void stopMove();
float readSensorData();
Aggiungere queste righe dice al compilatore: "Queste funzioni esistono e saranno definite più avanti", risolvendo l'errore. (nel video a 09:21)
Migliorare la stabilità del sensore
Durante i test, potresti notare che l'auto si ferma o balbetta anche quando il percorso è libero. Questo spesso accade perché il loop gira troppo velocemente e il sensore a ultrasuoni non ha abbastanza tempo per ricevere il segnale eco, risultando in una lettura di 0 cm. Per risolvere, aggiungi un piccolo ritardo alla fine della funzione loop() per dare al sensore il tempo di lavorare.
void loop() {
float distanza = readSensorData();
if (distanza > 25) {
moveForward(200);
}
else if (distanza < 10 && distanza > 2) {
moveBackward(200);
} else {
stopMove();
}
delay(100); // Aggiungi un ritardo di 100ms per letture stabili
}
Un ritardo di 100 millisecondi è di solito sufficiente per ottenere letture di distanza stabili e coerenti. (nel video a 10:56)
Dimostrazione dal vivo del progetto
Una volta caricato il codice, apri il Monitor Seriale. Vedrai testo che indica lo stato dell'auto, come "Avanti", "Indietro" o "Fermo".
Nella dimostrazione, l'auto è posizionata di fronte a un ostacolo. Quando l'ostacolo è a più di 25 cm, l'auto si muove in avanti. Mentre avvicini la mano, l'auto si ferma quando la distanza scende sotto i 25 cm. Se porti la mano molto vicina, entro 10 cm, l'auto farà retromarcia. Questo comportamento è chiaramente visibile nel video e conferma che la logica di evitamento ostacoli funziona correttamente. (nel video a 11:53)
Conclusione
Congratulazioni! Hai costruito con successo un'auto intelligente che può navigare nel suo ambiente ed evitare ostacoli. Questo progetto combina input dai sensori, logica decisionale e controllo del motore in un unico sistema funzionale. Non hai solo imparato a usare un sensore a ultrasuoni, ma anche a implementare un semplice algoritmo di controllo che è la base per robot autonomi molto più complessi.
Capitoli
- [00:00] Introduzione all'evitamento ostacoli
- [01:16] Panoramica del progetto e prerequisiti
- [02:24] Collegamento del sensore a ultrasuoni e del driver del motore
- [04:56] Apertura del codice del progetto
- [05:12] Spiegazione del codice: logica e funzioni
- [08:34] Caricamento del codice e test iniziale
- [09:21] Risoluzione dei problemi: prototipi di funzione
- [10:56] Risoluzione dei problemi: aggiunta di un ritardo per la stabilità
- [11:53] Dimostrazione dal vivo dell'evitamento ostacoli
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int trigPin = 3;
const int echoPin = 4;
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//ultrasonic
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
}
void loop() {
float distance = readSensorData();
if (distance > 25) {
moveForward(200);
}
else if (distance < 10 && distance > 2) {
moveBackward(200);
} else {
stopMove();
}
}
float readSensorData() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
return distance;
}
void moveForward(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void moveBackward(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void stopMove() {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
Common Course Links
Common Course Files
Cose di cui potresti avere bisogno
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Risorse e riferimenti
-
DocumentazioneDocumentazione per il kit di apprendimento SunFounder 3 in 1 IoT/Smart Car.docs.sunfounder.com
-
Esterno
File📁
Librerie Arduino (zip)
-
Codice sorgente del kit di apprendimento Smart Car 3-in-1 di SunFounder
3in1-kit-main-v2.zip12.80 MB