Fondamenti di elettronica robotica: percorso di apprendimento
Puoi alimentare un robot che resta acceso sotto carico, collegare più sensori a un solo bus I²C e scrivere un ciclo che li legga tutti senza mai bloccarsi.
La maggior parte dei problemi dei robot che sembrano problemi software non lo è. La scheda si riavvia e si incolpa il codice; un sensore restituisce valori privi di senso e si incolpa la libreria; il robot ignora il paraurti e si incolpa la logica. In ogni caso il guasto è a un livello inferiore, nella parte del sistema su cui nessuno ha scritto un tutorial perché sembrava troppo elementare da richiederne uno.
Questo percorso copre proprio quel livello. Tratta l’alimentazione: perché la tensione di una batteria cede all’avvio dei motori e come intervenire; il bus I²C: che cosa fanno davvero i due fili condivisi da tutti i sensori; e la temporizzazione: perché un ciclo che si ferma ad aspettare è un robot che non può reagire.
Nulla di tutto questo è difficile. Tutto è presupposto da ogni altro percorso di questo sito.
Prima di iniziare
Ti serve un microcontrollore che sai già programmare e la disponibilità a collegare un multimetro ai terminali di una batteria. Nessuna teoria del controllo, nessuna matematica oltre addizione e una divisione. Se hai costruito qualcosa, anche un LED lampeggiante, sei pronto.
Che cosa saprai fare
- Distinguere un riavvio da un crash in meno di un minuto e riconoscere quale hai davanti prima di aprire il codice.
- Sommare il consumo di corrente di un robot e scegliere il pacco batteria in base al risultato, anziché in base al contenuto del kit.
- Spiegare perché un blocco da 9 V con la tensione più alta sugli scaffali dà il risultato peggiore sotto carico e prevedere di quanto calerà la tensione di un pacco.
- Collegare più sensori a un solo bus I²C, trovarli con uno scanner e risolvere una collisione di indirizzi in tre modi diversi.
- Scrivere un ciclo che legga i sensori, piloti i motori e riporti lo stato a tre frequenze diverse senza mai bloccarsi, e svolgere correttamente il confronto al rollover.
- Misurare il tempo peggiore del tuo ciclo invece di presupporlo.
Dove le persone si bloccano
Scambiare il fatto che «non si è riavviato» per una prova che l’alimentazione funzioni. Il rilevatore di bassa tensione di un Arduino è impostato a 2.7 V, ma un ATmega328P a 16 MHz richiede circa 3.8 V per operare alla velocità nominale. In quell’intervallo il chip funziona fuori specifiche senza che nulla intervenga: è lì che si manifestano i guasti più strani di un robot, come variabili corrotte, un servomotore che salta o un sensore che restituisce valori plausibili ma privi di senso.
Aggiungere un condensatore e aspettarsi che risolva un riavvio. L’aritmetica dice il contrario: un condensatore da 1000 µF che dovesse fornire 2 A per 10 ms perderebbe 20 V. Riduce le ondulazioni di commutazione e i picchi di commutazione dei motori, operazione che vale la pena fare, ma solo una batteria più rigida può sostenere la corrente di spunto.
Impilare schede di espansione sullo stesso bus. Quasi ogni scheda include i propri resistori di pull-up, che finiscono in parallelo. Tre schede sono al limite e la quarta porta il bus sotto la corrente massima che qualsiasi dispositivo può assorbire: tre sensori funzionano e il quarto li disabilita tutti, senza che nulla sia realmente rotto.
Leggere un indirizzo a 8 bit dal foglio dati. Il foglio dati di un MPU-6050 indica 0xD0; la libreria
Arduino richiede 0x68, gli stessi bit spostati a destra di una posizione. È l’errore I²C più comune
e sembra esattamente una scheda morta.
Scrivere now >= last + interval. Si legge in modo più naturale della forma con la sottrazione, ma si rompe
al rollover di 49.7 giorni e scatta continuamente invece di aspettare. Sottrai sempre.
Incolpare la logica del ciclo quando è il ciclo a essere bloccato. Gli interrupt continuano a funzionare durante
delay(), quindi il conteggio di un encoder resta perfettamente corretto mentre il robot smette di reagire:
il sintomo sembra un bug decisionale anziché temporale.
Che cosa serve
| Componente | Perché serve a questo percorso | Costo indicativo |
|---|---|---|
| Un microcontrollore che sai programmare | Ogni misura qui viene eseguita su una scheda funzionante, non sulla carta | Arduino Uno, clone ~$8 |
| Un multimetro | Lo strumento senza il quale questo percorso non può proseguire: ogni affermazione si verifica personalmente | ~$15 |
| Un pacco batteria sotto carico | Un pacco misurato senza nulla collegato non dice nulla; deve alimentare qualcosa | Portapile 4×AA o 2S Li-ion |
| Due schede di espansione I²C | Una sola scheda non mostra mai il problema dei pull-up. Due iniziano a mostrarlo. | MPU-6050 + qualsiasi altra, ~$5 |
| Un paio di motori | Il carico che abbassa la linea di alimentazione: il guasto che questo percorso esiste per spiegare | Qualsiasi motore DC con ingranaggio |
Nessun oscilloscopio. Ogni misura di questo percorso è una misura in corrente continua e può essere eseguita da un multimetro economico.
Perché il percorso segue quest’ordine
L’ordine non è arbitrario: ogni nodo elimina una possibilità di errore per il successivo.
La temporizzazione viene prima di ogni misura. Un ciclo bloccato rende sospette tutte le altre misure, perché non puoi più stabilire quando è stata eseguita una lettura. Quando il ciclo non blocca puoi fidarti di una marca temporale e solo allora vale la pena registrare una misura.
L’alimentazione viene prima dell’ingresso analogico. analogRead su un Arduino è ratiometrico:
riporta l’ingresso come frazione del riferimento, e il riferimento predefinito è la stessa linea di
5 V che i motori stanno abbassando. Se misuri una batteria attraverso un partitore su una linea che
cala, la lettura aumenta mentre la batteria si scarica. Non puoi misurare una tensione in modo attendibile
finché non sai che cosa fa la linea di alimentazione, quindi il nodo dell’alimentazione deve precedere quello dell’ingresso analogico.
I²C viene dopo l’alimentazione, ma è indipendente dall’ingresso analogico. Il bus è un sottosistema separato e fallisce in modo proprio, con calcoli sui pull-up e collisioni di indirizzi, non con l’abbassamento della tensione. Dipende direttamente dal nodo della scheda, ed è per questo che l’albero si ramifica lì.
Il laboratorio viene per ultimo. Il simulatore di sensori permette di aggiungere intenzionalmente rumore, bias e interruzioni a un segnale pulito. Questo diventa instruttivo solo dopo aver visto il proprio hardware produrli per errore e sapere cosa ha causato ciascuno.
Checkpoint: come sapere che una tappa è stata superata
Ognuno di questi è un test su banco, non un quiz. Se non riesci a ottenere il numero, la tappa non è completa.
| Tappa | Controllo | Esito positivo |
|---|---|---|
| Temporizzazione non bloccante | Stampa la durata peggiore del ciclo per 10 secondi | Un numero in microsecondi misurato, non presupposto, e non cresce quando scolleghi un sensore |
| Batteria sotto carico | Misura la tensione del pacco con i motori spenti, poi bloccati | Puoi indicare la caduta in volt e dividerla per la corrente per ottenere la resistenza interna del pacco |
| Bilancio di corrente | Sommare su carta il consumo di ogni dispositivo, poi misurare il totale | Carta e multimetro coincidono entro circa il 20%; altrimenti hai trovato un dispositivo che consuma più di quanto dichiari il suo foglio dati |
| Ingresso analogico | Leggi la stessa batteria tramite il partitore con i motori spenti e in funzione | La lettura non cambia all’avvio dei motori: se cambia, il riferimento si sta muovendo |
| Bus I²C | Esegui uno scanner del bus aggiungendo una scheda alla volta | Ogni indirizzo compare e sai indicare la resistenza di pull-up totale sul bus |
| Collisione di indirizzi | Collega il pin AD0 dell’MPU-6050 al livello alto | Lo scanner indica 0x69 invece di 0x68 e sai spiegare perché il foglio dati riporta 0xD0 |
Dove termina questo percorso
Questo percorso di apprendimento si ferma intenzionalmente nel punto in cui l’elettronica smette di mentirti. Non copre i driver dei motori, i cicli di controllo o qualsiasi cosa che decida dove debba andare il robot: sono i percorsi sul controllo dei motori e sul controllo PID, che danno entrambi per scontato tutto ciò che è qui.
Si ferma anche prima di tre aspetti che vale la pena nominare. Non copre i regolatori a commutazione, che permettono di ottenere 5 V da un pacco da 12 V senza dissipare la differenza come calore in un regolatore lineare. Non copre la traduzione di livello tra dispositivi a 5 V e 3.3 V, necessaria la prima volta che colleghi uno ESP32 e un sensore a 5 V allo stesso bus. E non copre la progettazione di PCB o la saldatura: tutto qui viene fatto su una breadboard, va bene per imparare ed è esso stesso una fonte di guasti intermittenti quando un robot inizia a muoversi.
Percorso di apprendimento
Il percorso
Segui i nodi in ordine: ognuno sblocca il successivo una volta completato. I tuoi progressi vengono salvati su questo dispositivo.
0 / 9 completati
Domande comuni
Domande frequenti
Quali conoscenze di elettronica servono prima di costruire un robot?
Tre cose, nessuna avanzata. Devi dimensionare un alimentatore in base alla corrente che il robot assorbe davvero, così non si riavvia all'avvio dei motori. Devi capire il bus I²C abbastanza da collegare più sensori a due fili condivisi senza che si disturbino. E devi scrivere un ciclo di controllo che non si fermi mai ad aspettare, così il robot può reagire mentre svolge un'altra operazione. Tutto il resto, teoria del controllo, navigazione e cinematica, si fonda su queste tre cose.
Perché il mio Arduino si riavvia all'avvio dei motori?
La resistenza interna della batteria trasforma la corrente di spunto dei motori in una caduta di tensione e l'intera linea di alimentazione cede. Un motore che assorbe una corrente di 2 A attraverso un pacco con 0.5 Ω di resistenza interna abbassa la linea di un volt prima che qualsiasi cosa raggiunga il regolatore. Se questa discesa porta la scheda sotto la soglia di bassa tensione, essa si riavvia. La soluzione è una batteria più rigida e un alimentatore separato per i motori, non un condensatore più grande: un condensatore da 1000 µF che dovesse fornire 2 A per 10 ms perderebbe 20 V e quindi non potrebbe superare una corrente di spunto di quelle dimensioni.
Quanti sensori I²C posso collegare a un solo Arduino?
Lo spazio degli indirizzi consente 112 dispositivi, ma il limite elettrico arriva molto prima. Quasi ogni scheda di espansione ha i propri resistori di pull-up, in genere da 4.7 kΩ, e impilando le schede questi finiscono in parallelo. Quattro schede danno circa 1.2 kΩ, che a 5 V richiedono più di 4 mA di corrente assorbita, oltre i 3 mA che un dispositivo I²C deve essere in grado di gestire. Tre schede funzionano di solito e la quarta guasta l'intero bus. Rimuovendo i resistori di pull-up da tutte tranne una scheda puoi aggiungere molti più dispositivi.
delay() è davvero così dannoso nel codice di un robot?
Per un robot sì. Mentre il processore resta dentro delay() non legge sensori e non prende decisioni: un robot in delay(500) è cieco per mezzo secondo, che a 0.3 m/s corrisponde a 15 cm di movimento. La difficoltà diagnostica sta nel fatto che gli interrupt continuano a funzionare, quindi il conteggio dell'encoder rimane perfettamente corretto per tutto il tempo. Il sintomo sembra un bug di logica decisionale anziché un problema di temporizzazione bloccata. Sostituiscilo con il modello basato su millis() e, quando confronti i tempi, sottrai invece di aggiungere, altrimenti il confronto si rompe al rollover di 49.7 giorni.
Mi serve un oscilloscopio per seguire questo percorso?
No. Un multimetro basta per tutto ciò che c'è qui: misurare la tensione di una batteria sotto carico, controllare l'uscita di un partitore, verificare che una linea non abbia subito un calo. Un oscilloscopio rende molto più facili da vedere le cadute di tensione e i problemi I²C e, se ne possiedi uno, dovresti usarlo, ma ogni misura richiesta da questo percorso è una misura in corrente continua e può essere eseguita da un multimetro da £10.
Quanto tempo richiede questo percorso di apprendimento?
Circa due ore di lettura nei quattro tutorial e realisticamente una o due sere al banco per eseguire davvero le misure. Le misure sono il punto: i numeri che questo percorso ti insegna a considerare affidabili sono l'abbassamento della tua batteria, la resistenza di pull-up totale del tuo bus e il tempo peggiore del tuo ciclo, nessuno dei quali si può cercare online.