Klawiatura skrótów z Arduino, która ułatwia codzienną pracę

Klawiatura skrótów z Arduino, która ułatwia codzienną pracę

Czy pamiętacie niedawny artykuł o własnej klawiaturze rozwiązującej problem nieporęcznych skrótów klawiszowych w programie Eagle? Dzięki niej do jednego przycisku można było przypisać nawet bardzo długą sekwencję kliknięć.

W tym artykule przedstawiam moją klawiaturę, która ułatwia pracę z różnymi programami komputerowymi!

Jakiś czas temu pisałem o ciekawym projekcie klawiatury do programu Eagle, która ułatwiała używanie nieporęcznych skrótów klawiszowych. Projekt bardzo mi się spodobał, gdyż program Corel Draw X5, którego codziennie używam do tworzenia ilustracji, posiada wiele narzędzi z przypisanymi iście "pianistycznymi" skrótami klawiszowymi, np. Shift+Alt+P. Po chwili namysłu zdecydowałem się na wykonanie swojej wersji klawiatury!

Na początek zakupiłem niezbędne elementy:

  • klawiaturę numeryczną posiadającą 18 przycisków,
  • płytkę Arduino Pro Micro z interfejsem USB 2.0 HID.

Zdecydowałem się na taką klawiaturę, gdyż posiada wygodne przyciski oraz gotową matrycę połączeń, więc w teorii wystarczy podłączyć się do gotowego złącza z sygnałami od klawiszy.

Matrycowanie przycisków jest wygodnym rozwiązaniem, ponieważ zmniejsza liczbę potrzebnych połączeń. Dla przykładu klawiatura 16 przyciskowa (4x4) wymaga jedynie 8 przewodów, zaś 20 przyciskowa (4x5) wymaga 9 przewodów. Tak jest w teorii...

W praktyce okazało się, że złącze zakupionej klawiatury posiada 12 wyprowadzeń...

Używając multimetru nastawionego na pomiar najniższego zakresu rezystancji, spisałem wszystkie połączenia pomiędzy stykami gniazda. Następnie zebrane informacje rozrysowałem do postaci matrycy połączeń, gdzie w miejscach węzłów są przyciski.

W tym miejscu wyjaśniła się zagadka dlaczego jest aż 12 linii. Niektóre linie (patrz komórka F-1) odpowiadają za matrycowanie tylko 1 przycisku! Najwyraźniej w procesie technologicznym bardziej opłacalne było dodanie większej liczby linii - jeśli jest jakieś inne "łatwiejsze" wyjaśnienie tej zagadki, to zwyczajnie go wcześniej nie zauważyłem i przyjąłem poniższy schemat połączeń.

Matryca połączeń przycisków i opis złącza.

Na podstawie schematu połączeń w matrycy podzieliłem sygnały na te które mają być wejściami i te które będą wyjściami. Następnie przylutowałem odpowiednie przewody poprzez rezystory ograniczające prąd do Arduino.

Obudowa z drukarki 3D

Następnie zabrałem się za obudowę. Do schowania sterownika konieczna była dodatkowa podstawka. Model stworzyłem w  Autodesk Fusion 360 i wydrukowałem na drukarce 3D.

Model dostawki do klawiatury z gniazdem na Arduino.

Dostawka posiada gniazdo na Arduino Pro Micro w miejscu dobrym do podłączenia kabla USB. Dzięki temu nie ma potrzeby montowania w obudowie dodatkowego złącza USB.

Klawiatura jest zaokrąglona i ciężko było ją zwymiarować. Mimo to, podstawka pasuje dość dobrze zarówno kształtem jak i kolorem.

Ostatnim etapem było wykonanie ikonek klawiszy (oczywiście w Corelu używając nowiutkiej klawiatury). Wydruk zalaminowałem i przykleiłem taśmą dwustronną do przycisków.

Nie będę tłumaczył, co robią poszczególne ikonki, bo każdy i tak może dostosować klawiaturę do własnych potrzeb. W moim przypadku przyspiesza ona wykonywanie wielu operacji w Corelu!

Oczywiście klawiatura może również generować dłuższe ciągi znaków:

Program w Arduino - dla dociekliwych

W programie fizyczne połączenia tworzone są stosując funkcję setSymbol, która za argumenty przyjmuje numer linii wejściowej, numer linii wyjściowej oraz unikatowy symbol. Funkcja posługuje się przy tym wcześniej zdefiniowanymi tablicami:

  • OUTPUTS - tablica 6 linii wyjściowych zdefiniowana na stałe,
  • INPUTS - tablica 6 linii wejściowych zdefiniowana na stałe,
  • symbols - tablica 36 możliwych konfiguracji linii (przy czym używamy tylko 18) wiążących ze sobą wejście, wyjście oraz symbol jako przechowywaną wartość.

Następnie tak odszukane indeksy w tablicach są zamieniane na indeks w tablicy 36 możliwych symboli. Jak to się dzieje? Numer wiersza iRow wymnożony przez rozmiar macierzy połączeń (MATRIX_SIZE) niejako przenosi indeks pomiędzy wierszami. Zaś dodanie numeru kolumny przesuwa go o zadaną wartość w obrębie kolumn.

Następnie do tak wybranego indeksu wpisywany jest symbol:

Zasada działania sterownika matrycy jest prosta i została omówiona w kursie Arduino poziom 2. W danej chwili tylko jedna linia wyjściowa przyjmuje stan niski, a wszystkie linie wejściowe są sprawdzane. Przełączanie pomiędzy wyjściami jest na tyle szybkie, że efekt matrycowania jest niezauważalny.

W programie zatrzask reprezentuje tablica flag o nazwie states. Jeżeli w danym momencie przycisk jest wciśnięty (przyjmuje stan LOW) i wiemy, że ostatni stan był puszczony (KEY_RELEASE) to wywołaj metodę onPress(index), gdzie index odpowiada znakowi w tablicy symbols lub ostatniemu stanowi w tablicy states.

Metoda onPress łączy w sobie fizyczne kliknięcia klawiatury z komendą wysłaną do podłączonego urządzenia. Stosując blok switch-case sprawdzany jest symbol klikniętego przycisku i wysyłany zostaje zdefiniowany tekst. W powyższym przypadku są to:

  • Wciśnięcie samego klawisza Escape,
  • Wciśnięcie kombinacji Ctrl+U.

Dla zainteresowanych pełny kod programu. Program jest napisany na tyle elastycznie, że można go dostosować do własnych potrzeb:

  1. ustalić rozmiar matrycy MATRIX_SIZE,
  2. zmienić piny reprezentujące połączenia w blokach #define,
  3. zdefiniować własne symbole w metodzie mapKeys,
  4. napisać co klawiatura ma wypisywać w metodzie onPress.

Podsumowanie

Projekt bardzo praktyczny i ciekawy - polecam każdemu zrobić swoją wersję klawiatury. Warto jednak zastanowić się, czy jest sens przerabiać gotową klawiaturę numeryczną. Zdecydowanie łatwiej byłoby odtworzyć projekt z własnymi, "łatwiej" podłączonymi przyciskami!

arduino, corel, klawiatura