por Katja y Guido Socher <katja(at)linuxfocus.org, guido(at)linuxfocus.org>
About the authors:
Katja es la editora de la versión en alemán de LinuxFocus. A ella le gustan
Tux,
los gráficos digitales, el cine, la fotografía y el mar.
Puedes encontrar su página
aquí. Guido es un viejo admirador de Linux, le encanta por la
libertad que le ofrece. Puedes elegir y desarrollar
soluciones de acuerdo con
tus necesidades.
Traducido al español por:
Gabriela González <tradugag(at)yahoo.com>
Contenidos:
|
Construyendo un robot autónomo que busca la luz
Resumen:
En este artículo describimos cómo construir un robot
autónomo con un microcontrolador
que siempre intentará dirigirse hacia el punto de mayor
luminosidad.
_________________ _________________ _________________
|
Introducción
Hace dos años presentamos en LinuxFocus al "Linux-controlled walking
robot" o Robot que camina controlado con Linux.
Era muy especial en su diseño ya que caminaba sobre patas
y no presentaba
motores convencionales. Este era un aspecto muy
interesante de este
robot, aunque era muy lento, necesitaba mucha
energía y requería de muchas partes especiales y habilidades
para construirlo.
El diseño de nuestro nuevo robot es muy diferente. Es
económico y podrás construirlo utilizando partes que
se encuentran
disponibles en prácticamente cualquier parte del mundo.
Se trata de un robot autónomo controlado
por un microcontrolador
AVR. Como robot autónomo (no
controlado por una
persona) lo programamos para que corriera hacia el lugar de
mayor luminosidad en la habitación.
La mecánica
El pequeño motor con caja de cambios del Conrad
|
Un servo estándar modificado para funcionar como un motor. Probablemente sea la mejor solución pero se nos
ocurrió esta idea cuando el robot ya estaba
construido.
|
El robot tiene solamente dos ruedas que funcionan con 2
motores independientes. La tercera rueda es una
pelotita de ping pong. Esto permite al robot
dirigirse hacia el
objetivo. Nosotros hemos utilizado ruedas de goma de juguetes pero
no hace falta que desmanteles
los tuyos también. La tapa de un frasco de mermelada con una
banda elástica alrededor
también sirve para lograr una linda rueda.
Es obvio que un robot autónomo
también pueda funcionar con
baterías. Como el microcontrolador utiliza
4.5V los motores también deben funcionar
con 3-4.5V. Además no deben consumir
demasiada energía ya que de otro modo las baterías
y el circuito de control serán
muy grandes y
pesados. Para este diseño utilizamos un chip de
motor integrado llamado L293D.
El chip de motor integrado L293D puede alcanzar un máximo de
0.5A. Por lo tanto los motores deberían
requerir menos de 0.5A en las
peores condiciones.
Utilizamos 2 pequeños motores con caja de cambios del Conrad
(www.conrad.de, código de
pieza: 242802) pero tú puedes utilizar cualquier otro motor pequeño
con caja de
cambios. De hecho pensamos ahora que la mejor solución
sería utilizar Motores Servo estándar
como los que se usan para los controles remoto
de pequeñas
lanchas, autos o aviones.
Normalmente estos Motores Servo pueden girar únicamente a un cierto ángulo
pero tú puedes abrir la caja de cambios del Servo, quitar el
quitar el tapón,
retirar el medidor de potencia y la electrónica. Es un perfecto pequeño
pero fuerte
motor y los Servos son fáciles de conseguir.
Para construir el robot coloca los motores debajo de una pequeña
tablita de madera (12cm x 9cm)
y ubícalos casi en el medio de modo que la mayor parte de la
carga se encuentre sobre
los dos ejes. La tercera rueda, la pelotita de ping pong,
debe tomar solamente una pequeña fracción
del peso del robot para asegurarnos de que
pueda deslizarse bien en
su "cojinete" (ver esquemas).
El cojinete para la pelotita de ping pong es la tapita de una pequeña
botella de plástico que tiene
exactamente el tamaño
correcto.
Para operar el pequeño robot hemos utilizado 3 baterías
AAA. Ubica
los soportes de las baterías como se indica abajo. Las baterías son
bastante pesadas así que procura que la mayor parte de la carga se halle
sobre las ruedas y solamente una
pequeña porción
sobre la pelotita de ping pong. Puedes colocar un interruptor para seleccionar
on/off (encendido/apagado)en algún lugar
de lado del robot.
Sensores
Le daremos a nuestro robot 2 tipos de sensores:
- sensores al tacto: de este modo el robot sabe si ha tocado
un objeto
- sensores a la luz: para que el robot encuentre el punto más
luminoso de la habitación
Los sensores al tacto son simples interruptores hechos con alambre
de acero. Los doblamos como se puede ver
en la figura abajo:
Hay 4 sensores al tacto colocados con un tornillo en
las esquinas de
la tablita de madera.
Cuando el robot toca un objeto el alambre de acero (2, ver la figura
a continuación) toca el segundo alambre
de la tablita (3) y esto cierra la conexión
eléctrica entre el alambre de acero y
el alambre en la tablita de madera.
Para prevenir que el alambre de acero no se salga cuando
la pelotita de ping pong no esté en su cojinete
hemos agregado una pequeña pieza de madera (1)
debajo de la tablita. Este pequeño poste debe ubicarse
a aproximadamente 5mm. por arriba del suelo cuando la
pelotita de ping pong se encuentre en su
cojinete.
El alambre de acero debería terminar a aproximadamente 5-7mm. por encima del suelo.
Los sensores a la luz son 3 foto reóstatos. Colocamos cartón
entre los foto reóstatos como se muestra en la figura
de abajo. Este cartón crea sombras en los reóstatos
cuando reciben luz de un
lado. Sólo cuando la luz llegue exactamente desde arriba
se recibirá una cantidad de luz
similar en los
3 sensores. Comparando los valores de los 3 sensores el
robot puede decidir en qué dirección
irá.
Puedes soldar los 3 foto resistores en una pequeña
tabla de experimentación
(esas tablas con muchos agujeritos) y fijar todo
con un simple tornillo
en el robot.
Más abajo te explicamos cómo conectar los sensores
y los dos motores a la tabla de circuito impreso
con el microcontrolador.
Ahora que ya tenemos las partes mecánicas
pasemos a observar el "cerebro"
del robot.
El Circuito
Utilizamos un microcontrolador AT90S4433 como el "cerebro" de nuestro
robot pero el
"cerebro" no puede directamente liberar energía suficiente para conducir
los motores.
Aquí es donde participa el chip de motor integrado
L293D.
Este chip contiene 4 dispositivos amplificadores de salida digitales
con diodos de extra protección para evitar
altos voltajes
inducidos por las bobinas de un motor. 2 de los
dispositivos de salida
se pueden usar para conducir un motor. De esta forma es posible
hacer que el motor gire a la izquierda
o a la derecha.
Colocamos un motor entre salida (output) 1 y salida 2 y el
otro entre las salidas
3 y 4. Los pines activados del chip pueden usarse para
controlar
la velocidad de los motores cuando transmitimos pulsos de
longitud variable a los
pines activados.
El resto del circuito es muy simple: Utilizamos el microcontrolador Atmel
AT90S4433
nuevamente. Tú conoces ya este microcontrolador
por artículos anteriores en
LinuxFocus. Sus entradas análogas se pueden utilizar para
medir la luz
en los foto resistores y sensores al tacto conectados
directamente a las líneas digitales
de entrada, como se muestra abajo.
Para mayor información sobre el microcontrolador
puedes ver el artículo de
Guido de la edición de marzo 2002:
Programando el Microcontrolador
AVR con GCC.
El circuito funciona con 4.5V. Tres baterías AAA son por lo tanto
suficientes para operar
el robot.
Ahora el circuito para nuestro robot autónomo estaría listo.
Sin embargo, ¿qué harías si el robot no funcionara
como esperabas porque algo
está mal
con el software? No puedes ver nada. No sabes
cúales son los valores de los sensores
a la luz, no sabes porqué el software del
robot ha tomado tal o cual
decisión. Lo que necesitamos es algún tipo de salida
(output)
en la pantalla que nos permita mostrar y entender qué hace el robot. El puerto serial
RS232 es muy útil
para este propósito. Podemos imprimir los valores de las variables
y hasta podemos comunicarnos con el
robot. No deseamos conectarlo todo el tiempo
pero lo necesitamos
para depurar al robot. Por esto tiene sentido
colocar el
max232 y otras piezas necesarias para la conexión
RS232 en una tabla aparte
y conectarla, solamente cuando sea necesario:
Los diagramas de circuito Eagle y los diseños de tablero se
pueden descargar al final del artículo
junto con el software para
este robot.
No describimos el diseño de tablero aquí. Puedes verlo en
Eagle. El tablero de circuito es lo suficientemente pequeño como
para fijarlo
entre las baterías.
Abajo hay un dibujo donde podrás ver qué sensores al tacto en
los lados del
robot se conectan a qué pines en el diagrama de
circuito.
El diagrama también muestra cómo conectar los motores. La polaridad
de los motores
se elige de modo tal que el robot avance (en
la dirección
de la flecha) si +3V se encontrara conectado al pin
"+"- y GND
al pin "-"-. 1y a 4y son los nombres de los pines en el
L293D.
El Software
No queremos dar más detalles aquí. El programa principal
se puede encontrar en el
archivo linuxrobot.c (descarga del software
al final
del artículo). El programa incluye muchos comentarios
y debería ser de fácil lectura para un
programador C. El ciclo principal revisa los valores análogos de los foto resistores
al ejecutar el análogo interno del
Microcontrolador al convertidor digital en el modo
de conversión single shot 3 veces. Luego de ello los sensores
al tacto son
revisados. Si se presionara cualquiera de estos sensores al tacto entonces,
tienen preferencia con respecto a los sensores a la luz ya que probablemente
tocarán algún obstáculo. El robot conducirá al motor
unos milisegundos en la posición opuesta al sensor al tacto
que fuera tocado.
Si no se hubiese tocado ningún sensor al tacto entonces se compara a los
foto resistores
entre sí. Esta comparación se realiza con la función (comparar con)
compare_with_tol()
donde comparamos un valor promedio de 2. Para
evitar eso
de encontrarnos muy afectados por el "ruido" decimos que 2
valores se igualan si
la diferencia fuera menor al 5%.
Basados en la comparación de los sensores a la luz podemos
decidir qué motor
encenderemos. Como tenemos solamente 2 ruedas podemos dirigir
el robot hacia el punto
aumentando la velocidad de una de las ruedas o aún
llevándolas hacia la dirección opuesta. Dado que el microcontrolador
repite la medición muy rápidamente varias veces por segundo
el movimiento del
robot
se ve como si continuara aún si detenemos uno de los motores
durante la fracción
de un segundo
para girar un poco hacia la izquierda o hacia la derecha.
Juntando todo
Cuando ensamblas la electrónica siempre resulta una buena idea
hacer controles por
etapas. De esta manera podrás reducir fácilmente posibles
fallas.
Existen 3 programas de prueba diferentes incluidos en
el paquete de software de linuxrobot
(descargarlo al final del artículo).
El programa ledtest permite que los 2 leds (diodos emisores de luz) parpadeen. Lo cargas
con el comando
"make ledtestload" (hacer que cargue ledtest). Esto compilará el programa y lo cargará
en el
microcontrolador. Los 2 leds deberían comenzar a parpadear
inmediatamente después de que el programa se haya
cargado. Cuando esta prueba resulta exitosa puedes estar seguro de que
el microcontrolador con su oscilador y la conexión
a la PC
para cargar el software
funcionan bien.
Sigue el programa motortest (motortest program). Este programa implementa
"an electronic rubber
ball" (una pelotita de goma electrónica). Lo cargas con el comando "make motortestload" (hacer que cargue motortest).
El programa motortest controla los sensores al tacto
todo el tiempo y si se toca a uno de ellos
entonces el robot se aleja del sensor
que fue tocado.
Si tocas al robot con tu mano en uno de sus lados
saltará hacia
atrás. Coloca tu otra mano detrás del robot
y saltará hacia atrás y hacia adelante entre
tus
2 manos como una pelotita de goma. Si el robot pasa
esta prueba
entonces todo menos los sensores a la luz y la conexión RS232
habrán sido
puestos a prueba.
El último programa de prueba se llama adctest (compilar y cargar
con hacer cargar adctest
(make adctestload). El programa pone a prueba a la conexión RS232
cuya función es depurar al robot
y controla el ADC (analógico al convertidor
digital) con 3 foto reóstatos.
Carga el programa en el microcontrolador y luego conecta
el adaptador para la conexión
RS232 a tu PC. Después de eso ejecuta los
3 comandos siguientes en una shell:
make ttydevinit
./ttydevinit /dev/ttyS0
cat /dev/ttyS0
El robot periódicamente debería imprimir los valores de la intensidad de la luz
que ha medido con los sensores a la luz.
Una vez pasadas todas las pruebas puedes cargar el programa final
en el robot con
"make load" (hacer cargar).
El mejor lugar para jugar con las primeras pruebas es una habitación con
una simple lámpara en el medio. El robot debería simplemente correr directo
en la dirección de la lámpara y detenerse allí.
Es bastante divertido ver cómo se da vuelta si lo colocas sobre el piso
de espalda a la fuente de luz o cómo evita
las
sombras.
Problemas y mejoras
Comenzamos este robot como un pequeño experimento. Resultaba divertido
construir un robot autónomo que pudiera tomar
decisiones por sí mismo y que no necesite
ninguna conexión de datos a la computadora.
El programa que incluye el paquete linuxrobot que tú puedes
descargar más adelante hacia el final del artículo
es pequeño y
simple
pero hace lo que queríamos: El robot se dirige hacia el punto
de mayor luminosidad.
Nos gustaría mencionar algunas cosas que podrían tenerse en cuenta
como punto de partida para un futuro
desarrollo:
- Los sensores al tacto se prueban únicamente en intervalos bastante extensos,
unos pocos milisegundos, lo que limita la respuesta del robot. Deberían
controlarse
más seguido.
- Si se tocara a uno de los sensores al tacto esto tendría
prioridad sobre todas las demás cosas y el robot se mueve entonces
durante unos pocos cientos de
milisegundos
en la dirección opuesta. Si se tocara un sensor diferente durante
este lapso
esto sería ignorado por el momento.
- La sensibilidad de los foto resistores disminuye
cuando las condiciones de luz
son deficientes.
Esto puede provocar el efecto de que la diferencia medida entre
los sensores se encuentre por debajo del umbral que se encuentra codificado
en el disco
dentro del programa (5%) y el robot asume que todos los sensores reciben
la misma cantidad de
luz. Los valores de luminosidad que salen del ADC podrían
ajustarse mediante una curva de filtro no lineal
para compensar este efecto.
Por el momento el programa linuxrobot es pequeño y simple así que
no deberías tener problemas para comprenderlo
y quizá podrías continuar con su desarrollo. Requiere solamente el 50% de
la memoria del microcontrolador 4433 así que aún puedes
agregar muchas
cosas.
Lo bueno de este robot es que el hardware es
de algún modo genérico:
Consiste básicamente en 2 motores y algunos sensores unidos a
un microcontrolador.
Toda la lógica se implementa en el software. Esto significa que
si cambias el
software puedes cambiar practicamente todo como a tí te guste.
Aquí se ve al robot en posición de prueba. Pusimos un poco de papel
Post-It debajo de él
para que no saliera corriendo. El RS232 se
conecta con fines de
depuración:
... y el robot terminado buscando la luz....:
Referencias
Formulario de "talkback" para este artículo
Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
<--, regresar al índice de este número
2003-07-08, generated by lfparser version 2.41