RaccoonBoard #1 Diseñando un sistema empotrado Linux

Hace un par de semanas que empecé uno de los proyectos personales más complejos a los que me he enfrentado, pero de momento está siendo más sencillo de lo que me esperaba gracias a toda la información que hoy en día se puede encontrar en innumerables fuentes en internet. Después de leer el increible artículo de Jay Carlson «So you want to build an enbedded Linux system», y de leer algo más sobre los procesadores mencionados en el mismo, me animé a diseñar una placa de desarrollo para uno de ellos, y meterme de lleno en el diseño de uno de estos sistemas. De mano parece algo bastante intimidante. Un sistema con una CPU a cientos de megahertzios, con memoria dinámica, buses modernos como USB y ethernet, configurar, compilar y conseguir arrancar uBoot y Linux… Muchos retos a nivel de hardware y software. Pero al empezar a leer la documentación existente, muchas cosas parecían asequibles. Así que dedidí tirarme a la piscina. Para empezar elegí uno de los procesadores que de entrada parecía más sencillo, un NUC980 de Nuvoton. Una de las ventajas de este procesador es que lleva RAM DDRII integrada (64MB), con lo que de un plumazo se elimina una de las mayores complejidades de un sistema moderno con microprocesador, el bus de DRAM con sus señales de longitudes e impedancias controladas. Además como comenta Jay Carlson en su blog, esta plataforma tiene otras ventajas para un principiante, como un sistema Buildroot simplificado por el fabricante, un encapsulado TQFP con sus pines en vez de un array BGA, y también importante, un precio especial para prototipos con un gran descuento para las 5 primeras unidades del integrado. Leyendo sobre los problemas que Jay Carlson tuvo con la versión de 64 pines (básicamente la selección del modo de arranque por no estar todas las señales de configuración del chip en pines externos), me decidí por la version de 128 pines que si tiene todas estas señales presentes. Así que mi selección final fue el Nuvoton NUC980DK61YC, en formato TQFP de 128 pines y con 64MB de DDRII integrados. Esta CPU tiene un núcleo ARM926EJ-S hasta 300MHz, y viene cargada de periféricos propios de un sistema empotrado, 2 puertos USB 2.0 y varios 1.1, dos puertos de tarjeta MMC/SD, 20 canales DMA, interfaz de entrada de vídeo digital, 8 canales de ADC de 12 bits, y varios puertos de I2C, PWM, SPI, UART, CAN…  de todo.

Una vez elegido el microprocesador, lo siguiente es empezar a leer la documentación del fabricante. Básicamente me basé en dos documentos, su datasheet principal, y su guia de diseño de hardware. Aunque al principio diseñar un sistema de este tipo desde cero pueda parecer muy intimidante, normalmente contaremos con bastante información de los fabricantes. Guias concisas sobre que necesitaremos para hacer funcionar nuestro sistema, incluyendo información sobre como conectar cada periférico, requisitos de alimentación, reset, desacople, reloj, etc, incluyendo muchas veces además de los esquemas de ejemplo consejos sobre el enrutado del PCB. Así que me puse a analizar toda esta documentación para empezar a diseñar que quería en mi placa, que componentes necesitaría, y cómo conectarlos.

Alimentación y desacople
Alimentación y desacople

Empezamos con la alimentación. Una CPU de este tipo suele tener ciertos requerimientos de alimentación que a veces son complicados y se dejan en manos de un PMIC (Power Management IC), que se encarga de generar los voltajes necesarios en el orden correcto. En el caso del NUC980 esto se simplifica un poco ya que no son necesarias complejas sincronizaciones de los diferentes voltajes en cascada ni nada de eso, así que nos ahorramos el PMIC y podemos usar reguladores normales. Eso si, en este caso necesitaremos tres: 1.2V para el núcleo de la CPU, 1.8 para la memoria DDRII, y 3.3V para los periféricos y la I/O. Por disponibilidad (la mayoría de componentes los compré en Aliexpress por decenas para asi ir teniendo stock de ciertas cosas), seleccioné reguladores 1117 de 3.3V y 1.2V, y para los 1.8V que sólo requerían unos pocos mA, usé el LP2985.  Respecto a la alimentación no mucho más, los condensadores que recomiendan los fabricantes de cada regulador, y eso si, todos los condensadores de desacople que exige el NUC980 que son un montón, básicamente uno de 100nF en cada pin de alimentación y alguno extra , unos 20 en total sólo para la CPU. Teniendo en cuenta esta cantidad enorme de condensadores, me decidí a usar el tamaño 0402 para los mismos, y aunque sabía que luego serían complicados de soldar (nunca había usado menos de 0603 en diseños propios, aunque si los había soldado en reparaciones o kits), esto haría más fácil seguramente el enrutamiento del PCB.

Además necesitamos un pequeño circuito para la pila si queremos que el RTC de la CPU no pierda la hora al apagar el sistema, con sus diodos para prevenir que la pila reciba alimentación cuando la placa está enchufada, y el circuito de reset, el típico pulsador con resistencia pullup y condensador. También tenemos unas cuantas señales de configuración de la CPU. Básicamente definen el dispositivo principal de arranque (NAND, Flash SPI, SD, USB…), si tenemos mensajes de debug en el UART0, si el USB0 es Host o Device (que puede funcionar como un interfaz de debug del fabricante), la activación del watchdog, etc. Para esto defino en el esquema unos puentes de soldadura que me permitirán ponerlos a 0 o a 1 mientras testeo el software para la placa.

Respecto al reloj, muy sencillo, un simple cristal de 12MHz con sus condensadores de carga (valores recomendados por el fabricante) y otro de 32.768KHz para el RTC con igualmente sus condensadores de carga.

Tarjeta SD
Ejemplo de conexión de la tarjeta SD

Luego he seleccionado los periféricos base que quería tener en el sistema, una tarjeta SD como dispositivo de arranque y almacenamiento (usaré la MMC/SD0) , los dos puertos USB 2.0, el puerto serie UART0 que servirá como consola de debug y arranque de Linux, y el puerto ethernet 0. Para este último, el NUC980 sólo tiene MAC (Media Access Control o capa de enlace de datos), así que nos hace falta ponerle un integrado que implemente el PHY (Physical layer o medio físico, en mi caso un LAN8720A de SMSC), y teniendo en cuenta que hay que añadir también los transformadores,  seleccioné un conector RJ45 con ellos integrados.

El resto del esquema es básicamente seleccionar todas las señales de los GPIO y sacarlas a un par de tiras de pines en el orden más sencillo para enrutar, que por suerte en la mayoría de casos es un orden bastante lógico ordenado por puertos. Al final añado unos puntos de prueba para los diferentes voltajes, un conector USB C para la alimentación (con sus resistencias de configuración), un LED de encencido… y listo.

Y ahora empieza lo mejor, el enrutado. La verdad es que hice dos diseños del PCB. Uno en dos capas y otro en cuatro. No cabe decir que el diseño con cuatro capas ha sido considerablemente más sencillo. El disponer de un plano de tierra y otro de alimentación en las capas intermedias hace el enrutado mucho más fácil al poder bajar con vias directamente desde los pines donde necesite una de estas dos señales, y además para las pistas que tengan que tener impedancia controlada (USB, ETH…), el tener un plano de tierra directamente debajo de la capa superior sin ninguna señal atravesándola, hace el trabajo mucho más sencillo. Aunque logré enrutar la PCB con el diseño de dos capas y tengo un prototipo funcionando con ella, la verdad es que se hizo bastante más difícil e incluso tuve que dejar tres GPIOs sin enrutar ya que se me hacía imposible.

Con el diseño de cuatro capas la verdad es que se simplificó mucho el tema y terminé el enrutado en mucho menos tiempo (y pudiendo enrutar todos los GPIO). Igualmente para ambos diseños  lo primero fue posicionar los componentes en una disposición lógica (las posiciones son las mismas en ambas placas), primero la CPU en el centro y luego en función de la conexión a sus pines los periféricos alrededor de ella. Como es una placa de desarrollo y no tenía limitaciones en cuanto a forma, tamaño o disposición de los diferentes puertos, pues lo fui poniendo todo buscando el menor lio de conexiones posibles. Lo primero definir varios anchos de pista, 0.203mm (8mil) para la mayoría de señales, y 0.5mm y 0.75mm para señales de alimentación. También definí las separaciones de las señales y los anchos y separación de las señales diferenciales que tenemos que enrutar (más info sobre esto a continuación). Una vez listo esto empiezo por posicionar y enrutar los condensadores de desacople, intentando dejarlos lo más cerca de los pines que los necesitan. Luego los dos cristales y sus condensadores correspondientes, los pines del UART0, y luego los periféricos que deben tener salidas en los bordes de la PCB, ordenados según los pines a los que están conectados. Primero el más complejo, el IC del PHY de ethernet, que requiere de su propio espacio en el PCB ya que tiene sus propios condensadores de desacople y resistencias de polarización además de su propio cristal, resistencias de terminación, y el propio conector de ethernet.

Longitud de la pista y el segmento seleccionado.

Luego por posición de las señales y en el mismo lado del PCB, posiciono los dos puertos USB. Hay que tener en cuenta que estos USB 2.0 tienen que enrutarse con pares diferenciales y que son líneas de impedancia controlada. Por suerte KiCAD tiene una herramienta para ello, sólo tenemos que definir los grosores y separación de las líneas (podemos usar la calculadora de KiCAD para ver la impedancia, en el caso de USB las señales tienen que ser de 90 ohm) y nombrar las señales diferenciales con nombres acabados en +/- ó _P/_N. Luego al seleccionar la herramienta de enrutado diferencial, KiCAD ya nos llevará las dos señales a la vez hasta su destino, sólo teniendo luego que ajustar el «skew» (la diferencia de longitud entre las dos pistas) con una herramienta también disponible en el enrutado de KiCAD. También las señales finales del ethernet son diferenciales, esta vez de 100 ohm de impedancia, otra cosa a tener en cuenta.

Ejemplo de meandros en las señales de la tarjeta SD

Y para terminar con lo complejo y en el otro lado del PCB, la tarjeta SD. Aunque no son pares diferenciales, si que tenemos las cuatro señales de datos que son un bus paralelo a alta velocidad, así que lo mejor es igualar la longitud de las pistas para que las señales tengan una alta sincronización y evitarnos problemas. Para ello también tenemos una herramienta en KiCAD. Al seleccionar una pista, nos dirá la longitud de la misma (no confundir con la longitud del segmento) en la barra inferior de la pantalla, recordaremos la longitud más larga de las señales a igualar, y usando la herramienta «Tune track lenght» con esa esa longitud iremos igualando el resto de señales. Lo que hace KiCAD es ir añadiendo «meandros» a la pista hasta que iguala la longitud a la que le hemos definido. Normalmente es algo que no tenemos en cuenta cuando diseñamos circuitos para Arduino y similares que como mucho se mueven en pocas decenas de megahertzios, pero si nos adentramos en los 300MHz como este caso o más, ya hay que tener en cuenta el tiempo de propagación e igualar las longitudes de las señales que tienen que viajar a la vez (buses de datos, de dirección, pares diferenciales, etc), nos ahorrará muchos dolores de cabeza.

Por último posiciono al lado de la tarjeta SD el botón de reset, y al otro lado todos los componentes de alimentación, junto con el conector USB C que nos proporcionará los 5V para alimentar la placa. En el espacio que queda encajo el soporte para la pila del RTC y los pasivos que necesita, los puentes de soldadura para las señales de configuración de la CPU en la cara inferior, y ya solo queda el tedioso paso de enrutar todos los GPIOs externos a las tiras de pines que van a los lados del PCB. En previsión había girado la CPU 45º lo que nos deja las señales bastante ordenadas para ir sacándolas hacia los pines, auque en algunas de ellas  no queda otra que usar la cara inferior para enrutarlas. Una vez enrutado y comprobadas las reglas de diseño.

Una cosa que suelo hacer es imprimir el diseño de la PCB en papel, para posicionar encima todos los componentes y asegurarme que todo encaja, sobretodo si he tenido que crear alguna huella. Después de comprobar varias veces todo el enrutado y las reglas de diseño, DRC y demás, exporto los gerbers y a fabricar. En este caso las envié a JLCPCB por que tiene un proceso de 4 caras bastante barato. 5 PCBs de 59x92mm con envío incluido por 20€ (y 15€ son de envío!!!). En poco más de una semana tenía las flamantes PCBs en mi buzón, y ya sólo quedaba soldarlas y a funcionar! (o eso pensaba yo). La mayoría de componentes los pude soldar sin problema usando un estañador, en mi caso una estación T12 (que por cierto recomiendo encarecidamente, tecnología de soldadura moderna a un precio estupendo, y con muchas puntas para elegir). Sólamente tuve que usar aire caliente para los componentes sin pines laterales, el PHY de ethernet (QFN24) y los tres cristales. Los condensadores 0402 si que tuve que ser cuidadoso para soldarlos a ojo, pero con una punta fina en el estañador y algo de flux, acabé soldándolos sin demasiado problema (salvo alguno que salió disparado y nunca más apareció). El resultado…

Primer mensaje de la CPU, no puede arrancar desde la SD porque no tiene ni conector soldado :)

En ese momento todavía no me habían llegado todos los componentes, faltaba el conector de ethernet y el de la tarjeta SD, el portapilas, los diodos y el cristal del RTC, algunas resistencias… pero tenía lo suficiente para inciar la placa con el debug activado y ver que pasaba. Después de comprobar que que no había ningún cortocircuito en las alimentaciones, y enchufarla a 5V y comprobar que todos los voltajes eran correctos, soldé los puentes de configuración para activar el debug por el puerto serie 0, boot desde la SD, USB 0 en modo device para depuración, conecté un conversor USB-Serie a mi PC (cuidado que son señales de 3.3V) y lancé un programa de terminal serie,  pulsé reset y… respuesta de la CPU!!! Por lo menos estaba viva, así que sólo quedaría instalar las herramientas de software del fabricante y cocinar un sistema linux adaptado para la misma, mientras a esperar al resto de componentes para poder terminar el PCB y así probar todos los periféricos. Pero voy a dejar el tema del software para otro post, porque va a ser un artículo largo por si mismo.

Teneis disponible el diseño del PCB en mi Github: https://github.com/ladecadence/RaccoonBoard-PCB, pero aviso desde ya que es un prototipo y no está todo probado, así que no recomiendo a nadie fabricarla, pero para echarle un vistazo al esquema y el PCB puede valer. En unos días espero tener probados todos los periféricos de la placa desde Linux (de momento la SD, los USB y los GPIO funcionan!) y escribiré el post sobre todo el tema del software, mientras os dejo mi twitter donde iré comentando avances:  https://twitter.com/davidpello

Un saludo.

PlatformIO en VSCodium

La verdad es que la integración de PlatformIO en VSCode es espectacular, y aunque casi siempre uso la combinación de PlatformIO Core en línea de comandos y mi querido Vim, quería hacer algunas pruebas. Puestos en modo VRMS, no quería instalar los binarios de VSCode de Microsoft, así que he instalado los que provee el proyecto VSCodium, una compilación de VSCode usando las fuentes libres que provee Microsoft en Github, pero eliminando los plugins de telemetría y otras cositas no libres.

Por supuesto que instalar PlatformIO no iba a ser tan sencillo como en VSCode. VSCodium utiliza un repositorio libre de extensiones de VSCode y PlatformIO no está en ellos. Pero por suerte siempre podemos instalar las extensiones a partir de los archivos .vsix. Así que podríamos ir a la página de la extensión, a la derecha darle a «Download plugin» y en VSCodium, en la pestaña de extensiones darle al menú (los tres puntitos) y seleccionar «Install from VSIX…».

Pero PlatformIO requiere de uno de los plugins de C/C++ de microsoft, que por defecto no viene compilado en VSCodium, así que tenemos que instalarlo. Está disponible aquí.

En mi caso he seleccionado el .vsix de linux, lo he instalado desde la pestaña de extesiones de VSCodium como comenté antes, y después ya he instalado la extensión de PlatformIO que ahora arranca correctamente.

Ahora toca probarlo a fondo a ver si todo funciona correctamente.

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.

DIY y FaceBook

Desde hace tiempo tengo una idea que no me puedo quitar de la cabeza. Desde muy chaval, con 16 o 17 años, he estado participando en diversas «escenas» DIY (Do It Yourself ó hazlo tu mismo), principalmente relacionadas con la música, pero también alrededor del software y la cultura libres. Desde grupos de amigos que nos juntábamos para tocar juntos y pasarlo bien, a organizar conciertos y pequeños festivales sin ánimo de lucro para bandas independientes. Todo se hacía «en casa», en consonancia con esta ética DIY que abogaba por prescindir de empresas y sellos discográficos que en la mayoría de casos hacían perder la esencia de este tipo de música y movimientos sociales. Desde hacerles la comida y acoger en nuestras casas a los grupos que venían a tocar, hasta empaquetar y llevar personalmente al correo discos que se intercambiaban entre pequeñas distribuidoras de música, fotocopiar y grapar a mano pequeños fanzines con reseñas de los nuevos discos y agendas de conciertos, y pasar noches creando las primeras páginas web con este tipo de contenido allá cuando internet empezaba a ser popular. Muchas veces no era fácil, y el esfuerzo por organizar conciertos coincidía con días lluviosos por semana que nos hacían perder dinero personal para poder al menos pagarles la comida y la gasolina del viaje a los grupos que venían a tocar, pero eso era parte de la apuesta por esta manera de hacer las cosas.

Nos plantamos a día de hoy, y aunque tengo que reconocer que ya no estoy tan involucrado en la organización de estas cosas, si que sigo participando y colaborando ocasionalmente con amistades que siguen en ello, acogiendo grupos en mi casa, ayudando a cocinar la comida y echando una mano con otras pequeñas cosas que a menudo hacen falta. Pero hay algo que a mi parecer ha cambiado en gran medida, quizá parezca sutil y sin importancia para algunas personas, pero a mi modo de ver es muy significativo y opuesto a todo lo que este tipo de manifestaciones culturales representan.

Hace años había diversas webs que consultar para enterarte de que estaba pasando en la «escena», webs que recopilaban la agenda de los conciertos y eventos, webs de opinión y reseñas de discos, las propias webs de los colectivos que organizaban eventos y distribuían el material, y algunos foros donde se intercambiaban opiniones, se compraba y vendía material y equipo de segunda mano, se quedaba para compartir coches para ir a conciertos y en definitiva se hacía comunidad, no siempre muy bien avenida o cohesionada, pero comunidad al fin y al cabo. Ahora tenemos FaceBook.

Personalmente no soy usuario de FaceBook. Tuve una cuenta hace años, pero la borré cuando empecé a preocuparme por la privacidad y las estrategias comerciales de esta empresa, además de por no encontrarme a gusto con la interacción social en esta plataforma basada en gran medida en la apariencia más que en el contenido, pero esa es otra historia. El problema, y la raíz de este texto, viene de la asimilación masiva por parte de FaceBook de todo este tipo de cultura (con la colaboración de todas las personas involucradas en ella, claro). La mayoría de las web citadas ya no existen; en su lugar se han ido sustituyendo por grupos en la red social, anuncios de eventos, y otro tipo de herramientas que ofrece. Aquí se plantea el dilema: una manifestación cultural basada en la autoorganización e independencia, totalmente basada en los servicios de una de las empresas multinacionales más poderosas de la actualidad, que  utiliza todo el contenido publicado en su plataforma para comerciar con los datos que genera y enriquecerse, contenido que por cierto censura a merced, y que participa además en el mayor sistema de control e invasión de la privacidad personal concebible. Cada cual hace con su privacidad lo que quiere, no voy a entrar a discutir esto en este texto porque no es el tema que quería comentar, pero parece irónico que por comodidad y conveniencia se esté a merced de una de las mayores multinacionales para compartir contenido de una cultura basada en una supuesta ética DIY. Y esto no es sólo aplicable a este pequeño colectivo, muchos otros en los que me muevo alrededor del software y la cultura libre parecen estar en el mismo punto.

Las alternativas nunca fueron fáciles. Gestionar y mantener económicamente nuestros propios servicios en internet como webs, blogs, listas de correo, foros, etc, es un trabajo poco agradecido y que muchas veces no tiene el alcance y la repercusión de uno de estos grupos de FaceBook, pero creo que el debate debería de por lo menos estar presente, al fin y al cabo, se trataba de ser independientes, ¿verdad?.

 

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.

FCDControl

Después de mucho tiempo sin postear, subo una pequeña actualización con algo de lo que he estado haciendo ultimamente.

He vuelto a retomar la radioafición, y en serio, ahora tengo la licencia EA1IDZ, y ya llevo buenas experiencias con DX, antenas caseras, satélites, e incluso un contacto con la ISS.

Entre otras cosas, he estado trasteando con una FunCube Dongle, una SDR (software Defined Radio), muy compacta y con un gran espectro (de 64 a 1700MHz), que me ha permitido escuchar muchas bajantes de satélites, decodificar APRS, y jugar con GNURadio, una de las suites más impresionantes que he usado de software libre.

Como siempre, echaba de menos una aplicación para linea de comandos para controlar la FunCube Dongle, asi que me puse manos a la obra. Basándome en el código de la aplicación gráfica, no fue difícil hacer una herramienta básica para seleccionar la frecuencia, correción y ver el estado de la radio. Depués de publicarlo en la lista de correo del proyecto FunCube, he recibido incluso un parche para configurar la ganancia del LNA, y otras cosillas.

El código está disponible en Gitorious, y ya de paso comentar que a partir de ahora, las cosas que desarrolle las iré subiendo ahi, he aprovechado para subir varios de mis proyectos. Podeis echar un vistazo en https://gitorious.org/~ladecadence

Espero postear de nuevo con más asiduidad, ahora que ya tenemos server dedicado  (gracias a vieju.net!) y que tengo bastantes cosas en el tintero.

Saludos.

Implementación VHDL del MBC5

Hacía mucho que no posteaba algún proyecto, pero esto lo merece.

Desde hace un tiempo, llevo pensando en poder prescindir de los chips MBC5 originales de nintendo en mis cartuchos flash para GameBoy, ya que es difícil andar consiguiendo cartuchos antiguos, tiendas de segunda mano, ebay, amigos…

Así que había pensado en reimplementar el MBC5 usando algún chip de lógica programable. El problema es que no tenía conocimientos sobre ello :-)

Así que me puse a diseñar el funcionamiento del MBC5 en puertas lógicas, usando el Ktechlab, hasta que tuve algo que más o menos se comportaba como debía, asi que entonces ya me empezé a plantear en hacer un diseño definitivo.

Buscando encontré la gama XC9500 de Xilinx, CPLDs pequeños de 5V, con el más simple de todos, el XC9536, en formato TQFP de 44 pines, muy similar al MBC5 de 32 pines, que podria adaptar fácilmente a mi cartucho. Asi que me puse manos a la obra. Amazon y a buscar un libro de VHDL. Encontré de segunda mano «Digital Design, an embedded systems approach using VHDL» a buen precio, asi, que lo compré, y me está resultando una buena lectura, muy recomendable. Una vez aprendido lo básico, ya me puse a jugar con un kit de desarrollo CoolRunnerII que tenemos en el LABee, y cogiendo algo de soltura. Asi que un dia me puse a escribir líneas de VHDL y este fin de semana, más o menos he dejado el  diseño listo.

En la captura podeis ver la simulación de mi implementación del MBC5 funcionando, pruebo todos los modos posibles, selección de bancos ROM bajo, ROM alto, bancos de RAM, activación y desactivación de la RAM externa, escritura en la RAM externa, reset… todo parece funcionar según el diseño original del MBC5. Lo único que he cambiado es el mapeado del banco 0 para la compatibilidad con el MBC1. El MBC5 permite mapear el banco 0 en el segundo banco de ROM físico del cartucho a partir de 4000h, mientras que el MBC1, si le pedimos seleccionar el banco 0, nos pondrá el banco 1 en 4000H. No conozco ningún juego o programa que mapee el banco 0 en 4000h, asi que creo que es más interesante usar el formato del MBC1 y asi evitar incompatibilidades con programas antiguos.

Con el ISE de xilinx, ya he sintetizado el diseño, seleccionado los pines para la E/S y dejado todo listo para cuando me lleguen los CPLD’s que tengo pedidos y el JTAG USB de xilinx. En seguida podré probarlo en hardware real y a ver que pasa.

Ahora que he empezado con la lógica programable, me va a ser difícil parar, esto es demasiado interesante y útil como para no hacer más cosas :-)

En cuanto tenga todo comprobado publicaré los fuentes VHDL de mi diseño. Además tengo pensado hacerle unos añadidos, ya que me sobran dos o tres pines… más ROM? más RAM?, I/O? ya veremos ;-)

PlataformaCero

Desde hace un par de meses, estoy trabajando en un nuevo proyecto muy interesante. Ahora soy coordinador técnico de PlataformaCero, un nuevo centro de producción artístico en LABoral centro de arte, a cargo de Pedro Soler.

La apuesta es por el arte interactivo y visual, electrónica, prototipado, interacción, performance extendida… y me he encargado de equipar dos espacios muy interesantes, el LABee, laboratorio de electrónica experimental, un lab equipado con todo tipo de equipamiento para el desarrollo electrónico, y el fabLAB, un laboratorio de fabricación digital, con cortadora láser, fresadora CNC con eje rotatorio, impresora 3D… unos recursos geniales para cualquier tema de desarrollo experimental. Además disponemos del Plat0, un plató de televisión experimental, equipado con un estupendo equipo audiovisual, estaciones de edición, y equipo de audio profesional, y el EcoLAB, un laboratorio ambiental para expetimentar con permacultura, cultivo sostenible, redes de sensores y control de las plantaciones, etc. De hecho en este último, estoy ahora desarrollando un sistema de monitorización ambiental basado en arduino+xbee, para mapear el entorno cara a estudiar las condiciones y decidir que plantar y demás.

Además se realizará una convocatoria abierta de proyectos cara a residencias pagadas y con dinero para producción, talleres profesionales sobre temas relacionados con  la linea del centro, pequeños talleres mensuales sobre materias relacionadas con los espacios (electrónica, fabricación, etc), y un evento anual, ya clásico en el mundillo, el SummerLAB.

Dentro de poco publicaremos abiertamente el proyecto  con toda la información.

Salam ‘alaykum El Cairo

«Salam ‘alaykum» o «La paz sea contigo», el saludo típico, también es un sentimiento que te embarga al llegar a El Cairo. Su inmensidad, la sensación del pasado en el presente, ejemplificado por la silueta de las tres pirámides que hacen sombra sobre el mar de luz visible al llegar de noche en avión, es sobrecogedor. Una ciudad que nunca duerme, y que te despierta a las 4:30am con la casi musical llamada a la oración, otro ritmo de vida.

Este será mi «hogar» durante un mes, durante el cual impartiré cursos sobre electrónica y arduino para el OpenLab de Medrar, una estupenda oportunidad que me ha sido concedida gracias a la gente de Hangar. Muchas gracias.

Empieza el viaje.