Robot seguidor de línea con microcontrolador 8051
Un seguidor de línea funcional en un 8051 puro y comprensión profunda de cada capa que Arduino oculta: circuitos de reset, puertos cuasibidireccionales y PWM.
Casi todos los cursos de ingeniería que enseñan microcontroladores terminan con el mismo ejercicio:
construir un seguidor de línea sobre un 8051. Es un buen ejercicio por una razón que normalmente no se
dice: el chip no le da nada. No hay analogWrite() para fijar la velocidad de un motor, ni
analogRead() para los sensores, ni biblioteca para la placa del driver. Cada capa a la que
normalmente llamaría, la construye usted.
Esa es la diferencia entre este itinerario de construcción y el seguidor de línea con Arduino. El robot es el mismo; la profundidad no. Va a escribir el generador de modulación por ancho de pulso (PWM) que un Arduino tiene en silicio, aprender por qué un pin del 8051 enciende un LED solo si lo cablea al revés, y averiguar —antes de comprar nada— exactamente cuánto CPU le está costando su control de motores.
El 8051 es un microcontrolador de 8 bits de arquitectura Harvard en un encapsulado de 40 pines, normalmente un AT89S52 con 8 KB de flash y 256 bytes de RAM. No tiene periférico PWM, sus puertos son cuasibidireccionales (hay que escribir un 1 antes de leer una entrada), y sus pines drenan más corriente de la que sourcing es capaz — así que el LED va en el lado de sumidero y el puente en H del driver de motores (high-bridge) necesita pull-ups para ser manejado de forma fiable. Esos detalles suenan a notas al pie hasta que el robot no hace absolutamente nada porque EA está flotante o porque el circuito de reset es activo a nivel alto y usted lo puso a masa.
Empieza en una protoboard solo con el chip, un cristal de 11.0592 MHz y dos condensadores de carga, una red de reset y EA a nivel alto: el circuito mínimo que realmente ejecuta código. Los tres primeros tutoriales le llevan por la arquitectura y el mapa de memoria, la entrada/salida de uso general (GPIO) y el interfaz de puertos, y luego construir PWM a partir del Timer 0 en modo de autorrecarga de 8 bits: unos 460.8 Hz con pasos del 5 %, con un coste aproximado de un cuarto de la CPU, un intercambio que paga por no tener periférico.
A partir de ahí el camino converge con el seguidor de línea de Arduino: el mismo array de reflectancia IR (infrarrojo) colapsado en un error ponderado, el mismo control PID (Proporcional-Integral-Derivativo), y el mismo simulador en el navegador donde encuentra ganancias que toman las curvas con limpieza. El árbol tecnológico mantiene separados los nodos de hardware y de concepto, así que la primera mitad no necesita más que el chip y un programador ISP (programación en sistema) como un USBasp, y solo los dos últimos nodos de construcción necesitan el chasis, los motores y el array.
Recorra el árbol tecnológico de abajo en orden. Los tres primeros nodos no necesitan más que el chip en una protoboard, las ganancias del seguimiento de línea se ajustan en el simulador del navegador, y solo los dos últimos pasos necesitan el chasis y los motores. Su progreso se guarda en este dispositivo.
Lista de materiales
| Componente | Cant. | Coste aprox. | Notas |
|---|---|---|---|
| AT89S52 DIP de 40 pines | 1 | $2 | Programable en sistema. Un AT89C51 necesita un programador paralelo que usted no tiene |
| Programador ISP USBasp | 1 | $3 | El AT89S52 se programa por SPI, y esto es lo que lo hace viable |
| Cristal de 11.0592 MHz | 1 | $0.50 | No 12 MHz. Vea abajo: esto no es una preferencia |
| Condensadores cerámicos de 33 pF | 2 | $0.20 | Condensadores de carga del cristal |
| Condensador electrolítico de 10 µF + resistencia de 10 kΩ | 1 de cada | $0.20 | La red de reset. El reset aquí es activo a nivel ALTO |
| Red de resistencias de 10 kΩ | 1 | $0.50 | Pull-ups del puerto 0: es de colector abierto y no puede sacar un nivel alto sin ellos |
| Zócalo ZIF o DIP de 40 pines | 1 | $1 | No suelde nunca el chip directamente; lo va a quitar |
| Array de reflectancia IR | 1 | $5–10 | Salida digital, o añada un ADC externo: el 8051 no tiene entrada analógica |
| L298N | 1 | $3 | |
| Motorreductor TT | 2 | $4 | |
| Chasis 2WD | 1 | $6–10 | |
| Pack de baterías | 1 | $6 | |
| Protoboard y jumpers | — | $5 | Los tres primeros hitos ocurren íntegramente aquí |
Total: aproximadamente $35–50.
Dos compras deciden si este proyecto es agradable o miserable.
El cristal debe ser de 11.0592 MHz. El 8051 deriva su velocidad en baudios del desbordamiento
del Timer 1, y a 11.0592 MHz toda velocidad estándar sale como un valor de recarga entero: 9600 baudios
es exactamente TH1 = 0xFD. Un cristal de 12 MHz da 10417 baudios frente a un objetivo de 9600, un
error del 8.5 %, muy por encima del ~3 % que tolera una UART. Cada carácter llega corrupto. El chip
funciona perfectamente hasta el momento en que intenta imprimir algo para depurar, que es el peor
momento posible para descubrirlo.
El array de sensores debe tener salidas digitales, o debe añadir un ADC externo como un ADS7828 o un ADC0808. El 8051 no tiene entrada analógica en absoluto. Esta es la primera cosa que el chip le quita y que un Arduino le da gratis, y vale la pena decidirlo a conciencia: las salidas de comparador son más simples pero le cuestan la señal de error proporcional suave que hace que el ajuste de PID funcione bien.
El circuito mínimo
Antes de cualquier sensor o motor, consiga que el chip desnudo ejecute código en una protoboard. Seis conexiones:
| Pin | Conectar a | Por qué |
|---|---|---|
40 (VCC) |
+5 V | |
20 (GND) |
Masa | |
31 (EA) |
+5 V | Selecciona la memoria de programa interna. Flotante o a masa, el chip busca en memoria externa que no está y no hace nada en absoluto |
18, 19 (XTAL2, XTAL1) |
A través del cristal | Con un condensador de 33 pF de cada pata a masa |
9 (RST) |
10 µF a +5 V, 10 kΩ a masa | El reset es activo a nivel ALTO aquí, a diferencia de casi cualquier otro microcontrolador |
EA flotante es el motivo número uno de que una primera placa con un 8051 parezca muerta, y no produce
ningún error, ninguna luz y ninguna pista. Compruébelo primero, siempre.
Un LED en P1.0 es el «hola mundo»: cablee el cátodo al pin, el ánodo a través de una resistencia de
330 Ω a +5 V, y escriba 0 para encenderlo. El pin drena unos 10 mA y en modo fuente da unos
60 microamperios, así que cableado al revés brilla tenuemente y parece un fallo.
Construir por hitos
Los tres primeros solo necesitan el chip en una protoboard, lo que significa que puede llevar usted mucho camino dentro de este proyecto antes de comprar un chasis.
| # | Hito | La prueba | Un aprobado se ve así |
|---|---|---|---|
| 1 | El chip funciona | Haga parpadear un LED en P1.0 | Parpadea. Si no, compruebe EA antes que nada |
| 2 | Tiempos verificados | Parpadee a exactamente 1 Hz con un retardo contado | Un cronómetro sobre 60 parpadeos coincide dentro de un segundo |
| 3 | El serie funciona | Imprima un contador a 9600 baudios | Texto limpio: basura significa el cristal equivocado |
| 4 | Entrada GPIO | Lea un pulsador en P1.1 con el pull-up | Lee de forma fiable. Recuerde escribir 1 antes de leer |
| 5 | Interrupción de timer | Commute un pin desde una ISR del Timer 0, con osciloscopio o cronometrándola | El periodo es el que calculó, y es estable |
| 6 | PWM por software | Motive un LED al 0 %, 25 %, 50 % y 100 % de ciclo de trabajo | Brillos visiblemente distintos, sin parpadeo |
| 7 | Coste del PWM medido | Commute un pin libre en el bucle principal y cronometre | Puede decir qué fracción de la CPU consume la ISR |
| 8 | Motores manejados | Ambas ruedas adelante y atrás al ciclo de trabajo comandado | Ambas direcciones, ambas velocidades, sobre tacos |
| 9 | Sensores leídos | Imprima todos los canales sobre línea y sobre suelo | Cada canal distingue los dos |
| 10 | Señal de error | Mueva el robot a mano cruzando la línea | Una posición ponderada monótona, sin saltos |
| 11 | Seguimiento | Corra sobre un óvalo pegado con cinta | Completa las vueltas |
El hito 7 es el que hace que este proyecto exista. El analogWrite de un Arduino no cuesta nada:
el PWM se genera en silicio. Aquí lo construyó usted con una interrupción de timer, y se dispara
decenas de miles de veces por segundo. Medir qué fracción de su CPU consume eso es la lección:
típicamente es un cuarto del chip, y es justo lo que le compra un periférico PWM por hardware.
Cómo se ve un buen resultado
| Medición | Típico en esta construcción |
|---|---|
| Ciclo de máquina a 11.0592 MHz | 1.085 µs: puede contar instrucciones y saber el tiempo |
| Frecuencia del PWM por software | ~460 Hz con pasos del 5 %, desde el Timer 0 en autorrecarga de 8 bits |
| CPU consumida por la ISR del PWM | ~25 % |
| Frecuencia del bucle principal restante | Sigue cómodamente por encima de 200 Hz para el lazo de control |
| RAM usada | Menos de 100 bytes de los 256: la restricción es real pero aquí no aprieta |
| Rendimiento del seguimiento | Comparable al montaje con Arduino; el robot no es el punto |
Esa última fila conviene decirla sin rodeos. Este robot no superará al
seguidor de línea con Arduino. Es el mismo robot, construido por
el camino difícil, y el retorno es comprensión y no rendimiento. Si quiere un mejor seguidor de línea,
ajuste el de Arduino. Si quiere saber qué ha estado haciendo analogWrite por usted, construya este.
Resolución de problemas
| Síntoma | Causa probable | Arreglo |
|---|---|---|
| El chip no hace absolutamente nada | EA flotante o a masa |
Una el pin 31 a +5 V |
Sigue sin hacer nada, con EA en alto |
El cristal no oscila | Compruebe los condensadores de 33 pF y las soldaduras del cristal |
| Se reinicia continuamente | RST mantenido en alto | El reset es activo a nivel ALTO: compruebe la red de 10 µF / 10 kΩ |
| El serie imprime basura | Cristal de 12 MHz | 11.0592 MHz, o acepto no tener depuración por serie |
| El LED brilla muy tenuemente | Cableado en modo fuente (sourcing) | Cátodo al pin; escriba 0 para encenderlo |
| El puerto 0 no lee ni escribe nada | Colector abierto, sin pull-ups | 10 kΩ de cada pin a +5 V |
| El periodo del PWM tiembla | Recarga del timer tarde en la ISR | Recargue como la primera sentencia, o use el modo 2 |
| El programa vuelve a una dirección aleatoria | La pila se solapa con el banco de registros 1 | SP = 0x30; al principio de main() |
| Se comporta de forma errática al crecer el código | RAM agotada | 256 bytes en total: compruebe el mapa del enlazador |
| El programador no ve el chip | Pines ISP ocupados, o sin control del reset | Libere P1.5–P1.7 y RST mientras programa |
| Los sensores no dan ningún valor útil | Array analógico en un chip sin ADC | Array con salida digital, o añada un ADC externo |
Hacia dónde llevarlo después
Añada un segundo timer y mida su propio bucle. Con el Timer 0 generando el PWM, el Timer 1 puede contar el periodo de su bucle de control, lo que convierte «se siente responsivo» en un número. En un chip donde puede contar ciclos de máquina, ese número es exactamente predecible: verifique su predicción.
Interfaz de una LCD por el puerto 0 y se topa de verdad con el problema del colector abierto, más con los requisitos de temporización de un dispositivo que es genuinamente más lento que el procesador.
Y después construya la versión con Arduino, y fíjese en lo que
ahora entiende de cada línea. El analogWrite que usted escribe en una línea es la ISR en la que
invirtió una tarde aquí; el analogRead es el ADC que tuvo que añadir por fuera. Esa comparación es
la verdadera entrega de este proyecto.
Hoja de ruta del proyecto
La ruta de construcción
Sigue el árbol tecnológico desde las piezas hasta un robot que funciona. Cada nodo se desbloquea cuando completas sus requisitos previos, y tu progreso se guarda en este dispositivo.
0 / 17 completados
Componentes
- Controlador8051 MicrocontrollerEl clásico microcontrolador de 8 bits en encapsulado DIP de 40 pines para aprender arquitectura interna real.
- SensorIR Reflectance Sensor ArrayEl sensor óptico esencial para seguidores de línea y resolución de laberintos.
- DriverL298N Motor DriverEl clásico módulo de puente H dual para mover motores de continua y paso a paso.
- ActuadorDC GearmotorEl motorreductor compacto que convierte alta velocidad en el par necesario para mover un robot.
- Chasis2WD Robot ChassisLa plataforma donde se atornillan dos motores, una rueda loca y toda tu electrónica.
- AlimentaciónBattery Power PackLa fuente de energía determinante: por qué la química y la resistencia interna importan más que los voltios.
Tutoriales de esta ruta
- Principiante · 30 minArquitectura del 8051: pines, mapa de memoria y registrosNúcleo Harvard, cuatro puertos, 256 bytes de RAM y temporización que puedes contar en ciclos de máquina.
- Principiante · 28 minGPIO del 8051 e interfaz de puertos: hunde, no alimentesPor qué los LED del 8051 se cablean al revés, por qué escribes 1 antes de leer y qué puede manejar un puerto.
- Intermedio · 35 minTemporizadores del 8051 y PWM por software para motoresConstruye PWM desde una interrupción del temporizador 0, elige el compromiso frecuencia-resolución y maneja un puente H.
- Principiante · 20 minLeer una matriz de sensores IR de reflectancia para seguir líneasConvierte una fila de sensores IR en una posición de línea única y suave sobre la que dirigir.
- Principiante · 18 min de lecturaControla motores de CC con PWM y un puente HCablea y controla un motor de CC con escobillas con seguridad usando PWM, un puente H y límites de corriente realistas.
- Principiante · 20 min de lecturaConstruye un robot seguidor de línea: de sensores a dirección PIDDe sensores de reflectancia IR a un error ponderado a una dirección PID suave: cómo funciona realmente un seguidor de línea.
Practica antes de cablear
Ajústalo en el simulador en vivo
La ruta de construcción pasa por un laboratorio en el navegador. Consigue aquí el comportamiento correcto y luego traslada tus ajustes al robot real.
Preguntas frecuentes
¿Por qué construir un seguidor de línea con 8051 en lugar de usar Arduino?
Porque el microcontrolador 8051 le obliga a programar y construir lo que Arduino oculta bajo librerías. Al carecer de analogWrite(), debe implementar el generador PWM por software en interrupciones; al no haber pinMode(), debe comprender el funcionamiento de los puertos cuasibidireccionales y colectores abiertos. Si el único objetivo es tener un robot funcional rápido, use Arduino. Si el objetivo es asimilar la arquitectura de computadores y el control de bajo nivel, el 8051 enseña infinitamente más.
¿Qué componentes son indispensables para construir este proyecto?
Un microcontrolador AT89S52 con su cristal de cuarzo y circuito de reset, una matriz de fotosensores infrarrojos con salidas digitales, un puente en H (como el L298N o L293D), dos motorreductores TT con chasis de 2 ruedas motrices más rueda loca, y un conjunto de baterías que aísle la lógica de los motores. Para programarlo se precisa un grabador ISP compatible, como el económico programador USBasp.
¿Cómo se regula la velocidad de los motores sin periférico PWM por hardware?
Generando la modulación PWM íntegramente por software mediante el Timer 0 en modo 2 (autorrecarga de 8 bits). El temporizador dispara una interrupción periódica que incrementa un contador y conmuta a nivel alto los pines de salida durante una fracción N del periodo. Con un cristal de 11.0592 MHz se logra una frecuencia de 460.8 Hz con resolución de paso del 5 %, consumiendo aproximadamente un 25 % del tiempo de CPU.
¿Es obligatorio programar en ensamblador o se puede emplear lenguaje C?
Se puede utilizar lenguaje C perfectamente, siendo el estándar en docencia universitaria e industrial. Compiladores como Keil C51 o el compilador libre SDCC son las opciones de referencia. Leer y comprender código en ensamblador para el 8051 resulta muy formativo debido a su repertorio conciso y tiempos de ciclo estrictos, pero todo el firmware del robot puede estructurarse en C.
¿Por qué el microcontrolador no ejecuta nada tras grabarlo?
Compruebe de inmediato que el pin 31 (EA/VPP) esté conectado rígidamente a +5 V. Si se deja flotando o a tierra, el microcontrolador asume que debe ejecutar código desde una memoria ROM externa inexistente y no ejecuta instrucción alguna sin reportar error. Tras ello, revise la polaridad del circuito de reset (que en la familia 8051 es activo a nivel alto, al contrario que en la mayoría de microcontroladores modernos) y los condensadores de carga del cristal.
¿Es necesario adquirir los componentes físicos antes de comenzar?
No. El algoritmo de seguimiento y la calibración de ganancias se exploran en el simulador interactivo web, y las lecciones de arquitectura e interrupciones se estudian analíticamente. Puede comenzar en el simulador y adquirir la placa, los sensores y el chasis cuando vaya a ensamblar el montaje físico.