Un teclado de una sola tecla. ¿Para qué sirve?

Suena absurdo gastar tiempo en un teclado que tiene apenas un botón. Pero pensá en los gestos que repetís cien veces al día: silenciar el micrófono en una reunión, pausar la música, avanzar una diapositiva o disparar la cámara del celular sin tocar la pantalla. Para todos esos casos, un teclado completo es exagerado. Una sola tecla, bien mapeada, alcanza y sobra.

En este tutorial vas a construir el One Key: un teclado Bluetooth de una sola tecla mecánica, alimentado por batería LiPo, que aparece como un teclado HID normal en tu PC, tu Mac o tu celular. No necesita drivers ni software extra en el dispositivo: lo emparejas una vez y queda listo. Y lo mejor: puedes reconfigurar qué hace el botón desde una página WebSerial, sin volver a compilar nada.

Al terminar vas a saber cómo apilar las placas de Adafruit en formato BFF, cómo programar el ESP32 con la librería BleKeyboard en el IDE de Arduino, y cómo imprimir y cerrar una carcasa 3D con imanes. El proyecto está inspirado en el Monokey de Kickstarter, que se fabricó en una tirada limitada y hoy ya no se consigue.

El cerebro: QT Py ESP32 Pico

El corazón del proyecto es la placa Adafruit QT Py ESP32 Pico. Es diminuta (del tamaño de una moneda), tiene Bluetooth Low Energy integrado, conector USB C y un NeoPixel a bordo. Ese tamaño es clave: todo el dispositivo cabe en la palma de la mano.

Placa Adafruit QT Py ESP32 Pico con conector USB tipo C

Lo interesante del QT Py es que comparte el factor de forma BFF (Big Friendly Footprint), una familia de placas accesorias que se apilan encima usando los pines castellados del borde. Para este proyecto usamos dos accesorios BFF: uno para la tecla y otro para la batería.

El switch mecánico y el keycap

La tecla no se suelda directo a la placa principal. Va montada en una placa accesoria llamada NeoKey BFF, que trae el socket para un switch mecánico estilo MX y, además, un LED NeoPixel RGB que ilumina la tecla desde abajo. Ese LED es el que ves brillar en rojo en la foto de portada: es la señal de que el teclado todavía no está emparejado.

Switch mecánico Kailh Clicky Blue de perfil MX

El tutorial original usa un switch Kailh Blue (clicky, con ese clásico chasquido audible). Puedes elegir el tacto que más te guste: Blue para click marcado, Brown para algo intermedio, o Red lineal y silencioso. Encima va un keycap de perfil MX del color que prefieras.

Las dos placas BFF: tecla y energía

Antes de apilar, hay que soldar los pines a las dos placas accesorias. La idea es cortar secciones de header de 7 pines y soldarlas a cada BFF para que después calcen sobre el QT Py.

Placa NeoKey BFF y placa LiPoly Charger BFF con sus pines soldados

La placa de la derecha es la NeoKey BFF (fíjate en el footprint cuadrado del switch y el NeoPixel). La de la izquierda es la LiPoly Charger BFF: se encarga de cargar la batería LiPo por el mismo USB C de la placa y trae un interruptor físico de encendido más el conector JST para la batería. Con esta placa no necesitas un cargador TP4056 aparte: la carga ya está integrada.

Un truco del tutorial para que la torre quede lo más baja posible: como tanto el QT Py como las BFF tienen pads castellados, puedes estañar esos pads y soldar pines de header cortos para unir directamente el QT Py con la LiPoly BFF, ahorrando altura.

El stack armado

Una vez soldadas las tres placas, se apilan en orden: el QT Py abajo, la LiPoly Charger BFF en el medio y la NeoKey BFF arriba, con el switch mecánico asomando por la parte superior.

Stack completo: QT Py, LiPoly BFF y NeoKey BFF con el switch transparente arriba

Todo el cableado interno se resuelve con estos pines, sin un solo cable suelto. Esa es la gracia del sistema BFF: el hardware queda compacto y ordenado.

Programación en el IDE de Arduino

A diferencia de lo que podrías esperar, este proyecto se programa en el IDE de Arduino con C++, no en CircuitPython. Primero instala el soporte para ESP32 y selecciona la placa correcta:

Tools > Board > esp32 > Adafruit QT Py ESP32

También vas a necesitar el driver USB a serie de tu chip (CP2102N o CH9102, según la versión de tu placa) para que el computador la reconozca. En Linux ya viene incluido.

Luego instala dos librerías. Desde Tools > Manage Libraries agrega la librería de NeoPixel de Adafruit. Y aparte, descarga la librería ESP32 BLE Keyboard (el fork de sakul-the-one) desde su página de releases en GitHub y descomprímela dentro de tu carpeta de librerías de Arduino (por ejemplo ~/Documents/Arduino/libraries/).

El firmware combina tres piezas:

  • BleKeyboard maneja todo el protocolo Bluetooth LE HID: anuncia el dispositivo como teclado y envía los reportes de tecla al equipo conectado.
  • Adafruit NeoPixel controla los dos LEDs: el de la NeoKey BFF (pin A3) y el integrado del QT Py. Sirven para indicar el estado (rojo si no está emparejado, otro color al conectar o al presionar).
  • Preferences guarda la configuración en la memoria flash NVS del ESP32, bajo el espacio de nombres neokey. Como la NVS sobrevive a apagados y a deep sleep, el One Key siempre arranca con la última configuración que dejaste.

Una vez abierto el sketch onekey.ino, compila con Sketch > Verify/Compile y carga con Sketch > Upload.

Configuración por WebSerial, sin recompilar

Acá está la parte más cómoda del proyecto. La acción del botón se guarda en una estructura KeyCombo dentro de la NVS. En lugar de tocar el código cada vez que quieras cambiar la tecla, abres una página WebSerial desde el navegador, eliges la combinación y la placa la guarda en flash. La función loadSettings() relee todo al arrancar: la combinación de teclas, el tiempo de apagado automático, el brillo y los colores del LED.

El firmware soporta tres modos de acción:

  • Tecla simple o combinación: por ejemplo Ctrl + Shift + A para silenciar en Zoom, o una tecla F13 a F24 (que no existen en teclados normales y son ideales para mapear macros en el sistema operativo).
  • Texto completo: presionar el botón "escribe" una cadena de texto con bleKeyboard.print().
  • Tecla multimedia: como Play/Pause, subir o bajar volumen, usando un MediaKeyReport.

Ahorro de energía con deep sleep

Para que una batería tan pequeña dure, el firmware usa deep sleep. Si pasa un tiempo configurable (sleepMinutes) sin presionar el botón ni recibir datos por serie, la función goToSleep() apaga el riel del NeoPixel por el pin de power y manda el ESP32 a dormir. El chip despierta con la siguiente pulsación, envía la tecla y vuelve a dormir. Con este esquema, una batería LiPo de 150 mAh rinde semanas en uso normal.

Carcasa 3D cerrada con imanes

El proyecto incluye los archivos para imprimir la carcasa. Hay un 3MF listo para cargar en un slicer compatible como Bambu Studio, los STL individuales, y un STEP por si quieres editar el modelo. La carcasa es de dos piezas: una base que aloja el stack de placas y la batería, y una tapa con un orificio cuadrado por donde asoma el switch.

Render 3D de la carcasa del One Key: base y tapa separadas

En la guía original imprimen a 0.16 mm de altura de capa con soportes de árbol activados para la base y la tapa, con un ángulo umbral de 25 grados. Eso permite soportar solo las partes internas sin arruinar la tapa inclinada.

Lo elegante del diseño es cómo cierra: en lugar de tornillos, la base y la tapa se unen con cuatro imanes de neodimio que se presionan en los orificios de las esquinas. Quedan firmes pero puedes abrir la carcasa cuando quieras para cargar o ajustar algo.

Carcasa azul impresa con los cuatro imanes en las esquinas y la electrónica dentro de la base

Emparejar y usar

Con el firmware cargado y la carcasa cerrada, emparejarlo es como cualquier dispositivo Bluetooth:

  1. Enciende el One Key con el interruptor lateral. El NeoPixel se pone rojo, indicando que está sin emparejar.
  2. En tu PC, ve a Bluetooth y agrega un dispositivo nuevo.
  3. En la lista aparece como teclado BLE (en Windows se identifica como "ESP32 BLE KB3"). Selecciónalo.
  4. Listo: cada vez que presiones la tecla, envía la combinación configurada.

Tres unidades terminadas del One Key en distintos colores con sus keycaps MX

Como ves, una vez que dominas el patrón puedes imprimir varios en distintos colores y darle a cada uno una función propia: uno para el mute, otro para la cámara, otro como botón de pánico que abre el correo.

Variantes y mejoras

Una vez que tienes el One Key funcionando, hay varias formas de llevarlo más lejos:

  • Modo macro de texto largo: aprovecha el modo "texto" del firmware para que el botón escriba tu correo, una firma o un comando que tecleas seguido. Es el clásico "botón de un solo uso" que ahorra escribir lo mismo todo el día.
  • Indicación por color según la app: el NeoKey BFF tiene un NeoPixel RGB. Puedes modificar el código para que el LED cambie de color según el modo activo, así sabes de un vistazo qué hace el botón en ese momento.
  • Versión de varias teclas: si una tecla te sabe a poco, Adafruit tiene placas con más switches mecánicos. El mismo concepto BLE HID escala a una mini botonera para controlar OBS, Discord o atajos de tu editor.

Personalización para Chile

En Chile puedes conseguir el cerebro y los conectores del proyecto en MechatronicStore:

  • Seeed Studio XIAO ESP32 S3 (SKU GS1-3) por $13.670. La NeoKey BFF está diseñada precisamente para QT Py y XIAO, así que esta placa es el reemplazo directo del QT Py ESP32 Pico del tutorial: mismo factor de forma compacto, Bluetooth Low Energy y soporte en el IDE de Arduino.
  • Fila pin header macho 2x40 (SKU GI5-3) por $490. De aquí cortas las secciones de 7 pines para apilar las placas BFF y armar la torre.

El switch mecánico estilo MX, el keycap, la batería LiPo de 150 mAh y las placas accesorias BFF (NeoKey y LiPoly Charger) son piezas especializadas: si no las tienes, las consigues con Adafruit o tiendas especializadas en teclados mecánicos. La batería puede ser cualquier LiPo de 3.7V con conector JST de 150 a 300 mAh.

Recursos

Inspirado en el proyecto de Adafruit. Versión chilena con los componentes en stock local que aplican.