Interfaz ZeroDeck para RPI Zero

publicado en: Helvetios, Proyectos | 0

En este proyecto he estado programando al principio una interfaz en GTK llamada GamMa. Pero el objetivo era correr esa aplicación en una RPI Zero 2W y que esta se comunicase con el tablero por USB y sirviese de interfaz con el jugador. Durante el desarrollo de la aplicación GamMa he ido cambiando el método de desarrollo y adaptando el código según iba encontrando problemas y aprendiendo más a programar en C++.

Empecé la aplicación usando Geany como IDE, que era el que había usado hasta entonces para desarrollar en una RevPI, ya que era muy ligero y fácil para mi que siempre había programado en C para microcontroladores. Para avanzar algo en este tema cambié a Codeblocks, que está mas pensado para trabajar en C++ y también se ejecuta correctamente en una RPI4.

Entonces ya aprendí a usar Visual Studio Code con el plugin de Remote SSH, lo que me permitía trabajar fácilmente desde mi PC sin tener que ejecutar un escritorio remoto en la RPI. Desde entonces he desarrollado así, y he ido adaptando el código según encontraba problemas.


El primer problema fue con las librerías de acceso a USB. Empecé con HIDAPI, pero por problemas en la compilación para ARM cambié a LibUSB. Una vez tenía el tablero comunicando por USB con la interfaz en GTK, descarté esta interfaz para centrarme en desarrollar una interfaz física con botones y una pantalla OLED SPI de 128×64. Para ello usé WiringPI pero también acabé descartandolo por problemas a la hora de integrar la librería para controlar la pantalla. Usé entonces la librería bcm2835 que permite tener acceso a los gpio, al I2C y al SPI.


La librería para controlar la pantalla es ArduiPi_OLED, que es una librería portada de Arduino para hacerla funcionar en RPI. Tuve que modificarla para poder incluir el controlador de OLED SH1106 en modo SPI y añadí algunas funcionalidades más como detección de final de palabra y corregí errores para poder integrarla mejor en el proyecto. Este es mi fork: Fork ArduiPi_OLED. Es posible que recupere la versión GTK si se evoluciona lo suficiente como para requerir una aplicación en x86 o en una RPI con un LCD, pero por ahora iré desarrollando de este modo, con una pantalla y teclado físicos.

Los menús de juego en el prototipo se ven actualmente tal que así:


El juego ahora mismo tiene un par de fases, la que el jugador debe posicionar las piezas y la que permite al jugador decidir el movimiento de su pieza. La posición inicial del jugador es siempre la misma, pero la del objetivo (asteroide) y de los enemigos (aliens) se genera aleatoriamente. Este es un ejemplo de generación aleatoria de posiciones:


En la fase del jugador se iluminan las celdas de alrededor del jugador indicando cual es tu rango de movimiento:


Estas son las piezas que tengo impresas para ir probando, no son las definitivas pero son una idea de cómo serian. Tienen una base translúcida y un pequeño imán para que los sensores Hall de las celdas las detecten:

Piezas de prueba

Así que una vez tenía funcionando el prototipo con la conexión al OLED ya los botones, diseñé un circuito que lo integrase todo y además tenga la conexión para la RPI Zero 2W que alojará la aplicación GamMa y comunicará con el tablero por USB. Este circuito está diseñado para ser alimentado desde el propio tablero, que es el que tiene las fuentes de alimentación de 5V y 3.3V. Incluye la pantalla OLED SPI, el conector para la RPI Zero, leds RGB para indicar el estado del jugador y la fase de juego actual, y un conector auxiliar que permitirá ampliar las funcionalidades conectado un lector de NFC u otro interfaz para un segundo jugador. Los esquemas del circuito son estos:

Esquema del teclado del circuito
Esquema de los leds

Y los renders del circuito son tal que así:

Render del ZeroDeck top
Render del ZeroDeck bottom

El diseño del circuito, esquema y lista de materiales se pueden conseguir en PCBWay, así como pedir el pcb directamente. Este diseño es abierto, cualquiera puede usarlo para lo que quiera, pero la aplicación GamMa todavía no está publicada hasta que no consiga un funcionamiento mínimo y vea que licencia elijo.