Witam szanownych Sterujących Ruchem Elektronów, raczej tych początkujących Sterowników, którzy jak mniemam znajdą tu coś dla siebie nowego i ciekawego. Prezentowana gra, czy raczej test umiejętności szybkiego liczenia, może się przydać nie tylko do zabawy. Może na przykład pomagać dzieciakom w nauce tabliczki mnożenia. Lub sprzedawcom, jako trening szybkości liczenia, co w tym zawodzie jest bardzo ważne.
Zabierzmy się zatem do pracy. Projekt jest bardzo prosty, opisany z największą możliwą dokładnością i jest przeznaczony głównie dla początkujących w tematyce arduino, a nawet dla zupełnych elektronicznych laików. Oto podzespoły, których użyjemy:
- Płytka arduino UNO, lub NANO (która jest tańsza), lub inna płytka arduino, która ma co najmniej 8 pinów cyfrowych i łącza SDA i SCL (do podłączenia wyświetlacza LCD przez konwerter I2C);
- Wyświetlacz LCD 2 na 16, tutaj też jest swoboda wyboru, można użyć innych wyświetlaczy, ja użyłem 2(wiersze) * 16(komórek poziomo), zakup wyświetlacza z przylutowanym przez producenta konwerterem I2C oszczędzi pracy przy lutowaniu;
- Klawiaturka membranowa (keypad), najpopularniejsze i najtańsze to klawiaturki 4 na 4 (razem 16 klawiszy), lub 4 na 3 (razem 12 klawiszy), ja użyłem 4 na 4, można też użyć 4 na 3, ale wtedy nie wszystkie funkcje programu będą dostępne, chyba że po modyfikacji kodu programu (wyłączanie i włączanie gry jednym “wolnym” przyciskiem * );
- Buzzer, tak zwany “brzęczyk”, najlepiej z generatorem (czyli taki który po podaniu napięcia wysyła ciągły sygnał dźwiękowy, sygnał ustaje po odcięciu prądu), buzzer nie jest konieczny, można go pominąć;
- 2* diody LED, zielona i czerwona, niekoniecznie takie, i w ogóle bez diod też można się obejść;
- Płytka stykowa, służy wyłącznie do podłączenia diod LED;
- Kabelki, można się obejść bez lutowania, używając gotowych kabelków dla arduino, do podłączenia klawiaturki potrzeba 8 kabelków o stykach męski-męski, do podłączenia wyświetlacza LCD – 4 kabelki (męski-żeński), do podłączenia buzzera 2 kabelki męski-żeński ; do diod LED 2 kabelki męski-męski (gdy używamy uniwersalnej płytki stykowej), trochę inaczej wygląda sprawa z płytką NANO, gdzie są konieczne kabelki z wtykiem żeńskim. Poza tym najlepiej kupić NANO z przylutowanymi stykami, co kosztuje parę groszy więcej, a oszczędza czas. Najtańsze NANO i UNO można kupić na www.aliexpress.com – jedyny problem to miesięczny, lub 2 miesięczny czas oczekiwania na przesyłkę z Chin;
- Rezystory 220 Ohm, do podłączenia diod, ale nie są konieczne, ja podłączyłem diody LED bezpośrednio do arduino.
- Potencjometr 1k Ohm, niekonieczny, służy do sterowania tonem buzzera, ja obszedłem się bez potencjometru. Jeśli chcesz użyć potencjometru, podłącz go pomiędzy buzzerem a pinem arduino, nie trzeba nic zmieniać w programie.
Jeśli chodzi o używane w kodzie programu biblioteki, to będą konieczne:
- Liquid Crystal_I2C – jest wiele różnych bibliotek do sterowania wyświetlaczami LCD poprzez konwerter I2C. Ta której użyłem w projekcie jest do ściągnięcia w dołączonej paczce;
- Keypad – ta biblioteka obsługuje klawiaturkę. Strona biblioteki tutaj. Jest też w paczce dołączonej do projektu;
- Timers – użycie wątków, biblioteka jest dostępna w pliku dołączonym do projektu lub tutaj (gdzie jest też opis biblioteki po polsku).
I oczywiście konieczna jest instalacja na komputerze samego języka arduino IDE, najnowsza wersja, jak i wiele różności o arduino (po angielsku) dostępna jest tutaj.
Zaczynamy od podpięcia keypadu do arduino UNO. Ja użyłem 8 pinów cyfrowych, o numeracji od D2 do D9. Pisałem że zamiast arduino UNO może mieć zastosowanie np. taniutkie NANO, w tym przypadku trzeba zarezerwować 2 piny dla łącz SDA i SCL wyświetlacza LCD, w płytce NANO są to piny analogowe A4(SDA) i A5(SCL), jeśli chodzi o łącza klawiaturki to też można użyć pinów cyfrowych od D2 do D9). Sposób połączenia klawiatury do pinów arduino pokazano na rysunku:
Dlaczego klawiatura która ma 16 klawiszy wymaga tylko 8 ścieżek danych? Mogłoby się wydawać że dla określenia wciśnięcia każdego klawisza jest konieczne jedno połączenie. Otóż klawisze w bibliotece keypad.h są zdefiniowane nie jednostkowo, odrębnie, ale przy pomocy tablicy dwuwymiarowej, czyli 2 powiązanych zmiennych. Każda zmienna może przyjmować 4 wartości, a kombinacje pomiędzy obydwoma zmiennymi 4-stanowymi daje 16 możliwych różnych stanów. Graficznie wygląda to jak siatka z 4 wierszami i z 4 kolumnami. Nie musimy się kłopotać o oprogramowanie całego tego systemu, robi to za nas gotowa biblioteka keypad.h. Dołączamy ją do kodu instrukcją:
1 |
#include <Keypad.h> |
To co musimy zaprogramować, to przyporządkowanie odpowiednich pinów arduino do obsługi wierszy i kolumn klawiaturki. Robimy to w ten sposób:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const byte ROWS = 4; //cztery wiersze const byte COLS = 4; //cztery kolumny // tablica znaków klawiszy, dla 4 * 4 , dla keypadu 4 * 3 bez A,B, C, D, char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {2, 3, 4, 5}; //piny arduino wierszy klawiaturki, // tutaj przyporządkujemy odpowiednie piny cyfrowe odpowiednim wierszom byte colPins[COLS] = {6, 7, 8, 9}; //piny arduino kolumn klawiaturki // tutaj przyporządkujemy odpowiednie piny cyfrowe odpowiednim kolumnom //inicjalizacja klawiatury Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); |
Cały ten kod umieszczamy u samej góry programu, przed funkcją setup().
W ten sposób zakończyliśmy wstępne programowanie klawiaturki. Teraz podłączamy wyświetlacz LCD. Ja użyłem wyświetlacza o 2 wierszach poziomych, po 16 znaków każdy, czyli tego najtańszego i najpopularniejszego. Kupujemy wyświetlacz, który ma już zamontowany konwerter I2C, lub dolutowujemy do niego konwerter. I2C ma tylko 4 łącza: SDA, SCL, VCC i GND. Do komunikacji służą dwa pierwsze łącza, VCC i GND służą do zasilania – napięcie zasilania konwertera to 5v. Wyszukujemy więc na płytce arduino UNO piny komunikacyjne – są powyżej pinów D1-D13 i podłączamy wyświetlacz. Wyszukujemy piny 5V i GND (masa) i podłączamy tam wyświetlacz. Jako że łącza zarówno na UNO i jak na I2C są odpowiednio oznaczone, obejdzie się bez dodatkowego rysunku. Wystarczy połączyć SCL konwertera z SCL arduino UNO, SDA z SDA, VCC konwertera z 5V arduino, i GND z GND.
Po podłączeniu możemy sprawdzić czy wyświetlacz działa. Dodajemy więc do naszego programu kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// dołączamy bibliotekę konwertera I2C #include <LiquidCrystal_I2C.h> // definiujemy wyświetlacz LCD jako 16 znaków x 2, // adres heksadecymalny określa komórki pamięci // poprzez które komunikujemy się z I2c, u mnie jest to 0x3F, może być 0x27 lub inna // jak znaleźć ten adres opisałem w artykule LiquidCrystal_I2C lcd(0x3F,16,2); void setup(){ //inicjalizujemy wyświetlacz LCD lcd.init(); lcd.backlight(); // wypisujemy na wyświetlaczu napis początkowy przez 2 sekundy lcd.print("ALGEBRAIK v.1.0"); delay(2000); // czyścimy wyświetlacz lcd.clear(); } |
Kod ten powoduje wyświetlenie na rozjaśnionym wyświetlaczu LCD napisu “ALGEBRAIK v.1.0” przez 2 sekundy. Podłączamy więc arduino do portu USB komputera. Aby komunikować się z arduino poprzez port USB musimy mieć zainstalowany odpowiedni sterownik USB w systemie, którego używamy. Sterownik (CH341SER) do zarówno UNO jak i NANO znajdziemy choćby tutaj. Umieściłem go również w dziale download. Sterownik ten działa pod systemami Win 98/ME/2000/XP/Vista/7/8/8.1/10/2003/2008/2012. Czy zainstalował się i działa poprawnie, można sprawdzić w menadżerze urządzeń systemu (Panel Sterowania-> System -> Menadżer Urządzeń), powinien być widoczny pod zakładką “Porty Com i LPT” jako CH340 UNO(COM?). Port jest widoczny tylko po podłączeniu płytki arduino pod port USB (technologia Plug&Play), gdy płytka jest nie podłączona, port CH340 UNO nie wyświetla się w menadżerze! Pytajnik określa numer łącza USB który jest wykorzystywany. Podpięcie arduino pod inne złącze USB nie da żadnego efektu. Tak samo trzeba pamiętać by w arduino IDE skonfigurować odpowiednio port i rodzaj używanej płytki arduino.(Zakładka w menu Narzędzia -> płytka i Narzędzia -> Port) Port ten powinien być taki sam jak używany przez system port, pokazywany przez Menadżer Urządzeń.(np. Arduino/Genuino UNO na COM4 = CH340UNO(COM4)). Ładujemy kod do arduino (w IDE: Szkic -> Wgraj) i patrzymy na efekt.
Jeśli z wyświetlaczem jest wszystko w porządku możemy przejść do kolejnych czynności.
A zatem podłączamy buzzer i diody LED. Te elementy są dodatkowym urozmaiceniem urządzenia i mogą zostać pominięte. Buzzer, czyli inaczej głosniczek, który po podaniu napięcia wydaje stały dźwięk, różnej częstotliwosci zależnie od podanego prądu. Diody LED najlepiej podłączyć przy pomocy płytki stykowej. Jedna powinna mieć kolor zielony, druga czerwony. Zielona informuje gracza o jego prawidłowej odpowiedzi, druga – czerwona – o błędnej. Buzzer podłączamy do pinu D11, czerwoną LED do D13, zieloną do D12. Diody najlepiej podłączyć poprzez rezystory ok. 100Ohm, ale można też obyć się bez rezystorów. Można podłączyć potencjometr do buzzera, dzięki czemu będzie można regulować jego głosnosć.
To już chyba opisane wszystkie najważniejsze elementy konstrukcji. Pozostają jeszcze sprawy estetyczne, jak umieszczenie gry w odpowiedniej obudowie, ale ten etap pozostawiam pomysłowosci majsterkowiczów.
W sekcji dodanych do artykułu plików znajduje się obszernie po polsku opisany program, więc nie powinno być problemów ze zrozumieniem, jak program działa i jak powiązane są jego odpowiednie częsci.
Diody najlepiej podłączyć poprzez rezystory ok. 100Ohm, ale można też obyć się bez rezystorów
Nieeeeeeeee……
Nie, nie można pominąć rezystorów bo można spalić diodę albo co gorsza port mikrokontrolera.
NIGDY nie wolno przekraczać maksymalnej wartości prądu dla diody LED oraz przede wszystkim, maksymalnych wartości prądu dla pinu mikrokontrolera. W przypadku Atmegi 328p (takowa jest w arduino uno) wartość ta wynosi 40 mA na jeden pin cyfrowy.
Ale nie wolno też zapomnieć o limicie poboru prądu przez mikrokontroler który wynosi 200 mA. Jego również nie wolno przekroczyć.
Dziękuję za uwagi. U mnie w prototypie diody są bez rezystorów i działają dobrze. Ale racja co szkodzi podpiąć rezystorki. To mój pierwszy artykuł na majsterkowo i jestem trochę niepewny odzewu, co zmienić, co dodać itp. Przyznaję że końcówkę pisałem byle skończyć i pominąłem niektóre zagadnienia, ale w pliku programu są opisy do tego co pominąłem w artykule.
To że diody bez rezystorów działają dobrze to o niczym nie świadczy.
Bo będą działały dobrze a potem nagle już nie, kiedy się spalą.
Mikrokontroler 5V też można zasilać napięciem 9 V i będzie “działał dobrze” ale po kilkunastu minutach nagle przestanie i już się nie naprawi.
Popraw to bo oprócz tego to nawet nieźle ci ten projekt wyszedł.
daję 5 za chęci.
Oprócz tych diod jeszcze taka uwaga: Arduino IDE to środowisko programistyczne, a nie język. Język programowania używany przez to środowisko to C++.
Ze sterownikiem też trochę wprowadzasz w błąd. Sterownik, który opisujesz trzeba instalować tylko gdy mamy płytkę z chipem CH340 stosowanym często w tanich klonach i podróbkach Arduino. Jeśli ktoś ma oryginalne Arduino albo dobrej jakości klona to wystarczy zainstalować Arduino IDE.
Ok. Dziękuję za uwagi.
Możesz wrzucić jakiś filmik z działania?
Też bym obejrzał :)
Niestety konstrukcję rozebrałem. Ale efekt na wyświetlaczu wygląda bardzo prosto:
np.
25-9
(działanie do wykonania)
odpowiadasz naciskając cyfry na klawiaturce, zatwierdzasz krzyżykiem na klawiaturce. Program sprawdza czy twoja odpowiedź jest dobra, i jeśli tak to wyświetla DOBRZE!, wydaje dźwięk, i zaświeca zieloną diodę, po czym na kolejnym screenie wyświetla punktację. Jeśli popełniłeś błąd program wypisuje BLAD, wydaje dzwięk i zapala czerwoną diodę. i znów punktacja
Następnie zaczyna się kolejna runda….
Program można oczywiście modyfikować wg własnego uznania, jeśli zmienimy odpowiednie zmienne które określają granicę funkcji RANDOM – to możemy programik uczynić prostszym – dla dzieci – lub supertrudnym – dla matematyków.