Sari la conținut

Lansăm în curând: vezi produsele acum, comenzile se deschid la lansare

CSE Keyboards

05 / 06 · Wireless și firmware

Bluetooth, nRF52840 și ZMK

Ce se întâmplă de la apăsarea unei taste până la caracterul de pe ecran într-o tastatură wireless: cipul nRF52840, protocolul Bluetooth Low Energy, firmware-ul ZMK și cum ține bateria luni de zile.

Cipul nRF52840

nRF52840, produs de Nordic Semiconductor, nu este doar un microcontroler, ci un System-on-Chip (SoC): procesorul, radioul de 2.4 GHz și perifericele (GPIO, USB) stau pe aceeași pastilă de siliciu.

Această integrare reduce mult complexitatea PCB-ului, numărul de componente și sursele posibile de erori, față de varianta cu un microcontroler generic și un modul radio separat.

Specificații

Procesor
ARM Cortex-M4F, 32-bit
Litera „F” vine de la unitatea de calcul în virgulă mobilă (FPU)
Frecvență
64 MHz
Memorie Flash
1 MB
Memorie RAM
256 KB
Pini GPIO
48
USB
USB 2.0
Radio
2.4 GHz, Bluetooth 5 / BLE
Rată de transfer de 2 Mbps și mod Long Range
Alte protocoale
Thread, Zigbee, ANT
Plus protocoale proprietare de 2.4 GHz

Ce înseamnă pentru o tastatură

Procesorul
Are putere mai mult decât suficientă pentru scanarea matricei, debounce, straturi, macro-uri și stiva BLE, cu o latență pe care utilizatorul o percepe ca zero.
Radioul
Bluetooth 5 aduce o latență mai mică și o conectare inițială mai rapidă, iar modul Long Range ține conexiunea stabilă și în birouri cu zeci de rețele Wi-Fi.
Memoria
În 1 MB de Flash încap bootloader-ul, stiva BLE, sistemul Zephyr, aplicația ZMK și setările utilizatorului, plus actualizări de firmware prin Bluetooth (FOTA). 256 KB RAM țin buffere suficiente ca stiva BLE să nu piardă pachete.
USB nativ
Nu e nevoie de un cip convertor USB-serial separat. Prin cablu, tastatura funcționează ca dispozitiv USB HID standard, iar portul servește și la încărcare și depanare.

Din lucrarea de licență, capitolul 2.3

De ce nRF52840, nu RP2040

Raspberry Pi RP2040

Prima opțiune luată în calcul: dual-core ARM Cortex-M0+, foarte apreciat în comunitate.

  • Mulți pini GPIO, deci layout-uri mari (TKL sau full-size) fără componente suplimentare
  • Nu are radio integrat: depinde de un cip extern (ex. Infineon CYW43439) legat prin SPI
  • La momentul proiectului, suportul ZMK pentru această combinație era imatur: probleme de conectivitate, consum greu de optimizat și depanare complicată

Nordic nRF52840

Alegerea finală, considerată standardul de aur pentru ZMK.

  • Procesor și radio pe același cip, fără interfață MCU–radio de gestionat
  • Zephyr și ZMK au fost dezvoltate cu suport prioritar pentru seria nRF; stiva BLE vine direct de la Nordic
  • Mai puțini pini GPIO disponibili, deci formate compacte (60%, 65%, 75%)

O decizie de management al riscului

Pentru că Bluetooth era un obiectiv obligatoriu, s-a ales platforma cu software matur și radio integrat, acceptând un layout mai compact. Formatele compacte fiind populare, compromisul a fost considerat acceptabil.

Din lucrarea de licență, capitolul 3.4

Bluetooth Low Energy

Bluetooth Low Energy (BLE) face parte din standardul Bluetooth începând cu versiunea 4.0 și a fost gândit pentru comunicații pe distanțe scurte cu un consum foarte mic. Spre deosebire de Bluetooth Clasic, optimizat pentru fluxuri continue (de ex. audio), BLE trimite cantități mici de date, iar radioul doarme în cea mai mare parte a timpului.

Asta se potrivește perfect unei tastaturi, care trebuie să transmită date doar când apeși o tastă.

Rolurile GATT

Server GATT (Peripheral)
Dispozitivul care deține datele: tastatura. Își anunță prezența trimițând periodic pachete mici de advertising, prin care poate fi descoperită fără conexiune.
Client GATT (Central)
Dispozitivul care folosește datele: calculatorul, tableta sau telefonul. Caută activ pachete de advertising și inițiază conexiunea.

Servicii și caracteristici

Serviciul HID (UUID 0x1812)
Cel mai important: declară dispozitivul ca tastatură, mouse etc.
Battery Service (UUID 0x180F)
Expune nivelul bateriei, ca sistemul de operare să îl poată afișa.
Device Information Service (UUID 0x180A)
Detalii precum producătorul, modelul sau versiunea de firmware.
Report Map
O caracteristică doar pentru citire: o „hartă” care spune sistemului de operare cum să interpreteze datele (de ex. primul byte e pentru modificatori, următorii pentru tastele normale). ZMK o construiește automat, după configurație.
Input Report
Caracteristica prin care pleacă tastele apăsate. Calculatorul se abonează la notificări, iar tastatura trimite singură un pachet la fiecare apăsare, fără să fie întrebată. Acest „push” este esențial pentru eficiența energetică.

Securitate și compatibilitate

Împerecherea (pairing) generează chei de criptare AES-CCM, iar bonding-ul le salvează, ca dispozitivele să se reconecteze securizat fără intervenția ta. ZMK folosește LE Secure Connections, deci apăsările de taste circulă criptat. Prin profilul standard HID over GATT, tastatura funcționează fără drivere pe Windows, macOS, Linux, Android și iOS.

Din lucrarea de licență, capitolul 2.4

De la tastă la ecran

Cele șase etape prin care trece o apăsare de tastă până devine caracter pe ecran.USB: alternativa prin cablu1Acționareaswitch-uluimecanic →electric2Scanarematrice+ debounce3Căutare înkeymap șistraturi4Raport HID5TransmisieBLEcriptată, laevenimentulde conexiune6Gazdadecodează șiafișeazăcaracterul
Cele șase etape prin care trece o apăsare de tastă până devine caracter pe ecran.
  1. Actuarea switch-ului

    Degetul comprimă arcul. La punctul de actuare, contactele metalice se ating și închid circuitul: acțiunea mecanică devine semnal electric într-un punct al matricei.

  2. Scanare și debounce

    Firmware-ul activează pe rând fiecare coloană și citește toate rândurile, sute sau mii de ori pe secundă, și află coordonatele tastei (de ex. rândul 2, coloana 5). Debounce-ul filtrează zgomotul contactului.

  3. Interpretare și mapare

    Coordonata e căutată în keymap, ținând cont de modificatori și de stratul activ. Aceeași tastă G trimite „g” pe Layer 0 și F5 pe Layer 1 (cu Fn). Tot aici se decide dacă pornește un macro.

  4. Raportul HID

    Codurile rezultate sunt împachetate într-un HID Input Report, de obicei de 8 bytes la o tastatură standard (6-Key Rollover).

  5. Transmisia BLE

    Stiva BLE adaugă antetele, criptează pachetul cu cheile AES de la împerechere și îl pune la coadă. La următorul eveniment de conexiune, radioul pornește o fracțiune de secundă și trimite pachetul ca notificare pe Input Report.

  6. Recepția pe calculator

    Calculatorul primește pachetul prin adaptorul Bluetooth, îl validează și îl decriptează, apoi driverul HID generic îl citește după Report Map și afișează caracterul sau execută comanda.

Raportul HID de 8 bytes: byte 0 pentru modificatori (bit 0 = Ctrl stânga, bit 1 = Shift stânga etc.), byte 1 rezervat, bytes 2–7 pentru până la 6 taste apăsate simultan.Octetul 0 · bitmap modificatoristângadreaptaCtrlShiftAltGUICtrlShiftAltGUI01234567coduri de taste (max. 6 taste)rezervatmodificatori
Raportul HID de 8 bytes: byte 0 pentru modificatori (bit 0 = Ctrl stânga, bit 1 = Shift stânga etc.), byte 1 rezervat, bytes 2–7 pentru până la 6 taste apăsate simultan.
Scanarea matricei: o coloană e pusă pe HIGH, iar un rând citit HIGH arată tasta apăsată de la intersecție. Dioda de lângă fiecare switch împiedică ghosting-ul.R0R1R2R3rânduricititeC0C1C2C3C4coloană → HIGHdioda previne ghosting-ul6 rânduri × 14 coloane = 20 de pini
Scanarea matricei: o coloană e pusă pe HIGH, iar un rând citit HIGH arată tasta apăsată de la intersecție. Dioda de lângă fiecare switch împiedică ghosting-ul.

De ce o matrice cu diode

Ca să economisească pinii microcontrolerului, switch-urile sunt așezate într-o grilă de rânduri și coloane. Fiecare switch are în serie o diodă, ca apăsările multiple să fie înregistrate corect (N-Key Rollover) și să nu apară apăsări „fantomă” (ghosting).

Din lucrarea de licență, capitolul 2.5, 4.3, 1.1

Firmware-ul ZMK

ZMK este un firmware open-source pentru tastaturi wireless. Spre deosebire de QMK, firmware-ul tradițional, este construit pe Zephyr, un sistem de operare în timp real (RTOS) susținut de Linux Foundation. A fost gândit de la început pentru wireless, cu gestionare a energiei și comutare între mai multe conexiuni Bluetooth.

Nu scrii cod C: comportamentul tastelor se descrie în fișiere de configurare (.keymap și .conf), cu sintaxa devicetree. Stiva BLE vine gata făcută și certificată din Zephyr.

Ce poate face

Straturi (layers)
Mai multe tabele de taste. Pe un strat secundar, H, J, K și L pot deveni săgeți, iar rândul de cifre poate deveni F1–F12.
Macro-uri
Secvențe de taste declanșate cu o singură apăsare, de ex. o structură de cod precum un for loop.
Combo-uri
O acțiune la apăsarea simultană a două sau mai multe taste, de ex. J + K trimite Escape.
Tap-dance
O tastă face lucruri diferite după cum o apeși: o dată „a”, de două ori „@”, de trei ori Caps Lock.
Mouse keys
Pe un strat dedicat, I, J, K și L mișcă cursorul, iar U și O fac click stânga și dreapta.
Profile de conectare
Tastatura ține minte mai multe dispozitive împerecheate. O combinație (ex. Fn + 1/2/3) trece la alt dispozitiv, așa că poți controla un PC, un laptop și o tabletă cu aceeași tastatură.

Comportamente în keymap

&kp
„Key Press”: trimite un cod de tastă standard, de ex. &kp Q.
&mo
„Momentary Layer”: activează un strat doar cât timp ții tasta apăsată, ca tasta Fn (de ex. &mo 1).
&bt
Gestionează profilele Bluetooth: &bt BT_SEL 0 alege primul dispozitiv împerecheat, &bt BT_CLR șterge profilurile salvate.
&macro
Definește și declanșează secvențe complexe de apăsări.

Din lucrarea de licență, capitolul 4.1, 4.4, 2.5, 4.4

Baterie și consum

Cum se economisește energia

Deep sleep
După o perioadă de inactivitate configurabilă, procesorul și majoritatea perifericelor se opresc, iar consumul scade la câțiva microamperi. Prima apăsare de tastă trezește instantaneu sistemul.
Design event-driven
Firmware-ul nu stă în bucle de așteptare; se trezește doar la o întrerupere hardware (o tastă apăsată) sau la un eveniment radio.
Interval de conexiune adaptiv
Tastatura negociază cu calculatorul cât de des comunică. Când tastezi, intervalul e scurt, pentru latență mică; când stă, intervalul crește și radioul transmite mai rar.
Power gating
Perifericele interne (ADC, SPI, I2C) sunt pornite doar cât e nevoie. De exemplu, ADC-ul pentru baterie face o singură măsurătoare și se oprește, în câteva microsecunde.

Intervalul de conexiune BLE

În timpul tastării
7.5–15 ms
Latență minimă
Inactivă, dar conectată
100–200 ms
Pachete radio mai rare
Consum în deep sleep
µA
Câțiva microamperi
Ciclul de încărcare CC/CV al cipului TP4054: pre-încărcare sub ~2.9 V, curent constant, tensiune constantă la 4.2 V, apoi oprire.Preîncărcare(trickle)CCcurentconstantCVtensiuneconstantăFinal4.2 V~2.9 V~10%timptensiunecurentTerminare: curent sub ~10% din maxim
Ciclul de încărcare CC/CV al cipului TP4054: pre-încărcare sub ~2.9 V, curent constant, tensiune constantă la 4.2 V, apoi oprire.

Încărcarea acumulatorului Li-Po

  1. Pre-încărcare (trickle)

    Dacă bateria e foarte descărcată (sub ~2.9 V), cipul aplică un curent mic ca s-o aducă la o tensiune sigură.

  2. Curent constant (CC)

    Faza principală: cipul dă un curent maxim constant (stabilit cu un rezistor pe pinul PROG), iar tensiunea bateriei crește treptat.

  3. Tensiune constantă (CV)

    La 4.2 V, tensiunea e ținută fixă, iar curentul absorbit de baterie scade natural.

  4. Oprire

    Când curentul scade sub un prag (de obicei 10% din curentul maxim), încărcarea se oprește, ca bateria să nu fie supraîncărcată. Un LED arată starea încărcării.

Alimentare și protecție

Regulator LDO
Fie că vine de la USB-C (5 V), fie de la acumulator (3.7 V), tensiunea e stabilizată la 3.3 V, de care au nevoie nRF52840 și mai ales radioul său. La scoaterea cablului, alimentarea trece pe baterie fără întrerupere.
Nivelul bateriei
Un divizor de tensiune cu rezistori mari aduce tensiunea bateriei (3.0–4.2 V) la intrarea ADC a cipului. Firmware-ul o transformă în procent după curba de descărcare Li-Po și o trimite prin Battery Service. E mai puțin precis decât un „fuel gauge” dedicat, dar un compromis bun.
Protecție ESD
Liniile de date și de alimentare ale portului USB-C sunt protejate de un circuit de supresie, de obicei o matrice de diode TVS, care deviază spre masă descărcările electrostatice de mii de volți.
Comutator hardware (shipping mode)
Un comutator fizic în serie cu bateria o deconectează complet pentru depozitare îndelungată, reducând autodescărcarea aproape la zero, ceea ce modurile de veghe software nu pot face.

Din lucrarea de licență, capitolul 4.5, 3.5

Scris pe baza lucrării de licență a lui Ștefan-Emanuel Ciupitu, „Tastatură multifuncțională fără fir folosind modulul nRF52840” (Suceava, 2025).