Comunicación USB con el tablero y la aplicación GamMa.

publicado en: Helvetios, Proyectos | 0

Ya estoy de nuevo trabajando en el proyecto después de una larga pausa, pero con fuerzas renovadas. He montado el circuito del tablero Helvetios sobre un entrenador que hice hace tiempo: un maletín con una RaspberryPi, una pantalla LCD, unas baterías y un sistema de fuentes de alimentación. De esta forma puedo desarrollar el software de control del tablero sin necesidad de un PC. El proyecto de este maletín lo puedes consultar en Hackaday.

Maletín entrenador

En este entrenador estoy desarrollando la aplicación GamMa (Game Master) que conecta con el tablero. Es una aplicación en C++, no porque sea especialmente necesario sino como una forma de mejorar en este lenguaje que no suelo usar demasiado en mis proyectos, se podría hacer en C o Python sin problemas.


Esta aplicación se encargará de comunicar con el tablero y servir de interfaz entre el jugador y el ‘Director de juego’ virtual. Este director de juego será el código del programa que irá guiando al jugador a las acciones a realizar en las fases de cada turno (mover, defender, atacar, recolectar, minar, comerciar, etc…) y mostrará los resultados de esas acciones. Esto lo hará usando una pequeña pantalla donde mostrará las opciones de cada fase y mostrando en el tablero iluminando las celdas afectadas que rango, dirección u objetivo que afecta a la acción seleccionada. El jugador, además de poder seleccionar la acción a realizar mediante unos botones de selección, de aceptar y cancelar, dispone de un navegador en forma de 6 botones que permiten seleccionar el rango o dirección de esa acción. El interfaz de jugador simplificado sería tal que así:

UI de la aplicación GamMa

Por ahora a día de hoy esta aplicación solo comunica con el tablero por USB, siendo capaz de controlar el color de las celdas y leer si hay una pieza conectada. Se encargará además de gestionar el flujo del juego entre los varios jugadores y decidir el resultado de las acciones seleccionadas por cada jugador en base a unas reglas preestablecidas, ponderando por parámetros de cada pieza/jugador como velocidad, energía, fuerza, rango, escudo, capacidad de transporte, precios de materiales, etc….

Se pretende que todo el texto, acciones y reglas sean programables y editables de forma externa al código, de modo que las partidas puedan ser totalmente adaptadas a una historia y convertir el tablero en un campo de juego colaborativo o de batalla según se establezca en la configuración por el usuario del tablero sin tener conocimientos de programación. De esta forma podremos establecer múltiples juegos en cada tablero, cambiando totalmente la historia y los objetivos del juego, pudiendo ser un juego de minado de asteroides, recolección de recursos, batallas de tanques, naves, barcos, soldados, orcos, marines espaciales…, o simplemente juegos de lógica abstractos o puzzles. Todo queda en mi habilidad a la hora de programar las lógicas de juego y el sistema de edición de menús, fases y reglas.


El código de esta aplicación usa la librería HidAPI para comunicar con el tablero, con una velocidad más que aceptable para la aplicación. El microcontrolador STM32F103 es capaz de gestionar una conexión USB FS de 12Mbits, pero en el protocolo USB hay una gran cantidad de overhead y la velocidad efectiva queda reducida considerablemente. Igualmente, según las pruebas es más que suficiente para transmitir una actualización del estado de las celdas. Las animaciones serán programadas y se ejecutarán del lado del microcontrolador, quedando libre las comunicaciones para actualizaciones de estados (color y animación de la celda, detección de pieza en cada celda). Esta aplicación estará disponible en mi Github mas adelante, para que pueda ser usada por cualquiera como base para desarrollar otros interfaces o modificarla para incluir otras funcionalidades.

La representación del interfaz está realizada con GTK3, que es lo suficientemente ligero para ejecutarse en cualquier sistema, así como el código en C++ también será lo suficientemente rápido sin necesitar mucha capacidad de proceso o memoria, si se desarrollase en Python o QT seguramente el consumo de recursos sea mayor. Se desarrollará un interfaz sencillo en GTK para que se pueda conectar el tablero a cualquier PC con linux o sistema embebido tipo Raspberry, pero el objetivo es recrear el interfaz por hardware para cada jugador del tablero. Esto es: varias pantallas OLED de 128×64 pixeles en principio, si es requerido se usará una mayor, una botonera de navegación por menús y tablero, una barra led que identifique el turno o estado de cada jugador y unos leds que identifiquen en que fase de su turno se encuentra:

Interfaz de jugador

De esta forma el tablero es independiente de un ordenador, y usando un sistema embebido de bajos recursos como la Raspberry Pi Zero 2W sería suficiente para controlar varios de estos interfaces de jugador para un mismo tablero. Y con un desarrollo más avanzado, este sistema embebido puede ejercer como rival para poder jugar partidas en solitario, y conectarse a internet para poder conectar varios tableros o jugar partidas remotas con otros jugadores. También permitiría un interfaz del estado de la partida mucha más avanzado mediante un servidor web y mostrar el desarrollo o incluso poder interactuar con el tablero desde un dispositivo móvil con un interfaz de jugador vía web.


Además de lo descrito para cada jugador, se pretende incluir un lector de NFC que permita identificar las fichas (meeples, nave, soldado, etc..) de cada jugador o leer tarjetas. En la fabricación de las fichas se puede insertar una etiqueta NFC como las micro tag de Murata. De esta forma la propia ficha puede ir ganando habilidades o cambiar características, y quedar registrada esta evolución en la propia ficha, pudiendo usar esas mejoras en siguientes partidas. También se ha pensado incluir un pequeño altavoz que pueda generar algunos efectos de sonido de resolución de las acciones (batalla ganada/perdida, recurso obtenido/gastado, movimiento, etc..).


Y aquí una pequeña demo de la comunicación USB con el tablero:

Montaje del prototipo de tablero electrónico de 91 celdas

publicado en: Helvetios, Proyectos | 0

Pues finalmente he conseguido recopilar todos los componentes y montar el primer prototipo completo de tablero (ya hice unas pruebas anteriormente para validar los drivers de leds SPI en Primer prototipo del tablero de juego electrónico Helvetios). La escasez de componentes ha retrasado el montaje 6 meses hasta que he conseguido algunos componentes críticos, principalmente el driver de leds TLC5947 y el regulador DC/DC TPS561201.

Inicialmente contacté con varios montadores en china para que me hicieran los prototipos, pero el coste de los componentes a principio del 2022 era prohibitivo. Así que pedí los circuitos y la plantilla de la cara inferior en JLCPCB, y fui recopilando los componentes en los siguientes meses hasta conseguirlos todos y poder montar yo los circuitos.

El montaje lo hice a mano (a falta de tener un horno SMD como el que usé para los circuitos de LifeLinker), usando pasta de soldadura, una pistola de calor y mucha paciencia. Para la cara inferior usé la plantilla SMD ya que es donde había más integrados y algunos con pads térmicos como el driver de leds. De esta forma la distribución de la pasta quedaría mejor.

El circuito se diseñó para tener un tamaño muy contenido y así ser más económico el montaje de los primeros prototipos por el precio del circuito y de los acrílicos necesarios para el difusor y el separador de celdas. Así podremos crear todo el firmware necesario para el control de los leds y la gestión de la comunicación USB. Los siguientes diseños seguirán el concepto de circuitos por filas como se explica en Helvetios, así podremos crear tableros con las celdas más grandes y con mayor número de ellas.

Algunas fotos del proceso de montaje:

Circuitos Helvetios
Los circuitos tal cual llegaron.
Detalle pads
El tamaño de los pads para los drivers de leds es realmente pequeño.
Circuito inmovilizado
Circuito inmovilizado para usar la plantilla y aplicar la pasta de soldadura.
Componentes colocados
Componentes colocados para proceder a la soldadura con aire caliente.

Para la puesta en marcha del prototipo usé una placa de desarrollo NUCLEO-F103RB, que ya usé en el Primer prototipo del tablero de juego electrónico Helvetios. Esta vez usé la placa de desarrollo para programar el circuito, usando el conector que permite programar mediante SWD otro circuito. Así pude conectarme al tablero de juego y debuggar el código que controla los drivers de leds y los sensores Hall:

Setup de desarrollo y debug del firmware.

Además de la placa de desarrollo para programar, usé un pequeño analizador lógico de 8 canales y 24Mhz. Con este dispositivo y el software Pulseview del proyecto de software libre Sigrok es fácil poder ver que señales se generan y ver si es correcto el direccionamiento a los drivers de leds. Además interpreta varios protocolos como SPI y I2C y es muy útil para determinar la velocidad de refresco del sistema.

Captura de Pulseview

Durante la programación del código de control de los drivers de leds fui probando el resultado con difusores diferentes:

Difusor acrílico Opal Hielo 3mm
Difusor acrílico 33% 2mm

Y finalmente un video mostrando el funcionamiento de la detección de las celdas con algunos ejemplos de color.

Finalizado el diseño del primer PCB de Helvetios.

publicado en: Helvetios, Proyectos | 0

Durante estos últimos meses he estado acabando el diseño del que será el primer circuito del tablero electrónico Helvetios. Ha sido un proceso algo lento, por hacerlo durante mi poco tiempo libre pero principalmente por hacer el diseño en un solo circuito para ahorrar costes. En diseños posteriores seguiré con el concepto de diseño de circuitos de filas de celdas, unidos entre sí. Esto permitirá tableros mucho mas grandes y con mas celdas.

El diseño de este tablero es de 91 celdas, y se usará para poder desarrollar el software de control. Este software gestionará la iluminación rgb de las celdas, los sensores magnéticos Hall y la comunicación USB con el circuito ‘director’ de juego.

Unas pocas capturas del circuito acabado:

Circuito completo, con capas semitransparentes.
vista superior, con los leds RGB y los sensores Hall.
Detalle de la capa superior
Vista inferior, con los drivers de leds, el microcontrolador, las fuentes de alimentación y conectores.
Detalle de la capa inferior.

En la capa inferior se alojan los conectores del circuito. Dispone de un conector de entrada alimentación, un conector USB para comunicarse con el circuito ‘director’ de juego, y un conector que dará alimentación a este otro circuito.

Ahora empieza el proceso de fabricación del circuito, que será también complicado por la situación de falta de componentes. Es muy posible que no pueda tener ciertos componentes críticos como el microcontrolador o el driver de leds durante todo este año 2022. Los plazos de entrega de algunos son para 2023. También el hecho que sea un circuito con componentes por las dos caras implica que no cualquiera puede montarlos, se requieren dos procesos de ‘reflow’ para soldar todos lo componentes.

Aprovecharé el tiempo del montaje del tablero para diseñar el circuito ‘director’ de juego y hacer diseños de la carcasa para alojar los circuitos. Así que las próximas actualizaciones serán sobre como iré diseñando el circuito ‘director, que constará de una raspbery Pi Zero, una pantalla oled y una botonera para que el usuario elija los movimientos. También adelantaré parte del desarrollo del firmware del tablero, sobretodo la parte de comunicaciones USB para ir probando como comunicar con la raspberry.

Algoritmos de direccionamiento de celdas hexagonales.

publicado en: Helvetios, Proyectos | 0

Al iniciar el proyecto Helvetios pensé cómo podría mapear cada celda individualmente, darle una dirección a cada una para cuando diseñase los algoritmos que interaccionan con ellas. Mi idea inicial era numerar las celdas desde el centro hacia el exterior, formando una espiral:

Numeración de celdas en espiral

De esta forma,a la hora de programar los algoritmos de direccionamiento podría crear un array de celdas numeradas. Cada celda de ese array sería una estructura de datos: el color, si hay una pieza encima o no, si tiene algún efecto de iluminación y los números de las celdas vecinas.

Así, al direccionar una celda podría saber cual sería la siguiente celda si me muevo en una dirección determinada.

Además debería diseñar los algoritmos para calcular distancias y rangos. Para por ejemplo, iluminar las celdas de movimiento alrededor de una pieza, o para iluminar una línea de disparo de una pieza. Pensé que estos algoritmos deberían recorrer esta estructura de celdas e ir seleccionando las celdas vecinas adecuadas en base a la dirección de la función deseada. Más o menos lo tenía pensado para en el momento de diseñar la librería de control del tablero definir estas estructuras de datos.

Pero eso era antes de conocer la página de Red Blog Games. En esta genial página se analizan muchas técnicas para gestionar mapas y calcular algoritmos de direccionamiento. Tiene una sección para mapas hexagonales: https://www.redblobgames.com/grids/hexagons/ donde determina 4 tipos de direccionamiento: Offset, Cube, Axial y Doubled. El sistema de coordenadas que elegiría sería el Cube y se ve tal que así:

Sistema de coordenadas Cube

Además define los algoritmos para pasar de un sistema de coordenadas a otro, para calcular distancias, líneas, movimientos, rangos, intersección de rangos, obstáculos, rotaciones, reflejos, anillos, espirales y campos visuales.

Así que ya tengo toda una teoría para poder desarrollar la librería que permita interactuar con el tablero. De esta forma podré crear una serie de estructuras de datos y de funciones con las que programar el algoritmo del juego.

Este algoritmo permitirá en un principio que dos jugadores puedan usar el tablero por turnos. Inicialmente los dos en el mismo tablero pero el objetivo es poder jugar una partida online. También será posible crear una IA contra la que jugar offline, con lo que en algún momento cuando esté el tablero desarrollado, investigaré sobre sistemas de IA aplicados a juegos.

Tablero cortado a láser.

publicado en: Helvetios, Proyectos | 0

Retomando el diseño del tablero Helvetios después de una pausa he repensado cómo voy a hacer el primer prototipo. En vez de usar varios circuitos interconectados entre sí, he empezado a hacer un diseño mas simple. Para poder ajustar costes de los circuitos y los cortes en láser he tomado una hoja A4 como referencia, lo que me permite poder hacer impresiones del tablero, comprar hojas de acrílico baratas y cortar en el láser del makerspace Made del que soy socio.

En el diseño del tablero he incluido lo que será una serie de botones para poder interactuar en cada turno y poder seleccionar la dirección de la acción a realizar (movimiento, ataque, defensa, captura, etc…). También incluiré una pequeña pantalla oled para mostrar las acciones a elegir en cada turno y parámetros de juego de la pieza seleccionada.

Diseño para cortar en láser.

He cortado en acrílico negro la parte superior del tablero de forma que el entramado hexagonal servirá para poder alojar las piezas de juego. Por debajo irá una base translucida que servirá de difusor para los leds. En diseños posteriores es posible que cada celda tenga su propio difusor en vez de uno para todas las celdas, depende como vayan las pruebas y si consigo que no fugue mucha luz de una celda a otra. Seguramente tendré que aislar por debajo del difusor y que cada celda tenga su propio difusor hexagonal separado del resto.

Este es el resultado del corte, en una hoja de acrílico negro de 3mm y otro translúcido para el difusor:

Tablero ya cortado.

El próximo paso es diseñar el circuito que irá debajo de las celdas con los leds y los sensores (que ya está en proceso), y otro circuito con la pantalla y la botonera. El circuito de las celdas pretendo que vaya conectado vía usb a la raspberry. El circuito con la pantalla y la botonera irá conectado a la raspberry directamente usando un SPI para el oled y entradas I/O para los botones.

Primer prototipo del tablero de juego electrónico Helvetios

publicado en: Helvetios, Proyectos | 0

Diseño del circuito:

El primer prototipo del tablero electrónico Helvetios es el circuito que corresponde uno de los brazos con sensores y leds. En cada celda hay un sensor magnético de efecto Hall y tres leds RGB, lo que permite detectar si existe una pieza o no sobre la celda y mostrar el color correspondiente según se programe la mecánica del juego. Este es el diseño de bloques del circuito:

Componentes en cada celda.
Bloques del circuito con n celdas.

En este prototipo solo hay montadas 5 celdas, pero el diseño final del tablero Helvetios tendrá 8 celdas por circuito. En cada tablero habrá 21 circuitos de leds, lo que hace 169 celdas contando la celda central. Este tamaño está elegido para que cada circuito de leds sólo contenga un integrado TLC5947, pero podría incrementarse en un futuro conectando varios de estos integrados en cascada. La distribución de estos circuitos queda tal que así:

Distribución de circuitos de leds en el tablero.

El esquema de este prototipo del circuito de leds contiene unos pocos componentes: los sensores Hall DRV5032 en formato SOT32, el driver de leds TLC5946, los leds RGB y el registro de desplazamiento SN74HC165:

El diseño del PCB y el renderizado 3D del circuito quedarían tal que así:

Diseño del PCB
Render 3D de la capa superior
Render 3D de la capa inferior
PCB montado

Prototipo de desarrollo:

Para poder desarrollar el firmware de control he usado una placa de evaluación de Cortex M3 de ST NUCLEO-F103RB, en verdad era una placa de Cortex M0 pero la modifiqué cambiando el micro y añadiendo un cuarzo de 8MHz para poder hacer que funcione correctamente el periférico de USB. Tengo previsto volverla a modificar y cambiar el micro por un STM32F103RC y así disponer de 3 periféricos SPI que me ayudarán a controlar tres ramas de circuitos de leds a la vez. Está montada en una placa de topos en la que he incluido un conector macho para el circuito de leds y una Raspberri Pi Zero W con una pequeña pantalla Oled. En la siguiente fase del proyecto el microcontrolador estará conectado vía USB a la Raspberry e incluirá el software de control de la mecánica de juego.

Y algunos ejemplos de animaciones que se pueden conseguir con este prototipo:

El proceso de diseño del LifeLinker

publicado en: LifeLinker, Proyectos | 0

Para crear el LifeLinker se usaron varios programas de diseño y métodos de fabricación que se resumirán aquí. El Lifelinker consta de varios elementos o procesos de diseño: esquemático del circuito, diseño del circuito o PCB, diseño 3D de la caja y la tapa, programación del microcontrolador.

Para la fabricación se usaron impresora 3D, impresora manual para la plantilla de soldadura, horno de circuitos SMD y cortadora laser.


Diseño del circuito:

El esquema y el diseño del circuito PCB se hicieron usando el programa Altium Designer, puesto que es el que estoy más habituado a usar en el trabajo, pero podría haber usado fácilmente el Eagle para este circuito.

Una ventaja de usar Altium es que la librería de componentes que uso está creada como una base de datos de Access, lo que me permite tener más control de los componentes que se crean. Le añado datos varios de tensión, corriente, número de pines, códigos de proveedor, enlace del datasheet, stock y localización de almacén, etc.. Esto me permite poder generar una listas de materiales con precios de proveedores (Farnell, Mouser, Digikey…) y su stock.

Esquema del LifeLinker

En el esquema podemos ver que consta de un micocontrolador STM8L151 de 8 bits, un encoder rotativo con pulsador, la fuente de alimentación para generar 3V desde las pilas, el display de siete segmentos y tres dígitos, 5 leds para mostrar el modo y un buzzer. El microcontrolador está aprovechado al máximo, no le sobra ni un pin, y de los 8kBytes de flash que tiene, el código ocupa 7.5kB.


El circuito o PCB es simple, de dos caras:

El circuito se pidió a Elecrow junto con la pantalla de soldadura (stencil) en 15x15cm. El coste de 10 PCB’s + envío + pantalla costó solo 30€, siendo un coste muy contenido. La pantalla permite poder hacer una soldadura con horno de SMD y tener un resultado de soldadura profesional, también permite montar ciertos componentes que tengan pads de soldadura por debajo.


La pantalla de soldadura que se pidió junto a los prototipos de los circuitos se usó para montar todos los componentes SMD. Esta pantalla es de 15x15cm y para poder hacer varios circuitos le fabriqué un marco que me permitiese cambiar la pantalla para otros proyectos:


Diseño de la caja:

Para hacer la caja se importó el diseño 3D del circuito en Solidworks y se creó a partir de él. Esta caja está pensada para ser impresa en 3D con una impresora de filamento. La tapa trasera está cortada con laser y encaja deslizándose en unas ranuras en la caja.


Diseño del frontal:

Para el dibujo frontal elegí una carta de Magic, ya que este dispositivo está pensado principalmente para usarlo en este juego aunque es perfectamente válido para muchos otros. La propia caja está a escala de una carta de Magic, así que simplemente usé la web Magic Card Maker para crear un diseño sencillo y poder imprimirlo en vinilo adhesivo. Más tarde rehíce el diseño incluyendo texto y el dibujo del propio PCB en la carta.


Programando el firmware:

El microcontrolador es un STM8L151F3 de 8 bits, 16MHz, 8kbytes de Flash y 1kbyte de RAM. Para poder debugar el código y programar los prototipos usé la placa de evaluación STM8L-DISCOVERY y como compilador CXSTM8 de Cosmic Software, que tiene una licencia gratuita para los micros STM8. Como IDE usé el propio de ST, STVD (ST Visual Develop). El código fuente se puede consultar en mi repositorio de Github, https://github.com/microhenrio/LifeLinker.

Debugando con la placa de desarrollo

Los inicios

publicado en: Helvetios, LifeLinker, Proyectos | 0

Como primer entrada al blog voy a explicar el cómo y el porqué existe esta web. He estado involucrado con la electrónica casi desde que tengo memoria, estudiando o trabajando en ella. He trabajado creando circuitos electrónicos para diferentes empresas durante 15 años (hardware y firmware), principalmente electrodomésticos y equipos industriales.


En un momento dado decidí hacer algún proyecto por mi cuenta que fuera fácil de desarrollar con las herramientas que disponía, entonces cree el Notificador Bluetooth https://hackaday.io/project/28548-phone-bluetooth-notifier) con un buen resultado de diseño hardware y firmware ya que es lo que estoy acostumbrado a hacer. Aprendí algo sobre diseño 3D y empecé a hacer una app para conectar con él.


Desafortunadamente, Android Studio era demasiado para mí y fue frustrante conseguir una mínima aplicación funcional, así que nunca llegué a tener un MVP completamente funcional. El mostrarlo a alguna aceleradora de hardware tampoco resultó fructífero, no tenía un precio objetivo o un cálculo de costes para mayores cantidades, sólo el coste de los prototipos.

Así que en ese momento decidí hacer la electrónica más sencilla que se me ocurriera, con un cierto propósito. Entonces recordé un pequeño proyecto que hice en la universidad con un microcontrolador PIC, para contar los puntos de vida de las partidas de MTG (Magic the Gathering).


Decidí replicarlo con una electrónica sencilla pero con la integración y el bajo coste de producción en mente. De este modo nació el proyecto LifeLinker, principalmente para experimentar con el diseño y la impresión 3D, corte por laser, dibujos 2D y teniendo en cuenta de los costes de desarrollo, así como buscando las cotizaciones de las fabricaciones y procesos para poder industrializarlo en cantidades mayores. También busqué una forma de distribuirlo en todo el mundo usando Tindie, y creé la imagen de la empresa, la web y los canales en las redes sociales. Este proyecto, de alguna forma, se usó de semilla para construir algo más grande.


Los futuros proyectos intentarán seguir esta filosofía, desarrollando electrónicas sencillas para usar en juegos ya existentes. Al mismo tiempo se irán desarrollando tecnologías para usarlas en estos juegos existentes o para crear nuestros propios juegos electrónicos. Esa es la razón de la existencia de la sección de blog, para mostrar la evolución de los proyectos en desarrollo.

La aventura más grandiosa es la que está por venir. Hoy y mañana aún están por ver. Las posibilidades, los cambios son todos tuyos para hacer. El molde de tu vida está en tus manos para romper.

J. R. R. TOLKIEN, EL Hobbit

Últimas entradas: