Jak wiadomo, każde dzisiejsze urządzenie elektroniczne posiada przynajmniej klawiaturę przy pomocy, której możemy wprowadzać pewne informacje, dane. W dzisiejszym poradniku przedstawię jak wykorzystywać klawiaturę matrycową w połączeniu z Arduino, oraz pokażę przykłady jej wykorzystania. Zapraszam !
Spis treści:
1.Jak działa klawiatura matrycowa ?
2.Podstawowe funkcje
3. Przykładowy program
4.Przykład wykorzystania klawiatury
Co będziemy potrzebować:
- Klawiatura matrycowa (możesz zrobić taką jak ja wersja THT : wersja SMD)
- Arduino
- 1x dioda RGB
- 1x rezystor 220 ohm
- 1x zestaw przewodów połączeniowych
- biblioteka Keyboard
1.Jak działa klawiatura matrycowa ?
Jak popatrzymy na powyższe zdjęcie to możemy zauważyć że tego typu klawiatura ma połączone przyciski w rzędy i kolumny, w taki sposób że przyciśnięcie jednego przycisku spowoduje zwarcie dwóch linii- pionowej (kolumny) i poziomowej (rzędy). Od razu narzuca nam się wada takiej klawiatury- nie można wcisnąć w jednym momencie więcej niż jednego przycisku ponieważ program nie rozpozna które dokładnie zostały wciśnięte. Następnie te kolumny i rzędy podłączamy do Arduino. I to jest cała zasada działania klawiatury matrycowej ;)
2.Podstawowe funkcje
Jak w każdym programie używającym biblioteki musimy dodać ją do programu
1 |
#include <Keypad.h> |
Następie podajemy informacje jakie wymiary ma nasza klawiatura (ile kolumn na ile rzędów) w postaci stałej, liczby całkowitej:
1 2 |
const byte wiersze = 4; //ilość wierszów klawiatury const byte kolumny = 4; //ilość kolumn klawiatury |
W następnym kroku tworzymy tablicę dwuwymiarową, w której zawieramy informacje na temat, pod jakim przyciskiem kryje się jaki znak. Do tej tablicy wpisujemy jakie ona ma wymiary w postaci liczbowej czyli np. char klawiatura[4][4] co oznacza, że ma 4 wiersze i 4 kolumny (dokładnie w tej kolejności). Możemy równie dobrze zamiast cyfr wpisać stałe. Zatem char klawiatura [wiersze][kolumny], będzie również poprawne i wtedy informacje o wielkości klawiatury są zaciągane z wyżej wymienionych stałych. Zatem nasza klawiatura wygląda następująco:
1 2 3 4 5 6 |
char klawiatura[wiersze][kolumny] = { // rozkład klawiszy {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; |
Ze względu na to, że posiadam klawiaturę 4×4 to dokładnie taki rozkład klawiszy sobie przyjąłem. Między apostrofami wstawiłem znaki jakie klawiatura ma zwracać po wciśnięciu danego przycisku. Zatem klikając lewy górny przycisk otrzymamy znak 1, a jak prawy dolny to D.
Następnie musimy ustawić pinout naszej klawiatury, czyli jej sposób podłączenia do Arduino:
1 2 |
byte wierszePiny[wiersze] = {9,8,7,6}; //wiersze podłączone do pinów (numeracja od lewej strony do prawej) byte kolumnyPiny[kolumny] = {5,4,3,2}; //kolumny podłączone do pinów (numeracja od lewej strony do prawej) |
Zatem pierwszy wiersz podłączamy do pinu 9., a 4. wiersz do pinu 6. Pierwsza kolumna do 5. pinu, a ostatnia kolumna do 2. pinu.
Teraz pozostało już nam „utworzyć” klawiaturę przy pomocy funkcji z biblioteki:
1 2 3 4 5 6 7 |
Keypad nazwa_klawiatury = Keypad( makeKeymap(nazwa_tablicy_dwuwymiartowej), wierszePiny, kolumnyPiny, ilość_wierszy, ilość_kolumn ); //nazwa_klawiatury- przypisujmy nazwę naszej klawiaturze //nazwa_tablicy_dwuwymiartowej- nazwa naszej tablicy ze znakami klawiatury //wierszePiny - pinout dla wierszy klawiatury //kolumnnyPiny - pinout dla kolumn klawiatury //ilość_wierszy - ilość wierszy naszej klawiatury (wpisujemy zmienną) //ilość_kolumn - ilość kolumn naszej klawiatury (wpisujemy zmienną) |
Teraz, gdy już nasza klawiatura jest skonfigurowana to musimy w jakiś sposób odczytać wciśnięty klawisz. Z pomocą idzie nam funkcja keypad.getKey():
1 |
char przycisk = nazwa_klawiatury.getKey(); |
Jak widać sama funkcja nic nie robi. Musimy jej przypisać jakąś zmienną. W tym przypadku musimy się posłużyć zmienną char, do której będzie zwracana wartość wciśniętego przycisku. Oprócz tej funkcji jest jeszcze parę innych:
1 |
char InPrzycisk = nazwa_klawiatury.waitForKey(); |
Funkcja ta oczekuje na wciśnięcie określonego przycisku. Wadą tej funkcji jest to, że blokuje cały program, do momentu, aż ta funkcja zostanie spełniona.
1 |
nazwa_klawiatury.setHoldTime(czas); |
Funkcja ta dodaje do programu ile czasu musi być wciśnięty przycisk, aby został on wykryty jako wciśnięty. zmienna czas musi być w postaci unsigned int. Funkcję tą umieszczamy w pętli startowej programu
1 |
nazwa_klawiatury.setDebounceTime(czas) |
Funkcja ta dodaje czas przez, który przycisk ma być wciśnięty, aby został on wykryty jako wciśnięty. Funkcja ta niweluje przypadek, w którym drgania mikrostyków powodują wykrycie przycisku jako wciśnięty. Tutaj również zmienna czas musi być wyrażona jako unsigned int. Funkcję tą umieszczamy w pętli startowej programu. Ta funkcja różni się od poprzedniej !
3. Przykładowy program
Program będzie prosty, bo będziemy chcieli wyświetlić w konsoli, jaki przycisk został wciśnięty.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <Keypad.h> //dodaj bibliotekę obsługującą klawiaturę const byte wiersze = 4; //ilość wierszy klawiatury const byte kolumny = 4; //ilość kolumn klawiatury char klawiatura[wiersze][kolumny] = { //ustaw rozkład klawiszy {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte wierszePiny[wiersze] = {9,8,7,6}; //wiersze podłączone do pinów (numeracja od lewej strony do prawej) byte kolumnyPiny[kolumny] = {5,4,3,2}; //kolumny podłączone do pinów (numeracja od lewej strony do prawej) //utwórz klawiaturę na postawienie ustawienia klawiszy, pinów Arduino oraz ilości kolumn i wierszy Keypad klaw1 = Keypad( makeKeymap(klawiatura), wierszePiny, kolumnyPiny, wiersze, kolumny ); void setup() { Serial.begin(9600); //rozpocznij transmisję UART } void loop() { char przycisk = klaw1.getKey(); //zmiennej char przypisujemy zwrócony znak z klawiatury if (przycisk) //jeżeli wykryto wciśnięty przycisk to: { Serial.print("Wcisnieto przycisk: "); //wyświetl wciśnięto przycisk: Serial.println(przycisk); // wyświetl klawisz } } |
Jak wcześniej opisywałem. Najpierw tworzymy dwie stałe, wiersze i kolumny, w których będzie przechowywana wartość kolumn i wierszy klawiatury. Następnie tworzymy mapę klawiatury przy pomocy tablicy dwuwymiarowej. Potem tworzymy pinout, przy pomocy którego podłączymy klawiaturę do Arduino i tworzymy klawiaturę. Teraz w pętli głównej programu, tworzymy zmienną char przyciski, w której będzie przechowywany znak wciśniętego przycisku. Przy pomocy funkcji warunkowej if() sprawdzamy czy do zmiennej char trafił jakiś znak z klawiatury. Jeżeli znak się pojawił to wyświetlamy go w terminalu.
Po wgraniu programu powinniśmy otrzymać taki efekt: