miércoles, 21 de noviembre de 2012

Pacman emerges victorious!

Recientemente he acabado el curso online sobre Inteligencia Artificial que imparte la Universidad de Berkeley de forma gratuita. No recuerdo haber hecho ningún curso, online o no, tan divertido a la par que intenso (verdad Luis?). El temario lo podéis ver en la web, y aquí, ver el resultado de mi última práctica.

Consiste en un agente inteligente basado en la ecuación de un tipo que se llamaba Bellman. Tras 50 partidas de entrenamiento, donde el agente toma conocimiento de los mejores movimientos, así como situaciones peligrosas donde los fantasmas pueden acorralarte, éste es el resultado:




viernes, 16 de noviembre de 2012

Mejorando el PID

Sintonizar los valores del controlador PID puede ser una tarea tediosa en general, desesperante en un cuadricóptero en particular. Mi aproximación pasaba por probar cada plano por separado, al estilo balancín, con el quad apoyado en dos sillas sobre los brazos cuyos motores no estaba probando, y observando su comportamiento, mientras cambiaba valores secuencialmente.

El problema de todo esto es que observar el quad como método de referencia se antoja deficiente, por lo que decidí implementar unas gráficas en la propia interfaz de control web, haciendo uso del objecto canvas, una vez más.


A la derecha de la pantalla podéis observar las gráficas mencionadas, representando la línea azul el ángulo actual del quad, y roja, el ángulo objetivo marcado desde los mandos. A sumple vista pueden verse oscilaciones al llegar al angulo objetivo, que provocan que una vez en vuelo, sea complicado de pilotar. Espero que gracias a esta nueva herramienta, la sintonización PID sea algo más fructífera.

Y para terminar, un vídeo de la prueba:


jueves, 6 de septiembre de 2012

Atropos Pruebas de vuelo

Y aquí va el último vídeo de las pruebas de vuelo del Atropos. Actualmente, estoy probado el controlador PID de la guiñada, estabilizado mediante DCM, valíendose del magnetómetro triaxial HMC5883L

Notaréis que la cámara de a bordo, adolece de falta de color. Sufrió daños importantes durante otra prueba de vuelo, y es como se ha podido recuperar.


martes, 19 de junio de 2012

Filosofía del hacking ético

El hacker no es alguien con un pasamontañas y una corbata delante de un portátil con un vinilo de calavera. Es una filosofía, y una forma de ver y hacer las cosas. El hacking no es sólo ordenadores, podría extrapolarse a cualquier pensamiento lateral. ¿Has usado las llaves para abrir una lata a la que le faltaba la anilla? Eso, también es hacking.

Las escuelas no son un buen sitio para crear hackers, aniquilan la curiosidad. El hacking es curiosidad por descubrir el funcionamiento de las cosas, por hacer preguntas incómodas, y no conformarse con la respuesta. Esto es muy difícil de digerir para muchos profesores, e inaceptable para seguir el curso del "programa". Tampoco lo es para muchas empresas, que, aunque maquilladas entre anglicismos, imasdésmasies, y posits de colores, no dejan de pedir lo que sale de las fábricas de autómatas escuelas.

Por eso, mi propuesta para @CampusParty es la de crear una cultura del hacking, del bueno, de la curiosidad, de las soluciones insultantemente sencillas y poco ortodoxas. Usar lo que tenemos a nuestro alcance para algo más y reivindicarlo. Es nuestro derecho y obligación. Algo que no me canso de defender en este blog.

viernes, 8 de junio de 2012

I2C bitbanging con OpenWRT en Fonera 2201

Vuelvo con un tutorial, y ésta vez es sobre cómo podemos exprimir nuestro router al máximo en cuando a tema de I/O se refiere.



Este proceso fue imprescindible para poder afrontar con éxito la arquitectura del Atropos, ya que se necesitaba al menos un puerto I2C para comunicarse directamente con los sensores Wii evitando intermediarios.

Hardware


 Lo primero que tenemos que hacer es localizar 2 pines GPIO libres. Cada 2 pines, podemos crear un puerto I2C. Un pin para SCL y otro para SDA.


Una vez abierta la carcasa, procedemos a identificar los GPIO. En la Fonera 2201 podemos encontrar suficientes usando las líneas que controlan los LED de actividad de red.

Identificando líneas GPIO, el número de línea está indicado a rotulador
Aquí hemos localizado cuatro GPIO, suficientes como para montar 2 puertos I2C independientes. Se tratan de las líneas 1,3,4,7.

Lo siguiente que tenemos que hacer es acceder a ellas, sacando los respectivos cables. Es una operación delicada, ya que hay que soldar junto a las resistencias SMD que vienen con los LED. Notar que en el caso del GPIO 3 la línea viene sin utilizar y la tarea se facilita.

Para ir sobre seguro, decidí ubicar una placa de puntos sobre la placa de la fonera, para tener una buena base desde la que sacar cables.

Éste es un buen sitio donde emplazar nuestra placa perforada


Una vez localizado el sitio, adaptamos nuestra placa perforada hasta que encaje sin problemas

Salvamos las dos resistencias de arriba

Limamos la superficie del GPIO libre de LED, para evitar el barniz


Además de sacar las líneas para el I2C, preparamos la placa para contener las líneas de 3.3V y GND

Soldando pequeños trozos de cable rígido a los terminales, procuramos que coincidan con los terminales GPIO

Al colocar la placa, ajustamos los terminales cuidadosamente, para que al siguiente paso, sólo sea necesario un poco de soldador




GPIO7: amarillo, será SCL, GPIO4: verde, será SDA



En este ejemplo hemos obtenido 3 de las 4 líneas que buscábamos. En este punto, ya podríamos usar un puerto I2C, utilizando 2 de las 3.
La cuarta, basta con repetir los pasos con una placa de puntos adicional, junto a la más grande.

Para alimentar nuestros gadgets I2C, podemos aprovechar la línea 3.3V del puerto serie de la propia Fonera. Esquema:




Una vez que tenemos tanto la línea de 3.3V + GND, y dos líneas GPIO disponibles, es hora de definir SDA y SCL del I2C. Realmente podemos elegir cualquiera. Aquí mi configuración con el primer I2C:

GPIO7: amarillo=SCL
GPIO4: verde = SDA
+3,3V Serie: rojo= +3.3V
GND Serie: blanco=GND


Software

Para poder usar nuestro nuevo puerto, es necesario cargar un módulo especial en el kernel, se trata del módulo i2c-gpio-custom.ko
Necesitamos soporte para i2c para el kernel. Aquí unas pantallas orientativas para habilitarlo desde una compilación manual.




Después de hacer esto y flashear la Fonera con el nuevo kernel, el módulo no estaba disponible. Tuve que subirlo manualmente copiándolo a través de ssh, desde la carpeta de compilación de OpenWrt, buscando el propio fichero i2c-gpio-custom.ko

En mi caso, quedó aquí: /lib/modules/2.6.26.8/i2c-gpio-custom.ko

Una vez en nuestra Fonera con OpenWrt, hacemos iniciable el módulo e indicamos los pines que queremos usar:

$router# mv /etc/modules.d/59-i2c-gpio   /etc/modules.d/59-i2c-gpio-custom 
$router# echo "i2c-gpio-custom bus0=0,4,7 bus1=1,3,1" >/etc/modules.d/59-i2c-gpio-custom

$router# echo "i2c-gpio" >/etc/modules.d/60-i2c-gpio
$router# reboot


Notar el parámetro bus0=0,4,7 y bus1=1,3,1 estamos indicando que queremos 2 puertos I2C, el primero va a estar en /dev/i2c0, con pin GPIO4 como SDA y GPIO7 como SDL. El segundo va a estar en /dev/i2c1 con pin GPIO3 como SDA y GPIO1 como SDL

Ahora podemos montar cualquier gadget I2C a cualquiera de nuestros buses I2C y hacer un sondeo con el paquete i2c-utils que tendremos que tener instalado.

$router# i2c-detect /dev/i2c0



Más información:

http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/i2c-algo-bit.h#L43
http://www.mjmwired.net/kernel/Documentation/i2c/dev-interface