¿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