Costruisci un robot seguilinea con un microcontrollore 8051
Un robot seguilinea funzionante su un 8051 nudo e una comprensione chiara di ogni livello che un Arduino avrebbe nascosto, dal circuito di reset alla forma d'onda PWM.
Quasi tutti i corsi di ingegneria che insegnano i microcontrollori terminano con la stessa assegnazione: costruisci un robot seguilinea su un 8051. È una buona assegnazione per un motivo che di solito non viene detto: il chip non ti dà nulla. Nessun analogWrite() per impostare la velocità di un motore, nessun analogRead() per i sensori, nessuna libreria per la scheda del driver. Ogni livello che di solito invocheresti è tuo.
È la differenza tra questo percorso di costruzione e il robot seguilinea con Arduino. Il robot è lo stesso; la profondità non lo è. Scriverai il generatore di modulazione di larghezza d’impulso (PWM) che un Arduino ha nel silicio, imparerai perché un pin dell’8051 accende un LED solo se lo colleghi al contrario e scoprirai, prima di comprare qualsiasi cosa, quanta CPU ti costa esattamente il controllo dei motori.
L’8051 è un microcontrollore a 8 bit con architettura Harvard in un package a 40 pin, di solito un AT89S52 con 8 KB di flash e 256 byte di RAM. Non ha una periferica PWM, le sue porte sono quasi bidirezionali (devi scrivere un 1 prima di leggere un ingresso) e i suoi pin assorbono più corrente di quanta ne possano fornire: per questo il LED va sul lato di assorbimento e il driver del motore H-bridge (ponte alto) ha bisogno di resistenze di pull-up per essere pilotato in modo affidabile. Questi dettagli sembrano note a margine finché il robot non fa nulla perché EA è flottante o il circuito di reset è attivo alto e tu lo hai collegato a massa.
Inizi su una breadboard con soltanto il chip, un cristallo da 11.0592 MHz e due condensatori di carico, una rete di reset e EA collegato al livello alto: il circuito minimo che esegue davvero il codice. I primi tre tutoriali ti guidano attraverso architettura e mappa della memoria, input/output general-purpose (GPIO) e interfacciamento delle porte, poi la costruzione del PWM con il Timer 0 in modalità di ricaricamento automatico a 8 bit: circa 460.8 Hz con passi del 5%, al costo di circa un quarto della CPU, un compromesso che paghi per non avere una periferica.
Da lì il percorso converge con il robot seguilinea con Arduino: lo stesso array IR (infrarosso) a riflessione ridotto a un errore ponderato, lo stesso controllo PID (Proporzionale-Integrale-Derivativo) della sterzata e lo stesso simulatore nel browser, dove trovi guadagni che affrontano bene le curve. L’albero tecnologico separa i nodi hardware da quelli dei concetti, così la prima metà richiede solo il chip e un programmatore ISP (in-system programming) come un USBasp; solo gli ultimi due nodi di costruzione richiedono telaio, motori e array.
Percorri l’albero tecnologico qui sotto in ordine. I primi tre nodi richiedono solo il chip su una breadboard, i guadagni del seguimento della linea si regolano nel simulatore del browser e solo gli ultimi due passaggi richiedono telaio e motori. I tuoi progressi vengono salvati su questo dispositivo.
Lista dei componenti
| Componente | Quantità | Costo indicativo | Note |
|---|---|---|---|
| AT89S52 DIP a 40 pin | 1 | $2 | Programmabile in-system. Un AT89C51 richiede un programmatore parallelo che non hai |
| Programmatore ISP USBasp | 1 | $3 | L’AT89S52 si programma tramite SPI: è questo che lo rende pratico |
| Cristallo da 11.0592 MHz | 1 | $0.50 | Non 12 MHz. Vedi sotto: non è una preferenza |
| Condensatori ceramici da 33 pF | 2 | $0.20 | Condensatori di carico del cristallo |
| Condensatore elettrolitico da 10 µF + resistore da 10 kΩ | 1 ciascuno | $0.20 | La rete di reset. Qui il reset è attivo ALTO |
| Rete di resistori da 10 kΩ | 1 | $0.50 | Resistenze di pull-up per la porta 0: è open drain e non può generare un livello alto senza di esse |
| Socket ZIF o DIP a 40 pin | 1 | $1 | Non saldare mai il chip direttamente: dovrai rimuoverlo |
| Array di sensori IR a riflessione | 1 | $5–10 | Uscita digitale, oppure aggiungi un ADC esterno: l’8051 non ha ingressi analogici |
| L298N | 1 | $3 | |
| Motore TT con riduttore | 2 | $4 | |
| Telaio 2WD | 1 | $6–10 | |
| Pacco batteria | 1 | $6 | |
| Breadboard e ponticelli | — | $5 | I primi tre traguardi si svolgono interamente qui |
Totale: circa $35–50.
Due acquisti decidono se questo progetto è gradevole o spiacevole.
Il cristallo deve essere da 11.0592 MHz. L’8051 deriva la velocità seriale facendo traboccare il
Timer 1 e, a 11.0592 MHz, ogni velocità standard dà come risultato un valore di ricaricamento
intero: 9600 baud corrisponde esattamente a TH1 = 0xFD. Un cristallo da 12 MHz dà 10417 baud
contro un obiettivo di 9600, un errore dell’8.5%, ben oltre il ~3% che una UART tollera. Ogni
carattere arriva corrotto. Il chip funziona perfettamente finché non provi a stampare qualcosa
per il debug, che è il momento peggiore in cui scoprirlo.
L’array di sensori deve avere uscite digitali, oppure devi aggiungere un ADC esterno come un ADS7828 o un ADC0808. L’8051 non ha alcun ingresso analogico. Questa è la prima cosa che il chip ti toglie e che Arduino ti dà gratuitamente; vale la pena deciderlo in modo consapevole: le uscite dei comparatori sono più semplici, ma ti fanno perdere il segnale proporzionale e regolare che rende efficace la regolazione del PID.
Il circuito minimo
Prima di qualsiasi sensore o motore, fai eseguire il codice al chip nudo su una breadboard. Sei collegamenti:
| Pin | Collega a | Perché |
|---|---|---|
40 (VCC) |
+5 V | |
20 (GND) |
Terra | |
31 (EA) |
+5 V | Seleziona la memoria interna del programma. Se è flottante o a massa, il chip recupera dalla memoria esterna, che non c’è, e non fa nulla |
18, 19 (XTAL2, XTAL1) |
Attraverso il cristallo | Con un condensatore da 33 pF da ciascun ramo a terra |
9 (RST) |
10 µF verso +5 V, 10 kΩ verso terra | Il reset è attivo ALTO qui, a differenza di quasi tutti gli altri microcontrollori |
Un EA flottante è il motivo più comune per cui una prima scheda 8051 sembra morta, e non
produce alcun errore, alcuna luce e nessun indizio. Controllalo per primo, ogni volta.
Un LED su P1.0 è il “hello world”: collega il catodo al pin, l’anodo tramite un resistore da
330 Ω a +5 V e scrivi 0 per accenderlo. Il pin assorbe circa 10 mA e fornisce circa
60 microampere, quindi collegato nel modo opposto luce debolmente e sembra un guasto.
Costruiscilo in traguardi
I primi tre richiedono solo il chip su una breadboard, quindi puoi essere già avanti in questo progetto prima di comprare un telaio.
| # | Traguardo | Il test | Un risultato positivo sembra |
|---|---|---|---|
| 1 | Il chip funziona | Fai lampeggiare un LED su P1.0 | Lampeggia. Se non succede, controlla EA prima di tutto |
| 2 | Temporizzazione verificata | Lampeggia esattamente a 1 Hz usando un ritardo conteggiato | Un cronometro su 60 lampeggiamenti coincide entro un secondo |
| 3 | Seriale funzionante | Stampa un contatore a 9600 baud | Testo pulito: caratteri spazzatura indicano il cristallo sbagliato |
| 4 | GPIO in ingresso | Leggi un pulsante su P1.1 con il pull-up | Letture affidabili. Ricorda di scrivere 1 prima di leggere |
| 5 | Interrupt del timer | Commuta un pin da una ISR del Timer 0, con oscilloscopio o misurandone il tempo | Il periodo è quello che hai calcolato ed è stabile |
| 6 | PWM software | Pilotare un LED con duty dello 0%, 25%, 50%, 100% | Luminosità visibilmente diversa, senza sfarfallio |
| 7 | Costo del PWM misurato | Commuta un pin libero nel ciclo principale e misura il tempo | Puoi dire quale frazione della CPU consuma la ISR |
| 8 | Motori pilotati | Entrambe le ruote avanti e indietro al duty comandato | Entrambe le direzioni e velocità, su blocchi |
| 9 | Sensori letti | Stampa tutti i canali sopra la linea e sul pavimento | Ogni canale distingue i due casi |
| 10 | Segnale d’errore | Sposta il robot a mano attraverso la linea | Una posizione ponderata monotona, senza salti |
| 11 | Seguimento | Esegui su un ovale nastrato | Completa i giri |
Il traguardo 7 è quello per cui esiste questo progetto. Il metodo analogWrite di un Arduino non costa nulla: il PWM è generato nel silicio. Qui l’hai costruito con un interrupt del timer e si attiva decine di migliaia di volte al secondo. Misurare quale frazione della CPU consuma è la lezione: in genere è un quarto del chip, ed è ciò che acquista una periferica PWM hardware.
Che aspetto ha un buon risultato
| Misura | Tipica in questa costruzione |
|---|---|
| Ciclo macchina a 11.0592 MHz | 1.085 µs: puoi contare le istruzioni e conoscere i tempi |
| Frequenza del PWM software | ~460 Hz con passi del 5%, dal Timer 0 in ricaricamento automatico a 8 bit |
| CPU consumata dalla ISR del PWM | ~25% |
| Frequenza residua del ciclo principale | Ancora comodamente sopra 200 Hz per il ciclo di controllo |
| RAM utilizzata | Meno di 100 byte dei 256: il vincolo è reale ma qui non è stretto |
| Prestazioni di seguimento | Confrontabili con la costruzione con Arduino; il robot non è il punto |
Vale la pena dire chiaramente quest’ultima riga. Questo robot non surclasserà il
robot seguilinea con Arduino. È lo stesso robot, costruito
nel modo difficile, e il guadagno è la comprensione, non la prestazione. Se vuoi un robot seguilinea
migliore, regola quello con Arduino. Se vuoi sapere cosa abbia fatto per te analogWrite,
costruisci questo.
Risoluzione dei problemi
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| Il chip non fa assolutamente nulla | EA flottante o a massa |
Collega il pin 31 a +5 V |
Continua a non fare nulla, EA è alto |
Il cristallo non oscilla | Controlla i condensatori da 33 pF e i punti di saldatura del cristallo |
| Si riavvia continuamente | RST mantenuto alto | Il reset è attivo ALTO: controlla la rete 10 µF / 10 kΩ |
| La seriale stampa caratteri spazzatura | Cristallo da 12 MHz | 11.0592 MHz, oppure accetta di non avere il debug seriale |
| Il LED luce molto debolmente | Collegato alla sorgente di corrente | Catodo al pin; scrivi 0 per accenderlo |
| La porta 0 non legge né scrive | Open drain, senza pull-up | 10 kΩ da ogni pin a +5 V |
| Il periodo del PWM oscilla | Ricaricamento del timer troppo tardi nella ISR | Ricarica come prima istruzione oppure usa la modalità 2 |
| Il programma torna a un indirizzo casuale | Lo stack sovrascrive il banco 1 dei registri | SP = 0x30; all’inizio di main() |
| Si comporta in modo instabile man mano che il codice cresce | RAM esaurita | 256 byte totali: controlla la mappa del linker |
| Il programmatore non vede il chip | Pin ISP in uso o nessun controllo del reset | Libera P1.5–P1.7 e RST durante la programmazione |
| I sensori non restituiscono valori utili | Array analogico su un chip senza ADC | Array con uscita digitale, oppure aggiungi un ADC esterno |
Da dove proseguire
Aggiungi un secondo timer e misura il tuo ciclo. Con il Timer 0 che gestisce il PWM, il Timer 1 può contare il periodo del ciclo di controllo, trasformando «sembra reattivo» in un numero. Su un chip in cui puoi contare i cicli macchina, quel numero è esattamente prevedibile: verifica la tua previsione.
Collega un LCD tramite la porta 0 e incontri davvero il problema dell’open drain, oltre ai requisiti temporali di un dispositivo realmente più lento del processore.
Poi costruisci la versione con Arduino e osserva quanto ora
capisci di ogni sua riga. L’analogWrite che scrivi in una riga è la ISR a cui qui hai dedicato
una serata; analogRead è l’ADC che hai dovuto aggiungere esternamente. Questo confronto è il
vero risultato del progetto.
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 / 17 completati
Componenti
- ControllerMicrocontrollore 8051Il chip che il tuo programma didattico insegna, senza nulla tra te e l'hardware.
- SensoreArray di sensori a riflessione IRUna fila di occhi a infrarossi che indica al robot dove si trova la linea.
- 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 · 30 minArchitettura dell'8051: pin, mappa della memoria e registriCore Harvard, quattro porte, 256 byte di RAM e un tempo di esecuzione che puoi contare in cicli macchina.
- Principiante · 28 minGPIO dell'8051: assorbire, non alimentarePerché i LED dell'8051 sono cablati al contrario, perché devi scrivere 1 prima di leggere e cosa può pilotare una porta.
- Intermedio · 35 minTimer dell'8051 e PWM software per il controllo dei motoriCostruisci il PWM con un interrupt del Timer 0, scegli il compromesso tra frequenza e risoluzione e pilota un H-bridge.
- Principiante · 20 minLeggere un array di sensori IR per seguire una lineaTrasforma una fila di sensori IR in un'unica posizione di linea uniforme su cui puoi governare.
- 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.
- Principiante · 20 min di letturaCostruisci un robot seguilinea: dai sensori allo sterzo con PIDDai sensori a riflessione IR all'errore ponderato e allo sterzo PID fluido: come funziona davvero un robot seguilinea.
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
Perché costruire un robot seguilinea su un 8051 invece che su un Arduino?
Perché l'8051 ti fa costruire ciò che Arduino nasconde. Non c'è analogWrite, quindi scrivi tu il generatore PWM; non c'è pinMode, quindi impari cosa fanno davvero le porte quasi bidirezionali. Se l'obiettivo è un robot funzionante, usa un Arduino. Se l'obiettivo è capire il robot, l'8051 insegna più all'ora di qualsiasi scheda con una libreria per tutto.
Quali componenti servono per un robot seguilinea con 8051?
Un AT89S52 con il suo cristallo e il circuito di reset, un array di sensori IR a riflessione, un driver H-bridge come L298N o L293D, due motori TT con riduttore, un telaio 2WD e un pacco batteria che mantenga logica e alimentazione dei motori su linee separate. Serve anche un programmatore ISP: un USBasp costa poco e programma l'AT89S52 tramite quattro pin.
Come controlli la velocità dei motori su un 8051 senza hardware PWM?
Generi il PWM in software. Il Timer 0 lavora in modalità di ricaricamento automatico a 8 bit e interrompe ogni 100 cicli macchina; l'interrupt conta i tick e mantiene alta l'uscita per i primi N di ogni periodo. A 11.0592 MHz si ottengono 460.8 Hz con passi del 5% di duty, al costo di circa un quarto della CPU: è il compromesso da pagare per non avere una periferica PWM.
Posso scrivere il codice in C o devo usare l'assembly?
C va benissimo ed è quello che usano oggi la maggior parte dei corsi. Keil C51 è lo standard industriale e SDCC è un'alternativa libera e open source. Vale la pena leggere l'assembly su questo chip: il set di istruzioni è piccolo e i tempi sono calcolabili, ma non devi scrivere tutto un robot in assembly.
Perché il mio robot 8051 non fa nulla dopo la programmazione?
Controlla prima di tutto che EA (pin 31) sia collegato a +5 V. Se resta flottante o a massa, il chip tenta di recuperare il programma dalla memoria esterna, che non c'è, e non esegue nulla senza alcun errore. Poi controlla il circuito di reset: sull'8051 il reset è attivo alto, così come i due condensatori di carico del cristallo.
Devo comprare i componenti prima di iniziare questo progetto?
No. La logica di seguimento della linea e la regolazione dei guadagni funzionano nel simulatore del browser e i tre tutorial sull'8051 richiedono solo il chip su una breadboard. Compra telaio e motori quando sarai pronto a collegare il robot fisico.