Ügyességi játék házilag az Arduinóval
Hajtogass egy drótpályát, szerezz be néhány programozható komponenst, és az összeállítást azonnal életre keltheted egy Arduino segítségével.
A vásári játékok egyik lengépszerűbb elektronikus ügyességi kihívása a hajlítgatott drótpályán végigvezethető pálca, amely berregő hanggal jelzi, ha nem sikerült érintés nélkül eljuttatnod a játéktér egyik feléről a másikra. E kis szerkezet asztali verzióját Arduino mikrovezérlőddel pillanatok alatt magad is létrehozhatod, az elkészült eszközt aztán tetszés szerint továbbfejlesztheted. Cikkünkben megmutatjuk, hogyan alkothatod meg saját ügyességi játékodat.
Előkészületek
Az alapok nem igényelnek nehezen beszerezhető hardveres komponenseket, mindössze egy LED, egy berregő, valamint néhány kábel kell ahhoz, hogy az összeállítást életre hívd, illetve egy prototípuslapka sem árt a végső változat elkészítéséhez. Ezenkívül valamilyen drótra is szükséged lesz a pálya és az érintőpálca kialakításához (kezdetben két, formára hajlítgatott gemkapocs tökéletesen megfelel), illetve némi szigetelőszalag is jól jöhet az elemek összeillesztéséhez és a szabad érintést kínáló zónák kijelöléséhez. Amennyiben ezek a komponensek a rendelkezésedre állnak, bele is vághatsz játékod megvalósításába.
Maga az összeállítás végtelenül egyszerű: a prototípuslapkába tűzött drótpálya egyik felét csatold a digitális oldal 2-es pinjéhez, a LED-dióda egyik végét a 4-es slothoz, másikat pedig a GND jelzésű földeléshez, végezetül dugd be a pálcát a 3,3 voltos aljzatba. Ha hangot is szeretnél, kösd a 3-as aljzatra a buzzert, másik felét pedig szintén földeld le az egyik üres, GND jelzésű pinnel. Opcionálisan - illetve ha a prototípus túlzottan sokszor jelezne hibásan - a komponensekhez ellenállásokat is társíthatsz.
Alkotásod mobilitásának maximalizálásához egy külső áramforrás bevetését is megfontolhatod, de ha igazán látványos eredményre vágysz, egy számlálót is hozzáadhatsz (ez lehet egy hét szegmensből álló számkijelző vagy akár egy konkrét képernyő is). Ami a szoftvereket illeti, bőven elegendő mindenre az Arduino fejlesztői környezete, extra komponensek telepítésével csak akkor kell bajlódnod, ha valamilyen további hardverelemmel szeretnéd bonyolítani projektedet.
Egyszerűbb, mint gondolnád
Az összeállítást követően már le is ülhetsz az IDE elé, ahol egy új projektet nyitva nekiláthatsz életre kelteni a kódot. Változókból kezdetben háromra lesz csupán szükséged, így a start() függvény előtt ezek létrehozásával érdemes indítanod. Elsőként a LED-hez tartozó pin kapjon nevet (int led=4;), ezek után a játékmezőként csatlakoztatott drótpálya hivatkozása következzen (int palya=2;), végül pedig a buzzer csatlakozóját is add hozzá a listádhoz (int buzzer=3;).
A szükséges változók után jöhet a setup() függvény konfigurálása. Kezdőlépésként a soros monitort kell lindítanod a 9600-as porton (Serial.begin(9600);), majd a LED, illetve a buzzer elemeit kimenetként (pinMode(led,OUTPUT); pinMode(buzzer,OUTPUT);), a pályaelemeket pedig bemenetként (pinMode(palya, INPUT);) megjelölnöd. Indításkor néhány sorral még azt is érdemes kikötnöd, hogy a kimeneti státuszok milyen állapotban várják a rajtot.
Mivel sem a berregőt, sem a LED-et nem kívánod rögtön a start után bekapcsolni, lásd el mindkettőt LOW értékkel (digitalWrite(led,LOW); digitalWrite(buzzer,LOW);). Ha elkészültél, át is léphetsz a loop() függvény belsejébe, ahol először keríts sort egy státuszvizsgálatra, ennek segítségével ellenőrzöd a bemeneti elemed (jelen helyzetben ez a pályádat jelenti) aktuális áramellátását. Amennyiben rendszered nyitott állapotban van - tehát a 3,3 voltos pin felől nem érkezik semmilyen impulzus - akkor ez 0-s értéket eredményez, azonban amint zárod az áramkört, ez az adat 1-re vált.
Ezt a változót nevezd el gStatusnak (int gStatus = digitalRead(palya);). Amennyiben az 1 értéket veszi fel (if(gStatus == 1){}), küldj áramot a LED és a buzzer irányába is úgy, hogy mindkettő értékét HIGH-ra állítod (digitalWrite(led,HIGH); digitalWrite(buzzer,HIGH);), iktass be némi várakozást (delay (100); ), majd ismételten vond meg mindkét port áramellátását (digitalWrite(led,LOW); digitalWrite(buzzer,LOW); ). Eztán adhatsz némi időt a játékosoknak a riasztás kiheverésére (delay(1000);).
Ha a kódnak ezzel a részével elkészültél, azt az ágát is gépeld be feltételnek, amelyre akkor fut a szoftvered, ha nem 1-es érték érkezik a bemeneten. Ezen belül csupán annyi a teendőd, hogy kikapcsolt állapotba lépteted a buzzert és a LED-et, így némiképp szűrheted a fals riasztásokat (else {digitalWrite(led,LOW); digitalWrite(buzzer,LOW);}). Legvégül annyival kell még bővítened a kódodat, hogy a Serial.println(gStatus); kifejezéssel kiíratod a soros monitorra az aktuális állapotot. Ha kész a programod, el is indíthatod a feltöltést, és máris kipróbálhatod élesben a játékot.
A kijelző beüzemelése
Mivel viszonylag egyszerűen felépíthető az alapprojekt, bemutatjuk azt is, miként bonyolíthatod meg egy kicsit végső alkotásodat, például a Groove Starter Kit kétsoros LCD-képernyőjének bevetésével. A shield modul, valamint a kijelzőt a készüléked I2C portjával összekötő kábelek csatlakoztatása után csupán annyi a teendőd, hogy a shield megfelelő pinjeibe visszacsatolod a korábban használt kábeleket.
Az összeállítást követően lépj az Arduino kódszerkesztőjébe, ahol a kijelző használatához elengedhetetlen extra csomagokat kell a szoftverhez társítanod. Ehhez kattints a Vázlat menüpontra, majd a megjelenő listából a Könyvtár tartalmazása, illetve a Könyvtárak kezelése… opciókat válaszd. A felugró ablak keresőmezőjébe gépeld be a Grove LCD kifejezést, és a megjelenő egyetlen találat melletti Telepítés-gombra klikkelve indíthatod el a letöltést és az installálást. Amint megtörtént, visszatérhetsz a kódnézetbe, mivel néhány sornyi kiegészítés hiányzik már csak ahhoz, hogy megjelenítőd életre keljen.
Első lépésként a szoftvered legelejére gépeld be a #include <Wire.h>, alá pedig a #include "rgb_lcd.h" kifejezéseket, amelyeknek köszönhetően problémamentesen használhatod a telepített csomagokból elérhető függvényeket. Hozz létre egy hivatkozást a kijelződre rgb_lcd lcd; néven, illetve állítsd be az alapértelmezett - zöld - színhez szükséges értékeket (const int colorR = 0; const int colorG = 255; const int colorB = 0;).
Ha mindez megvan, állíts készenlétbe egy hibaszámlálót is (int hibak=0;), a kiíratás során ugyanis szükséged lesz erre az értékre. Következő lépésként áttérhetsz a setup()-ba, ahol megjelenítőd típusát az lcd.begin(16, 2); értékkel definiálhatod, háttérvilágításának színét pedig az előzőleg megadott értékekkel állíthatod zöldre (lcd.setRGB(colorR, colorG, colorB);). Most már csak egy üzenetet kell megjelenítened a képernyőn, ennek felső sorában a "HIBAK" kifejezés szerepel majd, alul pedig a loop()-on belül számszerűsítheted, hány alkalommal érintetted a fémpálcát a pályához.
Ezzel el is készültél a start() függvény nélkülözhetetlen funkcióival, elindulhatsz a loop()-ba. Az ismétlődő kódrészben állítsd a képernyőhöz tartozó kurzort a megjelenítő második sorának első karakterére (lcd.setCursor(0, 1);), színezd zöldre a képernyőt (lcd.setColor(GREEN);), majd írd ki a hibák számát (lcd.print(hibak);).
Innentől a maximális játékélmény már csak néhány módosításon múlik az 1-es érték olvasása esetén élesedő feltételekben; állítsd pirosra a kijelzőt (lcd.setColor(RED);), illetve növeld meg a hibák értékét (hibak++;). Mivel a kijelző így már megfelelően színkódolva reagál az érintésekre, a LED-et akár likvidálhatod is a projektből. Ha még szeretnél egy extra lépéssel továbbmenni, összeállításodban elhelyezhetsz egy gombot is, amelynek élesítésével újraindíthatod a számlálót.
Kód
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd; const int colorR = 255; const int colorG = 0; const int colorB = 0;
int palya = 2; int led = 4; int buzzer = 3; int hibak=0;
void setup() { lcd.begin(16, 2); lcd.setRGB(colorR, colorG, colorB); lcd.print("HIBAK"); Serial.begin(9600); pinMode(led,OUTPUT); pinMode(buzzer,OUTPUT); pinMode(palya, INPUT); digitalWrite(led,LOW); digitalWrite(buzzer,LOW); }
void loop() { lcd.setCursor(0, 1); int gStatus = digitalRead(palya); lcd.setColor(GREEN); lcd.print(hibak);
if(gStatus==1) { lcd.setColor(RED); digitalWrite(led,HIGH); digitalWrite(buzzer,HIGH); delay(100); digitalWrite(led,LOW); digitalWrite(buzzer,LOW); delay(1000); hibak++;}
else { digitalWrite(led,LOW); digitalWrite(buzzer,LOW);}
Serial.println(gStatus); }