Robot con evitamento degli ostacoli: rileva, scansiona e sterza
Un robot che gira autonomamente—rileva gli ostacoli, cerca aperture e sterza verso lo spazio libero—costruito con componenti che hai compreso e prima regolato in simulazione.
Un robot con evitamento degli ostacoli è la costruzione naturale dopo un robot seguilinea. Un robot seguilinea segue: segue una linea che qualcuno ha tracciato per lui. Questo robot decide: senza pista e senza mappa, sente lo spazio intorno a sé e sceglie dove andare. Questa differenza—reagire al mondo invece di seguirlo—è il primo vero assaggio di autonomia, ed è ancora abbastanza semplice da capire completamente.
Il nucleo è un breve ciclo ripetuto: rileva–scansiona–decide–sterza. Il sensore ultrasonoro HC-SR04 invia un ping in avanti e misura l’eco per stimare la distanza; quando qualcosa è più vicino di una soglia di sicurezza, il robot si ferma, fa oscillare il sensore a sinistra e a destra con un servomotore SG90 e sterza verso la direzione più aperta. La soglia non è arbitraria: è una distanza di sicurezza costruita a partire dalla velocità attuale, dalla latenza tra sensore, decisione e attuazione, dalla distanza di frenatura (che cresce con il quadrato della velocità), dal raggio del robot e da un margine, tutti visibili nella curva della distanza di arresto nel simulatore.
Aggiungi i componenti necessari a un robot mobile e impari cosa fa ciascuno: un Arduino Uno per una logica a 5 V tollerante, il sensore ultrasonoro e la sua zona cieca (la distanza minima sotto la quale non può riportare nulla), il servomotore che dà al fascio un secondo punto di vista, l’H-bridge L298N che commuta la corrente dei motori che i pin logici non possono fornire, due motori TT con riduttore, dove il riduttore scambia velocità con coppia utilizzabile, un telaio 2WD con supporto girevole per la sterzata differenziale e un pacco batteria che deve alimentare motori e logica su linee separate. L’albero tecnologico ti porta anche attraverso due percorsi di apprendimento—controllo dei motori e navigazione reattiva—così le stesse idee di PWM, odometria e filtraggio incontrate nel robot seguilinea tornano qui in un contesto di navigazione.
Poi, prima di spendere qualcosa o rischiare un collegamento errato, regola il comportamento di evitamento nel simulatore del browser finché non naviga in modo pulito in uno spazio ingombro. L’area di lavoro è vista dall’alto e bidimensionale, con raggi istantanei e privi di rumore; un fascio ultrasonoro reale si apre di circa 15°, è bloccato dal corpo stesso del robot ed è disturbato da superfici morbide o inclinate, quindi filtrerai le letture, aggiungerai un filtro mediano e una breve pausa di assestamento dopo che il servomotore si è mosso prima di fidarti di una distanza sull’hardware. Trovare in simulazione una distanza di arresto sicura e una regola per la direzione chiara elimina quasi tutti i dubbi prima che il robot si muova.
Solo dopo colleghi il robot vero— trigger ed eco alla tensione corretta, segnale del servomotore a un pin che supporta PWM, PWM e direzione dei motori al driver, batteria dei motori solo al pin VM del driver, ogni massa collegata insieme— e lo fai girare su un pavimento con scatole o sedie. Le stesse lezioni di rilevamento e filtraggio portano direttamente al Micromouse con labirinto a muri se in seguito vuoi aggiungere la mappatura, o alla navigazione ROS 2 se aggiungi un Raspberry Pi.
Percorri l’albero tecnologico qui sotto dall’alto verso il basso. Ogni nodo si sblocca quando i suoi prerequisiti sono completi e i progressi vengono salvati su questo dispositivo, così puoi costruire il robot durante un fine settimana senza perdere il punto.
Lista dei componenti
| Componente | Quantità | Costo indicativo | Note |
|---|---|---|---|
| Arduino Uno | 1 | $5–8 | La logica a 5 V è davvero utile qui: l’eco dell’HC-SR04 è a 5 V |
| HC-SR04 | 1 | $2 | Un VL53L0X è un buon secondo sensore, non un sostituto |
| Servomotore SG90 | 1 | $2 | Per la testa di scansione. MG90S se funzionerà per ore |
| L298N | 1 | $2–4 | Oppure un TB6612FNG, che disperde molto meno della batteria |
| Motore TT con riduttore | 2 | $4 | |
| Telaio 2WD | 1 | $6–10 | |
| Pacco batteria | 1 | $6 | 6×AA NiMH oppure 2×18650 |
| Interruttori a urto | 2 | $1 | Aggiungili. Vedi sotto |
Totale: circa $30–40.
I due interruttori a urto sono i quaranta centesimi meglio spesi sul robot e sono la parte che la maggior parte delle costruzioni omette. Ogni sensore di distanza ha superfici che non può vedere: un sonar è cieco alle tende e ai muri incontrati con un angolo ripido e un robot senza sensori di contatto spingerà una tenda finché qualcosa non cede. Due interruttori dietro un paraurti avvolto trasformano «di solito evita le cose» in «non si blocca mai contro qualcosa che non poteva vedere».
Come si collega tutto
| Da | A | Nota |
|---|---|---|
HC-SR04 VCC, GND |
5 V, GND | ~15 mA, con picchi durante un ping |
HC-SR04 Trig |
D9 | Qualsiasi pin digitale |
HC-SR04 Echo |
D10 | Uscita a 5 V: va bene su un Uno, richiede un divisore su una scheda a 3.3 V |
| Segnale del servomotore | D6 | La libreria Servo usa il Timer 1, che gestisce anche il PWM sui pin D9/D10 |
| Alimentazione del servomotore | 5 V separata, massa comune | 650 mA in stallo: non il pin 5 V dell’Arduino |
Driver ENA, ENB |
D5, D3 | Pin che supportano PWM. Rimuovi i jumper di enable dell’L298N |
Driver IN1–IN4 |
D8, D7, D4, D2 | |
| Interruttori a urto | D11, D12, INPUT_PULLUP |
COM a terra, NO al pin |
Batteria + |
VM / +12V del driver |
Mai l’Arduino |
| Tutte le masse | Un punto | Arduino, driver, alimentazione del servomotore, negativo della batteria |
Fai attenzione al conflitto del timer: la libreria Servo prende il Timer 1, che su un Uno
gestisce il PWM sui pin 9 e 10. Metti il PWM dei motori su 3, 5, 6 o 11 e il servomotore su un pin
qualsiasi: il problema non si presenta. Metti l’abilitazione dei motori sul pin 9 e il suo controllo
della velocità smetterà silenziosamente di funzionare nel momento in cui colleghi un servomotore.
La distanza di arresto, calcolata invece che indovinata
La soglia di arresto è il numero più importante di questo progetto e non è arbitraria. È la somma di quattro distanze:
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Termine | Da dove viene | Tipico |
|---|---|---|
| Latenza di rilevamento e decisione | Ping (fino a 25 ms), assestamento del servomotore, periodo del ciclo | 60–100 ms |
| Distanza di frenatura | Velocità al quadrato divisa per due volte la decelerazione | Cresce rapidamente |
| Raggio del robot | Dal bordo anteriore del telaio al centro di rotazione | 80–100 mm |
| Margine | Perché il cono del sensore è largo 15° e si trova su cose morbide | 50 mm |
Calcolato per un robot a 0.3 m/s con 80 ms di latenza e 1.0 m/s² di frenatura:
= (0.3 x 0.08) + (0.09 / 2.0) + 0.09 + 0.05
= 0.024 + 0.045 + 0.09 + 0.05 = 0.21 m
Quindi circa 21 cm. Ora raddoppia la velocità a 0.6 m/s:
= 0.048 + 0.18 + 0.09 + 0.05 = 0.37 m
La soglia non è raddoppiata: è cresciuta del 76%, perché il termine di frenatura va con il quadrato della velocità. Ecco perché un robot che evita in modo affidabile a velocità di camminata comincia a sbattere contro le cose quando lo acceleri, e perché la soluzione è una soglia dipendente dalla velocità, non un unico grande numero fisico che rende il robot timido ovunque.
Costruiscilo in traguardi
| # | Traguardo | Il test | Un risultato positivo sembra |
|---|---|---|---|
| 1 | I motori guidano | Avanti, indietro, rotazione in entrambe le direzioni su blocchi | Tutti e sei gli stati funzionano; conosci la deadband di ogni ruota |
| 2 | La distanza viene letta | Punta a un muro a 30 cm e stampa per un minuto | Stabile entro un centimetro o due, senza zeri |
| 3 | Il timeout funziona | Punta all’aria aperta e al soffitto | Il ciclo mantiene la frequenza: l’assenza di eco non deve significare robot congelato |
| 4 | Filtro mediano | Fai passare ripetutamente una mano nel fascio | Spariscono le letture selvagge isolate; l’avvicinamento reale viene ancora registrato |
| 5 | Il servomotore scansiona | Comanda −60°, 0°, +60° e stampa la distanza a ciascuno | Scansione ripetibile, con una pausa di assestamento prima di ogni ping |
| 6 | La pausa di assestamento è dimostrata | Rimuovi deliberatamente la pausa | Le letture si spargono sugli angoli: ora conosci quel guasto |
| 7 | Soglia di arresto | Porta il robot verso un muro e lascialo fermarsi | Si ferma con il margine calcolato, non per fortuna |
| 8 | Decisione di svolta | Mettilo davanti a un angolo con un lato aperto | Sterra verso il lato aperto, non a caso |
| 9 | Isteresi | Posizionalo fermo appena sopra la soglia | Si impegna in una decisione invece di oscillare |
| 10 | Recupero dagli urti | Portalo contro un cuscino | Il sonar non lo vede, l’interruttore lo intercetta e il robot arretra e sterza |
| 11 | Marcia libera | Cinque minuti in una stanza ingombra | Sopravvive; quando si blocca sai dire in quale stato è |
Il traguardo 10 è quello che distingue una dimostrazione da un robot. Un cuscino assorbe completamente l’impulso ultrasonoro, quindi il sensore segnala uno spazio aperto e il robot ci entra a tutta velocità. Senza un interruttore a urto, poi spinge finché i motori non si bloccano.
Risoluzione dei problemi
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| Il robot si blocca a intervalli casuali | pulseIn senza timeout |
Passa un timeout di 25000 µs; gestisci esplicitamente l’assenza di eco |
| Si ferma d’emergenza in una stanza vuota | Sta trattando un timeout come 0 cm | Un timeout significa lontano, non vicino. Restituisci un valore sentinella |
| Entra in tende e cuscini | Il suono viene assorbito: è fisica, non un bug | Aggiungi interruttori a urto |
| Entra nei muri di traverso | Il ping riflette lontano dal ricevitore | Stessa soluzione; scansiona anche più angoli |
| Sterza con sicurezza verso un muro | Legge prima che il servomotore si sia assestato | Aggiungi 100–200 ms dopo aver comandato l’angolo, prima di fare il ping |
| Vibra davanti agli ostacoli | Una sola soglia, nessuna isteresi | Fermati a 20 cm e non ripartire finché non arrivi a 30 cm |
| Il servomotore vibra e la scheda si resetta | Corrente del servomotore attraverso l’Arduino | Alimentazione separata a 5 V per il servomotore, massa comune |
| Il controllo della velocità dei motori ha smesso di funzionare | La libreria Servo ha preso il Timer 1 (pin 9, 10) |
Sposta il PWM dei motori su 3, 5, 6 o 11 |
| Resta bloccato in un angolo per sempre | Nessuna memoria: intrinseco alla navigazione reattiva | Aggiungi una componente casuale e una fuga dal rilevamento del blocco |
| Evita bene lentamente, colpisce le cose veloce | Soglia fissa, termine quadratico di frenatura | Rendi la soglia dipendente dalla velocità |
| Letture selvagge quando due robot girano insieme | Si sentono a vicenda i propri ping | Scaglia i tempi dei ping |
Da dove proseguire
Aggiungi l’inseguimento delle pareti. Un robot che mantiene una distanza fissa da una parete su un lato percorre una stanza in modo deterministico invece di vagare, ed è il primo comportamento che comincia a sembrare un piano. È una piccola modifica al codice e una grande modifica concettuale.
Aggiungi un secondo tipo di sensore. Un VL53L0X fallisce su superfici quasi esattamente opposte al sonar: quelle scure e opache e gli specchi, rispetto a quelle morbide e inclinate. Insieme coprono molto più della stanza rispetto a uno dei due da solo.
Accetta il limite e prosegui. Un robot reattivo non può essere mandato ovunque, non può promettere di aver coperto il pavimento e può girare per sempre in una stanza a ferro di cavallo. Sono proprietà dell’assenza di una mappa, non bug. Quando iniziano a contare, il micromouse aggiunge mappatura e pianificazione e il robot per la copertura affronta direttamente la domanda «sono passato ovunque?».
Roadmap del progetto
Il percorso di costruzione
Segui l'albero tecnologico dai componenti fino a un robot funzionante. Ogni nodo si sblocca quando i suoi prerequisiti sono completati, e i tuoi progressi vengono salvati su questo dispositivo.
0 / 18 completati
Componenti
- ControllerArduino UnoLa scheda a 8 bit tollerante con cui la maggior parte delle persone scopre la robotica.
- SensoreSensore ultrasonico HC-SR04Un ping sonar in un pacchetto da due dollari: ecco come un robot sente gli ostacoli.
- AttuatoreServomotore SG90Il servomotore da nove grammi presente nella maggior parte di bracci robotici, pinze e sterzi.
- DriverDriver del motore L298NIl doppio ponte H che trasforma deboli pin logici in potenza per i motori.
- AttuatoreMotore DC con ingranaggi (motore TT)Il motore giallo con ingranaggi che trasforma un telaio nudo in un'auto robot in movimento.
- TelaioTelaio robotico 2WDLa piattaforma su cui si montano due motori, un caster libero e tutta la tua elettronica.
- AlimentazionePacco batteria e alimentazione del robotLa differenza tra un robot che funziona e uno che continua a riavviarsi.
Tutorial in questo percorso
- Principiante · 22 minAlgoritmo di evitamento ostacoli: rileva, scandisci, decidi, giraIl ciclo rileva–scandisci–decidi–gira che permette a un robot di evitare gli ostacoli autonomamente.
- Principiante · 20 minLeggere un HC-SR04: distanza affidabile nel codiceTrasforma ping ed eco in una distanza stabile in cm, con timeout e filtro mediano.
- Principiante · 18 minScansione di un sensore ultrasonoro con servomotoreScansiona con un servomotore un HC-SR04 per trovare la direzione più libera prima di girare.
- Principiante · 18 min di letturaControlla motori in corrente continua (DC) con PWM e un ponte HControlla in sicurezza un motore DC con spazzole usando PWM, un ponte H e limiti di corrente realistici.
- Intermedio · 20 min di letturaOdometria differenziale con encoder sulle ruoteIntegra il movimento delle ruote sinistra e destra per ottenere la posa di un robot mobile, poi identifica e calibra la deriva.
Esercitati prima di cablare
Mettilo a punto nel simulatore
Il percorso di costruzione passa per un laboratorio nel browser. Ottieni qui il comportamento giusto, poi trasferisci le tue impostazioni sul robot reale.
Domande frequenti
Come funziona un robot con evitamento degli ostacoli?
Guida in avanti mentre un sensore ultrasonoro controlla la distanza davanti. Quando qualcosa è più vicino di una soglia impostata, il robot si ferma, fa oscillare il sensore a sinistra e a destra con un servomotore per misurare la distanza in ogni direzione e sterza verso la direzione più aperta, poi riprende a guidare. Tutto questo è un breve ciclo rileva–scansiona–decide–sterza che viene eseguito molte volte al secondo.
Qual è il sensore migliore per un robot con evitamento degli ostacoli?
Il sensore ultrasonoro HC-SR04 è la scelta predefinita: è economico, facile da collegare e affidabile per alcuni metri. Un sensore a tempo di volo dà una lettura più stretta, più rapida e precisa, se ti serve, ma per il primo robot che evita gli ostacoli l'ultrasono offre il giusto equilibrio tra costo e semplicità.
Devo comprare i componenti prima di iniziare questo progetto?
No. Il rilevamento e la logica di evitamento funzionano nel simulatore del browser, quindi puoi capire e regolare il comportamento prima di comprare qualsiasi cosa. Solo i passaggi finali di costruzione—cablaggio e assemblaggio—richiedono Arduino, HC-SR04, servomotore, driver, motori, telaio e batteria fisici.
Perché il mio robot con evitamento degli ostacoli non funziona?
I tre colpevoli abituali sono una lettura ultrasonora rumorosa o bloccata (aggiungi un filtro mediano e lascia il sensore libero), la lettura del sensore prima che il servomotore abbia finito di muoversi (aggiungi una breve pausa di assestamento) e l'alimentazione dei motori direttamente dall'Arduino invece che attraverso il driver, che causa brown-out e resetta la scheda.
In che modo è diverso da un robot seguilinea?
Un robot seguilinea segue una pista predisposta per lui; un robot con evitamento degli ostacoli non ha una pista e deve decidere dove andare. Aggiunge un sensore di scansione e un vero ciclo decisionale, il che lo rende il naturale secondo robot da costruire dopo un robot seguilinea.