Ebben az oktatóanyagban az Arduino alatt a 2×16 karakteres LCD-vel bővített KeyPad shield használata kerül bemutatásra. Az áramkör érdekessége a „több billentyű egy bemeneten” kialakítású felhasználói interakció feldolgozása. Az irányítás és a kijeltő megismerése után néhány játék bemutatása következik, mely tipikusan ilyen LCD-nyomógomb rendszerekre készült.
Szükséges eszközök
A mintaprogramok kipróbáláshoz szükséges hardware-eszközök:
Szoftver-környezet:
- Arduino-1.8.13 (de egyéb kiadással is működik)
Az LCD Keypad shield
A 16×2 LCD Keypad elnevezésű shield az Arduino UNO, Mega, Leonardo és más – Arduino kompatibilis – alappanelekhez is használható. Az egyetlen megkötés, hogy a lapnak támogatnia kell az 5V-os tápellátást és az analóg bemeneten az 5V fogadását. Az áramköri felépítése miatt teljes mértékben kompatibilis az Arduino (beépített) 4-bites „LiquidCrystal” eljárás-könyvtárával.
A shield tartalmaz:
- 16×2 karakteres LCD kijelző,
- kijelző kontraszt-beállító potenciométer,
- LCD háttérvilágítás ki/bekapcsolása/fényerőállítás,
- 5 nyomógomb, amelyek az A0 analóg bemenetre van csatlakoztatva,
- reset gomb,
- szabad kivezetéseket (furatgalvánizáltan kivezetve) az A1..A5, D0..D3, D11..13 pontokon
Az LCD Keypad shield használata
Az LCD Keypad egy egyszerű „out of box” felhasználóbarát Arduino shield. A beüzemeléséhet a kivezetéseit kell pontosan megismerni. Az LCD bekötése:
Arduino kivezetés | Funkció |
D8 | LCD RS |
D9 | LCD Enable |
D7 | LCD D7 |
D6 | LCD D6 |
D5 | LCD D5 |
D4 | LCD D4 |
D10 | LCD háttérvilágítás |
A0 | Nyomógombok |
1602 Arduino LCD – billentyűzet jellemzői
Az információk, eredmények megjelenítése az elektronikai projektekben mindig fontos kérdés volt. Az adatok kiírása, közlése a felhasználókkal már a korai fejlesztéseknél igényként merült fel. A visszajelzések lehetnek olyan egyszerűek, mint például 7 szegmenses vagy LED-kijelző – de hamar elérhetővé váltak a részletgazdagabb, rugalmasabban kezelhető LCD-k is. Ezek használata mindig is az információmegjelenítés egyik legnépszerűbb módja volt. Az LCD-k két általános típusra oszthatók: karakteres és grafikus megjelenítésűre.
Az egyik legelterjedtebb, legolcsóbb és legegyszerűbben elérhető LCD típus az ún. karakteres LCD. Ez az LCD több sorból és oszlopból áll – a betűk és a számok a sorok és oszlopok által létrehozott, fixen kötött helyekre kerülnek kiírásra. Például a 16*2 karakteres LCD 2 sort és 16 oszlopot tartalmaz. Így összesen 32 karakternyi helyen tud információt megjeleníteni.
Ezekkel a kijelzőkkel nagyon egyszerű dolgozni – teljes mértékben kompatibilisek az összes mikrokontrollerrel és processzorlappal. Több gyártó is készít karakteres LCD-t és a csatolófelülete kvázi-szabvánnyá vált. A 16×2 karakteres LCD könnyebb használatához a négy gombot is tartalmazó Arduino shield készült.
A nyomógomb-rendszer működése
Az 5 nyomógomb – Select/Kiválasztás, Up/Fel, Down/Le, Left/Balra és Right/Jobbra – mind az A0 elnevezésű analóg bemenethez csatlakozik. Ez az alábbi módon valósul meg:
Ha nincsen egyetlen gomb sem megnyomva, akkor az A0 bemeneten mérhető feszültséget az R1 jelű 2kOhm-os 5Vra kötött ellenállás okozza. Ebben a helyzetben a többi ellenállásnak nincs szerepe (hiszen sorba vannak kötve és a legutolsó pontja”lebeg” – így az A0 analóg bemenet értéke a felső határérték: 1023 lesz.
Amikor a Fel/Up gombot nyomjuk meg, akkor a 2 kOhm ellenállás a 330 Ohm ellenállással sorba kapcsolódik és a közös pontjukon a feszültségérték (az ellenállásos feszültségosztás miatt [bővebben lásd: → Egyszerű elektronika: Ellenállás]) kb. 0.71V lesz: ez 330R/(330R+2k) * 5V = 0,142 * 5V = 0,71V, ami ADC mért értékben: 5V/1023*0.71V = 145). Tehát, ha 145 körüli értéket kapunk az A0 beolvasásakor, akkor az az Up/Fel nyomógomb megnyomását jelzi. A ténylegesen figyelembe vett és a működésben (ekkor) szerepet játszó kialakítás:
A Down/Le gomb megnyomásakor (330 Ohm + 620 Ohm=) 950 Ohm és a 2kOhm határozza meg az ellenállásosztót, így az A0 bemenetre kb. 1,61 V kerül (ADC-ként ez 329 mért értéket jelent).
A shield-en mind az 5 navigációs gomb ellenállásokon keresztül az A0 (analóg) bemenetre csatlakozik – megtakarítva jónéhány különálló digitális bemenetet. Amikor megnyomásra kerül egy billentyű, akkor az ellenállásokból képzett osztóáramkörnek megfelelő érték jelenik meg az A0 bemeneten – a mért értékből pedig a megnyomott gomb azonosítható.
Nyomógomb | A0 (ADC) érték |
Right/Jobb | 0-60 |
Up/Fel | 60-200 |
Down/Le | 200-400 |
Left/Bal | 400-600 |
Select/Kiválaszt | 800-800 |
Nincs megnyomva | >800 |
És maga a programkód (a teljes program,kód és kapcsolódó anyagok a →Hivatkozások pontból tölthető le)
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 | #include <LiquidCrystal.h> const int pin_RS = 8; const int pin_EN = 9; const int pin_d4 = 4; const int pin_d5 = 5; const int pin_d6 = 6; const int pin_d7 = 7; const int pin_BL = 10; LiquidCrystal lcd( pin_RS, pin_EN, pin_d4, pin_d5, pin_d6, pin_d7); void setup() { lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print(" LCD Keypad "); lcd.setCursor(0,1); lcd.print("Press Key:"); } void loop() { int x; x = analogRead (0); lcd.setCursor(10,1); if (x < 60) { lcd.print ("Right "); } else if (x < 200) { lcd.print ("Up "); } else if (x < 400){ lcd.print ("Down "); } else if (x < 600){ lcd.print ("Left "); } else if (x < 800){ lcd.print ("Select"); } } |
A kód működése röviden
1 | #include <LiquidCrystal.h> |
A program globális részén meghivatkozásra kerül LiquidCrystal
eljáráskönyvtár: a karakteres LCD kezelése a standard, beépített Arduino függvénykönyvtárral lehetséges.
1 | LiquidCrystal lcd( pin_RS, pin_EN, pin_d4, pin_d5, pin_d6, pin_d7); |
Az LCD nevű objektumot létrehozzuk – amely paraméterként az LCD fizikai bekötését tartalmazza. A könnyebb kezelhetőség miatt az ezt megelőző sorokban az egyes kivezetések értéke definiálásra kerül.
A program inicializációs (setup()
) részén kerülnek az egyszer lefutó programsoros megadásra:
1 | lcd.begin(16, 2); |
Az lcd.begin()
függvénnyel az LCD kezdeti konfigurálása történik meg – az lcd objektum sor- és oszlopszámának megadásával. Az első paraméter az oszlopok, a második a sorok számát adja meg.
A program a további lépésben az lcd.setCursor()
utasítással a kiírás első karakterének hely-koordinátáit adjuk meg oszlop és sor paraméterpárosként . Majd ezután az lcd.print()
segítségével a felhasználónak szóló szöveget írjuk ki a kijelzőre.
Az LCD alapbeállítása, inicializálása, az alapszöveg kiírása a setup ()
részben ezzel meg is történt.
A futó programban (a loop()
által befoglalt, ismétlődő program-magban) a nyomógombokat reprezentáló feszültségosztó közös pontjának értékét az analogRead(A0)
utasítással beolvassuk éselmentjük az x változóba. A megismert lcd.setCursor()
utasítással a kiírási helyet beállítjuk a 10,1 koordinátákra. A beolvasott értéktől függően az egymásba ágyazott if-elseif
függvényekkel a lenyomott gomb szerinti kiírást hajtjuk végre az lcd.print()
segítségével.
Tipp: a kiírás során a korábban kiírt karakterek felülírásra kerülnek – ezért történik meg minden kiírásnál a hat karakter kiírása (a szóközökkel feltöltve a törlendő helyeket)!
Fontos! Az ADC bemeneti értéke több gomb lenyomása esetén a priorizált gomb értékét adja vissza. A működési logika alapján a több gomb egyidejű lenyomása nem detektálható – a magasabb prioritású kerül kiértékelésre!
Használati tippek
Az LCD használatával kiírás vagy kijelzés történhet, míg a nyomógombok segítségével egyszerű navigálásra és kiválasztásra van mód. Ennek egyik felhasználási lehetősége a különféle menük elkészítése, illetve egyszerűbb játékok létrehozása.
A menük létrehozása megérdemel egy külön cikket, ez a későbbiekben a →Karakteres LCD menük kezelése fejezetben érhető el.
A játékok azonban már egy érdekes terület. A 2×16 kijelző sok-sok mindenre alkalmas, hiszen a fix, beégetett karakterek mellett 8 darab, egyidejűleg megjeleníthető definiált ábra is kiíratható. És ha a gombokkal az irányítás megoldható – akkor nyert ügyönk van.
De nem kezdüönk neki a játékok megírásának – ezt mások már megtették helyettünk…
LCD Keypad és a játékok
Az LCD Keypad shield játékgyűjtemény legtöbb esetben különálló nyomógombokra és kijelzőre épült. Ez került később átírásra, hogy az egységes kialakítású Keypad shield-en futtatható legyen. A programok mind kipróbálásra kerültek, az alappanel Uno lapka volt.
A játékok a megadott linkekről letölthetőek, vagy egyszerűbben a →Hivatkozások alól (lap alján) egyben is elérhetőek.
1. Arduinoid
A klasszikus falromboló néven is ismert játék. Kicsit fura, hogy oldalirányban kell játszani – de megszokható.
Opcionális kiegészítő: 1x passzív buzzer (csipogó) a D3 és a GND közt.
- Author: Mason (@profmason)
- Eredeti URL: https://codebender.cc/sketch:209333#DF%20Robot%20LCD%20with%20Keypad.ino
- Youtube: https://www.youtube.com/watch?v=mam9-iFeFJk
2. DinosaurGame
Az „ugrálós”, barlangban mászkálós dinoszauruszos játék átirata.
- Author: Erbol Syzdyk
- URL: https://create.arduino.cc/projecthub/aqzuonyt/arduino-dino-game-using-lcd-663aeb
- Youtube: https://www.youtube.com/watch?v=pR_U7vryuJY
3. Hangmanduino
A szókitalálós -hagyományos akasztófa-játék. Jelenleg angol nyelven érhető el. A program, elején a szavak szabadon átírhatóak. (Alapesetben az ékezetes karaktereket nem támogatja…)
- Author: Dan Wagoner
- URL: http://www.nerdybynature.com/2009/08/31/hangmanduino/
- Youtube: https://www.youtube.com/watch?v=hCa8F8fbHLQ
4. Helicopter
A régi, 8-bites számítógép korában és a játéktermi gépeknél megjelent klasszikus felhőkerülgetős helikoptervezetéses játék.
- Author: Kevin Loney
- URL: https://makezine.com/2013/03/11/arduino-helicopter-game-2/
- Youtube: https://www.youtube.com/watch?v=Lmb0OcObO5A
5. Hunt The Wumpus
A mászkálós, szöveges alapú kalandjátékok alapján készült egyszerű verzió.
- Author: @dmalec
- URL: https://github.com/dmalec/Hunt-The-Wumpus
- Youtube: —-
6. Jump
A mászkálós, oldalnézetes játékok „őspéldánya”…
- Author: Joshua Brooks
- URL: http://www.instructables.com/id/Arduino-LCD-Game/
- Youtube:https://www.youtube.com/watch?v=LVPSwgAacac
7. Number Flip-Flop
Nem is annyira egyszerű játék. Számokat kell sorba rakni, és adott „szeleteket” lehet forgatni. Részletes leírás a feltöltési anyagok közt található.
- Author: Budd Churchward (@barnacleBudd)
- URL: http://mypetdigispark.blogspot.co.za/2013/02/lcd-game-set-up-number-flip-flop-intro.html
- Youtube: https://www.youtube.com/watch?v=SqxVIVnzkR0
8. Pac-Man
Egyszerűsített Pacman játék.
- Author: Jean Malha
- URL: http://forum.snootlab.com/viewtopic.php?f=34&t=207
- Youtube: —
9. PACMAN RIDER!
A Pacman játék nehezített kiadása. Bónusz élettel és támadó szörnnyel.
- Author: Micky Griffiths
- URL: —-
- Youtube: https://www.youtube.com/watch?v=JapKr4s1tVY
10. Poseur Blocks
Tetris játék – kicsit másként… A felépítő elemek részletesebbek, több variációra van lehetőség.
- Author: Alex Zen (@alexzen)
- URL: https://github.com/alzkun/poseur-blocks
- Youtube: https://www.youtube.com/watch?v=tZByxIPXiag
11. Snake
A korai monokróm kijelzős telefonok klasszikus kígyós játéka… 2×16 karakteres kijelzőn…
- Author: @boti12bot
- URL: https://www.youtube.com/watch?v=IkTK6WMlMs4
- Youtube: https://www.youtube.com/watch?v=IkTK6WMlMs4
12. Tetris
A klasszikus Tetris játék – nagy méretű építőelemekkel.
- Author: @Numeric
- URL: https://hackaday.io/project/10761-tetris-on-arduino-lcd
- Youtube: https://www.youtube.com/watch?v=YTdxdu47js0
13. The Lonely Cottage
Szövegalapú, többválasztásos szórakoztató szöveges kaland, jó történettel. A programban a szöveges rész lefordítható, illetve a játékmenet logikai elágazási is jól dokumentáltan megtalálhatóak a programban. Megfontolandó rövid szöveges kalandjátékok újraírására, vagy logikai lépések (oktatási) célra.
- Author: Wayne Jones (@WarmCat)
- URL: http://www.instructables.com/id/Text-Based-Multi-Choice-Adventure-Game/
- Youtube: https://www.youtube.com/watch?v=H70bLuWkbx4
14. Tromino
Még egy Tetris játék.
- Author: Johannes le Roux (@dadecoza)
- URL: —-
- Youtube: https://youtu.be/O69huEK0YT4?t=448
15. Truck Lane
Kerülgetős játék, hasonló a Helicopter-hez. Csak itt autóval malacokat kell kikerülni
- Author: @TheRealDod
- URL: http://www.instructables.com/id/Truck-Lane-a-16×2-LCD-Arduino-game/
- Youtube: https://www.youtube.com/watch?v=N4ZchEWr8_s
16. Vroum!
Autóversenyzős játék. A pálya széles, ámde előre egy sort lehet látni. Kerülgetni kell a többi versenyzőt illetve az útpadkára sem szabad felmenni.
- Author: Pierre Massat
- URL: https://guitarextended.wordpress.com/2013/01/19/sketch-of-the-arduino-lcd-video-game-voitures/
- Youtube: https://www.youtube.com/watch?v=-sYp-wQ_Rtg
17. Zombie
Zombis játék. Egygombos gyorsasági-ügyességi.
- Author: Markus Ulfberg
- URL: http://genericnerd.blogspot.co.za/2010/01/arduino-game-zombie-showdown.html
- Youtube: https://www.youtube.com/watch?v=bYbsQDPGdj8
Egyéb játékok – kérés
Ha találkoztál még ilyen játékkal, kérlek írd meg, hogy felvehessem a listára. Köszönöm szépen előre is. A visszajelzést itt teheted meg →Kapcsolat.