Caminho de construçãoIntermediárioUm fim de semana

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.

Esquema técnico de Construa um robô seguidor de linha com um microcontrolador 8051SENSOR ERROR

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

100%
Componente

Adicione os motores de tração

Componente

Ver componente
Caminho de aprendizagem

Controle de motores

Caminho de aprendizagem

Abrir caminho
Montagem

Conecte o robô

60 min

Montagem

Grave e execute

60 min

Objetivo

Robô seguidor de linha com 8051 concluído

Você construiu

Componentes

Tutoriais deste caminho

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.