Robot controlado por el MC8051


¿Qué hace el Robot?

Básicamente se desplaza en línea recta y no cambia su estado hasta que no se den dos condiciones:
  • Que el robot se trabe o choque contra algún obstáculo que no vio
  • Que el robot vea un obstáculo
Si el robot se traba o choca contra algún obstáculo, dobla sus ruedas delanteras hacia la derecha y retrocede 6 pasos. Una vez que termino esta rutina vuelve a la lógica anterior (avanza hasta que...), pero apuntando levemente en otra dirección. Todo esto parece funcionar bien, pero existe la posibilidad de que cuando retrocede se trabe o choque con algo antes de terminar los 6 pasos. Si esto ocurriera, el robot deja de retroceder y vuelve a la lógica anterior. Parece algo sin sentido, pero funciona, por que repite esta secuencia todas las veces que sea necesario hasta que el robot logre un cambio significativo en su dirección y evite el obstáculo, para entender mejor esto, veamos un dibujo.


El robot consiste en un carro con cuatro ruedas, de las cuales dos son de tracción y dos de dirección. Está construido con Lego, estos ladrillitos facilitaron un montón la parte mecánica del proyecto, por que están pensados para este tipos de proyectos (ver figura 1). Volviendo al robot, enumeremos los sensores:
  • Un sensor que me indica la posición de las ruedas de dirección
  • Un sensor que lee luz del ambiente.
  • Un sensor que me indica cada vez que el robot da un paso
  • Además el robot puede controlar dos cosas:
  • La velocidad y dirección de dos motores (el de tracción y el de dirección).
  • Puede prender o apagar una linterna
Figura 1

El robot está controlado por el Micro Controlador 8051 de Dallas. El programa para controlar el robot lo escribo en la PC y después lo "bajo" al MC por medio de un puerto serie (el RS232). El Micro tiene una memoria ROM de 4 Kbytes y una RAM de 4 Kbytes. La memoria de ROM tiene quemado un BootStrap, un programa que le permite cargar programas en la memoria RAM a través del puerto serie. La memoria ROM está abajo de la memoria RAM, es decir, la memoria ROM está desde la dirección 0 a la 4000 y la memoria RAM de la dirección 8000 a la 16000 (esto es aproximado). La memoria RAM podría estar desde la dirección 4000 a la 8000, pero no es así por razones de comodidad en el hard, que no causan problemas en el soft, solamente hay que tener en cuenta estos parámetros al leer y escribir memoria.

La placa donde está montado el micro, permite utilizar:
  • Tres puertos en paralelo de 8 bits cada uno. Estos se denominan A, B y C y son controlados por el integrado 8255. Estos tres puertos son los más convenientes para controlar cosas, ya que la placa fue pensada para que esto fuera así.
  • Otro puerto paralelo (D) que está controlado directamente por el MC 8051, es decir, está conectado físicamente por el MC. Es peligroso por que no tiene ningún tipo de protección. Este puerto tiene conectado 1 modulo de 4 DIPs. Son interruptores que conectan a 4 pines del puerto a tierra o a +V. Se los utiliza para un posible seteo de algún programa.
  • Un puerto serie, por el cual se bajan los programas (con ayuda del BootStrap).
  • Cuatro pines (que se los podría llamar puerto E) que activan las interrupciones externas y los timers. En este proyecto se utiliza una de las dos interrupciones externas para contar pasos.
La parte electrónica y mecánica del proyecto, se puede apreciar en los siguientes esquemas:

Esquema General
Figura 2

Sensor que detecta la posición de las ruedas de dirección

Este sensor está compuesto por un led infrarrojo y tres fototransistores. Los fototransistores están en un agujero cada uno de un ladrillito, que está en la parte fije del sistema de dirección. El emisor de luz infrarroja está en un agujereo de un ladrillito de la parte móvil del sistema de dirección. Cuando las ruedas están derechas, el led IR ilumina el fototransistor del medio. Cuando las ruedas se mueven, se iluminan los fototransistores de los costados.

Los fototransistores están conectados al MC, y le envían pulsos eléctricos cuando están iluminados. De esta forma se entera en que posición, aproximada, están las ruedas. Para entender mejor el sensor, veamos la figura siguiente:
Figura 3
Sensor de luz y conversor analógico digital

Este sensor de luz, con ayuda de una linterna que se prende y se apaga, me permite detectar obstáculos antes de chocarlos. La linterna se controla desde el MC, entonces puede hacer mediciones con la linterna prendida y con la linterna apagada. Si las mediciones con la luz apagada son de menor intensidad que las mediciones con la luz prendida quiere decir que estoy viendo el reflejo de algo.
El sensor de luz no es un fototransitor al aire libre, si no que está dentro de un tubo negro, de unos 5 cm de largo, para que sea bastante direccional.

Antes de poder prender o apagar la linterna, lo que hacía era simplemente ver luz, y cuando sobrepasaba una intensidad determinada, esquivaba. El problema era que no se calibraba para distintos ambientes con más o menos luz.

El sensor de luz es muy sencillo, pero el problema es transformar esta magnitud análoga en un número binario. Para eso está el Conversor Analógico-Digital (ADC). Este conversor necesita un pequeño programa que lo ayude, que se explica en la figura 4.

Figura 4

Sensor que cuenta los pasos

Este sensor es muy sencillo, y es una rueda con 5 agujeritos, que interrumpen el paso de luz entre un led y un fototransistor. El fototransistor está conectado a un pin del puerto E, el pin que activa la interrupción externa numero 0. De esta forma cada vez que el fototransistor recibe luz, el programa que está corriendo en el MC se detiene, y se hace un JMP a la rutina de la interrupción. Una vez que la rutina termina de hacer lo suyo retorna al curso normal del programa.
Esto se ve más en detalle, en la parte del informe que explica la programación del MC.
La interface del sensor es igual a la fracción señalada en la figura 3.

Circuito interface de los motores

Sobre este punto no hay mucho que decir, es simplemente armar el circuito, toda la parte de control de los motores queda a cargo del MC. Más adelante se explica como.

Figura 5

Interface de la linterna

Es el mismo caso que el anterior, el circuito es muy sencillo y todo queda a cargo del MC, todo se verá mas adelante cundo veamos la programación del Robot.

Figura 6
Disposición de patas de los transistores e integrados

Programación del Robot

Para entender mejor la programación del micro, veamos ejemplos de programas sencillos, es decir no ver el programa final de golpe. Además no voy a explicar todas las virtudes del Micro primero por que llevaría un libro exclusivo a la descripción del mismo. Por otro lado, las características que sé las voy a describir a medida que aparezcan a lo largo del desarrollo del proyecto.

El programa Motor01.asm hace andar un motor a distintas velocidades sin usar los timers


El programa lo que hace es enviar una corriente pulsante por un pin del puerto A, esta corriente es amplificada por el circuito interface. La pulsación de la corriente es lo que logra las distintas velocidades del motor. Para variar la velocidad, hay que cambiar los valores de los registros 0 y 1, de este modo los pulsos van mas rápidos o mas despacio, pero existe un problema, el programa varía el tiempo entre pulso y pulso y el ancho del pulso, nosotros no queremos eso, sino que queremos un pulso de ancho fijo y solamente variar la distancia entre pulso y pulso.
 
Figura 7

Insisto en esto por que los motores que uso en el proyecto necesitan recibir corriente por un tiempo mínimo para poder moverse. Si yo achico la distancia entre pulsos y el ancho del pulso, llega un momento que el motor no se mueve. Pero si tengo un pulso de ancho fijo, por más que achique la distancia entre pulsos, el motor no se va a detener.

Para lograr que el programa haga esto, se le pueden hacer varias modificaciones, un de ellas es hacer otra rutina igual a delay, pero que sea un retardo fijo para el ancho del pulso. Pero lo que se hizo fue usar las interrupciones y los timers. ¿Qué es una interrupción? Se la puede definir como un evento determinado que te lleva a ejecutar otra parte del programa. Por ejemplo, yo hago una interrupción que cuando un pin determinado de algún puerto, cambie de nivel, el programa haga un JMP a una sección de código que me incrementa una variable y luego retorna al punto del programa donde se produjo la interrupción. Este sería el principio de un contador de pasos. Nótese la gran ventaja de las interrupciones, ya que yo no debo fijarme cada tanto el estado del pin (por ejemplo), si no que la interrupción "me avisa" al desviarme a cierta sección de código de mi programa.

Pero hay un detalle, las interrupciones no se activan ante cualquier evento, solo ante algunos, que en el caso del MC 8051 son:
  • Cuando un timer se rebalsa (overflows). Un timer es algo que me permite controlar tiempos. La forma de trabajo es sencilla, el timer lo que hace es incrementar a un numero, que está en memoria, en tiempo regulares. Cuando el timer se rebalsa, transcurrió un tiempo determinado, que se puede controlar, cambiando el número inicial.
  • Tengo dos pines que me permiten activar interrupciones externas.
  • Cuando me envían un dato por el puerto serie de comunicaciones.
La interrupción que nos interesa es la interrupción de los timers.
La rutina que maneja los timers para mandar los pulsos a los motores están en el archivo Motor02.asm