Teclado mecánico DIY (1)

Índice de contenido:
- Introducción
- QMK firmaware personalizado
- Descargar el firmware
- Crear un teclado nuevo
- Crear Keymap
- Diseñar y configurar el keymap
- rules.mk y config.h
- Compilar y grabar
- Conclusión
Introducción
Cualquiera que haya estado enganchado a algún juego de ordenador, habrá oído hablar de los teclados mecánicos, que si son los mejores, los más rápidos, etc. En mi caso siempre se me han dado lo suficientemente mal los videojuegos como para no querer gastarme más de 20€ en un teclado. Hasta ahora, que por motivos de ergonomía, he estado buscando teclados «split», es decir, separados en dos partes, una para cada mano, haciendo que la posición de la espalda sea mucho más natural.
Total que, dando vueltas por la web me topé con el increíble mundo de los teclados mecánicos custom, para los que puedes elegir, el tipo de tecla, en función del sonido y de la sensación que da al pulsarla. Existen una infinidad de tipos de teclas, PCB, controladores, keycaps, de todo, pero, Yo que soy así de especial, decidí que si me montaba uno, lo hacía personalizado, con mi propia PCB y mis luces RGB, con las piezas diseñadas en 3D e impresas. El proyecto iba a presentar 3 grandes problemas que resolver: el diseño de la PCB, la configuración del firmware y la construcción de los keycaps. El primero era la excusa perfecta para probar KiCAD de forma más consistente, la segunda (contada en esta entrada) era la más complicada para mí, afortunadamente QMK está muy trillado en la web y pude resolver todas mis dudas. El tema de los keycaps lo cierto es que no esperaba que fuera a darme tanta guerra, pero al final llegué a una solución aceptable por el momento.
QMK firmware personalizado
Antes de realizar el diseño de la PCB, basicamente, me aseguré de que todo estaba acorde y de que el firmware iba a funcionar correctamente. El firmware es QMK, es bastante potente y extenso, y soporta un sin fin de teclados diferentes, aunque se puede acomodar para hacer un teclado propio, como es el caso. Tengo que decir, que a pesar de la cantidad de documentación existente en la página web, no me ha resultado nada intuitivo el hacerlo, ya que prácticamente todo está explicado suponiendo que estás intentando construir un teclado ya predefinido. Sin embargo, al final, conseguí compilar el firmware configurado a mi gusto, para poder construir un teclado «split» en el que en cada mano tenga una matriz de teclas de 5×6 teclas.
Si tuviera que describir pasos para conseguir un firmware QMK personalizado, serían los siguientes:
Descargar el firmware
Obvio. Pero por muy obvio que sea es el primer paso. Se puede descargar aquí directamente de github o clonar el repositorio en tu PC. Aquí es justo decir que quizá el entorno más cómodo para realizar esta parte sea Linux, ya que hay una serie de pasos a realizar en la consola de comandos, yo lo he hecho en Windows 10. No me voy a entretener en explicar la preparación de este entorno ya que es seguir a rajatabla lo que cuentan aquí. Una vez tengas claro en que carpeta tienes todo el firmware y tengas el entorno instalado correctamente (creo que por ahí también lo dicen, pero es recomendable tener algún editor de código como Visual Studio Code), ya estás listo para empezar.
Crear un teclado nuevo
Esto es algo que no he conseguido encontrar en la documentación en sí (a lo mejor sí que está pero yo y mi empanada mental no lo hemos visto), el caso es que existen una serie de scripts que te crean la estructura de carpetas que ha de tener tu teclado para poderlo compilar sin problema. Dentro de la carpeta del firmware existe la carpeta qmk_firmware/util/ y en ella existen una serie de scripts para diferentes cosas (que ignoro), si ejecutamos el script new_keyboard.sh, nos pedirá el nombre del teclado que queremos crear el tipo de electrónica y nuestro nombre y el solo nos creará todo lo necesario.

Crear Keymap
De la misma forma, ejecutando el script con la siguiente sintaxis: new_keymap.sh <ruta del teclado> <nombre del keymap>.
Se nos creará la carpeta correspondiente.

A pesar de lo que indica la imagen, una vez tengamos todo configurado, a la hora de compilar el firmware lo haremos mediante qmk compile como veremos más adelante.
Diseñar y configurar el keymap
Una vez tenemos toda la estructura de carpetas necesaria creada, viene lo interesante, que es diseñar el teclado en sí, el como van a estar distribuidas las teclas. En mi caso, quería un teclado ortogonal (una fila debajo de la otra sin desfasar, como cualquier teclado numérico) de dos partes separadas de 5×6 teclas. Pues bien, para decirle eso al firmware, en nuestra carpeta del teclado se habrá generado un fichero header con el nombre de nuestro teclado.

Aquí debemos describir nuestro layout en dos secciones, la primera describe la distribución física de las teclas, y la segunda la asignación de estas en la matriz tal y como lo va a interpretar el firmware, esta segunda parte es un array bidimensional que básicamente es un lista de filas. Aquí es necesario mencionar que en el caso de un teclado split, es necesario duplicar el numero de filas, de forma que la matriz de la mano derecha quedaría virtualmente debajo de la de la mano izquierda. Este es mi Layout:

Como se puede ver, mi teclado tiene 5 filas y 12 columnas, pero en la matriz se representa como una lista de 10 filas de 6 columnas.
Lo siguiente es el keymap en sí. Cada vez que pulsamos una tecla, esta debe tener asignado un «keycode», que es la identificación de la tecla o combinación de teclas que le firmware va a enviar por el USB al sistema operativo. QMK Configurator es una herramienta que nos permite hacer esto de forma visual, el probelma es que funciona en base a los teclados que existen en el repositorio, por lo que si queremos hacernos el un layout nos va a tocar dar un par de vueltas, lo podemos hacer a mano por supuesto, en mi caso lo que hice fue usar el keymap 0_sixty, ya que es básicamente el teclado que me quiero hacer y exportar el keymap.json.

Este fichero json se puede convertir a la sintaxis que necesitamos usando el comando qmk json2c [-o OUTPUT] filename. Nos devolverá en la consola el código que debemos pegar en nuestro keymap.c.

rules.mk y config.h
Aparte de crear el keymap, estos dos ficheros son los que configuran el firmware en sí. En rules.mk se dan una serie de instrucciones al compilador sobre las diferentes opciones que tiene tu teclado, en este fichero solamente tendremos que habilitar la opción «split» y «RGB» mediante SPLIT_KEYBOARD = yes y RGBLIGHT_ENABLE = yes respectivamente.

En el config.h se encuentra la configuración del teclado propiamente dicha, es necesario indicar el número de filas y columnas de la matriz de teclas, los pines del controlador asignados para las filas y las columnas, y un par de opciones específicas para teclados split,
#define USE_SERIAL
#define SOFT_SERIAL_PIN D2
Estas dos opciones definen el tipo de comunicación entre ambas mitades del teclado.
#define MASTER_LEFT
Existen varios modos de decirle al firmware si está manejando la matriz de la mano derecha o la de la izquierda, la forma más sencilla es que use la conexión USB para saber si es el master o no, y con esta opción le decimos que, si es el master porque tiene el USB es además la matriz de la mano izquierda.

Con todo esto, ya estamos en disposición de compilar el firmware y probarlo en el controlador.
Compilar y grabar
La verdad es que, si bien, hasta este punto ha habido cosas en las que he tenido que indagar porque o bien no entendía muy bien la documentación o bien la documentación deja algunas cosas un poco difusas, pero como he dicho al principio, es probable que alguien con más maña en esto del software lo encuentre super sencillo. Llegado el momento de compilar, es donde más sorpresa me he llevado, ya que, si hemos configurado bien el entorno de qmk, este paso es el más sencillo de todo el proceso.

Como veis, basta con escribir el comando qmk compile y decirle que teclado y con que keymap lo quieres compilar, así de sencillo. Tras un par de minutos, se generará en la carpeta raíz de qmk un fichero .hex que es el que deberemos grabar en el controlador.
Para grabarlo creo que también hay un par de formas diferentes, yo he usado qmk toolbox, porque me pareció sencillo en su momento.

El proceso es sencillo, conectar el controlador, hay que hacerle un reset al controlador para que entre en modo debug y pueda comunicarse con el QMK Toolbox, aparecerá un mensaje en la consola de que el dispositivo ha sido conectado. Una vez aquí, con el fichero .hex seleccionado, pulsamos Flash y listo, unos segundos después el controlador saldrá del modo debug y quedará nuestro firmware grabado.
Conclusión
En resumen este es el proceso que he seguido para configurar el firmware del teclado, como he dicho ya un par de veces, a lo largo de este proceso me he trabado más de una vez, con la frustración de que no quería avanzar al diseño de la PCB hasta que no tuviera claro como funciona el firmware. Salvando esos momentos, que parecen eternos, pero fueron un par de tardes, es uno de los retos que presentaba el proyecto que, aunque parezca una tontería, me intimidaba más. Al final ha resultado ser más sencillo de lo que creía en un principio.
El siguiente paso: diseño de la PCB.
