Y al final llego la hora de armar un robot... luego de comprar una Raspberry PI 2 (RPI2) y despues de un par de años de haber probado diferentes cosas con Raspberry, era tiempo de armar algo "movil" y que tuviera en lo posible algun indicio de "inteligencia" (artificial)...
Mis proyectos anteriores (viewtopic.php?f=76&t=73731 y
viewtopic.php?f=76&t=116466) hicieron que fuera conociendo Raspberry desde lo mas básico y avanzando hacia algo mas complejo.
Ya venia con la idea desde hacia un tiempo, especialmente cuando vi esto, que me dejo con las ganas:

viewtopic.php?f=76&t=37137
Pero no encontré mucha mas info al respecto en el foro en Español de Raspberry Pi, por lo que me decidí a escribir algo yo mismo.
Advertencia: esta nota intenta ser mas bien una guía y no un tutorial, e incluye muchos temas que me interesaban y que fui aprendiendo a lo largo del proyecto. No quiere decir que sea la única o mejor forma de hacerlo y además se trata de un prototipo de pruebas por lo que no es para nada definitivo y seguro que queda mucho mas por hacer y mejorar, pero no por ahora...
Tampoco me interesa ser criticado ya que como en todo proceso de aprendizaje se cometen errores y soy plenamente consciente de los que cometí y ya tomé debida nota para evitarlos en el futuro

Gracias por su comprensión.
Ir a "Actualización con Cargadores USB y Microswitch": viewtopic.php?p=871039#p871039
Ir a "Actualización con Camera Module (Raspicam) e Interfaz Web": viewtopic.php?p=871041#p871041
Ir a "Actualización con Luces Frontales y Sensores de obstáculos" : viewtopic.php?p=871110#p871110
Ir a "Actualización con Encoders y Módulo Sensor de Ruedas" : viewtopic.php?p=872858#p872858
Ir a "Actualización con Sensores de Línea y de Intensidad de luz" : viewtopic.php?p=875390#p875390
Ir a "Actualización con ServoMotor y Soporte para Cámara" : viewtopic.php?p=876466#p876466
Ir a "Actualización con Matriz de Leds y Backpack" : viewtopic.php?p=884329#p884329
Ir a "Actualización con Joystick Xbox 360 y Programas Python" : viewtopic.php?p=885757#p885757
Introducción:
Como no sabia por donde empezar comencé a buscar información al respecto, sobre cual seria la forma mas fácil y/o rápida de armar un rover y de ser posible económicamente accesible. Lamentablemente donde vivo esa segunda condición no es para nada fácil de lograr, pero eso es otra historia...
Encontré un articulo que intentaba listar los posibles kits de robots y placas controladoras que había en el mercado:
https://www.reddit.com/r/raspberry_pi/c ... lable_for/
Y al igual que el autor la que me pareció mas interesante por las posibilidades que ofrecía es Raspirobot de MonkMakes, ya que había visto muchos de los artículos publicados por Simon Monk y me suponían bastante fáciles de comprender y seguir, además que funciona con Python y podia conseguirla localmente:
https://github.com/simonmonk/raspirobotboard2
https://www.adafruit.com/products/1940
Se trata de esta placa (hacer click en las imágenes para ampliar):


Aunque se podría reclamar que la placa es un hat que ocupa todos los pines GPIO, por suerte RPI2 tiene pines extra que iban a quedar disponibles para conectar mas cosas, ya que Raspirobot fue originalmente diseñada para las Raspberry Pi de 26 pines. Además esta era version 2 que incluía varias mejoras respecto de la primera version.
Faltaba ahora una carrocería con los motores y sus ruedas, así que conseguí un kit de los mas comunes que se llama Dagu Magician Chassis, que es muy conocido por la facilidad que ofrece para el montaje de cualquier tipo de rover:
http://www.dagurobot.com/goods.php?id=53
Por suerte también lo conseguí localmente, junto con unos cables de conexión macho-hembra y hembra-hembra. De los proyectos anteriores me habían sobrado los de conexión macho-macho.
Cabe aclarar que por su precio obviamente solo incluye lo básico que son dos motores DC comunes con caja reductora de plástico, dos ruedas plásticas con cubiertas de goma y una ruedita metálica de apoyo y guía (castor). También tiene un portapilas con capacidad para 4, lo que presupone pensado para controladores que no requieren mucho voltaje, como podría ser por ejemplo una placa Arduino.
Nacia asi el proyecto "Norman", no es ninguna sigla, le puse ese nombre porque cuando empece estaba viendo la serie Bates Motel, por lo que lo nombré en honor a Norman Bates el protagonista, pero no es que sea un robot psicópata, jaja...

Construcción:
Siguiendo las instrucciones de la pagina de Raspirobot comencé la aventura del ensamblaje.
Raspirobot demandaba un poco mas de voltaje ya que se encarga además de los motores, también de alimentar la propia RPI2.
Así que lo que hice fue agregar un segundo portapilas en serie para sumar mas voltios a la entrada.
También tome la oportunidad de agregar un sensor ultrasónico HC-SR04, uno de los mas comunes, ya que tiene para conectarlo directamente.




Una vez montada la Raspirobot sobre RPI era cuestión de adosarlas al chasis con los separadores:




Otra cosa a agregar seria un pequeño protoboard para usarlo como puente de conexiones entre componentes por la longitud de los cables, que simplemente estaría pegado con el pegamento que tiene debajo:


Luego conectar los cables para los puentes de conexión agregar las pilas:


Finalmente agregar el HC-SR04 al montaje:




Lo básico para hacer andar esto era cargar el sistema operativo Raspbian y configurarlo para usarlo preferentemente sin interfaz grafica con raspi-config y que se loguee automáticamente. Ya lo había mencionado en otro articulo pero aquí va:
http://www.opentechguides.com/how-to/ar ... start.html
Luego copiar el software del repositorio de Raspirobot.
En la carpeta "examples" se encontraba un "test.py" para hacer pruebas de la placa y uno llamado "rover_avoiding.py" que servía para probar el funcionamiento.
Lo que hace es mover el robot hacia adelante en forma automata y usando el sensor ultrasónico medir la distancia de objetos hacia el frente, y si se topa con algún obstáculo hacer un giro para avanzar en otra dirección.
Buscando en el repositorio del autor fui hacia el de la version 1 ya que había visto que era posible controlarlo directamente y no solo dejarlo que funcione automáticamente, pero ese programa no venia en la version 2.
Finalmente encontré uno llamado "rover.py" que me permitiría manejarlo con un teclado wireless, tal como había visto en varios videos:
https://www.youtube.com/watch?v=IO8a-2lrSns
https://www.youtube.com/watch?v=7oTjEB-Maeg
http://www.raspberrypitutorials.yolasit ... irobot.php
Era cuestión de hacer una modificación en la importación de librerías y definición de variables de la version y cambiar:
Code: Select all
from raspirobotboard import *
rr = RaspiRobot()
Code: Select all
from rrb2 import *
rr = RRB2()

Una cosa a tener en cuenta es que ese programa funciona con la librería pygame para mostrar en pantalla un grafico de distancia medida por el sensor ultrasónico. Asi que para que funcione sin estar conectado a la pantalla, primero hay que iniciar la Raspberry y luego de ejecutar el programa con "sudo python rover.py" recién entonces desconectar del monitor y empezar a utilizarlo.
A partir de allí era cuestión de empezar a estudiar esos programas en python para modificarlos y agregarles mejoras y mas funcionalidades, como por ejemplo usar un joystick como mando, quería algo asi:
https://www.youtube.com/watch?v=XJ7JGqFZcRU
El joystick que tengo es uno común USB como este:

Por suerte encontré esto que sirvió de guía e investigando un poco mas sobre pygame pude para agregarlo al programa:
https://github.com/ric96/joypi/blob/master/joypi.py
http://sabia.tic.udc.es/gc/Contenidos%2 ... utton.html
https://www.pygame.org/docs/ref/joystick.html
Quedando asi para manejarlo con la palanca e incluso con los leds onboard como indicadores:
Code: Select all
while True:
joystick_count = pygame.joystick.get_count() #Get Joystick Count
for i in range(joystick_count):
joystick = pygame.joystick.Joystick(i)
joystick.init()
for event in pygame.event.get():
if event.type == (pygame.JOYAXISMOTION):
if (joystick.get_axis(1) < -0.5): #Forward
rr.forward()
rr.set_led1(True)
rr.set_led2(True)
elif (joystick.get_axis(1) > 0.5): #backward
rr.reverse()
rr.set_led1(True)
rr.set_led2(True)
elif (joystick.get_axis(0) < -0.5): #Left
rr.left()
rr.set_led1(True)
rr.set_led2(False)
elif (joystick.get_axis(0) > 0.5): #Right
rr.right()
rr.set_led1(False)
rr.set_led2(True)
if event.type == (pygame.JOYBUTTONDOWN):
if (joystick.get_button(0) == True):
rr.stop()
rr.set_led1(False)
rr.set_led2(False)
1- Raspberry Pi 2 B (podría ser también el modelo B+, lo que conviene es que tenga un puerto GPIO de 40 pines)
2- Placa controladora Raspiboard V2 (podría ser la version 1, pero no tiene funcionalidades avanzadas)
3- Memoria MicroSD de al menos 4 GB (conviene que sea lo mas rápida posible, si es clase 10 mejor)
4- Fuente de alimentación 5V 2A (a utilizar durante la programación y pruebas para no gastar pilas)
5- Kit Dagu Magician Chassis (incluye 2 motores y sus cables, 2 ruedas y un portapilas para 4 pilas, una rueda direccional de metal, además de tornillos y separadores)(también puede ser cualquier plataforma 2WD)
6- Portapilas extra para 4 pilas (puede ser de 6 pilas y reemplazar los 2 portapilas en serie)
7- Separadores extra de metal (en caso de querer elevar la plataforma si uno de los portapilas no entra, mi caso)
8- 8 pilas (si se usan 2 portapilas en serie)(6 pilas si se usa un solo portapilas)(se recomiendan recargables)
9- Tornillos extra para ajustar el portapilas (también podrían ser bridas de plástico)
10- Protoboard (breadboard) de 400 puntos (mas grande no entraría)
11- Cables varios de conexión de toda variedad macho/hembra (pueden ser tipo Dupont)
12- Sensor ultrasónico HC-SR04 (no he probado si funcionaria adaptando otro modelo como el SR05)
13- Teclado wireless (puede ser un teclado USB pero el movimiento estaría limitado por el cable)
14- Monitor con conexión HDMI (para hacer la configuración inicial, luego se puede acceder por SSH)
15- Joystick USB (opcional, también tiene la limitación del cable, no probe joystick wireless)
16- Dongle wifi (hasta aquí opcional, se puede hacer conexión por cable para la programación)
17- Soldador y estaño (hasta aquí opcional, se pueden ajustar los cables de los motores enroscándolos en los conectores)
Nota: En lugar de una placa controladora Raspirobot se podrían utilizar componentes separados.
Con el chip L293D (como el de Raspirobot) se pueden controlar motores eléctricos y se puede usar un conversor switch step down para regular 5V. De lo contrario también se puede utilizar un driver de motores con chip L298N que es mas standard, maneja mas corriente e incluso tiene incorporado un regulador de 5V, por lo que es muy utilizado con Arduino.
Cantidad de errores cometidos: 2
- Se me perdieron un par de tornillos y tuercas porque hay que ajustarlos bien, de lo contrario se aflojan y se caen con el movimiento.
- Las pilas en el portapilas que venia con el kit cada tanto se saltaban debido a las vibraciones por movimiento y se apagaba el robot, hay que sujetarlas aunque sea con cinta o conseguir un mejor portapilas.