🚀 Introduzione
Vuoi costruire un robot capace di muoversi autonomamente e scegliere da solo la direzione migliore quando incontra un ostacolo? 🤖🚧
In questo progetto realizzerai un robot evita ostacoli avanzato utilizzando Arduino UNO, due motori DC, un driver L298N, un sensore a ultrasuoni HC-SR04 e un servomotore.
Il sensore a ultrasuoni sarà montato sul servo.
Quando il robot rileva un ostacolo davanti a sé:
👉 Rispetto a un robot evita ostacoli base, questa versione non sceglie una direzione casuale ma analizza l’ambiente prima di muoversi.
Vuoi costruire un robot capace di muoversi autonomamente e scegliere da solo la direzione migliore quando incontra un ostacolo? 🤖🚧
In questo progetto realizzerai un robot evita ostacoli avanzato utilizzando Arduino UNO, due motori DC, un driver L298N, un sensore a ultrasuoni HC-SR04 e un servomotore.
Il sensore a ultrasuoni sarà montato sul servo.
Quando il robot rileva un ostacolo davanti a sé:
- si ferma;
- arretra leggermente;
- guarda a sinistra;
- guarda a destra;
- confronta le distanze;
- ruota verso il lato più libero;
- riprende il movimento.
👉 Rispetto a un robot evita ostacoli base, questa versione non sceglie una direzione casuale ma analizza l’ambiente prima di muoversi.
🎯 Cosa realizzerai
Con Arduino creerai un robot che:
Con Arduino creerai un robot che:
- 🤖 si muove autonomamente;
- 📏 misura la distanza dagli ostacoli;
- 👀 orienta il sensore tramite servo;
- ⬅️ controlla lo spazio disponibile a sinistra;
- ➡️ controlla lo spazio disponibile a destra;
- 🧠 sceglie la direzione più libera;
- ⬇️ arretra quando l’ostacolo è troppo vicino;
- 🔄 ruota sul posto;
- 🔘 permette di avviare e fermare il robot;
- ✅ utilizza codice compatibile con Arduino UNO.
🧰 Materiale necessario
- 1x Arduino UNO;
- 1x telaio robot a due ruote;
- 2x motori DC con riduttore;
- 2x ruote;
- 1x ruota libera;
- 1x modulo driver L298N;
- 1x sensore a ultrasuoni HC-SR04;
- 1x servomotore SG90 o compatibile;
- 1x supporto per montare HC-SR04 sul servo;
- 1x pulsante;
- 1x LED di stato;
- 1x resistenza da 220 Ω;
- 1x portabatterie adatto ai motori;
- 1x alimentazione esterna da 5V per il servo, consigliata;
- cavetti jumper;
- distanziali e viti;
- cavo USB.
🛒 Non hai ancora i componenti?
Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.
👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un'occhiata anche ai miei libri dedicati ad Arduino.
All'interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 Scopri i miei libri su Arduino:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4rfzjXE
Molti dei progetti presenti su progettiarduino.com utilizzano componenti elettronici di base come LED, resistenze, sensori e breadboard.
Se stai iniziando con Arduino, il modo più semplice è utilizzare un kit completo per principianti, che include quasi tutti i componenti necessari per realizzare molti dei progetti presenti sul sito.
👉 Kit Arduino consigliato:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4b3dxjW
📘 Vuoi imparare Arduino passo dopo passo?
Se vuoi approfondire e realizzare progetti più completi, puoi dare un'occhiata anche ai miei libri dedicati ad Arduino.
All'interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.
👉 Scopri i miei libri su Arduino:
ℹ️ Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
https://amzn.to/4rfzjXE
📚 Librerie necessarie
Il progetto utilizza la libreria:
Il sensore HC-SR04 viene gestito direttamente tramite pulseIn() e non richiede librerie esterne.
Il progetto utilizza la libreria:
- Servo.
Il sensore HC-SR04 viene gestito direttamente tramite pulseIn() e non richiede librerie esterne.
🔌 Schema di collegamento
Driver L298N – Motore sinistro
Driver L298N – Motore destro
Sensore HC-SR04
Servomotore
Pulsante AVVIO/STOP
LED di stato
Driver L298N – Motore sinistro
- ENA → pin PWM 5;
- IN1 → pin digitale 7;
- IN2 → pin digitale 8;
- OUT1 e OUT2 → motore sinistro.
Driver L298N – Motore destro
- ENB → pin PWM 6;
- IN3 → pin digitale 12;
- IN4 → pin digitale 13;
- OUT3 e OUT4 → motore destro.
Sensore HC-SR04
- VCC → 5V;
- GND → GND;
- TRIG → pin digitale 3;
- ECHO → pin digitale 4.
Servomotore
- filo segnale → pin digitale 9;
- filo rosso → alimentazione 5V;
- filo marrone o nero → GND.
Pulsante AVVIO/STOP
- un terminale → pin digitale 2;
- terminale opposto → GND.
LED di stato
- anodo → pin digitale 10 tramite resistenza da 220 Ω;
- catodo → GND.
⚠️ Alimentazione del robot
I motori e il servo non devono essere alimentati direttamente dai pin di Arduino.
Utilizza:
Collega insieme:
👉 Senza una massa comune, i segnali di controllo potrebbero non funzionare correttamente.
I motori e il servo non devono essere alimentati direttamente dai pin di Arduino.
Utilizza:
- un pacco batterie adatto ai motori;
- un’alimentazione stabile da 5V per il servo;
- una massa comune tra tutti i circuiti.
Collega insieme:
- GND della batteria motori;
- GND del driver L298N;
- GND dell’alimentazione servo;
- GND di Arduino.
👉 Senza una massa comune, i segnali di controllo potrebbero non funzionare correttamente.
💻 Codice Arduino
Il programma utilizza una macchina a stati.
Gli stati principali sono:
Il programma utilizza una macchina a stati.
Gli stati principali sono:
- robot fermo;
- movimento avanti;
- arresto ostacolo;
- retromarcia;
- scansione sinistra;
- scansione destra;
- scelta direzione;
- rotazione.
⚙️ Come funziona
Quando il robot è attivo, il sensore HC-SR04 misura continuamente la distanza davanti.
Se la distanza è maggiore della soglia, il robot procede in avanti.
Se la distanza è inferiore alla soglia:
Il robot gira verso il lato con più spazio disponibile.
Quando il robot è attivo, il sensore HC-SR04 misura continuamente la distanza davanti.
Se la distanza è maggiore della soglia, il robot procede in avanti.
Se la distanza è inferiore alla soglia:
- il robot si ferma;
- arretra per un breve intervallo;
- ruota il servo a sinistra;
- misura la distanza;
- ruota il servo a destra;
- misura nuovamente;
- torna al centro;
- confronta i risultati.
Il robot gira verso il lato con più spazio disponibile.
📏 Distanza di sicurezza
La soglia principale è impostata a:
const int DISTANZA_OSTACOLO = 25;
Quando un oggetto si trova entro 25 cm, il robot avvia la manovra.
Puoi modificare la soglia in base a:
👉 Un robot più veloce dovrebbe utilizzare una distanza maggiore.
La soglia principale è impostata a:
const int DISTANZA_OSTACOLO = 25;
Quando un oggetto si trova entro 25 cm, il robot avvia la manovra.
Puoi modificare la soglia in base a:
- velocità del robot;
- dimensioni del telaio;
- precisione del sensore;
- spazio disponibile.
👉 Un robot più veloce dovrebbe utilizzare una distanza maggiore.
👀 Scansione dell’ambiente
Il servo utilizza tre posizioni:
Il programma attende brevemente che il servo raggiunga la posizione prima di misurare.
Il servo utilizza tre posizioni:
- centro → 90°;
- sinistra → 150°;
- destra → 30°.
Il programma attende brevemente che il servo raggiunga la posizione prima di misurare.
🧠 Scelta della direzione
Dopo la scansione, Arduino confronta:
Se la distanza sinistra è maggiore, il robot gira a sinistra.
Se la distanza destra è maggiore, gira a destra.
Se entrambe sono molto ridotte, il robot esegue una rotazione più lunga per allontanarsi dalla zona chiusa.
Dopo la scansione, Arduino confronta:
- distanza sinistra;
- distanza destra.
Se la distanza sinistra è maggiore, il robot gira a sinistra.
Se la distanza destra è maggiore, gira a destra.
Se entrambe sono molto ridotte, il robot esegue una rotazione più lunga per allontanarsi dalla zona chiusa.
⬇️ Retromarcia preventiva
Prima di eseguire la scansione, il robot arretra leggermente.
Questa manovra:
La durata della retromarcia può essere modificata nel codice.
Prima di eseguire la scansione, il robot arretra leggermente.
Questa manovra:
- aumenta lo spazio davanti al sensore;
- riduce il rischio di urtare l’ostacolo;
- facilita la rotazione;
- migliora le letture laterali.
La durata della retromarcia può essere modificata nel codice.
🔄 Rotazione sul posto
Per ruotare verso destra:
Per ruotare verso sinistra:
Il robot gira quindi quasi sul proprio asse.
La durata della rotazione determina l’angolo raggiunto.
Per ruotare verso destra:
- motore sinistro avanti;
- motore destro indietro.
Per ruotare verso sinistra:
- motore sinistro indietro;
- motore destro avanti.
Il robot gira quindi quasi sul proprio asse.
La durata della rotazione determina l’angolo raggiunto.
🧊 Filtro delle misurazioni
Il sensore HC-SR04 può occasionalmente restituire valori errati.
Il programma esegue più misurazioni e utilizza la media delle letture valide.
Se non viene ricevuto alcun eco, il valore viene considerato molto distante.
Questo riduce le reazioni causate da singole misurazioni anomale.
Il sensore HC-SR04 può occasionalmente restituire valori errati.
Il programma esegue più misurazioni e utilizza la media delle letture valide.
Se non viene ricevuto alcun eco, il valore viene considerato molto distante.
Questo riduce le reazioni causate da singole misurazioni anomale.
🔘 Pulsante AVVIO/STOP
Premendo il pulsante:
Quando il robot viene fermato:
Premendo il pulsante:
- robot fermo → avvio;
- robot attivo → arresto immediato.
Quando il robot viene fermato:
- i motori vengono disattivati;
- il servo torna al centro;
- il LED si spegne;
- la procedura corrente viene annullata.
⚠️ Direzione dei motori
A causa del montaggio speculare, uno dei motori potrebbe girare nel verso opposto.
Il codice contiene:
const bool INVERTI_MOTORE_SINISTRO = false;
const bool INVERTI_MOTORE_DESTRO = true;
Se il robot gira invece di procedere diritto, modifica uno dei due valori.
Puoi anche invertire fisicamente i fili del motore interessato.
A causa del montaggio speculare, uno dei motori potrebbe girare nel verso opposto.
Il codice contiene:
const bool INVERTI_MOTORE_SINISTRO = false;
const bool INVERTI_MOTORE_DESTRO = true;
Se il robot gira invece di procedere diritto, modifica uno dei due valori.
Puoi anche invertire fisicamente i fili del motore interessato.
⚠️ Il robot continua a oscillare
Se il robot cambia continuamente direzione:
Se il robot cambia continuamente direzione:
- riduci la velocità;
- aumenta la distanza di sicurezza;
- aumenta il tempo di attesa del servo;
- controlla che il sensore sia montato stabilmente;
- evita superfici che assorbono gli ultrasuoni.
🧪 Prova iniziale
Prima di appoggiare il robot a terra:
Evita scale, bordi e oggetti fragili.
Prima di appoggiare il robot a terra:
- solleva le ruote;
- controlla avanti e indietro;
- verifica le rotazioni;
- controlla il movimento del servo;
- osserva la direzione del sensore;
- prova il pulsante STOP;
- esegui la prova in uno spazio libero.
Evita scale, bordi e oggetti fragili.
🧠 Perché è un progetto importante
Con questo progetto impari a:
Con questo progetto impari a:
- realizzare un robot autonomo;
- controllare due motori DC;
- utilizzare il driver L298N;
- muovere un sensore tramite servo;
- misurare distanze con HC-SR04;
- confrontare più direzioni;
- creare una macchina a stati;
- gestire manovre automatiche;
- filtrare misurazioni instabili;
- sviluppare codice compatibile con Arduino UNO.
🔄 Varianti possibili
Vuoi migliorare il progetto?
Vuoi migliorare il progetto?
- 📟 aggiungi un display LCD;
- 🔔 collega un buzzer durante la retromarcia;
- 💡 aggiungi LED di direzione;
- 🛞 utilizza encoder sulle ruote;
- 🔋 controlla la tensione della batteria;
- ⚡ misura la corrente dei motori;
- 🎛️ regola la velocità con un potenziometro;
- 📊 invia le distanze al Serial Plotter;
- 🧠 aggiungi una memoria delle direzioni;
- 🗺️ registra una semplice mappa;
- 📱 aggiungi una modalità Bluetooth;
- 🚨 collega sensori anticaduta.