Ultratania, programowalna klawiatura makro

Ultratania, programowalna klawiatura makro

Programowalne klawiatury DIY to częsty projekt wśród hobbystów. Na ogół są to jednak złożone, drogie i skomplikowane konstrukcje. W tym przypadku jest jednak inaczej. Zaprezentowana w artykule konstrukcja została zoptymalizowana pod kątem kosztów – gotowe, kompletne urządzenie kosztować ma jedynie 3 dolary (niecałe 15 zł). Przyjrzyjmy się, jak udało się to osiągnąć.

Motywacją do zaprojektowania tego urządzenia były organizowane w całej Azji festiwale hobbystów, elektroników itp. Autor postanowił zrobić coś wyjątkowego na takie spotkanie, aby podczas wydarzeń dla twórców wymieniać się z nimi prezentami. Jest to popularna i szeroko stosowana tradycja, która rozpoczęła się od wykonywania elektronicznych wizytówek, które z czasem były rozbudowywane o odtwarzanie muzyki, światełka czy wręcz gry wideo.

Założenia dla projektu były proste – urządzenie ma być czymś zupełnie nowym, co jeszcze nie było prezentowane na tego rodzaju festiwalu, a jednocześnie urządzenie ma być wystarczająco tanie, aby autor mógł sobie pozwolić na zbudowanie kilku takich urządzeń i rozdawanie ich za darmo napotkanym osobom. I tak autor doszedł do pomysłu „4×Macropad” – mechanicznej klawiatury makro z 4 mechanicznymi klawiszami w rozmiarze wizytówki (oczywiście z pominięciem wysokości).

Nieskomplikowana konstrukcja sprawia, że autor poleca swój projekt nawet, jako pierwszy projekt do wykonania. Układ zawiera same podstawowe elementy, a jednocześnie korzysta z kilku ciekawych technologii. Gotową płytkę drukowaną do układu można zamówić, wiele elementów mechanicznych układu wykonanych jest w technologii druku 3D, a wszystkie komponenty elektroniczne można przylutować ręcznie – najmniejszy z układów jest w obudowie SOP, która jest stosunkowo łatwa do ręcznego lutowania w porównaniu z innymi obudowami SMD, takimi jak SSOP, QFN czy w BGA.

Moduł można zmontować w około 30 minut, a koszt całości to około 3 dolary (nie licząc kosztów wysyłki poszczególnych elementów). To dla wielu początkujących hobbystów może być sporą zachętą – nie trzeba inwestować dużych ilości czasu i pieniędzy w ten projekt. Kod programu udostępniony jest przez autora, a do zaprogramowania mikrokontrolera w systemie wystarczy środowisko Arduino.

Potrzebne elementy

Do budowy tego modułu potrzebne będą:

  • płytka drukowana,
  • podstawa wydrukowana w 3D do montażu PCB pod kątem (opcjonalna),
  • 4 śruby M2×5,
  • mikrokontroler CH552G – układ z rdzeniem E8051 programowalny w środowisku Arduino IDE,
  • przełącznik do zmiany trybu działania,
  • przyciski SMD,
  • złącze miniUSB,
  • 7 rezystorów 10 kΩ (SMD0805),
  • 2 kondensatory 100 nF (SMD0805),
  • 3×diody LED (zasilanie, tryb A i tryb B),
  • 4×przyciski mechaniczne,
  • 4×nakładki na przyciski (dowolne, można wydrukować je w 3D),

Płytka drukowana i elementy

Kluczowym elementem tego projektu jest płytka drukowana. Klawiatura makro została zaprojektowana z otwartą konstrukcją PCB, co oznacza, że płytka drukowana jest bezpośrednio odsłonięta na górze urządzenia. Dzięki temu urządzenie lepiej pasuje swoją stylistyką do środowiska hobbystów, elektroników. Autor w swoim repozytorium na GitHubie umieścił kompletną dokumentację płytki PCB w postaci plików Gerber. Nie udostępnił schematu urządzenia, ale bez problemu można odczytać połączenia pomiędzy mikrokontrolerem, a poszczególnymi peryferiami układu z kodu programu. Zestawienie tych połączeń zawarto w tabeli 1.

Elementy do druku 3D można edytować w programie Autodesk Inventor. Firma Autodesk zapewnia bezpłatną wersję dla studentów, w której można dowolnie dostosowywać model w zależności od potrzeb. Elementy te możemy wydrukować samodzielnie, jeśli mamy drukarkę 3D lub możemy zamówić w firmie, która się tym zajmuje. Autor projektu zlecił druk 3D tej samej firmie, która przygotowywała dla niego PCB, co uprościło logistykę.

Mając już PCB można zacząć montować urządzenie. Autor poleca na początek zacząć od lutowania najmniejszych elementów. Można też lutowanie zacząć od mikrokontrolera CH552G, następnie można przylutować otaczające go elementy w obudowach SMD0805, a następnie pozostałe części z obudowami przewlekanymi. Wystarczy postępować zgodnie z instrukcjami nadrukowanymi na PCB i przylutować wszystko we właściwych miejscach (rysunek 1).

Rysunek 1. Rozmieszczenie poszczególnych elementów składowych modułu

Moduł wyposażony jest w trzy opcjonalne kanały RGB, którymi można sterować za pomocą zaawansowanego oprogramowania (można je wgrać do mikrokontrolera). Jeśli chcemy skorzystać z tej opcji należy wlutować dodatkowe rezystory 10 kΩ i diody LED SMD0805, zgodnie z opisem.

Uruchomienie i programowanie

Przed podłączeniem modułu do komputera należy wykonać test zasilania, najlepiej używając zasilacza laboratoryjnego, który wyposażony jest w ograniczenie prądowe. Do pól oznaczonych 5 V i GND na płytce drukowanej podłączamy zasilanie, zanim podepniemy moduł do komputera. Jest to ważne, aby upewnić się, że nic nie zostało zwarte podczas procesu lutowania, a PCB można bezpiecznie podłączyć do komputera.

Po włączeniu układu, bez żadnego programu wgranego do mikrokontrolera, dioda LED powinna świecić z 50% jasnością. Dzieje się tak, ponieważ piny kontrolne diody LED pływają. To normalne zachowanie. Jeśli wszystko działa poprawnie, można teraz odłączyć moduł od zasilacza laboratoryjnego i rozpocząć programowanie z poziomu komputera.

Przed zaprogramowaniem modułu trzeba zainstalować na komputerze wymagane biblioteki i sterowniki dla Arduino IDE, aby móc w ogóle zaprogramować ten mikrokontroler. Dokładny opis, jak dodać obsługę układów z serii CH55×do Arduino IDE, znaleźć można na GitHubie (link znajduje się na końcu artykułu). Należy postępować zgodnie z instrukcją, aby dodać wymagane zależności i sterowniki tego układu do komputera, by środowisko Arduino mogło skomunikować się z mikrokontrolerem.

Programowanie dla początkujących

Autor przewidział dwa sposoby programowania układu. Dla bardziej początkujących programistów opracował generator kodu on-line, który ma interfejs graficzny, w którym można skonfigurować wszystkie klawisze i tryby działania makropada. Klawiatura ma dwa tryby – Tryb A i tryb B, które można przełączać za pomocą przełącznika w lewym górnym rogu urządzenia. Makra w obu trybach mogą być inne, wszystkie je można zdefiniować w internetowym konfiguratorze.

Aby rozpocząć programowanie, wystarczy wejść na stronę konfiguratora (link na końcu artykułu). Wybieramy tryb A, przycisk, który chcemy zaprogramować. W polu edycji wprowadzamy przyciski, jakie chcemy lub wybieramy specjalny klawisz multimedialny z listy rozwijanej poniżej. Można dodać również opcje opóźnienia i inne kroki. Następnie wybieramy kolejny klawisz w tym trybie, aż wszystkie zostaną zaprogramowane. Następnie przechodzimy do trybu B i analogicznie konfigurujemy wszystkie przyciski.

Po skonfigurowaniu wszystkich klawiszy w obu trybach, naciskamy przycisk, który generuje kompletny szkic Arduino. Wystarczy pobrać go i użyć do zaprogramowania mikrokontrolera – opis programowania z pomocą Arduino IDE znajduje się poniżej.

Zaawansowane programowanie klawiatury

Zaawansowani programiści, który są w stanie samodzielnie edytować kod w języku C, mogą skorzystać ze środowiska Arduino IDE do modyfikacji przygotowanego przez autora firmware. W pierwszej kolejności należy pobrać z repozytorium kod programu, którego uproszczoną wersję pokazano na listingu 1.

Listing 1. Uproszczony listing programu

#ifndef USER_USB_RAM
#error “Require USB RAM. Go Tools > USB Setting
and pick the 2nd option in the dropdown list“
#endif

#include “src/userUsbHidMediaKeyboard/USBHIDMediaKeyboard.h“
#include “win-zh_util.h“

// Konfiguracja sprzętowa
// LED trybu
#define LED_A 34
#define LED_B 33
// LED RGB
#define LED_Red 32
#define LED_Green 31
#define LED_Blue 30

// Przełącznik trybu
#define SWITCH 14
// Przyciski klawiatury
// (mechaniczne, od lewej do prawej)
#define BTN_1 15
#define BTN_2 16
#define BTN_3 17
#define BTN_4 11

// Obecny tryb
bool modeA = true;

// Poprzedni stan przyciskiu
bool bt1ActiveState = false;
...
// Obecny stan przycisku
bool bt1Active = false;
...

// Specjalny tryb do regulacji głośności,
// aktywowana w trybie A po przytrzymaniu przycisku 2
// w tym trybie przyciski 3 i 4 służą do
// zmiany głośności zamiast przewijania ścieżek
bool volMode = false;

void setup() {
// Inicjalizacja portu USB
USBInit();
// Przełącznik statusu
pinMode(SWITCH, INPUT);
// Diody LED statusu
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
// LED czerwony jako wyjście
pinMode(LED_Red, OUTPUT);
// LED zielony jako wyjście
pinMode(LED_Green, OUTPUT);
// LED niebieski jako wyjście
pinMode(LED_Blue, OUTPUT);

if (!digitalRead(SWITCH)){
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);

digitalWrite(LED_Blue, HIGH);
digitalWrite(LED_Red, LOW);
}else{
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);

digitalWrite(LED_Blue, LOW);
digitalWrite(LED_Red, HIGH);
}
// Zielony LED zarezerwowany dla dwóch
// długich naciśnięć przycisku 2
digitalWrite(LED_Green, LOW);
}

void loop() {
// Odczyt trybu działania klawiatury
modeA = !digitalRead(SWITCH);

// Odczyt stanu przycisku 1
bt1Active = !digitalRead(BTN_1);
...

// Tryb A
if (modeA == HIGH){
// Przycisk 1: Play/Payse
if (bt1ActiveState != bt1Active){
bt1ActiveState = bt1Active;
if (bt1Active){
Consumer_press(MEDIA_PLAY_PAUSE);
}else{
Consumer_release(MEDIA_PLAY_PAUSE);
}
}
// Przycisk 2: Zmień playlistę / tryb kontroli głośności
if (bt2ActiveState != bt2Active){
bt2ActiveState = bt2Active;
if (bt2Active){
volMode = true;
digitalWrite(LED_Green, HIGH);
}else{
volMode = false;
digitalWrite(LED_Green, LOW);
}
}
// Przycisk 3: Poprzedni utwór / głośność w dół
if (bt3ActiveState != bt3Active){
bt3ActiveState = bt3Active;
if (volMode){
// Wykrywanie przytrzymania przycisku 2
if (bt3Active){
Consumer_press(MEDIA_VOLUME_DOWN);
}else{
Consumer_release(MEDIA_VOLUME_DOWN);
}
}else{
// Tryb domyślny
if (bt3Active){
Consumer_press(MEDIA_PREV);
}else{
Consumer_release(MEDIA_PREV);
}
}
}
// Przycisk 4: Następny utwór / głośność w górę
if (bt4ActiveState != bt4Active){
bt4ActiveState = bt4Active;
if (volMode){
// Wykrywanie przytrzymania przycisku 2
if (bt4Active){
Consumer_press(MEDIA_VOLUME_UP);
}else{
Consumer_release(MEDIA_VOLUME_UP);
}
}else{
// Tryb domyślny
if (bt4Active){
Consumer_press(MEDIA_NEXT);
}else{
Consumer_release(MEDIA_NEXT);
}
}
}
// Kontrola diod LED
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
digitalWrite(LED_Blue, HIGH);
digitalWrite(LED_Red, LOW);

// Tryb B – drukowanie informacji wizytówki
}else{
// Przycisk 1:
if (bt1ActiveState != bt1Active){
bt1ActiveState = bt1Active;
if (bt1Active){
// Uruchomienie przeglądarki
Consumer_press(CONSUMER_BROWSER_HOME);
delay(100);
Consumer_release(CONSUMER_BROWSER_HOME);
delay(1500);
// Wpisywanie adresu strony
// (większość została pominięta dla uproszczenia)
Keyboard_write(‚h‘);
delay(30);
Keyboard_write(‚t‘);
delay(30);
Keyboard_write(‚t‘);
delay(30);
Keyboard_write(‚p‘);
delay(30);
// Klawisz Enter – przejście na stronę
Keyboard_write(KEY_RETURN);
delay(30);
}
}
// Przycisk 2:
if (bt2ActiveState != bt2Active){
bt2ActiveState = bt2Active;
if (bt2Active){
// Wpisywanie chińskich znaków
// (większość pominięta dla uproszczenia)
typeChinese(„45935“); //這
typeChinese(„44111“); //是
}
}
// Przycisk 3:
if (bt3ActiveState != bt3Active){
bt3ActiveState = bt3Active;
if (bt3Active){
// Wpisywanie chińskich znaków
// (większość pominięta dla uproszczenia)
typeChinese(„36889“); //這
typeChinese(„26159“); //是
}
}
// Przycisk 4:
if (bt4ActiveState != bt4Active){
bt4ActiveState = bt4Active;
if (bt4Active){
// Wpisywanie dowolnego tekstu
// (większość pominięta dla uproszczenia)
Keyboard_write(‚S‘);
Keyboard_write(‚e‘);
Keyboard_write(‚e‘);
...
}

}

// Kontrola diod LED
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
digitalWrite(LED_Blue, LOW);
digitalWrite(LED_Red, HIGH);
}

// Proste filtrowanie drgania styków przycisków
delay(50);
}

Przykład w repozytorium implementuje następujące elementy:

  • Tryb A – kontroler multimediów (praca z YouTube lub inną usługą przesyłania strumieniowego z listą odtwarzania), patrz załączona instrukcja sekwencji kombinacji klawiszy;
  • Tryb B – wersja demonstracyjna (automatyczne otwieranie adresu URL, chińskie znaki Unicode i inne).

Dodatkowe GPIO

Płytka drukowana jest wyposażona w trzy dodatkowe GPIO, które są wyprowadzone z mikrokontrolera do sterowania diodą LED RGB, która ulokowana jest na spodzie płytki drukowanej klawiatury. Odpowiednie piny mikrokontrolera dla tych pinów to P30, P31 i P32, zgodnie z oznaczeniami na warstwie opisowej na płytce drukowanej. Można wyjść tych używać również do sterowania innych podzespołów, takich jak silnik wibracji czy inne moduły elektroniczne, a nawet do komunikacji z innym mikrokontrolerem, jeżeli dodamy do programu obsługę interfejsu szeregowego lub portu I²C, korzystając np. z biblioteki softi2c.

Programowanie mikrokontrolera

Aby przesłać gotowe oprogramowanie do modułu, należy w Arduino IDE w menedżerze płytek wybrać układ CH552. Po skonfigurowaniu środowiska wystarczy kliknąć przycisk przesyłania i podczas kompilacji nacisnąć i przytrzymaj przycisk PROG na płytce drukowanej, podłączając moduł klawiatury do komputera w momencie, gdy kompilacja się zakończy. Po podłączeniu makropada do komputera należy zwolnić przycisk PROG i poczekać, aż skompilowany szkic zostanie załadowany do pamięci mikrokontrolera.

Bardzo ważne jest to, aby nie zwolnić przycisku PROG zbyt wcześnie. W takim wypadku system Windows spróbuje ponownie załadować urządzenie i ponownie przełączyć je w tryb USB HID. Jeśli przycisk PROG zostanie zwolniony zbyt późno, to przesłanie programu może nie być możliwe, gdyż przycisk ten powoduje zwarcie linii USB D+ do masy. Jeśli mamy problem z przesłaniem programu, warto spróbować ponownie. Jak pisze sam autor, jemu programowanie tego układu udaje się typowo po trzeciej próbie.

Podsumowanie

Po zaprogramowaniu modułu, klawiaturka jest już gotowa do użytkowania. Gotowy moduł pokazany jest na rysunku 2.

Rysunek 2. Gotowy moduł klawiatury makro

Wystarczy podłączyć Macropad do komputera i już można używać go w sposób zgodny z zaprogramowanymi trybami. Macropad jest doskonałym gadżetem dla hobbystów. Dzięki niewielkim rozmiarom można zabrać go ze sobą na spotkania, festiwale itd., a dzięki niewielkiej cenie można go rozdawać, jako zamiennik naszej wizytówki. Jeśli skorzystamy z oprogramowania z listingu 1 to zobaczymy, że w drugim trybie (B) moduł po naciśnięciu przycisków wpisuje adres strony i inne nasze dane.
Wszystkie elementy projektu są opublikowane na licencji open-source na GitHubie – źródło programu, modele 3D, pliki gerber i inne szczegółowe informacje można znaleźć w repozytorium autora. Dzięki temu z łatwością można nie tylko samodzielnie zbudować taki projekt, ale także rozbudować go – jeśli mamy jakieś pomysły, możemy skomentować projekt autora lub rozdzielić repozytorium (fork) i rozbudować naszą wersję o nowe, własne pomysły.

Nikodem Czechowski, EP

Bibliografia:

Artykuł ukazał się w
Elektronika Praktyczna
czerwiec 2023
DO POBRANIA
Materiały dodatkowe
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio styczeń - luty 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich styczeń 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów