Mastodon
Zdjęcie okładkowe wpisu Programowanie klawiatury za pomocą QMK oraz wytłumaczenie czym są warstwy

Programowanie klawiatury za pomocą QMK oraz wytłumaczenie czym są warstwy

3
Dodane: 5 lat temu

Odkąd w moje posiadanie wpadł Massdrop ALT, to zacząłem się interesować QMK. To oprogramowanie jest odpowiedzialne za tworzenie firmware’u dla naszej klawiatury, dzięki czemu możemy ją zaprogramować dokładnie tak, jak chcemy. Jak to zwykle bywa, jest prostsze i bardziej skomplikowane podejście do tematu.

Konfigurator Online

Programowanie klawiatury jest dosyć proste i nie powinno zająć dłużej niż kilka minut. Podstawową i prostą metodą, która jednak nie umożliwia wykorzystania QMK w pełni, jest konfigurator QMK online, w połączeniu z QMK Toolbox. Za pomocą tego pierwszego narzędzia tworzymy mapę naszej klawiatury, czyli określamy gdzie znajduje się jaki klawisz, a za pomocą drugiego wysyłamy skompilowany firmware do klawiatury.

Powyżej widzicie przykład mojego Doro67. Na górze konfiguratora, wybrałem z listy swoją klawiaturę, określiłem jej układ (niektóre klawiatury mogą mieć więcej niż jeden układ, np. USA/ANSI czy UK/ISO) i potem wcisnąłem Load Default. Pod czarnym oknem widać układ klawiszy, który sobie ustawiłem (polecam jego eksport w formacie JSON, aby móc później do niego wrócić, bez konieczności ponownego konfigurowania każdego klawisza), a po lewej widać numerki, które określają warstwy. Na dole z kolei mamy listę dostępny klawiszy, które możemy ustawić w naszym układzie. Poza standardowymi klawiszami, jest też możliwość ustawienia, aby wybrany klawisz na klawiaturze, przykładowo, usypiał nam komputer, uruchamiał kalkulator lub nawet symulował Command/Control + C/V/X. Jeśli natomiast chcemy skorzystać z makr, to trzeba zainstalować sobie pełne środowisko QMK i oprogramować klawiaturę w edytorze tekstu (o tym poniżej). W każdym razie, wystarczy skompilować firmware i wgrać go do klawiatury za pomocą programu QMK Toolbox.

Co to są warstwy?

Warstwę 0 – domyślną – widzicie powyżej, po lewej stronie. To warstwa, która tradycyjnie zawiera klawisze, które widzimy na legendach. Jeśli wciśniemy literką Q, to na ekranie pojawi się Q. Klawisze Shift, Command, Windows, Option/Alt czy Control nie uruchamiają innych warstw – to są modyfikatory, które umożliwiają uzyskanie dodatkowej funkcjonalności za pomocą klawiszy z warstwy domyślnej, zerowej.

Prawdopodobnie zdecydowana większość z Was korzysta z warstw na swoich Makach i nawet nie zdajecie sobie z tego sprawy. Klawiatury Apple oraz macOS chowają drugą warstwę pod klawiszem Fn. Jego naciśnięcie powoduje, że wybrane klawisze na klawiaturze zaczynają spełniać inne funkcje i wykonywać inne zadania. Oto kilka przykładów, które prawdopodobnie znacie:

  • Fn + Delete – kasowanie znaku za kursorem, zamiast przed nim;
  • Fn + strzałka do góry – Page Up.
  • Fn + strzałka do dołu – Page Down.
  • Fn + strzałka w lewo – Home.
  • Fn + strzałka w prawo – End.

Na powyższym screenie mojego układu na warstwie 0, widać klawisze MO(1), dwa klawisze na prawo od Spacji. Ten klawisz, a konkretnie to kod klawisza, czyli wspomniane MO(1) – nie mylić go z Macowym Fn – przełącza klawiaturę na warstwę 1, tak długo, jak go trzymamy (są funkcje, które przełączają nas na inne warstwy i nie wymagają trzymania klawisza, np. TG(x), TT(x), TO(x) czy OSL(x)).

Oznacza to, że jeśli przytrzymam klawisz MO(1), to uruchomiona zostanie powyższa warstwa nr 1 (i będzie aktywna, dopóki nie puszczę tego klawisza). Trójkąty, które określają kod KC_TRNS, oznaczają, że te klawisze są transparentne, czyli zachowana jest funkcja z warstwy poniżej (w tym wypadku warstwy 0). Jeśli spojrzycie na góry rząd, to zobaczycie, że w miejsce numerków, od 1 do =, znajdują się klawisze od F1 do F12. Oznacza to, że jeśli wcisnę MO(1) + 1, to uzyskam klawisz F1, MO(1) + 2 to F2 itd.

Nic nie stoi na przeszkodzie, aby dodać więcej różnych klawiszy, zgodnie z naszymi potrzebami do tej warstwy. Dodam też, że możemy mieć do 15 dodatkowych warstw, więc możliwości programowania klawiatury opartej o QMK są ogromne. W praktyce jednak nie ma to większego znaczenia, dopóki nie zaczniemy korzystać z klawiatur typu Planck, na których nie da się funkcjonować bez większej ilości warstw (są one tam z konkretnego powodu i wbrew pozorom, wprawieni użytkownicy mogą na nich pracować szybciej i ergonomicznej, niż użytkownicy klawiatur z bardziej tradycyjnym układem).

To właśnie dzięki warstwom, nawet jeśli nie chcecie przekonać się do powyższego układu (tzw. ortholinear), można sprawnie korzystać z klawiatur mniejszych, chociażby z modeli 60% czy też HHKB (poniżej).

Jak widzicie, fakt że główna warstwa nie ma chociażby strzałek, nie jest przeszkodą, bo znajdują się one na warstwie nr 1, dostępnej po przytrzymaniu klawisza MO(1). A jeśli nie chcecie trzymać klawisza funkcyjnego, to można go skonfigurować, że jednorazowe pacnięcie przełącza nas pomiędzy warstwami 0 i 1.

Środowisko QMK i makra

Wspominałem wcześniej o makrach, a do tych musimy zdecydować się na zainstalowanie pełnego środowiska QMK, aby móc kompilować firmware dla naszej klawiatury. Brzmi to strasznie, ale w rzeczywistości procedura jest dosyć prosta i opisana szczegółowo tutaj. Ciekawszym zadaniem jest tworzenie naszego pierwszego firmware’u i potem flashowanie nim naszej klawiatury.

Prawdopodobnie pierwszym plikiem, jaki przyjdzie nam edytować, jest keymap.c, który zawiera tekstowy odpowiednik powyższych układów, konfigurowanych graficznie. Oto moja obecna konfiguracja warstw nr 0 i 1:

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( 
    KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_HOME,  
    KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,  
    KC_GRV,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_PGDN,  
    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_UP,   KC_END,  
    KC_LCTL, KC_LALT, KC_LGUI, KC_SPC,  KC_RALT, MO(1),   KC_LEFT, KC_DOWN, KC_RGHT  
  ),
  [1] = LAYOUT( 
    KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_DEL, KC_TRNS,  
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  
    KC_TRNS, RESET,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS,  
    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END  
  ),
};

Jak zapewne się domyślacie, każdy rząd tekstu w części [x] = LAYOUT(...) odpowiada poszczególnym fizycznym rzędom klawiszy na klawiaturze. Stworzenie własnego układu w tym formacie jest ciut bardziej czasochłonne, niż za pomocą graficznego edytora online, ale wystarczy to zrobić raz, a potem jedynie nanosić wymagane zmiany. Jeśli nie rozumiecie co oznaczają te wszystkie KC_..., to zerknijcie sobie do dokumentacji tutaj.

No i tutaj dochodzimy do sedna tematu makr, które wymagają tekstowego oprogramowania naszej klawiatury. QMK zawiera sporo bardziej zaawansowanych funkcji, które możemy dodać do klawiatury. Dla przykładu, ostatnio zacząłem wdrażać tzw. Tap Dance, za pomocą którego można ustawić wybrany klawisz, aby miał podwójną funkcjonalność. Dla przykładu, za pomocą kodu/komendy ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPSLOCK) mogę przypisać dwie funkcje do klawisza ESC – jeśli go normalnie wcisnę, to wywołany zostanie ESC, ale jeśli wcisnę go dwukrotnie (w krótkim odstępie czasu, domyślnie 200 ms, podobnie jak podwójne kliknięcie myszki), to wywołam CAPSLOCK (albo cokolwiek innego, co będę potrzebował).

Planuję wykorzystać Tap Dance do przypisania klawiszy F3Cmd + F3 właśnie pod podwójne wciśnięcie jakiegoś innego klawisza, np. HomePgUp. Te dwa skróty klawiszowe wywołują Mission Control oraz Mission Control → Show Desktop, a ponieważ z nich korzystam niezwykle często, to chciałem uprościć sobie do nich dostęp. Niestety, albo jestem głupi, albo jest błąd dokumentacji Tap Dance, bo nie mogę tej funkcji uruchomić. Niezależnie, będę z nią walczył w najbliższych dniach…

Wracając jednak do makr, teoretycznie możecie pod wybrany klawisz przypisać dowolną liczbę komend. Przykładowo, jeśli chcecie, wykorzystać jakiś przycisk do wykonania serii zadań, to nic nie stoi na przeszkodzie, aby tak się stało – wciskacie zadany przez siebie skrót, np. Fn + ESC, a klawiatura otworzy Spotlight, wpisze do niego Safari, uruchomi go, a potem otworzy nową zakładkę z Gmailem i kolejną z ulubionymi wiadomościami. Granice możliwości są w zasadzie ograniczone przez naszą wyobraźnię.

Powyższy klip pokazuje, że ktoś w QMK stworzył grę w Węża, którą zapewne znacie z telefonów Nokii. Ta gra akurat nie wchodzi w interakcję z komputerem, do którego klawiatura jest podłączona, ale niech to będzie pokaz możliwości QMK, które są naprawdę imponujące i których pewnie nie wykorzystam nawet w 50%.


Jeśli coś powyżej nie jest jasne lub macie jakieś pytania, to zapraszam do komentarzy, ale mam nadzieję, że jasne chociaż jest, dlaczego zdecydowałem się na klawiaturę programowalną, która umożliwia ominięcie takich narzędzi jak Karabiner. Bonusem jest to, że firmware klawiatury jest niezależny od komputera, do której ją podłączamy, do czego zalicza się również iPad. To z kolei oznacza, że od teraz zawsze obok Spacji będę miał Prawy ALT, który będzie pozwalał mi łatwo wstawiać polskie ogonki.

A teraz wracam do zgłębiania tajników QMK i zastanawiania się, do czego go jeszcze wykorzystać.

Wojtek Pietrusiewicz

Wydawca, fotograf, podróżnik, podcaster – niekoniecznie w tej kolejności. Lubię espresso, mechaniczne zegarki, mechaniczne klawiatury i zwinne samochody.

Zapraszamy do dalszej dyskusji na Mastodonie lub Twitterze .

Komentarze: 3

Czy jest możliwe zaprogramowanie swojego firmwaru tak, żeby klawiatura zmieniała warstwę w zależności od tego czy jest podłączona np. do pc i maka? Czy sprzęt pozwoli wykrywać to jakoś?Aktualnie mam klawiaturę applowską (pełną alu na kablu) podłączoną do monitora Eizo CG, który przełącza automatycznie klawiaturę (i mysz) wraz ze zmianą źródła. Wiem, że można sobie zaprogramować do tego dedykowany klawisz, ale ja jednocześnie pracuje na dwóch kompach na raz i wystarczająco mnie męczy, że muszę wielokrotnie przełączać źródło na monitorze.