sábado, 28 de mayo de 2016

Arduino y Robótica Educativa: Proyecto Auto-Robot.

Dentro de los muchos sueños que tuve en la infancia, recuerdo que siempre quise poder llegar a implementar un robot que "tuviera vida propia", es decir, que pudiese pasearse por las piezas de mi casa sin necesidad de tener que empujarlo o moverlo mediante un control remoto.

Dado que en mi niñez no tenía los conocimientos ni los ahorros necesarios para poder llegar a armar un robot de estas características, es que me embarqué ahora siendo adulto en realizar este proyecto junto a mi hijo Diego, quien actualmente tiene 5 años y comparte conmigo la curiosidad de querer saber cómo funcionan las cosas :)

Así nació el proyecto "Giorbo", el cual consiste en un auto-robot que es capaz de moverse en el suelo de forma autónoma, mirando a su alrededor y evitando los obstáculos con que se topa en su camino.

He aquí una foto de cómo se ve Giorbo sin su carrocería puesta:


Fig.1: Fotografía de Giorbo, el auto-robot.

Uno de los desafíos de este proyecto fue el poder implementar este robot usando piezas de bajo costo, ya que generalmente los kits de robótica educativa que existen en la actualidad tienden a ser caros (en promedio superan los USD 100), y muchos de ellos deben encargarse al extranjero.

Otros de los retos de este proyecto fue poder darle "inteligencia" a nuestro robot, de modo que pudiera desplazarse usando sus ruedas y tomara decisiones de movimiento cuando se enfrentara a muros, sillas, y cualquier cosa que se le pusiera por delante.

Acá puede verse a mi hijo soltando a Giorbo en la terraza de nuestro hogar:

Video 1: Giorbo en acción

El haber llevado a cabo este proyecto junto a mi hijo fue un experiencia inolvidable, y recomiendo realizar esta actividad a padres, educadores y cualquier persona que desee aprender a "crear vida artificial", o que simplemente quiera descubrir y aplicar conocimientos de robótica, electrónica y diseño, entre otras disciplinas.

1) PARTES USADAS PARA ARMAR EL ROBOT


Fig.2: Piezas base para implementar el robot

Para poder construir el auto-robot necesitas conseguir un conjunto de piezas, las cuales se presentan a continuación (se muestran con un precio unitario en dólares y pesos chilenos, tomando como referencia el costo al por menor conseguido en tiendas de Chile).


Nombre de PiezaPrecio Chile $Precio USD
1 Placa Arduino UNO R3
8.800
12.9
1 Servo Motor Tower Pro Sg90
2.180
3.2
1 Sensor Ultrasonido HC-SR04
2.480
3.6
1 Porta pilas 4 AA
330
0.5
1 Pila alcalina 9 volts Great Value
2.690
4
4 Pilas alcalinas AA 1,5 volts Great Value
980
1.4
2 Motorreductores de 3,5 a 6 volts con rueda
11.980
17.6
1 Circuito Integrado L293D Driver Motor
2.400
3.5
1 Rueda 40 mm. giratoria
1.350
2
1 Pack 40 cables macho-macho para protoboard
2.650
3.9
1 Conector plug 2,1 mm. para batería 9 volts
690
1
1 Protoboard de 170 puntos
1.880
2.8
1 Cinta doble contacto
980
1.4
1 Cinta aislante
340
0.5
TOTAL:39.73058.3
Tabla 1: listado de piezas del auto-robot con precio de referencia

El cerebro del robot está conformado por la mítica placa Arduino UNO, la cual es una de las piezas de hardware más usadas en la actualidad por los movimientos "Maker" y "DIY (Do-it-yourself, o hazlo tú mismo) para hacer prototipos electrónicos amateurs. A su vez, la cabeza del robot está conformada por un sensor de ultrasonido modelo HC-SR04, el cual actúa como un "par de ojos" y permite medir la distancia que hay con el objeto más próximo que se encuentre adelante de él. Junto a esto, la cabeza hace uso de un servo motor modelo Sg90, el cual actúa como un cuello que permite que el robot pueda girar sus ojos hacia la izquierda y la derecha, dándole así un alcance de visibilidad total de 180 grados.

Fig.3: Placa Arduino, servo motor y sensor de ultrasonido

Para movilizar al robot se utiliza un par de motorreductores, los cuales corresponden a motores pequeños con engranajes en su interior. Cada motorreductores debe conectarse a un neumático con revestimiento de goma u otro material rugoso, con el objetivo de que pueda haber roce entre éste y la superficie de desplazamiento (es decir, el suelo), de modo que el robot pueda avanzar, retroceder y girar.

Fig.4: Dos motorreductores con sus ruedas

Para darle estabilidad al desplazamiento del robot se puede montar una rueda giratoria (también conocida como "rueda loca") en la parte delantera del vehículo, la cual no necesita estar conectada a un motor, y será usada para que el robot pueda girar libremente en distintas direcciones.


Fig.5: Rueda giratoria con base, tornillos y tuercas


Para entregar energía a nuestro robot se utilizan dos fuentes de alimentación: una pila alcalina de 9 volts que alimenta a la placa Arduino y al sensor de ultrasonido, y 4 pilas alcalinas AA de 1,5 volts encargadas de entregar energía para impulsar los motorreductores (movimiento de las ruedas) y el servo motor (movimiento del "cuello" del robot). Para que las 4 pilas puedan entregar el voltaje requerido por los motores (un rango de 3,5 a 6 volts) éstas deben ser conectadas en serie, de modo que la suma de sus voltajes individuales permitan alcanzar los 6 volts (es decir, 4 pilas x 1,5 volts cada una = 6 volts). Para ello, se utiliza un portapilas que permite colocar de manera firme las 4 pilas de tipo AA, y que además provee los cables de salida para poder conectarlas.

Fig.6: Pila alcalina de 9 volts, portapilas y 4 pilas alcalinas AA

Para que la pila de 9 volts pueda conectarse a la placa Arduino puede utilizarse un conector de tipo plug, el cual tiene forma de cilindro por un extremo (para enchufarla a la placa), y por el otro trae un conector para conectarlo a la parte superior de la pila.

Fig.7: Conector de tipo plug para pila de 9 volts

Para poder integrar todos los dispositivos que hemos mencionado necesitamos armar el "sistema nervioso" de nuestro robot, de modo que éste nos permita orquestar las señales que se van recibiendo del medio ambiente (ej: hay un objeto adelante que está cerca) y permita tomar decisiones para mover las ruedas del auto, de modo de esquivar los obstáculos y avanzar libremente. Para ello, utilizaremos una protoboard que nos permita realizar las conexiones adecuadas entre las piezas, usando para ello un puñado de cables del tipo macho-macho (es decir, que tengan una punta saliente por ambos extremos).

Fig.8: Mini protoboard de 170 contactos, y pack de cables macho-macho

A diferencia de los vehículos que las personas usamos diariamente para desplazarnos día a día, nuestro robot sólo cuenta con tres ruedas (dos traseras y una delantera), por lo que no podemos realizar rotaciones a la izquierda o derecha en base al movimiento de las ruedas delanteras (sólo tenemos una, y ésta gira libremente sin estar conectada a nada). Para suplir el déficit de las ruedas delanteras usaremos una técnica conocida como "tracción diferencial", la cual permite que un vehículo pueda realizar desplazamiento y rotaciones usando sólo dos ruedas en base al movimiento independiente de cada una de ellas hacia adelante y atrás.

Para conseguir este efecto es necesario que podamos controlar el sentido del giro de los motorreductores, lo cual puede conseguirse invirtiendo la polaridad de la corriente que les apliquemos. Si bien esto puede realizarse cambiando de forma manual el orden de los cables que conectemos desde las pilas hacia cada motor, la idea es que el robot pueda moverse de forma autónoma, sin intervención externa. Para ello, necesitamos una pieza electrónica llamada L293D, el cual corresponde a un circuito integrado que implementa un "puente H" y permite controlar hasta dos motores para hacerlos girar en el sentido que uno desee.

Fig.9: Circuito integrado L293D con 16 pines

Junto a esto, nuestro robot debe tener un chasis o esqueleto que le permita sostener y dar rigidez a todas las piezas que componen el vehículo. Para ello, es importante que esta componente tenga el espacio suficiente para poder ubicar todas las partes contempladas, ya sea por encima o por debajo de ésta. También, se requiere que esté hecho de algún material que permita resistir el peso de las piezas que se pongan por arriba de ella, y que sea lo más liviana posible, de modo de no hacer más pesada la estructura completa del vehículo. En el caso de nuestro robot el chasis lo construimos usando una tapa plástica de caja de helado, pero podríamos haber utilizado acrílico, aluminio, madera u otro material.

Fig.10: Tapa de caja de helado de 800ml

Para poder unir distintas piezas del robot sin necesidad de tener que perforarlas y atornillarlas se puede utilizar una cinta de doble contacto, la cual trae pegamento por ambas caras y es de fácil manipulación (puede cortarse con tijeras y despegarse con las manos). Y por supuesto, para poder recubrir los cables eléctricos que queden expuestos al aire, y también para "amarrar" algunas piezas de nuestro robot, podemos usar la práctica e infaltable cinta aislante :)

Fig.11: Cinta de doble contacto y cinta aislante

2) ENSAMBLAJE DE LAS PARTES DEL ROBOT


Inicialmente, se deben conectar los dos motorreductores con sus respectivas ruedas, revisando que la unión entre ellos quede firme y no patine (si no, la rueda no tendrá fuerza para poder mover al robot). Para validar que el ensamblaje haya quedado bien se puede conectar el portapilas (con las 4 pilas puestas) a cada uno de los motorreductores, de modo de observar si sus neumáticos giran correctamente.

Fig.12: Prueba de giro de rueda con motorreductor ensamblado

Generalmente los motorreductores no vienen con cables incorporados para poder conectarlos a la corriente, por lo que hay que soldarles dos cables en la parte superior (donde se encuentran dos conectores métalicos perforados con forma circular). Para ello, debe usarse un cautín con pasta soldadora, de modo de soldar un cable en cada uno de los conectores (si no has soldado previamente, este es un muy buen momento para aprender a hacerlo :)

Fig.13: Cables soldados a los dos conectores de un motorreductor


Posteriormente, se debe colocar una tira de cinta doble contacto en una de las caras de cada motorreductor, con el objetivo de poder pegarla posteriormente a nuestro chasis (aún no se debe despegar la segunda superficie de contacto).

Fig.14: Motorreductor con cinta de doble contacto adherida por un lado

Para poder crear la cabeza del robot, lo primero es unir el servor motor (el "cuello") con el sensor de ultrasonido (los "ojos"). Para ello, una alternativa sencilla es cortar y pegar dos pedazos de cinta de doble contacto sobre la hélice del servo motor, de modo de pegarle pegarse posteriormente el sensor de ultrasonido sobre ella.

Fig.15: Servo motor con cinta doble contacto en su hélice

Al momento de pegar el sensor de ultrasonido hay que fijarse que sus cables queden apuntando hacia arriba; en caso contrario éstos pueden chocar con el servo motor u otras piezas. 

Fig.16: Sensor de ultrasonido pegado sobre la hélice del servo motor

El siguiente paso es realizar las conexiones de cables necesarias para que todas las piezas del robot puedan comunicarse a nivel eléctrico. Estas conexiones deben realizarse sobre la protoboard, y permitirá que la placa Arduino pueda dar las órdenes para controlar el servo motor, al sensor de ultrasonido y al circuito integrado L293D, el cual a su vez regulará el giro de los motorreductores para hacer que el vehículo avance, retroceda o rote. 

Para realizar este paso es muy importante que no se conecten todavía las pilas en el circuito que se está formando, dado que se puede provocar un cortocircuito por tener conexiones incompletas (las pilas deben colocarse en su totalidad únicamente cuando estén ensambladas todas las partes del robot).


Fig.17: Representación visual de conexiones entre componentes

Una vez realizadas las conexiones indicadas (si lo estimas conveniente puedes modificar la ubicación de los cables respetando el circuito eléctrico), tus componentes deberían verse interconectadas más o menos de esta forma:

Fig.18: Circuito eléctrico de conexión entre las componentes

Posteriormente debe realizarse la preparación del chasis. Para ello es importante validar que la placa Arduino, la protoboard, el servo motor (con el sensor de ultrasonido pegado) y las pilas puedan ser colocados encima de la superficie del chasis, tratando de que su distribución de peso sea lo más homogénea posible, de modo de evitar que un lado del vehículo quede mucho más pesado que el otro. Una distribución posible es colocar el servo motor al medio de la parte delantera del chasis, más atrás al centro la placa Arduino y encima de ella la protoboard. El portapilas puede colocarse en un costado (ej: al medio en el lado derecho), y la pila de 9 volts al medio en el otro costado. Para fijar las componentes es posible usar cinta de doble contacto y/o cinta aislante.

Fig.19: Ejemplo de distribución de componentes sobre el chasis

Una vez que se ha validado la posición donde irá cada componente se debe realizar una perforación en la zona que corresponderá a la parte delantera del chasis, de modo de hacer dos (o cuatro orificios si se desea) para poder instalar la rueda giratoria delantera. Lo ideal es primero realizar una marca en la posición a perforar, y luego atravesarlos con un desatornillador u otra herramienta equivalente. Habiendo realizado esto se deben pasar los tornillos por los orificios que tiene la rueda giratoria atravesando el chasis, para luego asegurarlos con tuercas por el otro extremo. Después, deben pegarse los dos motorreductores al costado izquierdo y derecho del chasis, usando para ello la cinta de doble contacto que tiene cada uno.

Fig.20: Instalación de rueda giratoria y motorreductores en parte inferior del chasis

Una vez que se han instalado todas las componentes necesarias, el auto robot debe verse similar a esto:


Fig.21: Vista delantera del auto robot

Fig.22: Vista en diagonal del auto robot

Fig.23: Vista trasera del auto robot


De forma opcional es posible agregarle una carrocería al robot para ocultar y proteger toda la circuitería del robot, por lo que queda a tu creatividad el escoger los materiales y hacer un diseño a tu gusto para implementar esta parte  :)

3) CODIFICACIÓN DE LA INTELIGENCIA DEL ROBOT


Para que el auto robot tenga inteligencia artificial se necesita primero diseñar la lógica del comportamiento que tendrá, de modo que pueda tomar decisiones de forma autónoma, sin intervención humana. Acá puede verse un algoritmo posible, modelado como un diagrama de flujo:

Fig.24: Diagrama de flujo que describe el comportamiento del robot

Teniendo el comportamiento definido se debe llevar a cabo la programación del robot. Para ello se requiere hacer uso de un computador que tenga instalado la herramienta "Arduino IDE", la cual funciona sobre los sistemas operativos Windows, Linux o Mac. Ésta puede descargarse desde acá: https://www.arduino.cc/en/Main/Software

Una vez instalada esta herramienta se debe editar en ella el código fuente de nuestro robot, el cual contendrá las instrucciones requeridas para poder controlar los sensores, motores y las otras componentes. El programa usado para el auto-robot Giorbo puedes encontrarlo en el siguiente repositorio del sitio GitHub (usa el archivo "roboCar.ino"): https://github.com/mmadaria/arduino-robot-car

Este código fuente hace uso de dos librerías auxiliares: "Servo.h" y "NewPing.h". La primera es utilizada para poder controlar el servo motor, y viene incluida como parte de la biblioteca estándar de Arduino IDE. La segunda es usada para controlar el sensor de ultrasonido, y debe ser descargada e instalada manualmente desde el siguiente sitio web (archivo "NewPing_v1.7.zip"): https://bitbucket.org/teckel12/arduino-new-ping/downloads .Si deseas aprender cómo instalar librerías puedes ver la siguiente guía: https://www.arduino.cc/en/Guide/Libraries

Si desea configurar a tu gusto los parámetros del comportamiento del auto robot, puedes modificar los valores de los parámetros que se encuentran definidos al comienzo del archivo y cuyas líneas comienzan con el texto "#define". Por ejemplo, la línea  que dice "#define MIN_OBSTACLE_DISTANCE_THRESOLD 28"  indica que la distancia mínima en la que el robot debe detenerse para no chocar contra un objeto es de 28cms. Ojo que en el código fuente puedes encontrar la descripción de cada uno de estos parámetros, de modo de poder entender para qué sirven.

Una vez que tengas listo el código fuente y las librerías en la IDE debes conectar a la placa Arduino un cable USB del tipo B macho (en su parte trasera), y el otro extremo del cable debe ir enchufado al computador. Una vez hecho esto se debe presionar en la IDE el botón "Upload", el cual permitirá compilar y cargar el programa en la placa Arduino del robot.


Fig.25: Arduino IDE compilando el programa para la placa Arduino UNO

Una vez que el programa se encuentre cargado en la placa se debe desenchufar el cable USB del robot. Cabe destacar que el programa no se borra de la placa cuando está sin energía, dado que queda almacenado en una memoria interna llamada Flash Memory, la cual es de tipo no volátil.

Para hacer que el robot ejecute el programa que le cargamos se debe enchufar la pila de 9 volts en la parte trasera de la placa Arduino, específicamente en el conector de tipo plug. Una vez hecho esto, el robot iniciará la ejecución del programa y comenzará a girar sus neumáticos para moverse hacia adelante, por lo que ahí puedes ponerlo en el suelo para que se desplace. Para apagar al robot basta con que desconectes el cable de la placa.

Video 2: Auto-robot finalizado y moviéndose

Si lo deseas puedes agregarle al robot un interruptor de tipo on/off (dos posiciones) para encenderlo y apagarlo. Para ello, una alternativa es conectar el interruptor a los cables de la pila de 9 volts, de modo de permitir o bloquear el paso de corriente desde esa pila a la placa Arduino.

Fig.26: interruptor de dos posiciones


Bueno, espero que te haya gustado este tutorial tanto como a mí me gustó escribirlo, y si tienes dudas o comentarios puedes escribirme a "mmadaria@gmail.com".

¡Muchas gracias, y que disfrutes tu robot!