Zongorát a mikrokontrollerből

|

Különféle művészeti ágak is kiaknázhatják a mikrovezérlőkben rejlő lehetőségeket, most a zenészeknek mutatunk egy izgalmas projektet.

Több lehetőséged is van arra, hogy zenei eszközként használd az Arduino-t, cikkünkben megmutatjuk, hogy miként készíthetsz egy szintetizátorra hajazó hangszert mindössze néhány egyszerű komponens és némi programozói tudás segítségével. Az összeállításhoz szerencsére nem kell komolyabb kiegészítőket beszerezned, mindössze tetszőleges mennyiségű (a teszteléshez legalább 3 szükséges) gomb, hozzájuk egyenként két kábel, egy buzzer, illetve az őt a lapkához csatoló vezeték szükséges és egy prototípuslapka használata is sokat segíthet. Ezek birtokában gondolkodás nélkül bele is vághatsz a zongora-készítési projektbe.

Az összeszerelés viszonylag egyszerű, a breadbordra kerülő komponensek csatlakozása során csupán egyetlen dologra kell komolyabban odafigyelned, hogy a buzzert egy olyan pinre kapcsold, mely mellett a ~ jel található (mi a 11-es pint szemeltük ki erre a feladatra). Alapkódodban 3 gomb használatán keresztül követheted nyomon a zongora elkészítésének lépéseit, természetesen a végeredmény extra beviteli eszközök csatolásával és néhány változó átírásával könnyedén módosítható.

Működő kattintások

Indításként a gombok aktiválása és a lenyomásukkor történő események előkésztése lesz a legfontosabb feladatod. Ehhez hozz létre a függvényen kívül egy-egy globális, szám típusú változót melyekkel a kiszemelt pineket címkézed fel. Ennek köszönhetően a későbbiekben sokkal egyszerűbben hivatkozhatsz rájuk és egy esetleges átkábelezés esetén is csupán egyetlen változóérték módosítására lesz szükséged. A const int BUTTON_C = 10; const int BUTTON_D = 9; const int BUTTON_E = 8; feliratokkal indítsd tehát a kódot, majd címkézd meg az Arduino onboard LED-jét a 13-as pin-en keresztül (const int LED = 13;). Ezt követően a start függvény belsejében folytathatod a szoftvered készítését, méghozzá a Soros-monitor megnyitásával (Serial.begin(9600);) és a gombjaidhoz tartozó pinek beállításával (pinMode(BUTTON_C, INPUT); digitalWrite(BUTTON_C,HIGH); ). Ezzel nagyjából végeztél is az alapfunkciók indításkor szükséges élesítésével, így áttérhetsz a loop()-ra. Itt sem lesz túlságosan bonyolult a teendőd, hisz mindössze annyit kell figyelned, hogy a megcímkézett gombok mikor kerülnek leütésre, ezt pedig a if(digitalRead(BUTTON_C) == LOW) feltétellel könnyedén meg is valósíthatod.

A feltételen belül aztán aktiválhatod a LED-világítást (digitalWrite(LED,HIGH); ), majd némi késleltetést is elhelyezhetsz ( delay(200); ) és már csak le kell másolnod ezt a kódrészletet annyiszor, ahány gombot élesíteni kívánsz (ügyelve arra, hogy a BUTTON_C feliratot a megfelelő változóval helyettesítsd). Utolsó lépésként a feltételeken kívül, de még a loop-on belül helyezz el egy utasítást, melynek segítségével a LED ismételten kikapcsolt állapotba vált (digitalWrite(LED,LOW); ). Ha ezzel is megvagy érdemes tesztelni a projektet, mely már a billentyűk lenyomására felvillantja a beépített LED-et. Amennyiben ez a funkció megfelelően működik, rátérhetsz a zenei rész elkészítésére is.

Előcsalt dallamok

A dallamok megszólaltatásához szükséged lesz egy tiszta hangsorra, a buzzer azonban csak számokként képes a kottaolvasásra, így kódodban kell majd néhány extra definíció (#define NOTE_C 262 #define NOTE_D 294 #define NOTE_E 330 #define NOTE_F 349 #define NOTE_G 392 #define NOTE_A 440 #define NOTE_B 493). Begépelésük után a buzzer pin-jét is nevesítsd a gombokhoz hasonlóan, a const int BUZZER = 11; sor segítségével. Következő lépésként a loop belsejében kell folytatnod a programod szerkesztését, hisz az if-ek belsejében egyelőre csupán LED-et villogtatsz, ám jó lenne, ha emellé már felcsendülő dallamok is társulnának. Ehhez nincs más teendőd, mint a tone(); függvényt élesítened, melynek első paramétereként a lejátszót adhatod meg, ami esetedben nem más, mint a BUZZER, második paramétere pedig a lejátszani kívánt hang, amit a definíciók közül könnyedén a gombodhoz igazíthatsz (BUTTON_C esetén például a tone(BUZZER, NOTE_C); bevetése szükséges). Utolsó lépésként el is kell hallgattatnod a zenét, így a loop végére biggyessz oda egy noTone(BUZZER); kifejezést. A zongorád alapfunkciói már készen is állnak a tesztelésre, a kódfeltöltést követően ugyanis már gombnyomásra szól a berregőd.

Felvétel indul

Most, hogy az alapokkal végeztél itt az ideje egy speciális funkciógombbal is kibővíteni a lejátszót, melynek segítségével rögzítheted a dallamokat. A gomb lenyomását követően a felvétel elindul, és a rögzítés egészen addig tart majd, amíg a kezdetben beállított tömb hosszát el nem éri a gombnyomások száma, vagy ha az indítást kiváltó billentyűt ismételt beveted. Itt már kicsit bonyolultabb lesz a feladat, melyhez a gomb címkézése mellett ( const int REC = 2; ) egy megfelelően beállított méretű és feltöltött tömbre (int replay[5] = {0,0,0,0,0}; ) is szükséged lesz, illetve kell még két változó is (int pushed = -1; int pushedSecond = 0; ), melyekkel nyomon követed a felvétel gomb használatát és a többi billentyű ezutáni viselkedését.

A setup-on az eredeti függvényhez képest csupán annyit kell módosítanod, hogy bővíted a REC-hez tartozó inicializációs műveletekkel (pinMode(REC, INPUT); digitalWrite(REC,HIGH); ) majd ugorhatsz is a loop belsejébe. Itt ismételten klónozd az egyik gombodat figyelő feladatrészt, ám a belső if helyett egy egysoros kiértékelő-függvényt használj (pushed == -1 ? pushed = 0 : pushed = 1; ) a lenyomást követő változtatásokra. Ezek után a zenei billentyűk lenyomását vizsgáló if-ágba lépj át, ahol indíts egy újabb feltételes funkciót, amibe akkor lépsz, ha a pushed értéke 0 (vagyis a REC gomb lenyomásával elindítottad a felvételt). Ekkor a replay tömb pushedSecond indexen álló tagjának 0 értékét módosítsd az adott hangnak megfelelő NOTE-ra, majd a pushedSecond változó értékét növeld és aktiválj némi késleltetést (delay(200); ). Ezzel már képes az Arduino rögzíteni a dallamokat, már csupán a visszajátszást kell megvalósítanod. Ehhez a loop-ban ismételten egy felételvizsgálatra lesz szükséged, melybe akkor lép a végrehajtás, ha a pushedSecond értéke eléri a tömb méretének maximumát, vagy, ha a pushed értéke felveszi az 1-et (azaz másodszor is megnyomtad a REC gombot). Ebben az esetben némi csendes várakozást követően (noTone(BUZZER); delay(1000); ) egy for-ciklussal végig lépkedhetsz a tömb elemein, így pedig minden nemnulla értéket dallammá alakíthatsz. Ha ez megtörtént már csak az alapbeállítások visszaállítása szükséges, vagyis a pushedSecond értéke ismételten 0-t vesz fel, míg a pushed újra -1-et. Legvégül egy for-ciklussal ismételten haladj át a replay tömb elemin és mindent kattints ismételten 0-ra. Ezzel el is készültél zongorád prototípusával, mely már a lejátszott dallamok visszajátszására is képes.

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.helloworldonline.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.