Hackeando una Flying3D FY-Q7

Hace unos días llegó a mis manos una radio de radiocontrol Flying3D FY-Q7, modelo que al parecer viene incluida en un kit junto con algunos multicópteros de la misma marca. La radio está muy limitada en funciones, pudiendo utilizarse casi exclusivamente con los aparatos con los que viene, pero para un ala fija es muy limitada, sin poder ajustar canales, dual rates, expos… y sin mezclas, con lo que habría que olvidarse de alas volantes o colas en V, etc, además de no sportar múltiples modelos. Su propietario me preguntaba si sería posible hacer algo con ella…

Pero mirando la radio, basta un momento para darse cuenta de que su aspecto es clavado a la Turnigy i6 (también vendida bajo la marca FlySky), salvo porque tiene menos interruptores, pero palpando las pegatinas embellecedoras, se notan los agujeros… y después de retirar los tornillos y abrirla, comparando el PCB con imágenes de la Turnigy encontradas en internet, vemos que es la misma radio.

Turnigy, al contrario de Flying3D (primera vez que veo esa marca por cierto), saca actualizaciones de firmware para su radio, que se puede flashear con un simple conversor USB-serie conectado a los pines del puerto trainer, iniciando la radio en modo bootloader,  y ejecutando una aplicación del fabricante para realizar el proceso (Aplicación para windows pero que funciona perfectamente en Linux bajo Wine si enlazamos el dispotivo COM a nuestro puerto serie-USB). Manos a la obra. Inicio la radio en modo bootloader siguiendo las instrucciones para la Turnigy (trim de throttle abajo, trim de timón derecha y encender) y parece que se enciende pero no sale nada en pantalla, así que parece que funciona, conecto el conversor USB-Serie a los pines indicados, y ejecuto la aplicación de Turnigy. Después de intercambiar los pines TX y RX (ups!) parece que la detecta al conectar y aparece una versión de firmware en pantalla. Bien, le doy a actualizar, se transfieren datos durante unos segundos y… nada, la radio no vuelve a dar señales de vida. Depués de varios intentos no consigo que ejecute el nuevo firmware, así que empiezo a mirar otras opciones. La suposición es que el bootloader de Flying3D debe flashear el firmware en otra posición de memoria de la que espera el firmware de Turnigy, al ser este mucho más simple, porque por lo demás el hardware es idéntico (salvo la falta de dos interruptores que simplemente no están, aunque están sus conexiones). Pero al abrir la radio, ya había visto que había un conector SWD (Single Wire Debugging)  para la CPU de la radio, un Kinetis ARM Cortex M0 de Freescale.

Asi que buscando información por internet, encontré la página del proyecto https://github.com/benb0jangles/FlySky-i6-Mod-, un repositorio con modificaciones a los firmwares originales de Turnigy, con mejoras como más canales, más interruptores, etc. En este repositorio veo los volcados completos de la flash de la CPU usando el interfaz SWD, así que supongo que podré flashearla completamente, incluyendo el bootloader de Turnigy y asunto arreglado. Afortunadamente tengo un interfaz STLink V2 (un clon barato de Aliexpress), que se puede usar con OpenOCD para flashear estas CPUs.

Lo primero es crear una configuración de OpenOCD para esta CPU e interfaz:

frskyi6-jlink.cfg:

source [find interface/jlink.cfg]
transport select swd

set CHIPNAME MKLx
source [find target/klx.cfg]

Y lanzar OpenOCD definiendo los bancos de memoria de este chip:

  $ openocd -f frskyi6-jlink.cfg -c "flash bank MKLx.pflash kinetis 0x00000000 0x0000ffff 0 4 MKLx.cpu" -c init

Una vez lanzado, nos conectamos por telnet (locallhost 4444) a este OpenOCD y ejecutamos los siguientes comandos para borrar la memoria y flashear el firmware completo original de Turnigy descargado del proyecto FlySky-i6-Mod-:

> kinetis mdm mass_erase
> reset halt
> program tgyi6_ori.bin 0

Pero… problemas. No se por qué, pero con mi configuración no me deja programar completamente la flash del Kinetis, no se si es por el interfaz STLink o si hay algún problema con la versión que uso de OpenOCD, pero por más que lo intento cambiando las velocidades del SWD, borrando y programando por bloques de memoria flash, probando todas las opciones de bloqueo y desprotección de la memoria, etc, no consigo flashear los 64K del firmware original y siempre me da error a media escritura.

Haciendo algunas pruebas con los comandos de escritura de OpenOCD, veo que si es posible escribir en la flash que guarda los datos y que en las pruebas puedo programar hasta 4K sin problemas, así que me viene a la mente la posibilidad de cortar el firmware esperando que el bootloader se grabe correctamente y que luego pueda subir el resto del firmware con el procedimiento de actualización por el puerto USB-serie. Asi que usando el comando dd voy cortando trozos del firmware original y flasheándolo a ver en que momento el bootloader responde desde el puerto serie.

$ dd if=tgi6_ori.bin of=tgi_ori-rev-bin bs=1K count=4

Flasheo una versión de 4K y el flasheado es correcto, pero el bootloader no responde por el puerto serie, pruebo con 8K, flashea pero tampoco hay respuesta, pruebo con 16K…

Y eureka! Además de flashear los 16K sin problema, cuando ejecuto la aplicación de Turnigy conectado por el puerto serie…

Me detecta una versión de firmware en la radio, con lo que el bootloader está activo, le doy a programar y recibo el saludo del firmware de Turnigy ejecutándose en la radio.

Ya de paso pruebo a instalar un interruptor extra instalándolo en uno de los agujeros ocultos y conectando su pin intermedio a uno de los pines libres en el conector de los interruptores existente, y reconocido por el firmware a la primera).

Ha costado un poco, pero hemos pasado de una radio totalmente limitada, a una radio que se puede utilizar con múltiples modelos, con receptores baratos de Turnigy, y que incluso soporta telemetría. Espero que os sirva de ayuda.

ASHAB NearSpaceOne

Desde hace unos meses un grupo de aficionados a la electrónica abierta y fabricación digital que nos conocimos alrededor de fabLAB Asturias, estamos desarrollando un proyecto de misión de alta altitud usando globos meteorológicos. La idea era participar en Global Space Balloon Challenge, un concurso abierto e internacional consistente en precisamente en la realización de estas misiones para promocionar la investigación y la experimentación científica por la ciudadanía, usando un entorno tan atractivo como es el acercamiento al espacio.

Este proyecto lo hemos llamado ASHAB (Asturias High Altitude Ballooning), y NS1 (Near Space One) a nuestra primera misión.

La misión básicamente  consiste en poner a prueba la base de los sistemas que pensamos emplear para futuras misiones: ordenador de a bordo, comunicaciones, imagen, sistema de recuperación y estaciones de tierra. A partir de esta primera misión, esperamos poder probar ideas más técnicas y sistemas más complejos, pero primero vamos a intentarlo con lo básico. Para registrar el vuelo, llevaremos varias cámaras HD y sensores, y la ultima adición es una cámara 360º que esperemos consiga unas imágenes increibles de toda la misión.

Todo el proyecto es por supuesto abierto. Estamos compartiendo los diseños y el código tanto en el wiki del grupo, como en repositorios online como github, y el contenido generado (datos, imágenes, vídeos) será también publicado con licencias libres una vez realizada la misión.

Para más información, podeis consultar la web y el wiki.

ViejuLCD USB

Ya tengo el prototipo del ViejuLCD versión USB, he preparado el PCB y todo correcto a la primera. Ahora mandaré un par de ellos a un par de compas de vieju.net para que desarrollen software del lado del PC.

viejulcd-protousb-2La idea es hacer un servidor de datos al LCD, que implemente una cola y a la que las aplicaciones que quieran hablar con el LCD se conecten por sockets y dejen el stream de texto/comandos que quieran mandar. Asi no habra conflictos de bloqueo entre las aplicaciones si dos toman el control del puerto al mismo tiempo. Luego tenemos pensado desarrollar varios clientes,  para datos del sistema, notificaciones, etc.

En el lado XT, la idea de JoJo, es hacer un programa residente de DOS (TSR), que capture ciertas interrupciones para recabar datos del sistema y asi enviarla al LCD. Con esta técnica se podria incluso usar el LCD de pantalla externa, capturando las interrupciones necesarias.

Yo he estado haciendo un pequeño demo, para probar los comandos implementados en el firmware del LCD, y la verdad, ha sido un éxito.

Lo programé en ruby, toma el control directamente del puerto, y hace una serie de pruebas del firmware, texto, scroll, niveles de brillo, activacion/desactivación, etc.

Podeis ver un video del demo a continuación:

ViejuLCD

Estoy junto con la gente de Vieju.NET prototipando un pequeño dispositivo que nos ha parecido divertido e interesante tener. Un display LCD conectable al puerto USB. Aunque ya hay muchos de estos dispositivos, queriamos hacer uno que tanto el hardware como el firmware fueran libres, y además, diseñar un protocolo muy simple para poder usarlo desde cualquier lenguaje, maquina, etc.

El resultado es el ViejuLCD… el LCD está controlado por un attiny2313, y para la comunicación al final hemos optado por dos versiones, la USB, con un ft232rl para hacer de interfaz USB/Serie, y una basada en un max232 para poder controlarlo desde un puerto serie normal.

El protocolo es muy sencillo, y está documentado en el wiki. Basicamente se envian caracteres ascii que se muestran en pantalla, salvo que se reciba el ascii 0x09, que entonces  se pone en modo comando e interpreta un cierto número de bytes siguientes dependiendo del comando que le mandemos.

La idea es desarrollar varios módulos para ciertos programas, como por ejemplo el MAME, para que nos muestre los créditos que nos quedan, un monitor de recursos del sistema, un TRS para DOS con diversas funciones…

En el siguiente video podeis ver la versión serie recibiendo datos desde un PC XT ejecutando MSDOS 3.3.  Un simple programa hecho en TurboC hace la magia:

Cartucho MSX-DOS2

Desde hace un tiempo tengo un MSX2, un Phillips VG8235. Me lo donaron en GP32Spain, no le funcionaba la disquettera y el dueño buscaba algumsxdos2-cartien que le diera un hogar y lo arreglara. Asi hice. Le adapté un disquetera de PC (cambia completamente el cableado, y hay que sacar un par de señales de otros conectores), y asi puede leer discos de 720K (la original es de 360K). Estuve estos dias trasteando con CP/M y con MSX-DOS, incluyendo compilar cosas en C nativamente con el compilador de hitech para CP/M (que funciona en MSX-DOS tambien).

Como el MSX-DOS 1 es bastante limitado, estuve buscando información y vi que se puede meter la bios del MSX-DOS2 en un cartucho externo, como ocupa 64K, con una EPROM 27C512, parecería suficiente, pero no, como el MSX sólo puede direccionar directamente esos 64K, tiene que usar paginación para poder tener  en memoria,  la bios, el sistema y ram libre, así que hay que añadir algo de lógica para que pueda paginar esa bios de MSX-DOS2. Está todo muy bien explicado en varias páginas, asi que me fue bastante fácil diseñar el cartucho.

Más fotos, esquemas y PCBs a continuación…

Sigue leyendo

Nuevo miembro en el taller

El taller crece, con la llegada de mi nueva estación de soldadura de aire caliente, una Soldtec 830c, que es una estación básica, pero más que suficiente para mi uso. Viene con tres boquillas redondas de diferentes diámetros, y hay una buena gama de ellas para elegir, además muy barata. Tiene una cosa que me hace gracia, cuando la apagas, se queda como un minuto o asi lanzando aire frio para refrigerar el equipo antes de apagarse sola. Ya la he estado probando y desoldar cosas con ella es una pasada. A ver que pida un poco de pasta y pruebe a soldar SMDs. Ahi queda instalada en mi rincón de trabajo.

Insoladora con LEDs UV y temporizador.

Estoy haciéndome una insoladora de PCB’s con LEDs UV. La idea me la dieron los chicos de http://radikaldesig.com/, que estuvieron trabajando en una. Después de hacer el PCB con los LEDs en una protoboard de tiras, pensé que sería interesante tener un temporizador que se encargara de apagar automáticamente la insoladora para no pasarme si se me olvida encendida. Asi que cojí otros trozos de protoboard y me he hecho uno, basado en un attiny2313, un 4511 para gestionar un display LED de 7 segmentos, un relé, y poco más. Podeis ver un video con un test del temporizador a continuación. El temporizador cuenta minutos, pero para hacer las pruebas esta muy acelerado como se puede ver en el video:

En siguientes entradas publicaré el esquema y el código de este temporizador por si os interesa.

EDIT: Os dejo el esquema del temporizador:

Y el código del micro; incluyo un makefile para compilarlo (make), flashearlo (make flash) y flashear los fuses (make fuses). seguramente tendreis que adaptarlo a vuestro programador, puertos, etc:

temporizador1

PCBs de los cartuchos 32Mbit Flash, 1Mbit SRAM.

Ayer me llegaron los PCBs del prototipo de cartucho flash para la gameboy en que estuve trabajando estos meses. Es un cartucho MBC5, con hasta 32MBit de FLASH (soporta chips de 16 ó 32Mbit), y 1Mbit de SRAM (128KB), con pila para poder guardar partidas. Con esta configuración se puede usar un 99% del software disponible para la gameboy (juegos y apps homebrew), incluyendo el LittleSoundDJ y el NanoLoops.

Ayer mismo monté uno de ellos, y parece funcionar correctamente; además de un programa hecho por mi que somete al cartucho a unos tests (bancos de ROM y salvado en la SRAM), probé a meter el ZELDA DX (8MBit), a jugar una partida, guardarla, sacar el cartucho y meterlo en otra gameboy y comprobar el guardado de la partida. Todo perfecto.

Solo tiene un pequeño fallo, el condensador de abajo del todo (C4) choca con la tapa y hay que hacerce a esta una pequeña muesca para que cierre, nada, en el diseño final lo subiré un poco y listo. Me quedaré con uno o dos, y el resto están adjudicados a seguidores del proyecto, en unos dias los montaré y empezaré a mandarlos, y dentro de poco pediré mas placas para seguir construyéndolos para los interesados. :-)

Cart Flasher

El programador está funcionando perfectamente. Tuve unos problemas programando el microcontrolador, pero ya está todo solucionado. Acabo de hacer unas pruebas y está todo correcto. Ahora a seguir depurando todo, he movido un par de componentes para el PCB final, pero el diseño es bueno, asi que ya solo quedan los cartuchos para tener todo listo para ponernos manos a la obra.

PCBs del CartFlasher

Me acaban de llegar los PCBs del programador de cartuchos flash de GameBoy en el que estoy trabajando. De momento visualmente están perfectos, y los conectores y los componentes encajan a la perfección, además han quedado muy bonitos.

Esta noche o mañana montaré uno para probarlo, a ver que tal va. Ya solo queda que me llegen los PCBs de los prototipos finales de los cartuchos, con 128KB de SRAM, que los tengo fabricando ahora mismo.

A la que lleguen y esté todo probado, ya podremos poner en marcha esos pedidos conjuntos de los que muchos estais deseosos.

Saludos!