9/28/2015

Robots con arduino Yun

Saludos,

A principio del mes de agosto estuve enfrascado en un proyecto con el Arduino yun, para realizar un robot semejante a los que ya he construido pero con la diferencia que en este caso podría tratarse de un robot autónomo.



Me explico, a grandes rasgos el Arduino yun funciona como un Arduino normal, con la salvedad que tiene conexión wifi y un sistema operativo propio el linino.


AVR Arduino microcontroller
Linux Microprocessor
Microcontroller                ATmega32U4
Operating Voltage          5V
Input Voltage    5
Digital I/O Pins  20
PWM Channels                7
Analog Input Pins            12
DC Current per I/O Pin  40 mA
DC Current for 3.3V Pin                50 mA
Flash Memory  32 KB (of which 4 KB used by bootloader)
SRAM   2.5 KB
EEPROM              1 KB
Clock Speed       16 MHz
Processor           Atheros AR9331
Architecture      MIPS @400MHz
Operating Voltage          3.3V
Ethernet             IEEE 802.3 10/100Mbit/s
WiFi       IEEE 802.11b/g/n
USB Type-A       2.0 Host
Card Reader      Micro-SD only
RAM      64 MB DDR2
Flash Memory  16 MB
SRAM   2.5 KB
EEPROM              1 KB
Clock Speed       16 MHz
PoE compatible 802.3af card support     See Power

El proyecto era montar un robot, con gripper, cámara con pant tilt, seguidor de línea, sensor de distancia,  servomotores y un led. Como ya os he dicho sería muy semejante a robots anteriores pero la diferencia de que la comunicación se emplearía wifi y la gracia que en linino se podrían hacer funcionar algunos módulos en python. Su destino era ir a USA para realizar un workshop, la verdad es que mucho más no sé, pero tenía que hacer dos unidades, ya como la Nasa (jajaja), por si uno fallaba.







Para hacer el setup del yun podéis seguir los pasos de Getting started, en Yun puede crear un punto de conexión, pero recomiendo configurarlo a una red la manera de configurarlo es conectarte al Arduino mediante wifi y abrir una página con la dirección 192.168.240.1 ahí os pedirá un password de acceso que por defecto es “arduino” sin las comillas. En el caso del Arduino mini yun es “doghunter” que encontrareis una mini guía aqui.

Una vez configurado el arduino a la red ya no es necesario que esté conectado al ordenador para cargarle el programa. Para que os aparezca en el Arduino ide, tenéis que cerrarlo u os pasara como a mí que no había forma que me apareciese, pues la nueva ip del Arduino no la sabes. Con el Arduino mini yun, hay otro tema este producto es de “la otra  compañía de Arduino” , así que tendréis que bajaros su ide propia.


Lo primero que descubres del yun es que las librerías wifi de Arduino no funcionan, resumiendo un poco el Arduino no tiene wifi lo tiene el Linux, así que se ha de emplear la librería Bridge.h para poder comunicar el Arduino con el linino y es el Linux el que podrá recibir y enviar mediante wifi.
Para la comunicación íbamos a emplear el protocolo UDP para ello haríamos un programa en python que corriera en el linino  que nos abriera un puerto en 192.168.0.102:2390 desde el cual recibiría instrucciones para testear el robot. Del mismo modo en el ordenador ejecutaríamos otra aplicación en python que recibiría los comandos del teclado y los enviaría por el puerto.


Módulo python en linino enlace


Para instalar el módulo de python en el linino, hay que conectarse mediante ssh a la ip 192.168.0.102 que es la ip que tiene asignada el yun en nuestro router. Desde Windows yo empleo el programa putty desde Linux aquí tenéis una guía de instalación. Una vez conectados no pedirá el password que le hemos puesto al Yun para poder acceder en modo root. Ahí editamos un documento nuevo.py y ponemos el código.






Luego hacemos chmod +x lininomybot.py para cambiar los permisos y lo ejecutamos mediante:
./ lininomybot.py
o
python  lininomybot.py


Módulo python Ordenador enlace


El modulo del ordenador abre una  ventana del terminal donde podéis  escribir en mayúsculas:
W --> Forward
S   --> Backward
A  --> Left
D  --> Right
X  --> Stop
Z  --> Led
C  --> Gripper
Q --> Cámara
E  --> Sensores

Este módulo genera el puerto comunicación mediante la instrucción:

 sock = socket.socket(socket.AF_INET, #Internet
                socket.SOCK_DGRAM) #UDP

Y envía las instrucciones  mediante:

 sock.sendto(msg, (UDP_IP,UDP_PORT))

Por otro lado el mensaje es recibido por el modulo del linino,  mediante la instrucción:

 sock.bind((UDP_IP,UDP_PORT)) y msg = sock.recv(1024).

Una vez   recibido el mensaje empleamos el bridge.put(“orden”,”msg”), importante es emplear el mismo nombre de variable en este caso “orden” en el módulo de python y en programa del Arduino.

Código Arduino enlace

En el código de Arduino está hecho con trozos de otros programas y básicamente sirve para testear que todo funciona correctamente. Como el control pant tilt de la pixy, que funciona buscando el color o los colores que le hemos entrenado. Ahora no lo hace pero cuando encuentre el objeto del color nos puede dar las coordenadas (x,y) y emplearlo para una aproximación. 

El led y el gripper funcionan en modo “conmutador” , cada vez que le enviamos la instrucción cambia de estado, abierto/cerrado, encendido/apagado.

La dirección está controlada por dos servomotores de 360º, no obtienen mucha velocidad pero sí bastante control.

La parte de los sensores no está terminada, en el ejemplo empleamos Console.print(“   ”); que envía la información al linino, no es necesario emplear la librería console.h, pero no envía la información a ordenador, parte de la idea de esta publicación es refrescarme un poco el tema y continuar.

Algún enlace de ayuda con ejemplos