Teclado Bluetooth com ZMK

Faz um tempo que comecei a pesquisar teclados mecânicos customizados e tinha essa curiosidade de como eles funcionam. Como existe muito material sobre isso e também ferramentas open source, decidi tentar criar o meu próprio teclado.

A principal motivação para mim foi a curiosidade e a vontade de aprender algo novo, além de ter a possibilidade de criar algo customizado para facilitar o meu dia a dia usando esse teclado.

Eu queria um teclado split, sem fio e que tivesse poucas teclas. Por ser um teclado sem fio eu decidi usar o firmware ZMK que tem suporte a bluetooth e baixo consumo de energia (isso é importante pois cada lado do teclado vai usar uma bateria). Também decidi que o teclado seria todo "handwired" ao invés de fazer a PCB, isso ajudou a economizar um pouco.

Para definir tudo o que eu precisaria no teclado e testar algumas ideias, decidi criar uma modelagem 3D de como eu queria que ele ficasse:

Modelagem 3D do teclado

Para esse teclado usei:

  • 32 switches red da redragon
  • 2 baterias recarregáveis de 3.7V e 100mAh
  • 2 placas nrf52840 compatível com nice!nano v2
  • 2 interruptores

Antes de tudo, acho que faz sentido explicar como são as conexões de cada switch com a placa:

Os switches geralmente não são ligados diretamente em pinos individuais da placa. Em vez disso usamos uma matriz. Isso permite conectar muito mais teclas usando menos pinos. Por exemplo, com 8 pinos podemos controlar até 15 teclas (3 linhas x 5 colunas).

Exemplo de teclas

Quando uma tecla é pressionada, um evento é gerado pelo firmware a partir daquela tecla com a linha e a coluna que foi ativada. Com base nesses valores o firmware identifica qual a posição da tecla e executa o comportamento definido naquela posição.

Protótipo

Fui seguindo a documentação do ZMK e fiz o build do firmware com apenas duas teclas para validar a minha configuração inicial e também garantir que as placas estavam funcionando, esse foi o keymap inicial:

/ {
    keymap {
        compatible = "zmk,keymap";
        default {
            bindings = <
                &kp A
                &kp &bootloader
            >;
        };
    };
};

E assim ficou o protótipo. Nesse protótipo as duas teclas fazem parte da mesma coluna (fio amarelo) e os diodos são as linhas, cada um conectado em um pino da placa:

Protótipo do teclado

Consegui validar a conexão bluetooth e a configuração do firmware ZMK, tudo estava funcionando.

A parte externa do teclado eu imprimi em uma impressora 3D. Soldei os diodos nos switches, usei esses fios de cobre que são mais rígidos para fazer as linhas e colunas, e depois soldei com fios de jumper de 24 AWG para conectar cada linha e coluna nos pinos da placa. Ficou assim:

Parte interna do teclado

Por fim, imprimi os keycaps e a parte de baixo, e foi assim que ficou o teclado:

Teclado completo

Por ser um teclado com poucas teclas, é mais díficil planejar o layout e as combinações de teclas de forma que a digitação continue eficiente e confortável, mas consegui chegar em uma configuração que ficou boa para mim. Essa é a primeira camada do layout:

Primeira camada do teclado

Esse é o layout completo com todas as camadas