TRRP es una plataforma de bajo coste que utiliza routers domésticos modificados con OpenWRT como plataforma para proyectos de Internet de las Cosas y robótica. Los routers pueden usarse como controladores para drones, rovers y otros dispositivos, equipados con sensores como acelerómetros, giroscopios y cámaras conectados a través de puertos I2C y serie. El documento describe cómo configurar los puertos, leer los sensores y estabilizar los sistemas mediante programas de control ejecutados con alta prior
David Meléndez Cano - Trash Robotic Router Platform (TRRP) [Rooted CON 2013]
1. David Meléndez Cano
@taiksontexas
Taiksonprojects.blogspot.com Taiksonprojects.blogspot.com
2. ¿Qué es TRRP?
➔
Plataforma de desarrollo de bajo o ningún coste
➔
“Internet de las cosas”
➔
Usa lo que tengas por casa
➔
Los trastos pueden ser útiles
➔
No tirar, no reciclar: Reutilizar
Taiksonprojects.blogspot.com
2
3. Usa tu viejo router como plataforma domótica / robótica
➔
Inversión inicial cero. Ya dispones de él
➔
Cambia el firmware: Ej: Linux OpenWRT
Pruebas de concepto:
ROVER Texas Ranger: Linksys Cuadricóptero ATROPOS:
WRT54GL La Fonera 2201
Taiksonprojects.blogspot.com
9. Plataforma router: Puertos I2C y serie
GPIO---> I2C / RS232
Puerto serie
Pines GPIO
Taiksonprojects.blogspot.com
10. Plataforma router: Carga de módulos
rm /etc/modules.d/59i2cgpio
echo "i2cgpiocustom bus0=0,4,7 bus1=1,3,1" >/etc/modules.d/59i2cgpiocustom
echo "i2cgpio" >/etc/modules.d/60i2cgpio
[reboot]
i2cdetect /dev/i2c0
Taiksonprojects.blogspot.com
11. Plataforma router: Puerto serie
stty -F /dev/ttyS0 raw
stty -F /dev/ttyS0 speed 115200
Taiksonprojects.blogspot.com
12. Plataforma router: Sensores - Giroscopio
Wii Motion Plus
Giroscopio triaxial
Puerto I2C
•
Nos dice a qué velocidad estamos girando en cada plano
•
No tan sencillo: Deriva
Taiksonprojects.blogspot.com
13. Plataforma router: Sensores - Acelerómetro
Wii Nunchuck
Acelerómetro triaxial
Puerto I2C
Mide la aceleración (g) en cada plano.
Taiksonprojects.blogspot.com
14. Plataforma router: Sensores - Magnetómetro
-Magnetómetro triaxial HMC5881L
-Gauss en cada plano
-El acelerómetro sólo anula la deriva en los planos de cabeceo y alabeo.
-El plano de guiñada (rumbo) se corrige obteniendo el rumbo actual en
grados, con respecto al norte.
Taiksonprojects.blogspot.com
15. acelerómetro
giroscopio
Imagen: “The Balance Filter” MIT
Pro: “Filtro de Kalman”; “Matriz de Cosenos Directores”
Taiksonprojects.blogspot.com
16. Plataforma router: Leyendo los sensores
ID único para cada sensor. Ej Wii Motion+: 0x52
•
Petición de datos escribiendo al dispositivo
•
Lectura de datos en buffer
#include <linux/i2cdev.h>
f_i2c0=open(I2C0, O_RDWR);
ioctl(f_i2c0, I2C_SLAVE, 0x52);
write(f_i2c0, buff_out, data_size);
read(f_i2c0, buffer,size);
Taiksonprojects.blogspot.com
17. Plataforma router: programa estabilización IMU
➔
Programa crítico que debe ejecutarse en intervalo de tiempo fijo
setitimer(ITIMER_REAL,&i_int,NULL);
(void)signal(SIGALRM ,timeout_real);
➔
Compite por el tiempo de CPU con el servidor web (telemetría y control)
➔
Cambiar la prioridad del proceso con nice no es suficiente: Real Time scheduling →
FIFO, Round Robin
#include <sched.h>
schedule.sched_priority=sched_get_priority_max(SCHED_FIFO);
sched_setscheduler(pthread_self(), SCHED_FIFO,&schedule);
Taiksonprojects.blogspot.com
18. El proceso watchdog informa al kernel de que el sistema no está colgado.
●
Consume su parte de CPU
●
Si se cuelga el router en pleno vuelo:
➔
ioctl(“/dev/watchdog”, WDIOC_KEEPALIVE, &dummywd);
Taiksonprojects.blogspot.com
19. Plataforma router: placa de control
-Mínimos componentes externos: Sólo para generar señales PWM
-Válido cualquier microcontrolador con UART y un par de timers
Fonera
PIC16f876A
/dev/ttyS0
ESC
Motores
Taiksonprojects.blogspot.com
20. Control HTTP
Las órdenes se transmiten a través de peticiones HTTP GET
-Desde eventos keydown keyup de javascript por AJAX
-Desde el proceso que lee del mando USB
http://atropos/cgibin/ajaxinput?QQZ[GAS]Z[ALABEO]Z[CABECEO]Z[GUIÑADA]Z
Deben ser muy fluidas y baratas en tiempo de CPU:
Httpd tweak:
Httpd.c:
[...]
if (strncmp(tptr, "cgibin/ajaxinput", 17) == 0) {
[...]
strcpy((char *)shmat(shmget(9998, 30, IPC_CREAT | 0666), NULL, 0),g_query);
exit(1);
}
[...]
Taiksonprojects.blogspot.com
21. Control UDP desde mando USB
cat /dev/input/js0
pad=open(“/dev/input/js0”,O_RDONLY);
reads=read(pad,msg,MSG);
(msg[7]==2)//gas
gas=((analog+127))*GAS_FACTOR;
[...]
(msg[7]==4)//guiñada
guinnada=analog*GUINNADA_FACTOR;
[...]
(msg[7]==1)//cabeceo
cabeceo=analog*CABECEO_FACTOR;
[...]
(msg[7]==0)//alabeo
alabeo=analog*ALABEO_FACTOR;
[...]
Taiksonprojects.blogspot.com