- Szükséges anyagok:
- Kördiagramm:
- Séma és magyarázat:
- A
- Zongorázni az Arduinón:
- Az Arduino programozása:
- Lejátszás, rögzítés, visszajátszás és ismétlés! :
Az Arduino megajándékozta azokat az embereket, akik nem elektronikai háttérből származnak, hogy könnyedén készítsenek dolgokat. Remek prototípus-készítő eszköz volt, vagy valami jó dolog kipróbálása. Ebben a projektben egy kis, mégis szórakoztató zongorát fogunk építeni az Arduino segítségével. Ez a zongora nagyjából egyszerű, mindössze 8 nyomógomb és zümmögő. Az Arduino tone () funkciójával különféle típusú zongora hangokat hoz létre a hangszórón. Kicsit fokozva felvettük a felvételi funkciót a projektbe, ez lehetővé teszi számunkra, hogy egy dallamot lejátszhassunk, és szükség esetén ismételten lejátszhassuk. Érdekesnek tűnik !! Tehát építkezzünk….
Szükséges anyagok:
- Arduino Uno
- 16 * 2 LCD kijelző
- Berregő
- Vágógép 10k
- SPDT kapcsoló
- Nyomógomb (8 Nos)
- Ellenállások (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Kenyérlemez
- Csatlakozó vezetékek
Kördiagramm:
A teljes Arduino zongoraprojekt egy kenyérlap tetejére építhető, néhány összekötő vezetékkel. A fritzing használatával készített kapcsolási rajz, amely a projekt kenyérlemez nézetét mutatja, az alábbiakban látható
Csak kövesse a kapcsolási rajzot, és csatlakoztassa ennek megfelelően a vezetékeket, a nyomógombokat és a hangjelzőt, mint egy NYÁK-modullal, de a tényleges hardverben csak a kapcsolót és a hangjelzőt használtuk, nem szabad, hogy nagyon megzavarja Önt, mert azonos típusú tűk vannak. A kapcsolatok létrehozásához hivatkozhat a hardver alábbi képére is.
A bal oldali ellenállások értéke a következő sorrendben van: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k és 10k. Ha nincs ugyanaz a DPST kapcsoló, akkor használhatja a normál kapcsolót, mint amely a fenti kapcsolási rajzon látható. Most nézzük meg a projekt vázlatát, hogy megértsük, miért hoztuk létre a következő összefüggéseket.
Séma és magyarázat:
A fent bemutatott kapcsolási rajz vázlatait az alábbiakban adjuk meg, szintén Fritzing segítségével készítettük.
Az egyik fő kapcsolat, amelyet meg kell értenünk, az, hogy hogyan csatlakoztattuk a 8 nyomógombot az Arduino-hoz az Analog A0 tűn keresztül. Alapvetően 8 bemeneti tűre van szükségünk, amelyek csatlakoztathatók a 8 bemeneti nyomógombhoz, de az ilyen projekteknél nem használhatjuk a mikrovezérlő 8 érintkezőjét csak nyomógombokhoz, mivel későbbi használatra szükségünk lehet rájuk. Esetünkben az LCD-kijelzőt kell összekapcsolni.
Tehát az Arduino analóg tüskéjét használjuk, és változó ellenállásértékű potenciálosztót alkotunk az áramkör befejezéséhez. Így minden gomb lenyomásakor egy másik analóg feszültség kerül az analóg csapra. Az alábbiakban egy csak két ellenállással és két nyomógombbal ellátott mintaáramkör látható.
Ebben az esetben az ADC csap + 5V-ot fog kapni, ha a nyomógombokat nem nyomják meg, ha az első gombot megnyomják, akkor a potenciálosztó az 560R ellenálláson keresztül elkészül, és ha a második gombot megnyomják, akkor a potenciális osztó versenyez az 1.5-ös használatával k ellenállás. Így az ADC csap által kapott feszültség a potenciálosztó képletei alapján változik. Ha többet szeretne megtudni arról, hogy a potenciális osztó hogyan működik, és hogyan kell kiszámítani az ADC csap által kapott feszültség értékét, akkor ezt a potenciálosztó számológép oldalt használhatja.
Ettől eltekintve az összes csatlakozás egyenesen halad előre, az LCD-t a 8, 9, 10, 11 és 12 érintkezőkhöz kell csatlakoztatni. A hangjelző a 7, az SPDT kapcsoló pedig az Arduino 6 érintkezőjéhez van csatlakoztatva. A teljes projekt a laptop USB portján keresztül működik. Csatlakoztathatja az Arduino-t egy 9 V-os vagy 12 V-os tápfeszültséghez a DC csatlakozón keresztül, és a projekt továbbra is ugyanúgy fog működni.
A
Az Arduino rendelkezik egy praktikus hang () funkcióval, amely felhasználható változó frekvenciájú jelek előállítására, amelyek felhasználásával különböző hangok adhatók ki egy hangjelző segítségével. Tehát értsük meg, hogyan működik a függvény és hogyan használható az Arduino-val.
Előtte tudnunk kell, hogyan működik a piezo hangjelző. Lehet, hogy iskolánkban megtudhattuk a piezo kristályokat, ez nem más, mint egy kristály, amely a mechanikus rezgéseket elektromossággá alakítja, vagy fordítva. Itt egy változó áramot (frekvenciát) alkalmazunk, amelyhez a kristály rezeg, így hangot termel. Ezért ahhoz, hogy a Piezo hangjelző némi zajt hallhasson, a Piezo elektromos kristályt rezegni kell, a zaj hangmagassága és hangja attól függ, milyen gyorsan rezeg a kristály. Ezért a hang és a hangmagasság szabályozható az áram frekvenciájának változtatásával.
Oké, akkor hogyan lehet változó frekvenciát kapni az Arduinótól? Itt jön be a tone () funkció. A tone () egy adott frekvenciát generálhat egy adott csapon. Az időtartam is megemlíthető, ha szükséges. A tone () szintaxisa az
Szintaxis hang (pin, frekvencia) hang (pin, frekvencia, időtartam) Paraméterek pin: az a tű, amelyen a hangfrekvenciát elő lehet állítani: a hang frekvenciája hercben - előjel nélküli int időtartam: a hang időtartama ezredmásodpercekben (opcionális1) - hosszú ideig aláíratlan
A pin értékei bármelyik digitális pinje lehetnek. Itt használtam a 8. számú tűt. A generálható frekvencia az Arduino táblán lévő időzítő méretétől függ. Az UNO és a legtöbb más közös tábla esetében a minimálisan előállítható frekvencia 31Hz, a maximálisan előállítható 65535Hz. Mi, emberek azonban csak 2000Hz és 5000 Hz közötti frekvenciákat hallhatunk.
Zongorázni az Arduinón:
Oké, még mielőtt belekezdenék ebbe a témába, hadd egyértelművé tegyem, hogy kezdő vagyok zenei jegyzetekkel vagy zongorával, ezért kérem, bocsásson meg, ha bármi, ami ebben a címsorban szerepel, hamis.
Most már tudjuk, hogy az Arduino hangfunkcióit használhatjuk bizonyos hangok előállítására, de hogyan játszhatjuk le egy adott hang hangjait ugyanazokkal. Szerencsénkre van egy „pitches.h” nevű könyvtár, amelyet Brett Hagman írt . Ez a könyvtár minden információt tartalmaz arról, hogy melyik frekvencia egyenértékű a zongorán található hanggal. Meglepett, hogy ez a könyvtár milyen jól tud működni és szinte minden hangot eljátszani egy zongorán. Ugyanezt használtam a Karib-tengeri kalózok, az Őrült béka, a Mario zongorájain és még a titanicon is, és fantasztikusan csengettek. Hoppá! Kicsit eltérünk a témától, így ha érdekel ez, akkor nézze meg a dallamokat az Arduino projekt segítségével. Ebben a projektben további magyarázatokat talál a pitches.h könyvtárról.
A projektünknek csak 8 nyomógombja van, így mindegyik gomb csak egy adott zenei hangot tud lejátszani, és így összesen csak 8 hangot játszhatunk. Kiválasztottam a zongorán a leggyakrabban használt hangokat, de kiválaszthatja bármelyik 8-at, vagy akár kibővítheti a projektet több nyomógombbal, és hozzáadhat további hangokat.
Az ebben a projektben kiválasztott hangok a C4, D4, E4, F4, G4, A4, B4 és C5 jegyzetek, amelyeket az 1–8 gombokkal lehet lejátszani.
Az Arduino programozása:
Elég elméletből térjünk ki az Arduino programozásának szórakoztató részére. A teljes Arduino program az oldal végén található, és leugorhat, ha szívesen vagy továbbolvasná a kód működésének megértését.
Arduino programunkban le kell olvasnunk az analóg feszültséget az A0 tűről, majd meg kell jósolni, hogy melyik gombot nyomtuk meg, és eljátszani az adott gomb megfelelő hangját. Ennek során azt is rögzítenünk kell, hogy a felhasználó melyik gombot és mennyi ideig nyomta meg, hogy később újra létrehozhassuk a felhasználó által lejátszott hangot.
Mielőtt folytatnánk a logikai részt, be kell jelentenünk, hogy melyik 8 hangot fogjuk lejátszani. Ezután a hangok megfelelő frekvenciáját a pitches.h könyvtárból vesszük , majd egy tömb képződik az alábbiak szerint. Itt a C4 hang lejátszásának frekvenciája 262 és így tovább.
int jegyzetek = {262, 294, 330, 349, 392, 440, 494, 523}; // C4, D4, E4, F4, G4, A4, B4,
Ezután meg kell említenünk, hogy az LCD kijelző melyik érintkezőkhöz van csatlakoztatva. Ha pontosan ugyanazokat a sémákat követi, mint fent, akkor itt semmit sem kell változtatnia.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Tüskék, amelyekhez az LCD van csatlakoztatva LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Ezután a beállítási funkción belül csak inicializáljuk az LCD modult és a soros monitort a hibakereséshez. Bevezető üzenetet is megjelenítünk, hogy megbizonyosodjunk arról, hogy a dolgok a tervek szerint működnek. Ezután a fő hurok funkción belül két, míg a hurok van.
Egy ideig ciklus lesz végrehajtva, amíg az SPDT kapcsoló többet rögzít. Felvételi módban a felhasználó fizetheti a szükséges hangokat, és ezzel egy időben a lejátszott hang is el lesz mentve. Tehát a while ciklus így néz ki alább
while (digitalRead (6) == 0) // Ha a kapcsoló felvételi módban van beállítva {lcd.setCursor (0, 0); lcd.print ("Felvétel.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Mint észrevehette , két funkciónk van a while cikluson belül. Az első Detect_button () funkcióval keresse meg, hogy melyik gombot nyomta meg a felhasználó, a második Play_tone () funkcióval pedig a megfelelő hangot játssza le. Ezen a funkción kívül a Detect_button () funkció azt is rögzíti, hogy melyik gombot nyomja meg, és a Play_tone () funkció rögzíti, hogy mennyi ideig nyomták meg a gombot.
A Detect_button () függvényen belül leolvassuk az analóg feszültséget az A0 csapról, és összehasonlítjuk néhány előre definiált értékkel, hogy megtudjuk, melyik gombot nyomták meg. Az érték meghatározható a fenti feszültségosztó számológéppel, vagy a soros monitor segítségével ellenőrizhető, hogy az egyes gombok milyen analóg értéket olvasnak.
void Detect_button () { analogVal = analogRead (A0); // olvassa el az analóg feszültséget az A0 csapon pev_button = button; // emlékszem a felhasználó előző gombjára, ha (analogVal <550) gomb = 8; ha (analógVal <500) gomb = 7; ha (analógVal <450) gomb = 6; ha (analógVal <400) gomb = 5; ha (analógVal <300) gomb = 4; ha (analógVal <250) gomb = 3; if (analógVal <150) gomb = 2; if (analógVal <100) gomb = 1; ha (analógVal> 1000) gomb = 0; / **** Csatlakoztassa a lenyomott gombokat egy tömbbe *** / if (gomb! = pev_gomb && pev_button! = 0) { felvett_gomb = pev_gomb; button_index ++; rögzített gomb = 0; button_index ++; } / ** A felvételi program vége ** / }
Mint mondtuk, ezen a funkción belül rögzítjük a gombok lenyomásának sorrendjét is. A rögzített értékeket a rögzített_gomb nevű tömbben tároljuk . Először ellenőrizzük, hogy van-e megnyomva egy új gomb, ha megnyomjuk, akkor azt is ellenőrizzük, hogy nem a 0. gomb van-e. Ahol a 0 gomb nem más, de nem nyom meg egyetlen gombot sem. Az if ciklus belsejében tároljuk az értéket a button_index változó által megadott index helyén, majd ezt az index értéket is növeljük, hogy ne írjuk túl ugyanarra a helyre.
/ **** R rögzítse a lenyomott gombokat egy tömbben *** / if (gomb! = Pev_gomb && pev_button! = 0) { felvett_gomb = pev_gomb; button_index ++; rögzített gomb = 0; button_index ++; } / ** A felvételi program vége ** /
A Play_tone () függvényben a többszörös, ha feltételek mellett megnyomott gomb megfelelő hangját játsszuk. Ezenkívül egy rögzített_idõ nevû tömböt fogunk használni, amellyel elmenthetjük a gomb lenyomásának idõtartamát. A művelet hasonló a gombsorozat felvételéhez, mivel a millis () függvénnyel állapíthatjuk meg, hogy mennyi ideig nyomták meg az egyes gombokat, és a változó méretének csökkentése érdekében elosztjuk az értéket 10-tel. A 0 gombnál, ami azt jelenti, hogy a felhasználó nem bármit megnyomva nem szólunk meg ugyanolyan ideig. A függvény belsejében található teljes kód az alábbiakban látható.
void Play_tone () { / **** R rögzítse az egyes késleltetett gombok közötti késleltetést egy tömbben *** / if (gomb! = pev_gomb) { lcd.clear (); // Ezután tisztítsa meg note_time = (millis () - start_time) / 10; felvett_idő = jegyzetidő; time_index ++; kezdési idő = millisz (); } / ** A felvétel vége ** / if (gomb == 0) { noTone (7); lcd.print ("0 -> Szünet.."); } if (gomb == 1) { hang (7, jegyzetek); lcd.print ("1 -> NOTE_C4"); } if (gomb == 2) { hang (7, jegyzetek); lcd.print ("2 -> NOTE_D4"); } if (gomb == 3) { hang (7, jegyzetek); lcd.print ("3 -> NOTE_E4"); } if (gomb == 4) { hang (7, jegyzetek); lcd.print ("4 -> NOTE_F4"); } if (gomb == 5) { hang (7, jegyzetek); lcd.print ("5 -> NOTE_G4"); } if (gomb == 6) { hang (7, jegyzetek); lcd.print ("6 -> NOTE_A4"); } if (gomb == 7) { hang (7, jegyzetek); lcd.print ("7 -> NOTE_B4"); } if (gomb == 8) { hang (7, jegyzetek); lcd.print ("8 -> NOTE_C5"); } }
Végül a felvétel után a felhasználónak át kell kapcsolnia a DPST-t a másik irányba a rögzített hang lejátszásához. Ha ez megtörtént, a program kitör az előző while ciklusból és belép a második while ciklusba, ahol a korábban rögzített időtartamig a megnyomott gombok sorrendjében játsszuk a hangokat. Az ehhez hasonló kód az alábbiakban látható.
while (digitalRead (6) == 1) // Ha a kapcsoló Lejátszás módban van beállítva { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Most játszik…"); for (int i = 0; i <(rögzített gomb) mérete / 2; i ++) { késés ((felvett idő) * 10); // Várja meg a következő dallam kifizetése előtt if ( felvett_gomb == 0) noTone (7); // a felhasználó ne érintse meg bármelyik gomb másik hangját (7, megjegyzések - 1)]); // lejátszani a felhasználó által megérintett gombnak megfelelő hangot } } }
Lejátszás, rögzítés, visszajátszás és ismétlés!:
Készítse el a hardvert a bemutatott kapcsolási rajz szerint, és töltse fel a kódot az Arduino táblára és annak megjelenített idejére. Helyezze az SPDT-t felvételi módba, és kezdje el lejátszani a kívánt hangokat. Az egyes gombok lenyomásával más a hangszín. Ebben az üzemmódban az LCD kijelzőn megjelenik a „ Felvétel…” felirat , a második sorban pedig az éppen látható hangjegy neve jelenik meg az alábbiak szerint
Miután lejátszotta a hangot, állítsa az SPDT kapcsolót a másik oldalra, és az LCD-n a „ Now Playing..” felirat jelenik meg , majd kezdje el lejátszani az imént lejátszott hangot. Ugyanaz a hang szólal meg újra és újra, amíg a kapcsolót az alábbi képen látható helyzetben tartja.
A projekt teljes kidolgozása az alábbi videóban található. Remélem, megértette a projektet, és élvezte az építését. Ha bármilyen problémája van a bejegyzés elkészítésével, tegye meg őket a megjegyzés részben, vagy használja a fórumokat a projekt technikai segítségére. Ne felejtsd el megnézni az alább megadott bemutató videót sem.