Construa um robô seguidor de linha com um microcontrolador 8051
Um robô seguidor de linha funcionando em um 8051 puro — e uma compreensão clara de cada camada que um Arduino esconderia, do circuito de reset à forma de onda PWM.
Quase todo curso de engenharia que ensina microcontroladores termina com a mesma tarefa: construir um robô seguidor de linha em um 8051. É uma boa tarefa por um motivo que normalmente não é dito — o chip não oferece nada. Não há analogWrite() para definir a velocidade de um motor, nem analogRead() para os sensores, nem biblioteca para a placa do driver. Você mesmo constrói todas as camadas que normalmente chamaria.
Essa é a diferença entre este caminho de construção e o robô seguidor de linha com Arduino. O robô é o mesmo; a profundidade não é. Você escreverá o gerador de modulação de largura de pulso (PWM) que um Arduino já traz no silício, aprenderá por que um pino do 8051 acende um LED somente quando o LED é ligado ao contrário e descobrirá — antes de comprar qualquer coisa — quanto a CPU realmente custa para o controle dos motores.
O 8051 é um microcontrolador de 8 bits com arquitetura Harvard em um encapsulamento de 40 pinos, normalmente um AT89S52 com 8 KB de flash e 256 bytes de RAM. Ele não tem periférico de PWM, suas portas são quase bidirecionais (você precisa escrever um 1 antes de ler uma entrada), e seus pinos drenam mais corrente do que fornecem — por isso o LED fica no lado de drenagem (sink) e as entradas do driver de motores na ponte H precisam de pull-ups para serem acionadas com confiabilidade. Esses detalhes parecem notas de rodapé até o robô não fazer absolutamente nada porque EA está flutuando ou porque o circuito de reset, ativo em nível alto, foi ligado ao nível baixo.
Você começa em uma protoboard apenas com o chip, um cristal de 11,0592 MHz e dois capacitores de carga, uma rede de reset e EA ligado ao nível alto — o circuito mínimo que realmente executa código. Os três primeiros tutoriais levam você pela arquitetura e pelo mapa de memória, pela entrada/saída geral (GPIO) e pela integração com as portas, e depois pela construção de PWM a partir do Timer 0 no modo de recarga automática de 8 bits: cerca de 460,8 Hz com passos de 5%, consumindo aproximadamente um quarto da CPU, um compromisso que você paga por não ter esse periférico.
A partir daí, o caminho converge com o robô seguidor de linha com Arduino: a mesma matriz de refletância IR (infravermelho) reduzida a um erro ponderado, o mesmo controle de direção PID (Proporcional-Integral-Derivativo) e o mesmo simulador de navegador, onde você encontra ganhos que permitem superar as curvas. A árvore tecnológica mantém separados os nós de componentes e de conceito, então a primeira metade precisa apenas do chip e de um programador ISP (programação no sistema), como um USBasp, e somente os dois últimos nós de construção precisam do chassi, dos motores e da matriz.
Percorra a árvore tecnológica abaixo na ordem. Os três primeiros nós precisam apenas do chip em uma protoboard, os ganhos de seguimento de linha são ajustados no simulador do navegador e somente as duas últimas etapas precisam do chassi e dos motores. Seu progresso é salvo neste dispositivo.
Lista de materiais
| Peça | Qtd. | Custo aproximado | Observações |
|---|---|---|---|
| AT89S52 DIP de 40 pinos | 1 | US$ 2 | Programável no sistema. Um AT89C51 exige um programador paralelo que você não tem |
| Programador ISP USBasp | 1 | US$ 3 | O AT89S52 é programado por SPI — é isso que o torna viável |
| Cristal de 11,0592 MHz | 1 | US$ 0,50 | Não use 12 MHz. Veja abaixo — não é uma preferência |
| Capacitores cerâmicos de 33 pF | 2 | US$ 0,20 | Capacitores de carga do cristal |
| Capacitor eletrolítico de 10 µF + resistor de 10 kΩ | 1 de cada | US$ 0,20 | A rede de reset. Aqui o reset é ativo em nível alto |
| Rede de resistores de 10 kΩ | 1 | US$ 0,50 | Pull-ups da Porta 0 — ela é de dreno aberto e não pode fornecer nível alto sem eles |
| Soquete ZIF ou DIP de 40 pinos | 1 | US$ 1 | Nunca solde o chip diretamente; você vai removê-lo |
| Matriz de refletância IR | 1 | US$ 5–10 | Saída digital, ou adicione um ADC externo — o 8051 não tem entrada analógica |
| L298N | 1 | US$ 3 | |
| Motorredutor TT | 2 | US$ 4 | |
| Chassi 2WD | 1 | US$ 6–10 | |
| Pacote de bateria | 1 | US$ 6 | |
| Protoboard e fios jumper | — | US$ 5 | Os três primeiros marcos acontecem inteiramente aqui |
Total: aproximadamente US$ 35–50.
Duas compras decidem se este projeto será agradável ou péssimo.
O cristal precisa ser de 11,0592 MHz. O 8051 deriva sua taxa de baud da porta serial pelo estouro do Timer 1 e, a 11,0592 MHz, cada taxa padrão resulta em um valor inteiro de recarga — 9600 baud é exatamente TH1 = 0xFD. Um cristal de 12 MHz produz 10417 baud para um alvo de 9600, um erro de 8,5%, muito acima dos ~3% que uma UART tolera. Cada caractere chega corrompido. O chip funciona perfeitamente até o momento em que você tenta imprimir alguma coisa para depurar, que é o pior momento possível para descobrir isso.
A matriz de sensores precisa ter saídas digitais, ou você precisa adicionar um ADC externo como ADS7828 ou ADC0808. O 8051 não tem entrada analógica alguma. Esse é o primeiro recurso que o chip não oferece e o Arduino oferece de graça, e vale decidir deliberadamente: saídas de comparador são mais simples, mas eliminam o sinal suave de erro proporcional que faz o ajuste de PID funcionar bem.
O circuito mínimo
Antes de qualquer sensor ou motor, faça o chip sem periféricos executar código em uma protoboard. São seis conexões:
| Pino | Conectar a | Por quê |
|---|---|---|
40 (VCC) |
+5 V | |
20 (GND) |
Terra | |
31 (EA) |
+5 V | Seleciona a memória interna de programa. Flutuando ou aterrado, o chip busca na memória externa que não existe e não faz nada |
18, 19 (XTAL2, XTAL1) |
Nos dois lados do cristal | Com um capacitor de 33 pF de cada perna ao terra |
9 (RST) |
10 µF para +5 V, 10 kΩ para o terra | O reset é ativo em nível alto aqui — diferente de quase todos os outros microcontroladores |
EA flutuante é o motivo mais comum para uma primeira placa 8051 parecer morta, e não produz erro, luz nem pista. Verifique-o primeiro, todas as vezes.
Um LED em P1.0 é o “olá, mundo”: conecte o cátodo ao pino, o ânodo por um resistor de 330 Ω a +5 V, e escreva 0 para acendê-lo. O pino absorve cerca de 10 mA e fornece aproximadamente 60 microampere, então, conectado ao contrário, ele brilha fracamente e parece uma falha.
Construa em marcos
Os três primeiros precisam apenas do chip em uma protoboard, o que permite avançar bastante neste projeto antes de comprar um chassi.
| # | Marco | O teste | Um resultado aprovado |
|---|---|---|---|
| 1 | O chip executa | Pisque um LED em P1.0 | Ele pisca. Se não piscar, verifique EA antes de tudo |
| 2 | Tempo verificado | Pisque a 1 Hz usando um atraso contado | Um cronômetro usado durante 60 piscadas concorda dentro de um segundo |
| 3 | Porta serial funciona | Imprima um contador a 9600 baud | Texto limpo — lixo significa cristal errado |
| 4 | Entrada GPIO | Leia um botão em P1.1 com o pull-up | Leitura confiável. Lembre-se de escrever 1 antes de ler |
| 5 | Interrupção do temporizador | Alterne um pino a partir de uma ISR do Timer 0; use osciloscópio ou cronometre | O período é o que você calculou e é constante |
| 6 | PWM por software | Acione um LED com ciclo de trabalho de 0%, 25%, 50% e 100% | Brilho visivelmente diferente, sem cintilação |
| 7 | Custo do PWM medido | Alterne um pino reserva no laço principal e cronometre | Você pode dizer qual fração da CPU a ISR consome |
| 8 | Motores acionados | Ambas as rodas para frente e para trás no ciclo de trabalho comandado | Os dois sentidos e as duas velocidades, sobre blocos |
| 9 | Sensores lidos | Imprima todos os canais sobre a linha e o piso | Cada canal distingue os dois |
| 10 | Sinal de erro | Mova o robô sobre a linha com a mão | Posição ponderada monótona, sem saltos |
| 11 | Seguimento | Execute-o em uma pista oval com fita | Completa as voltas |
O marco 7 é aquele pelo qual este projeto existe. O analogWrite de um Arduino não consome CPU — o PWM é gerado no silício. Aqui você o construiu a partir de uma interrupção de temporizador, e ela dispara dezenas de milhares de vezes por segundo. Medir que fração da CPU isso consome é a lição: normalmente é um quarto da CPU, e é exatamente isso que um periférico de PWM dedicado compra.
Como fica um bom resultado
| Medição | Típico nesta construção |
|---|---|
| Ciclo de máquina a 11,0592 MHz | 1,085 µs — você pode contar instruções e saber o tempo |
| Frequência do PWM por software | ~460 Hz com passos de 5%, a partir do Timer 0 em recarga automática de 8 bits |
| CPU consumida pela ISR do PWM | ~25% |
| Taxa restante do laço principal | Ainda acima de 200 Hz, com folga, para o laço de controle |
| RAM usada | Menos de 100 bytes dos 256 — o limite é real, mas não chega a apertar |
| Desempenho de seguimento | Comparável à construção com Arduino; o robô não é o ponto |
Essa última linha merece ser dita claramente. Este robô não superará o robô seguidor de linha com Arduino. É o mesmo robô, construído do jeito difícil, e o retorno é compreensão, não desempenho. Se quiser melhorar o robô seguidor de linha, ajuste a versão com Arduino. Se quiser saber o que analogWrite vem fazendo por você, construa este.
Solução de problemas
| Sintoma | Causa provável | Correção |
|---|---|---|
| O chip não faz absolutamente nada | EA flutuando ou aterrado |
Ligue o pino 31 a +5 V |
Ainda nada, com EA alto |
Cristal não oscilando | Verifique os capacitores de 33 pF e as juntas soldadas do cristal |
| Reinicia continuamente | RST mantido em nível alto | O reset é ativo em nível ALTO — verifique a rede de 10 µF / 10 kΩ |
| A porta serial imprime lixo | Cristal de 12 MHz | Use 11,0592 MHz ou aceite não ter depuração pela porta serial |
| O LED brilha muito fracamente | Ligado para fornecer corrente | Cátodo ao pino; escreva 0 para acender |
| A Porta 0 não lê nem escreve | Dreno aberto, sem pull-ups | 10 kΩ de cada pino a +5 V |
| O período do PWM oscila | Recarga do temporizador tarde na ISR | Recarregue como a primeira instrução ou use o modo 2 |
| O programa retorna a um endereço aleatório | Pilha sobrepondo o banco de registradores 1 | SP = 0x30; no início de main() |
| Comporta-se de forma errática conforme o código cresce | Memória RAM esgotada | 256 bytes no total — verifique o mapa do ligador |
| O programador não enxerga o chip | Pinos ISP em uso ou sem controle de reset | Libere P1.5–P1.7 e RST durante a programação |
| Os sensores não dão um valor útil | Matriz analógica em um chip sem ADC | Use matriz com saída digital ou adicione um ADC externo |
Para onde seguir
Adicione um segundo temporizador e meça seu próprio laço. Com o Timer 0 executando o PWM, o Timer 1 pode contar o período do laço de controle, o que transforma “parece responsivo” em um número. Em um chip onde você pode contar ciclos de máquina, esse número é exatamente previsível — verifique sua previsão.
Conecte um LCD pela Porta 0 e você enfrenta de verdade o problema do dreno aberto, além dos requisitos de temporização de um dispositivo realmente mais lento que o processador.
Depois construa a versão com Arduino — e perceba o que você agora entende sobre cada linha dela. O analogWrite que você escreve em uma linha é a ISR que consumiu uma noite aqui; o analogRead é o ADC que você precisou adicionar externamente. Essa comparação é o verdadeiro resultado deste projeto.
Roteiro do projeto
O caminho de construção
Siga a árvore tecnológica das peças até um robô funcionando. Cada nó é desbloqueado quando seus pré-requisitos são concluídos, e seu progresso fica salvo neste dispositivo.
0 / 17 concluídos
Componentes
- ControladorMicrocontrolador 8051O chip que seu currículo ensina, sem nada entre você e o componente físico.
- SensorMatriz de sensores IRUma fileira de olhos infravermelhos que informa ao robô onde está a linha.
- DriverDriver de motor L298NA ponte H dupla que transforma pinos lógicos fracos em potência para motores.
- AtuadorMotorredutor CC (motor TT)O motorredutor amarelo que transforma um chassi nu em um carro robô móvel.
- ChassiChassi de robô 2WDA plataforma onde se fixam dois motores, uma rodinha livre e toda a eletrônica.
- AlimentaçãoBateria e fonte de alimentação do robôA diferença entre um robô que funciona e outro que fica reiniciando.
Tutoriais deste caminho
- Iniciante · 30 minArquitetura do 8051: pinos, mapa de memória e registradoresNúcleo Harvard, quatro portas, 256 bytes de RAM e temporização que você pode contar em ciclos de máquina.
- Iniciante · 28 minGPIO e portas do 8051: absorve corrente, não fornecePor que os LEDs do 8051 são ligados ao contrário, por que você escreve 1 antes de ler e o que uma porta consegue acionar.
- Intermediário · 35 minTemporizadores do 8051 e PWM por software para motoresCrie PWM com uma interrupção do Temporizador 0, escolha entre frequência e resolução e acione uma ponte H.
- Iniciante · 20 minMatriz de sensores infravermelhos para robô seguidor de linhaTransforme uma fileira de sensores infravermelhos em uma posição suave da linha para comandar a direção do robô.
- Iniciante · 18 min de leituraControle de motores CC com PWM e uma ponte HLigue e controle com segurança um motor CC com escovas usando PWM, uma ponte H e limites de corrente realistas.
- Iniciante · 20 min de leituraConstrua um robô seguidor de linha: dos sensores ao controle PIDDos sensores de reflectância infravermelha ao erro ponderado e ao controle PID: como funciona de fato um robô seguidor de linha.
Pratique antes de fazer a fiação
Ajuste no simulador ao vivo
O caminho de construção passa por um laboratório no navegador. Acerte o comportamento aqui e depois transfira suas configurações para o robô real.
Perguntas frequentes
Por que construir um robô seguidor de linha em um 8051 em vez de um Arduino?
Porque o 8051 faz você construir o que o Arduino esconde. Não existe analogWrite, então você escreve o gerador de PWM; não existe pinMode, então aprende o que realmente fazem as portas quase bidirecionais. Se o objetivo é um robô que funciona, use um Arduino. Se o objetivo é entender o robô, o 8051 ensina mais por hora do que qualquer placa com uma biblioteca para tudo.
Quais componentes preciso para um robô seguidor de linha com 8051?
Um AT89S52 com seu cristal e circuito de reset, uma matriz de sensores de refletância IR, um driver de ponte H como o L298N ou L293D, dois motoresredutores TT, um chassi 2WD e um pacote de bateria que mantenha lógica e alimentação dos motores em trilhos separados. Você também precisa de um programador ISP — um USBasp custa muito pouco e grava o AT89S52 por quatro pinos.
Como controlar a velocidade dos motores em um 8051 sem PWM por circuito dedicado?
Você gera o PWM em software. O Timer 0 funciona no modo de recarga automática de 8 bits e interrompe a cada 100 ciclos de máquina; a interrupção conta as contagens e mantém a saída alta durante os primeiros N de cada período. A 11,0592 MHz, isso fornece 460,8 Hz com passos de 5% no ciclo de trabalho e consome cerca de um quarto da CPU — o compromisso que você paga por não ter um periférico de PWM.
Posso escrever o código em C ou preciso usar assembly?
C serve, e é o que a maioria dos cursos usa hoje. O Keil C51 é o padrão industrial e o SDCC é uma alternativa livre e de código aberto. Vale a pena ler código em assembly neste chip: o conjunto de instruções é pequeno e a temporização pode ser calculada, mas você não precisa escrever um robô inteiro nele.
Por que meu robô 8051 não faz absolutamente nada depois de gravar?
Verifique primeiro se EA (pino 31) está ligado a +5 V. Se ficar flutuante ou aterrado, o chip tenta buscar o programa em memória externa que não existe e não executa nada, sem qualquer erro. Depois, verifique o circuito de reset — o reset no 8051 é ativo em nível alto — e os dois capacitores de carga do cristal.
Preciso comprar peças antes de começar este projeto?
Não. A lógica de seguimento de linha e o ajuste dos ganhos rodam no simulador do navegador, e os três tutoriais do 8051 precisam apenas do chip em uma protoboard. Compre o chassi e os motores quando estiver pronto para montar o robô físico.