Percorso di costruzioneIntermedioUn fine settimana

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.

Schema tecnico: Costruisci un robot seguilinea con un microcontrollore 8051SENSOR ERROR

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

100%
Costruzione

Collega il robot

60 min

Costruzione

Programmalo ed eseguilo

60 min

Obiettivo

Robot seguilinea 8051 completato

L'hai costruito

Componenti

Tutorial in questo percorso

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.