En efecto , con un mando Wiimote de Nintendo (en Amazon cuesta menos de 16€ ), junto con su Raspberry Pi 2 Model B puede crear su propio “robot mayordomo” eso si usando una plataforma que le de movilidad al conjunto .
Evidentemente la forma del robot quedara sujeta a sus gustos, a los materiales que emplee y por supuesto a su creatividad ,pero el resultado siempre sera muy interesante sobre todo por el alto grado de personalización al que puede llegar . Lógicamente, ademas de la Raspberry y el mando wiimote , también necesitará comprar un chasis con las dos orugas motorizadas para que el robot pueda moverse.
Aunque el resultado probablemente no este a la altura de los grandes desarrollos de robots industriales , al hacer este robot aprenderá cómo utilizar Bluetooth para comunicarse con su Raspberry Pi, cómo conectar una tarjeta de robótica básica usando los pines GPIO ( y controlarlos con Python) ,así como también cómo utilizar una Nintendo Wiimote para controlar su Raspberry Pi ( también usando Python)
Para empezar ,siempre es bueno descomponer proyectos complejos en otros mas pequeños proyectos , ya que esto hace que sea mucho más fácil de resolverlos. Es decir: si hace este proyecto de una sola vez y no funciona , ¿cómo saber si es la tarjeta del motor , los motores , la conexión Bluetooth o el programa el culpable del fallo?
Como referencia ,los pasos a seguir en la construcción podrían ser los siguientes:
- Configurar y probar la tarjeta del motor y los motores
- Configurar y probar la conexión Bluetooth
- Configurar y probar el Wiimote
- Escribir el programa definitivo
- Construir el cuerpo de su robot usando su creatividad
Montaje inicial
Para poder controlar los motores del grupo motor , necesitará un escudo que tendrá que intercalar entre los pines del GPIO de su Raspberry y los cables de alimentación de los dos motores DC. Para ello simplemente ponga la placa encima de los pines del GPIO de su Raspberry PI cuidando el orden . Debería tener un aspecto como este:
Un vez conectado el escudo, el siguiente paso es conectar los cables de uno de los motores al conector azul marcado J3 / M1 , utilizando cables pelados en cada extremo o cables usando un conector macho – macho . Obviamente también debe conectar el otro motor para J2 / M2 .
El Rover 5 utiliza 2 motores independientes , cada uno con un codificador de cuadratura óptica y la caja de cambios . El montaje de la caja de cambios completo puede hacerse girar a incrementos de 5 grados para diferentes configuraciones de despacho . Puede incluso sustituir a las orugas de los tanques con ruedas tradicionales .
Esto no es una base de robot endeble :con un peso de más de 2,5 libras sin baterías , esta base es resistente y puede pasar por encima de casi todo.
No importa en qué forma conecta cada motor individual en este punto (si es un motor gira en la dirección equivocada entonces simplemente puede intercambiar los cables de otro ). Ademas en este punto también puede conectar la alimentación que simplemente puede proporcionarse por un portapilas de 6 pilas AAA de 1,5V , el cual proporcionara los 6V necesarios para el escudo Ahora tiene una batería conectada a los motores del robot a través de la tarjeta de control del motor .
Atención :tenga cuidado con la polaridad: el cable rojo del portapilas debe conectarlo al terminal +VCC del escudo y el cable negativo al terminal GND o 0V del escudo.
El aspecto final debería ser algo similar al siguiente :
El ultimo paso es conectar la Raspberry Pi al escudo con lo que ya tendríamos conectados todos los elementos del robot.
Ahora lo siguiente que toca es dotar del sw necesarios en la Raspberry Pi para controlar cómo y cuándo los motores reciben energía .
Prueba de motores
La placa Ryanteck se controla mediante los pines GPIO 17 , 18, 22 y 23 de la Raspberry Pi . Si establece el pin 17 a nivel alto , un motor va hacia la derecha , mientras que si se activa a nivel alto el pin 18 , el motor gira en sentido antihorario . Los pines 22 y 23 dan control del motor 2 funcionando de un modo idéntico a los pines 17 y 18 pero con el motor 2.
Con todo el conjunto conectado a su Raspberry Pi vamos a escribir un pequeño script en Python para probar el funcionamiento de la base motorizada .
En la línea de comandos escriba test_motors.py tipo nano .
Ahora escriba en el siguiente programa:
import RPiGPIO as io
import time
iosetmode(ioBCM)
pins = [17, 18, 22, 23]
for pin in pins:
iosetup(pin, iooutput)
#Los motores de prueba giran a un lado y luego al otro con retardo de 0,5 segundos .
for pin in pins:
print ('Testing pin ' + str(pin))
iooutput(pin, 1)
timesleep(0.5)
iooutput(pin, 0)
Presione Ctrl-O y luego Enter para guardar . Pulse CTRL – X para salir de la línea de comandos . Ahora ejecute el programa de prueba : sudo test_motors.py pyton .
Si la prueba no se ejecuta como se esperaba , compruebe todas las conexiones así como la batería y vuelva a intentarlo .
Prueba bluetooth
Otro modulo que usted necesitará es un adaptador Bluetooth . Teniendo conectividad Bluetooth se puede utilizar para transferir archivos y para la comunicación , pero también le permite utilizar dispositivos de juego como en la Nintendo Wiimote y el controlador de PS3 para aplicaciones de robótica .No todos los adaptadores funcionan en el Pi ; no se puede recomendar específicamente cualquier Inateck pero el adaptador de Bluetooth 4.0 que estamos utilizando funciona muy bien.
Para la prueba del mando de la Nintendo es habitual usar el dongle Inateck Bluetooth Adaptador USB 4.0 con LED | Dongle inalámbrico con inactivo inteligente y Wake-Up | Compatible con Windows XP / Vista / 7/8 / 8.1 | Soporte EDR y A2DP estéreo | Broadcom Chipset – Negro
, el cual usa un chip Broadcom 20702, el chip Bluetooth más reconocida en Europa y América; Nivel 1, la distancia de transmisión de hasta 10 m; Velocidad de transmisión máxima de 3 M / S.Ademes.Este dongle emite una señal de Bluetooth 4.0, es estable y fuerte, usa modo dúplex y tiene un bajo consumo de energía.Ademas cuenta con ahorro de energía a través de los modos inteligentes de sueño y despertar, evita la interferencia de monitoreo CRC de 24 bits y usa modulación de frecuencia automática contra superposicionesEnchufe el adaptador Bluetooth en el puerto USB de la Raspberry Pi , arránquela y conectese a esta .
Procedeamos a instalar el sw necesario,para ello desde línea de comandos debería instalar el driver usando el siguiente comando:
>sudo apt-get install –no-install-recommends bluetooth
Una vez instalado el software ,debería ver el bluetooth está en marcha,para ello escriba:
>sudo service bluetooth status
Deberia dar el mensaje bluetooth is running
.
Si no es así, reinicie la Raspberry Pi y vuelva a intentarlo .
Para probar el dongle escriba
>hcitool scan
Cualquier dispositivo detectable por Bluetooth en la zona aparecerá en la pantalla ; lo cual indicará que ahora está listo para usar Bluetooth en el Raspberry Pi . Si no se ve nada , asegúrese de que usted tiene un teléfono u otro dispositivo compatible con Bluetooth cerca del Pi y pruebe a detectarlos.
Prueba de conexión del mando .
Antes de continuar, debe tener Bluetooth instalado y funcionando en su Raspberry Pi ( habiendo seguido todos los pasos anteriores ). El hecho de que el servicio de Bluetooth esté en funcionamiento y pueda ver otros dispositivos no significa que el dongle bluetooth sea capaz de ver el Wiimote( de hecho también puede tener problemas si está utilizando un mando Wiimote diferente del oficial).Así que no hay reglas seguras y rápidas; puede que tenga que probar diferentes configuraciones si tiene problemas.
Escriba desde linea de comandos:
>hcitool scan
Ahora pulse los botones ‘1’ y ‘2’ en su Wiimote al mismo tiempo:los LEDs azules deben parpadear en el Wiimote y debería ver algo como esto en la pantalla:
Scanning … 00:1E:02:8A:CD:A1 Nintendo RVL-CNT-01
También puede ver otros dispositivos Bluetooth que están dentro del alcance, pero obviamente puede hacer caso omiso de ellos.
Si todo ha ido correctaemmnte ,ahora se sabe que la función Bluetooth está funcionando y puede comunicar el Wiimote con su Raspberry Pi.
El último paso es asegurarse de que podemos hablar con el Wiimote usando Python.,para lo cual debe instalar el módulo CWIID ,con objeto de que desde Python puede hablar con el Wiimote.
>sudo apt-get install python-cwiid
.
El siguiente programa probará que el Wiimote puede comunicarse con el Raspberry Pi. En la línea de comandos teclee
>nano wii_remote_1.py
Luego escriba o copie y pegue el código siguiente:
#!/usr/bin/python #+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k| #+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # # wii_remote_1.py # Connect a Nintendo Wii Remote via Bluetooth # and read the button states in Python. # # Project URL : # http://www.raspberrypi-spy.co.uk/?p=1101 # # Author : Matt Hawkins # Date : 30/01/2013 # ----------------------- # Import required Python libraries # ----------------------- import cwiid import time #import RPi.GPIO as io #io.setmode(io.BCM) #pins = (2,3,4,17) #for i in pins: # io.setup(i,io.OUT) button_delay = 0.1 print 'Press 1 + 2 on your Wii Remote now ...' time.sleep(1) # Connect to the Wii Remote. If it times out # then quit. try: wii=cwiid.Wiimote() except RuntimeError: print "Error opening wiimote connection" quit() print 'Wii Remote connected...\n' print 'Press some buttons!\n' print 'Press PLUS and MINUS together to disconnect and quit.\n' wii.rpt_mode = cwiid.RPT_BTN while True: buttons = wii.state['buttons'] # If Plus and Minus buttons pressed # together then rumble and quit. if (buttons - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0): print '\nClosing connection ...' wii.rumble = 1 time.sleep(1) wii.rumble = 0 exit(wii) # Check if other buttons are pressed by # doing a bitwise AND of the buttons number # and the predefined constant for that button. if (buttons & cwiid.BTN_LEFT): print 'Left pressed' time.sleep(button_delay) #io.output(2, True) if(buttons & cwiid.BTN_RIGHT): print 'Right pressed' time.sleep(button_delay) #io.output(3, True) if (buttons & cwiid.BTN_UP): print 'Up pressed' time.sleep(button_delay) #io.output(4, True) if (buttons & cwiid.BTN_DOWN): print 'Down pressed' time.sleep(button_delay) #io.output(17, True) if (buttons & cwiid.BTN_1): print 'Button 1 pressed' time.sleep(button_delay) if (buttons & cwiid.BTN_2): print 'Button 2 pressed' time.sleep(button_delay) if (buttons & cwiid.BTN_A): print 'Button A pressed' time.sleep(button_delay) #for i in pins: #io.output(i, False) if (buttons & cwiid.BTN_B): print 'Button B pressed' time.sleep(button_delay) if (buttons & cwiid.BTN_HOME): print 'Home Button pressed' time.sleep(button_delay) if (buttons & cwiid.BTN_MINUS): print 'Minus Button pressed' time.sleep(button_delay) if (buttons & cwiid.BTN_PLUS): print 'Plus Button pressed' time.sleep(button_delay)
Cuando haya terminado: Presione Ctrl-O y luego Enter para guardar Presione CTRL-x para salir de la línea de comandos .
Ahora ejecute el programa de prueba tecleando
>sudo python wii_remote_1.py
Siga las instrucciones y debería ver la pantalla respuestas a todas sus pulsaciones de botón así que ha llegado hasta aquí, ya sólo le queda probar todo el conjunto.
A continuación vamos a ver el programa principal que le permitirá controlar el vehículo con el Wiimote
En la línea de comandos escriba lo siguiente:
>nano robot.py
Ahora puede escribir , o cortar y pegar, el siguiente programa .
#!/usr/bin/python #based on Matt Hawkins' code http://www.raspberrypi-spy.co.uk/?p=1101 #Re written by Ryan Walmsley import cwiid import time import RPi.GPIO as io io.setmode(io.BCM) #Motor 1 is designed to be the motors on the left, Motor 2 is designed to be on the right #If one motor is in the wrong direction you can swap the pins around to save you having to re-wrire the robot. m1a = 17 #Motor 1 Forwards m1b = 18 #Motor 1 Backwards m2a = 22 #Motor 2 Forwards m2b = 23 #Motor 2 Backwards pins = (m1a,m1b,m2a,m2b) for i in pins: io.setup(i,io.OUT) for i in pins: io.output(i,False) button_delay = 0.1 print 'Press 1 + 2 on your Wii Remote now ...' time.sleep(1) # Try to connect to the Wiimote & quit if not found try: wii=cwiid.Wiimote() except RuntimeError: print "Can't connect to Wiimote" quit() print 'Wiimote connected' wii.rpt_mode = cwiid.RPT_BTN while True: buttons = wii.state['buttons'] if (buttons & cwiid.BTN_UP): #Forwards time.sleep(button_delay) io.output(m1a, True) io.output(m2a, True) elif (buttons & cwiid.BTN_DOWN): time.sleep(button_delay) io.output(m1b, True) io.output(m2b, True) elif (buttons & cwiid.BTN_LEFT): time.sleep(button_delay) io.output(m1a, True) io.output(m2b, True) elif(buttons & cwiid.BTN_RIGHT): time.sleep(button_delay) io.output(m1b, True) io.output(m2a, True) else: io.output(m1a, False) io.output(m1b, False) io.output(m2a, False) io.output(m2b, False) #press button A to stop all motors if (buttons & cwiid.BTN_A): time.sleep(button_delay) for i in pins: io.output(i, False)
Cuando haya terminado : Presione Ctrl-O y luego Enter para guardar pulse CTRL – x para salir de la línea de comandos .
Ahora ejecute el programa :
>sudo python robot.py
.
Si todo funciona correctamente usted debería ser capaz de controlar su vehículo con el Wiimote . Si no es así , vuelve a atrás y compruebe que cada paso está funcionando correctamente ..
Ahora usted ya tiene un robot con control remoto , que es completamente funcional , pero obviamente acaba de empezar , pues tendrá que pensar en el contenedor donde lo va a ubicar ( tendrá que usar su imaginación ) así como si le va a añadir algún accesorio más :por ejemplo sonido, algún tipo de luz, sensores ultrasonidos , etc
Por cierto el código completo esta disponible en su pagina oficial de Github
Fuente aqui