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. |
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.
![[motor on wooden board 1]](http://www.linuxfocus.org/common/images/article297/297_mecanics1.jpg)
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).
![[motor on wooden board 1]](http://www.linuxfocus.org/common/images/article297/297_mecanics2.jpg)
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.
![[pill box]](http://www.linuxfocus.org/common/images/article297/297_mecanics3.jpg)
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.
![[position of the batteries]](http://www.linuxfocus.org/common/images/article297/batteries.gif)
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
![[steel wire]](http://www.linuxfocus.org/common/images/article297/steelwire.jpg)
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.
![[touch sensors]](http://www.linuxfocus.org/common/images/article297/touchsensor.jpg)
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.
![[]](http://www.linuxfocus.org/common/images/article297/robot_connectors.gif)
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 ttydevinitEl robot periódicamente debería imprimir los valores de la intensidad de la luz que ha medido con los sensores a la luz.
./ttydevinit /dev/ttyS0
cat /dev/ttyS0
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.
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
- LinuxFocus Marzo 2002 artículo 231: Programando el Microcontrolador AVR con GCC (Programming the AVR Microcontroller with GCC)
- linuxrobot-0.1.tar.gz: el software y los esquemas en formato eagle
- descargar página para este artículo: Hoja de datos para el L293D y posibles actualizaciones del software linuxrobot pueden encontrarse aquí.
No hay comentarios:
Publicar un comentario