- Potrebni materiali:
- Shema vezja:
- Sheme in razlaga:
- Razumevanje
- Predvajanje tonov klavirja na Arduinu:
- Programiranje Arduina:
- Predvajaj, snemaj, predvajaj in ponavljaj! :
Arduino je blaginja za ljudi, ki niso iz elektronike, da lahko preprosto gradijo stvari. To je bilo odlično orodje za izdelavo prototipov ali za preizkusiti kaj kul, v tem projektu bomo z uporabo Arduina izdelali majhen, a zabaven klavir. Ta klavir je precej navaden s samo 8 gumbi in zvočnim signalom. Uporablja funkcijo tone () Arduino za ustvarjanje različnih vrst klavirskih not na zvočniku. Za malo popestritev smo v projekt dodali funkcijo snemanja, kar nam omogoča, da jo predvajamo in jo po potrebi predvajamo večkrat. Sliši se zanimivo kajne !! Torej, začnimo z gradnjo….
Potrebni materiali:
- Arduino Uno
- 16 * 2 LCD zaslon
- Zvočni signal
- Trimer 10k
- Stikalo SPDT
- Potisni gumb (8 št.)
- Upori (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Breadboard
- Priključne žice
Shema vezja:
Celoten projekt Arduino Piano je mogoče zgraditi na vrhu plošče z nekaj povezovalnimi žicami. Shema vezij, narejena s fritzingom, ki prikazuje pogled na projekt, je prikazana spodaj
Preprosto sledite shemi vezij in ustrezno povežite žice, gumbe in brenčalo, kot se uporabljajo z modulom PCB, toda v dejanski strojni opremi smo uporabili samo stikalo in brenčalo, to vas ne bi smelo preveč zmedeti, ker imajo isti tip zatiča. Za povezave se lahko sklicujete tudi na spodnjo sliko strojne opreme.
Vrednost uporov z leve je v naslednjem vrstnem redu: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k in 10k. Če nimate istega stikala DPST, lahko uporabite običajno preklopno stikalo, kot je prikazano na zgornjem vezju. Zdaj pa poglejmo sheme projekta, da bomo razumeli, zakaj smo vzpostavili naslednje povezave.
Sheme in razlaga:
Sheme, ki so prikazane zgoraj, so podane spodaj, izdelane pa so bile tudi s pomočjo Fritzinga.
Ena glavnih povezav, ki jo moramo razumeti, je, kako smo 8 tipk povezali z Arduinom prek analognega zatiča A0. V bistvu potrebujemo 8 vhodnih zatičev, ki jih lahko povežemo z 8 vhodnimi gumbi, vendar za takšne projekte ne moremo uporabiti 8 zatičev mikrokrmilnika samo za tipke, saj jih bomo morda potrebovali za kasnejšo uporabo. V našem primeru imamo zaslon LCD, ki ga je treba povezati.
Torej za dokončanje vezja uporabimo analogni zatič Arduino in tvorimo potencialni delilnik z različnimi vrednostmi upora. Na ta način se ob pritisku vsakega gumba na analogni zatič napaja drugačna analogna napetost. Vzorčno vezje s samo dvema uporoma in dvema tipkama je prikazano spodaj.
V tem primeru bo pin ADC prejel + 5V, ko tipk ne pritisnete; če pritisnete prvi gumb, se potencialni delilnik zaključi skozi upor 560R in če pritisnete drugi gumb, potencialni delilnik konkurira z uporabo 1,5 k upor. Na ta način se bo napetost, ki jo prejme pin ADC, spreminjala glede na formule potencialnega delilnika. Če želite izvedeti več o tem, kako deluje potencialni delilnik in kako izračunati vrednost napetosti, ki jo prejme pin ADC, lahko uporabite to stran kalkulatorja potencialnih delilnikov.
Razen tega so vse povezave naravnost naprej, LCD je priključen na nožice 8, 9, 10, 11 in 12. Zujalica je priključena na nožico 7, stikalo SPDT pa na nožico 6 Arduina. Celoten projekt se napaja prek vrat USB prenosnika. Arduino lahko priključite tudi na napajalnik 9V ali 12V prek enosmernega priključka in projekt bo še vedno deloval enako.
Razumevanje
Arduino ima priročno funkcijo tone (), ki se lahko uporablja za generiranje različnih frekvenčnih signalov, ki se lahko uporabljajo za ustvarjanje različnih zvokov z brenčalom. Torej, razumejmo, kako funkcija deluje in kako jo lahko uporabljamo z Arduinom.
Pred tem bi morali vedeti, kako deluje Piezo. Morda smo se v naši šoli naučili o kristalih Piezo, to ni nič drugega kot kristal, ki pretvarja mehanske vibracije v elektriko ali obratno. Tu uporabimo spremenljiv tok (frekvenco), za katerega kristal vibrira in tako proizvaja zvok. Da bi Piezo zvočnik sprožil nekaj hrupa, moramo Piezo električni kristal vibrirati, višina in ton hrupa pa sta odvisna od tega, kako hitro kristal vibrira. Zato lahko ton in višino uravnavamo s spreminjanjem frekvence toka.
V redu, kako naj torej dobimo spremenljivo frekvenco od Arduina? Tu nastopi funkcija tone (). Ton () lahko ustvari določeno frekvenco na določenem zatiču. Po potrebi lahko navedemo tudi trajanje časa. Sintaksa za tone () je
Sintaksni ton (pin, frekvenca) ton (pin, frekvenca, trajanje) Parametri pin: pin, na katerem se generira frekvenca tona: frekvenca tona v hercih - unsigned int duration: trajanje tona v milisekundah (neobvezno1) - nepodpisano dolgo
Vrednosti pin-a so lahko kateri koli digitalni pin. Tu sem uporabil zatič številka 8. Pogostost, ki jo je mogoče ustvariti, je odvisna od velikosti časovnika na plošči Arduino. Za UNO in večino drugih običajnih plošč je najmanjša frekvenca, ki jo je mogoče proizvesti, 31Hz, največja frekvenca, ki jo je mogoče proizvesti, pa je 65535Hz. Vendar ljudje slišimo le frekvence med 2000Hz in 5000 Hz.
Predvajanje tonov klavirja na Arduinu:
V redu, še preden sploh začnem s to temo, naj jasno povem, da sem začetnik z glasbenimi notami ali klavirjem, zato mi prosim, oprostite, če je karkoli omenjeno pod tem naslovom nesmiselno.
Zdaj vemo, da lahko v Arduinu uporabljamo funkcijo tonov za ustvarjanje nekaterih zvokov, kako pa lahko z njimi predvajamo tone določene note. Na našo srečo obstaja knjižnica z imenom "pitches.h", ki jo je napisal Brett Hagman. Ta knjižnica vsebuje vse informacije o tem, katera frekvenca je enaka kateri note na klavirju. Bil sem presenečen nad tem, kako dobro je ta knjižnica dejansko lahko delovala in predvajala skoraj vsako noto na klavirju, z isto sem igral klavirske note Pirates of Karibbean, Crazy Frog, Mario in celo titanic in zvenijo čudovito. Ups! Tukaj se nekoliko oddaljujemo od teme, zato, če vas to zanima, si oglejte predvajanje melodij s pomočjo projekta Arduino. V tem projektu boste našli tudi več razlag o knjižnici pitches.h .
Naš projekt ima samo 8 tipk, tako da lahko vsak gumb predvaja samo eno določeno glasbeno noto in tako lahko v celoti predvajamo samo 8 not. Izbral sem najpogosteje uporabljene note na klavirju, vendar lahko izberete vseh 8 ali celo razširite projekt z več potisnimi gumbi in dodate več opomb.
Opombe, izbrane v tem projektu, so note C4, D4, E4, F4, G4, A4, B4 in C5, ki jih je mogoče predvajati z gumbi 1 do 8.
Programiranje Arduina:
Dovolj teorije pojdimo na zabaven del programiranja Arduina. Popolna Arduino program je podan na koncu te strani lahko skoči dol, če želijo, ali brati nadalje, kako razumeti kodo dela.
V našem programu Arduino moramo prebrati analogno napetost z zatiča A0, nato predvideti, kateri gumb je bil pritisnjen in predvajati ustrezen ton za ta gumb. Pri tem moramo zabeležiti tudi, kateri gumb je uporabnik pritisnil in kako dolgo je pritisnil, da bomo lahko poustvarili ton, ki ga je uporabnik pozneje predvajal.
Preden se lotimo logičnega dela, se moramo izjasniti, katerih 8 not bomo predvajali. Nato se ustrezna frekvenca za opombe vzame iz knjižnice pitches.h in nato se oblikuje matrika, kot je prikazano spodaj. Tu je frekvenca predvajanja note C4 262 itd.
int opombe = {262, 294, 330, 349, 392, 440, 494, 523}; // Nastavitev frekvence za C4, D4, E4, F4, G4, A4, B4,
Nato moramo omeniti, na katere nožice je povezan LCD zaslon. Če sledite popolnoma enakim shemam, navedenim zgoraj, potem vam tukaj ni treba ničesar spreminjati.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // zatiči, na katere je priključen LCD, LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Nato v naši nastavitveni funkciji samo inicializiramo LCD modul in serijski monitor za odpravljanje napak. Prikažemo tudi uvodno sporočilo, da zagotovimo, da stvari delujejo, kot je bilo načrtovano. Nato imamo znotraj funkcije glavne zanke dve zanki while.
Enkratna zanka se bo izvajala, dokler je stikalo SPDT nameščeno za snemanje več. V načinu snemanja lahko uporabnik plača zahtevane tone, hkrati pa se shrani tudi ton, ki se predvaja. Torej je zanka while spodaj videti tako
while (digitalRead (6) == 0) // Če je preklopno stikalo nastavljeno v načinu snemanja {lcd.setCursor (0, 0); lcd.print ("Snemanje.."); lcd.setCursor (0, 1); Gumb za zaznavanje (); Predvajanje_tona (); }
Kot ste morda opazili, imamo v zanki while dve funkciji. S prvo funkcijo Detect_button () se poišče, kateri gumb je uporabnik pritisnil, z drugo funkcijo Play_tone () pa se predvaja ustrezen ton. Funkcija Detect_button () poleg te funkcije zabeleži tudi, kateri gumb se pritiska, funkcija Play_tone () pa zapiše, kako dolgo je bil gumb pritisnjen.
Znotraj Detect_button () funkcijo beremo analogni napetosti s pin A0 in ga primerjati z nekaterimi vnaprej določene vrednosti, da bi ugotovili, kateri gumb je pritisnjen. Vrednost lahko določite z zgornjim kalkulatorjem delilnika napetosti ali s pomočjo serijskega monitorja, da preverite, katere analogne vrednosti se berejo za posamezen gumb.
void Detect_button () { analogVal = analogRead (A0); // preberemo analogni voltag na zatiču A0 pev_button = button; // spomnimo se prejšnjega gumba, ki ga je pritisnil uporabnik if (analogVal <550) button = 8; če je gumb (analogVal <500) = 7; če je gumb (analogVal <450) = 6; če je gumb (analogVal <400) = 5; če je gumb (analogVal <300) = 4; če je gumb (analogVal <250) = 3; če je gumb (analogVal <150) = 2; če je gumb (analogVal <100) = 1; če je gumb (analogVal> 1000) = 0; / **** Zapiši stisnjene gumbe v polje *** / če (gumb! = gumb_pet_ & & gumb_pet_! = 0) { gumb_zapis = gumb_vlog; button_index ++; posneto_gumb = 0; button_index ++; } / ** Konec programa snemanja ** / }
Kot rečeno, znotraj te funkcije zabeležimo tudi zaporedje pritiska gumbov. Zabeležene vrednosti se shranijo v polje z imenom zapisani_gumb. Najprej preverimo, ali je pritisnjen nov gumb, če je pritisnjen, nato preverimo tudi, ali ni gumb 0. Kjer gumb 0 ni nič drugega kot noben gumb. Znotraj zanke if shranimo vrednost na mesto indeksa, ki ga daje spremenljivka button_index, nato pa to vrednost indeksa tudi povečamo, da ne prepišemo na isti lokaciji.
/ **** Zapiši pritisnjene gumbe v polje *** / if (gumb! = Gumb_pet_ & gumb_pet_v_kupu! = 0) { posnet_ gumb = gumb_vlog; button_index ++; posneto_gumb = 0; button_index ++; } / ** Konec programa snemanja ** /
Znotraj Play_tone () funkcijo bomo igrati ustrezno ton za gumb z večkratnik stisnjeni , če pogoji. Uporabili bomo tudi polje z imenom snimljeni čas, znotraj katerega bomo prihranili čas, za katerega je bil gumb pritisnjen. Postopek je podoben snemanju zaporedja gumbov, saj s pomočjo funkcije milis () določimo, kako dolgo je bil pritisnjen posamezen gumb, tudi za zmanjšanje velikosti spremenljivke vrednost delimo z 10. Za gumb 0, kar pomeni, da uporabnik ni s pritiskom na karkoli ne bomo predvajali nobenega tona v istem času. Popolna koda znotraj funkcije je prikazana spodaj.
void Play_tone () { / **** Zabeležite časovno zakasnitev med pritiskom vsakega gumba v polju *** / if (gumb! = gumb_pet_) { lcd.clear (); // Nato ga očistimo note_time = (millis () - start_time) / 10; posneti_ čas = note_time; time_index ++; čas_začetka = milis (); } / ** Konec programa snemanja ** / if (gumb == 0) { noTone (7); lcd.print ("0 -> Premor.."); } if (gumb == 1) { ton (7, opombe); lcd.print ("1 -> NOTE_C4"); } if (gumb == 2) { ton (7, opombe); lcd.print ("2 -> OPOMBA_D4"); } če (gumb == 3) { ton (7, opombe); lcd.print ("3 -> OPOMBA_E4"); } if (gumb == 4) { ton (7, opombe); lcd.print ("4 -> OPOMBA_F4"); } if (gumb == 5) { ton (7, opombe); lcd.print ("5 -> NOTE_G4"); } if (gumb == 6) { ton (7, opombe); lcd.print ("6 -> OPOMBA_A4"); } if (gumb == 7) { ton (7, opombe); lcd.print ("7 -> OPOMBA_B4"); } if (gumb == 8) { ton (7, opombe); lcd.print ("8 -> NOTE_C5"); } }
Na koncu mora uporabnik po snemanju preklopiti DPST v drugo smer, da predvaja posneti ton. Ko je to storjeno, se program prebije iz prejšnje zanke while in vstopi v drugo zanko while, kjer predvajamo note v zaporedju pritisnjenih gumbov za čas, ki je bil predhodno posnet. Koda, ki stori enako, je prikazana spodaj.
while (digitalRead (6) == 1) // Če je preklopno stikalo nastavljeno v načinu predvajanja { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Zdaj se predvaja.."); za (int i = 0; i <velikost (gumb_posneto) / 2; i ++) { zamuda ((zapisan_ čas) * 10); // Počakajte, preden plačate naslednjo melodijo, če ( snimljeni_button == 0) noTone (7); // uporabniški dint se dotakne katerega koli gumba sicer ton (7, opombe - 1)]); // predvajanje zvoka, ki ustreza gumbu, ki se ga je uporabnik dotaknil } } }
Predvajaj, snemaj, predvajaj in ponavljaj!:
Naredite strojno opremo v skladu s prikazanim vezjem in naložite kodo na ploščo Arduino in prikazan čas. Postavite SPDT v način snemanja in začnite predvajati tone po svoji izbiri, s pritiskom na posamezen gumb se bo ustvaril drugačen ton. V tem načinu se na LCD-prikazovalniku prikaže " Snemanje…", v drugi vrstici pa boste videli ime opombe, ki je trenutno pritisnjena, kot je prikazano spodaj
Ko predvajate ton, preklopite stikalo SPDT na drugo stran in na LCD-prikazovalniku se prikaže napis » Now Playing..«, nato pa začnite predvajati ton, ki ste ga pravkar predvajali. Vedno znova se bo predvajal isti ton, dokler bo stikalo v položaju, kot je prikazano na spodnji sliki.
Celotno delovanje projekta najdete v spodnjem videoposnetku. Upam, da ste projekt razumeli in ste ga radi zgradili. Če imate kakršne koli težave pri izdelavi te objave, jih objavite v oddelku za komentarje ali uporabite forum za tehnično pomoč pri svojem projektu. Ne pozabite preveriti tudi spodnjega predstavitvenega videoposnetka.