lunes, 29 de abril de 2013

Configurando el mando a distancia del Quad-Raspi-copter

Usando wifi y Android

Buenas tardes, tengo un poco de sequía de post, lo siento. Últimamente hago muchas pruebas que no llevan a nada, así que pierdo mucho tiempo, del poco tiempo que tengo. Comentaros que ya tengo probados el 100% de los componentes del Quad-Raspbi-Copter por separado, incluso tengo ya listos todos los cables para la versión final.
Bueno, hoy os voy a enseñar como me he montado la emisora, radio o mando distancia, como queráis llamarlo. Realmente este post podría llamarse "conexión wifi punto a punto contra un Android", pero es más interesante si lo oriento a lo que me interesa.

Uno de los grandes problemas a la hora de controlar un radiocontrol, es la radio. Si queremos poder controlar muchas cosas simultáneas, necesitaremos muchos canales, un sistema de radio emisión/recepción de muchos canales es muy caro y requiere un hardware adecuado, posiblemente Arduino. Así que paso, como es necesario que mi proyecto se controle desde el Android, voy a usar algo que Android tiene, wifi. Así que en el QRC lo único que tengo que poner es un wifi USB, y resulta que el otro día apareció en un cajón, mi antiguo wifi USB con el que me dedicaba al Aircrack:

tiene un señor antenon y una ganancia muy buena. Lo ideal sería, que el wifi del QRC actuase como AP, pero resulta que el driver de Realtek para este chipset, no trae ese modo. Así que será el Android, usando la función de Zona Wi-Fi Portatil, el que se muestre como AP y el QRC como cliente:

Lo primero será:

Configuración de Zona Wi-Fi Portatil en Android

En mi caso uso CyanogenMod, esta opción la tengo en Ajustes >  CONEXIONES INALÁMBRICAS Y REDES (Más ...) > Anclaje a red y zona Wi-FI
Vamos a la configuración y ponemos (por ejemplo):
SSID: QRC
Seguridad: WPA2 PSK
Contraseña: vooooolaaaareeeeUOUO
y activamos la Zona Wi-Fi

Confuración del RaspberryPi como cliente WIFI

Primero antes que nada, es asegurarnos que el kernel de nuestro Raspberry, tiene el controlador apropiado. Conectamos el dispositivo y ejecutamos:
dmesg
Veremos algo como esto:
[   67.991351] rtl8187: wireless switch is on
[   67.992103] usbcore: registered new interface driver rtl8187 

Eso quiere decir, que la cosa pinta muy bien. Nos aseguramos, si aparece el interfaz con:
ifconfig -a
eth0      Link encap:Ethernet  HWaddr aa:bb:cc:dd:ee:ff
          inet addr:192.168.1.33  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:374 errors:0 dropped:0 overruns:0 frame:0
          TX packets:386 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:28845 (28.1 KiB)  TX bytes:69915 (68.2 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr ff:ee:dd:cc:bb:aa
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
siiiii ahí lo tenemos, se llama WLAN0, este nombre cambia dependiendo del controlador. Ahora instalamos un par de cosillas:
apt-get update
apt-get install iw wireless-tools wpasupplicant

Ahora generamos "el código" que es la clave de la Zona Wi-Fi del Android:
wpa_passphrase QRC vooooolaaaareeeeUOUO

y nos devuelve, entre otras cosas, una linea que empieza por psk= y un montón de carácteres más. Ahora editamos el archivo /etc/wpa_supplicant/wpa_supplicant.conf:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="QRC"
  scan_ssid=1
  proto=WPA RSN
  key_mgmt=WPA-PSK
  pairwise=CCMP TKIP
  group=CCMP TKIP
  psk=elcodigosuperlargoquehasalidoanes
}
Activamos:
pkill wpa_supplicant
ifconfig wlan0down
ifconfig wlan0 up
iwconfig wlan0 essid "QRC"
wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf
dhclient wlan0

Comprobamos con:
ifconfig wlan0
y si tenemos una IP (192.168.43.91 en mi caso) es que te ha funcionado. Ahora desde el Android puedes acceder al Apache, ssh o lo que sea que tengas en el RaspberryPi :)

Automatizando el proceso y reconexión

Ahora viene la parte curiosa, vamos a hacer que se conecte de forma automática en caso de perdida de señal o primera conexión. Se supone que el wpa_supplicant hace esto, tambien se supone que el network-manager lo hace, pero por más que lo he intentado, no he conseguido nada así que me he fabricado este script: /usr/local/bin/auto_conexion_android.sh
#!/bin/bash
android=192.168.43.1
while ((1));
do
        if ! $(ping -c 1 $android > /dev/null );
        then
                echo no hay ping, levantar;
                echo led rojo;
                pkill wpa_supplicant;
                ifconfig wlan0 down;
                ifconfig wlan0 up;
                iwconfig wlan0 essid "QRC";
                wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
                dhclient wlan0;
        fi
        sleep 1;
                echo led verde;
done
Ponemos que el script se ejecute en cada inicio (/etc/rc.local) y listo, ya tengo el mando a distancia de mi "maquina de volar" y de lo más baratito.

5 comentarios:

  1. Por fin públicas, llegue a pensar que abandonaste el blog, menos mal que no uf uf uf

    ResponderEliminar
    Respuestas
    1. que vaaaa, lo que pasa es lo que comento más arriba, hago muchas pruebas combinando muchas cosas a la vez y no salentodo lo bien que me ggustaría.
      Tengo como 10 posts en borrador y muchos más en la cabeza.

      Eliminar
  2. ala que pelado no lo as tratado de control con touchosc aqui te dejo una de mis pruebas con android y arduino por supuesto solo me falta integrar la raspi y ese script me servira mucho :) gracia te dejo el video si te interesa https://www.youtube.com/watch?v=_ucmo8Ie_Rs saludos desde guatemala

    ResponderEliminar
    Respuestas
    1. esta curioso el touchosc, no lo conocía. No se como lo as integrado con arduino, pero la verdad es que si no lo explicas en un tutorial o manual, no le veo interés ninguno ¿lo has publicado en alguna web?

      Eliminar
  3. la verdad no lo e publicado solo se lo e enseñado a cierto amigos si queres aselo si te interesa jejeje hay mucha info pero relacionada con macintosh y pero yo lo e implementado con android si quere cuando llegue a casa impiezo aserlo porq esta app no tien soporte para crear tus propias plantillas pero con un poco de hack jejej podras aser las tuyas solo investigate un poco de todo lo que la gente a logrado touchosc en macintosh pero seria chilero verlo en tu raspicorter :) saludos de guatemala

    ResponderEliminar