- Potrebni materijali:
- Kružni dijagram:
- Sheme i objašnjenje:
- Razumijevanje
- Sviranje klavirskih tonova na Arduinu:
- Programiranje Arduina:
- Reprodukujte, snimite, ponovite i ponovite! :
Arduino je blagodat za ljude koji nisu iz elektronike da lako grade stvari. Bio je to izvrstan alat za izradu prototipova ili za isprobavanje nečega cool, u ovom ćemo projektu izgraditi mali, ali zabavni klavir koristeći Arduino. Ovaj je klavir prilično jednostavan sa samo 8 tipki i zujalicom. Koristi funkciju tone () Arduina za stvaranje različitih vrsta nota klavira na zvučniku. Da bismo je malo začinili, u projekt smo dodali značajku snimanja, to nam omogućuje reprodukciju melodije i ponovnu reprodukciju po potrebi kad god je potrebno. Zvuči zanimljivo zar ne !! Pa krenimo sa izgradnjom….
Potrebni materijali:
- Arduino Uno
- LCD zaslon od 16 * 2
- Zujalica
- Trimer 10k
- SPDT prekidač
- Tipka (8 br.)
- Otpornici (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Breadboard
- Spajanje žica
Kružni dijagram:
Cjeloviti projekt Arduino Piano može se izgraditi na ploči s nekim spojnim žicama. Dijagram sklopa izrađen pomoću fritzinga koji prikazuje prikaz ploče projekta prikazan je u nastavku

Samo slijedite shemu spojeva i u skladu s tim spojite žice, tipke i zujalicu kao što se koristi s PCB modulom, ali u stvarnom smo hardveru koristili samo prekidač i zujalicu, to vas ne bi trebalo zbuniti jer imaju istu vrstu izvoda. Da biste uspostavili veze, možete se pozvati i na donju sliku hardvera.

Vrijednost otpornika slijeva slijedi sljedeći redoslijed: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k i 10k. Ako nemate isti DPST prekidač, možete koristiti normalni preklopni prekidač poput onoga prikazanog na gornjoj shemi spojeva. Pogledajmo sada sheme projekta kako bismo razumjeli zašto smo uspostavili sljedeće veze.
Sheme i objašnjenje:
Sheme sheme za shemu koja je prikazana gore date su u nastavku, također je izrađena pomoću Fritzinga.

Jedna od glavnih veza koju moramo razumjeti je način na koji smo povezali 8 tipki s Arduinom putem analognog A0 pina. U osnovi trebamo 8 ulaznih pinova koji se mogu povezati s 8 ulaznih tipki, ali za ovakve projekte ne možemo koristiti 8 pinova mikrokontrolera samo za tipke jer će nam možda trebati za kasniju upotrebu. U našem slučaju imamo LCD zaslon koji treba povezati.
Dakle, koristimo analogni pin Arduina i oblikujemo potencijalni djelitelj s različitim vrijednostima otpora da dovršimo krug. Na taj će se način, kada se pritisne svaka tipka, na analogni pin dovoditi različiti analogni napon. Uzorak kruga sa samo dva otpora i dva gumba prikazan je u nastavku.

U tom će slučaju ADC pin dobiti + 5V kad se ne pritisnu tipke, ako se pritisne prva tipka, tada se potencijalni razdjelnik dovršava kroz otpor 560R, a ako se pritisne drugi gumb, potencijalni razdjelnik natječe se pomoću 1,5 k otpornik. Na taj će se način napon primljen od ADC pina mijenjati ovisno o formulama djelitelja potencijala. Ako želite znati više o tome kako djeluje potencijalni razdjelnik i kako izračunati vrijednost napona primljenog ADC pinom, tada možete upotrijebiti ovu stranicu kalkulatora potencijalnih razdjelnika.
Osim toga, sve su veze ravno naprijed, LCD je spojen na pinove 8, 9, 10, 11 i 12. Zujalica je spojena na pin 7, a SPDT prekidač povezan je na pin 6 Arduina. Kompletni projekt napaja se putem USB priključka prijenosnog računala. Također možete spojiti Arduino na napajanje od 9 V ili 12 V putem DC utičnice i projekt će i dalje raditi na isti način.
Razumijevanje
Arduino ima praktičnu funkciju tona () koja se može koristiti za generiranje različitih frekvencijskih signala koji se mogu koristiti za stvaranje različitih zvukova pomoću zujalice. Pa shvatimo kako funkcija radi i kako se može koristiti s Arduinom.
Prije toga trebali bismo znati kako djeluje Piezo zujalica. O Piezo kristalima smo možda naučili u našoj školi, on nije ništa drugo do kristal koji mehaničke vibracije pretvara u električnu energiju ili obrnuto. Ovdje primjenjujemo promjenjivu struju (frekvenciju) za koju kristal vibrira stvarajući zvuk. Stoga, da bi Piezo zujalica stvorio neku buku, moramo Piezo električni kristal titrati, visina i ton buke ovise o brzini kristala. Stoga se ton i visina mogu kontrolirati mijenjanjem frekvencije struje.
Dobro, kako ćemo onda dobiti promjenjivu frekvenciju od Arduina? Tu dolazi funkcija tone (). Ton () može generirati određenu frekvenciju na određenom pinu. Po potrebi se može spomenuti i trajanje vremena. Sintaksa tona () je
Sintaksni ton (pin, frekvencija) ton (pin, frekvencija, trajanje) Parametri pin: pin na kojem se generira frekvencija tona: frekvencija tona u hercima - nepotpisano int trajanje: trajanje tona u milisekundama (nije obavezno1) - nepotpisano dugo
Vrijednosti pin-a mogu biti bilo koje vaše digitalne pin-ove. Ovdje sam upotrijebio pin broj 8. Frekvencija koja se može generirati ovisi o veličini odbrojavanja na vašoj Arduino ploči. Za UNO i većinu uobičajenih ploča minimalna frekvencija koja se može proizvesti je 31Hz, a maksimalna frekvencija koja se može proizvesti je 65535Hz. Međutim, mi ljudi možemo čuti samo frekvencije između 2000Hz i 5000 Hz.
Sviranje klavirskih tonova na Arduinu:
U redu, prije nego što uopće započnem s ovom temom, dajte mi do znanja da sam početnik s glazbenim notama ili klavirom, pa vas molim da mi oprostite ako je bilo što što je spomenuto pod ovim naslovom besmislica.
Sada znamo da možemo koristiti funkciju tonova u Arduinu za stvaranje nekih zvukova, ali kako možemo reproducirati tonove određene note koristeći iste. Srećom po nas postoji biblioteka pod nazivom "pitches.h" koju je napisao Brett Hagman. Ova knjižnica sadrži sve informacije o tome koja je frekvencija ekvivalentna notama na klaviru. Iznenadio sam se koliko je ova knjižnica zapravo mogla raditi i svirati gotovo svaku notu na klaviru, koristio sam istu za sviranje klavirskih nota Pirates of Caribbean, Crazy Frog, Mario, pa čak i titanic, a zvučale su strašno. Ups! Ovdje pomalo odmičemo od teme, pa ako ste zainteresirani za to, pogledajte reprodukciju melodija pomoću Arduino projekta. U tom ćete projektu pronaći i više objašnjenja o biblioteci pitches.h .
Naš projekt ima samo 8 tipki tako da svaka tipka može svirati samo jednu određenu glazbenu notu, a time u potpunosti možemo svirati samo 8 nota. Odabrao sam najčešće korištene note na klaviru, ali možete li odabrati bilo kojih 8 ili čak proširiti projekt s više tipki i dodati još nota.
Bilješke odabrane u ovom projektu su note C4, D4, E4, F4, G4, A4, B4 i C5 koje se mogu reproducirati pomoću gumba 1 do 8.
Programiranje Arduina:
Dosta teorije pređimo na zabavni dio programiranja Arduina. Kompletan Arduino program daje na kraju ove stranice možete skočiti dolje ako žele ili čitati dalje razumjeti kako se kod radova.
U našem programu Arduino moramo očitati analogni napon s pina A0, zatim predvidjeti koja je tipka pritisnuta i reproducirati odgovarajući ton za taj gumb. Pri tome bismo također trebali zabilježiti koji je gumb korisnik pritisnuo i koliko dugo je pritisnuo, kako bismo mogli ponovno stvoriti ton koji je korisnik puštao kasnije.
Prije odlaska na logički dio, moramo proglasiti kojih ćemo 8 nota svirati. Odgovarajuća učestalost bilješki tada se preuzima iz biblioteke pitches.h, a zatim se formira niz kao što je prikazano u nastavku. Ovdje je frekvencija reprodukcije bilješke C4 262 i tako dalje.
int bilješke = {262, 294, 330, 349, 392, 440, 494, 523}; // Postavljanje frekvencije za C4, D4, E4, F4, G4, A4, B4,
Dalje moramo spomenuti na koje je igle povezan LCD zaslon. Ako slijedite iste sheme dane gore, ovdje ne morate ništa mijenjati.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pribadače na koje je povezan LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Dalje, unutar naše funkcije postavljanja samo inicijaliziramo LCD modul i serijski monitor za uklanjanje pogrešaka. Također prikazujemo uvodnu poruku samo kako bismo bili sigurni da stvari rade kako je planirano. Dalje , unutar funkcije glavne petlje imamo dvije while petlje.
Jednokratna petlja će se izvršavati sve dok je SPDT prekidač postavljen za snimanje više. U načinu snimanja korisnik može platiti potrebne tonove, a istovremeno će se spremiti i ton koji se reproducira. Dakle, while petlja izgleda ovako u nastavku
while (digitalRead (6) == 0) // Ako je preklopni prekidač postavljen u načinu snimanja {lcd.setCursor (0, 0); lcd.print ("Snimanje.."); lcd.setCursor (0,1); Tipka za otkrivanje (); Play_tone (); }
Kao što ste mogli primijetiti , imamo dvije funkcije unutar while petlje. Prva funkcija Detect_button () koristi se za pronalaženje tipke koju je korisnik pritisnuo, a druga funkcija Play_tone () koristi se za reprodukciju odgovarajućeg tona. Osim ove funkcije, funkcija Detect_button () također bilježi koja se tipka pritiska, a funkcija Play_tone () bilježi koliko je dugo tipka pritisnuta.
Unutar Detect_button () funkciju čitamo analogni napon od pin A0 i usporediti ga s nekim unaprijed definiranim vrijednostima saznati koji gumb je pritisnut. Vrijednost se može odrediti pomoću gornjeg kalkulatora djelitelja napona ili pomoću serijskog monitora kako bi se provjerilo koja se analogna vrijednost očitava za svaki gumb.
void Detect_button () { analogVal = analogRead (A0); // očitavanje analognog voltaga na zatik A0 pev_button = button; // sjetimo se prethodne tipke koju je korisnik pritisnuo if (analogVal <550) button = 8; ako je gumb (analogVal <500) = 7; ako je gumb (analogVal <450) = 6; ako je gumb (analogVal <400) = 5; ako je gumb (analogVal <300) = 4; ako je gumb (analogVal <250) = 3; ako je gumb (analogVal <150) = 2; ako je gumb (analogVal <100) = 1; ako je gumb (analogVal> 1000) = 0; / **** Snimite pritisnute tipke u niz *** / if (gumb! = gumb_pet_i && gumb_vrijednosti! = 0) { button_button = gumb_vlog; gumb_index ++; gumb_snimljenog = 0; gumb_index ++; } / ** Kraj programa za snimanje ** / }
Kao što je rečeno, unutar ove funkcije također bilježimo redoslijed pritiska gumba. Snimljene vrijednosti pohranjene su u polje nazvano snimljeni_tip. Prvo provjeravamo je li pritisnut novi gumb, ako je pritisnut, onda također provjeravamo nije li gumb 0. Gdje gumb 0 nije ništa, ali nije pritisnut nijedan gumb. Unutar petlje if pohranjujemo vrijednost na mjesto indeksa koje daje varijabla button_index, a zatim također povećavamo vrijednost indeksa tako da ne prepisujemo na istom mjestu.
/ **** Snimite pritisnute tipke u niz *** / if (gumb! = Gumb_pet_i &&_kut_tut! = 0) { snimljen_ gumb = gumb_v_v; gumb_index ++; gumb_snimljenog = 0; gumb_index ++; } / ** Kraj programa za snimanje ** /
Unutar Play_tone () funkcija ćemo igrati odgovarajući ton za gumb pritisnut pomoću više ako uvjetima. Također ćemo upotrijebiti niz pod nazivom snimljeno_ vrijeme u kojem ćemo spremiti vrijeme trajanja pritisnutog gumba. Postupak je sličan snimanju slijeda gumba pomoću funkcije millis () da odredimo koliko je dugo pritisnut svaki gumb, također radi smanjenja veličine varijable vrijednost dijelimo s 10. Za gumb 0, što znači da korisnik nije pritiskom bilo čega sviramo bez zvuka u istom trajanju. Kompletni kod unutar funkcije prikazan je u nastavku.
poništi Play_tone () { / **** Zabilježite vremensko kašnjenje između svakog pritiska gumba u polju *** / if (gumb! = gumb_pet) { lcd.clear (); // Zatim ga očistite note_time = (millis () - start_time) / 10; snimljeno_ vrijeme = vrijeme_bilješke; indeks vremena ++; vrijeme_početka = milis (); } / ** Kraj programa za snimanje ** / if (gumb == 0) { noTone (7); lcd.print ("0 -> Pauza.."); } if (gumb == 1) { ton (7, bilješke); lcd.print ("1 -> NAPOMENA_C4"); } if (gumb == 2) { ton (7, bilješke); lcd.print ("2 -> NAPOMENA_D4"); } ako (gumb == 3) { ton (7, bilješke); lcd.print ("3 -> NAPOMENA_E4"); } if (gumb == 4) { ton (7, bilješke); lcd.print ("4 -> NOTE_F4"); } if (gumb == 5) { ton (7, bilješke); lcd.print ("5 -> NOTE_G4"); } if (gumb == 6) { ton (7, bilješke); lcd.print ("6 -> NAPOMENA_A4"); } if (gumb == 7) { ton (7, bilješke); lcd.print ("7 -> NAPOMENA_B4"); } if (gumb == 8) { ton (7, bilješke); lcd.print ("8 -> NOTE_C5"); } }
Konačno, nakon snimanja korisnik mora prebaciti DPST u drugi smjer za reprodukciju snimljenog tona. Kada se to učini, program se prekida iz prethodne while petlje i ulazi u drugu while petlju gdje sviramo note u nizu pritisnutih gumba tijekom prethodno snimljenog vremena. Kôd za isto je prikazan u nastavku.
while (digitalRead (6) == 1) // Ako je preklopni prekidač postavljen u načinu reprodukcije { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Now Playing.."); za (int i = 0; i <veličina (tipka_snimljenog) / 2; i ++) { kašnjenje ((vrijeme snimanja) * 10); // Pričekajte prije nego što platite sljedeću melodiju ako ( Record_button == 0) noTone (7); // korisnik dint dodirnite bilo koji gumb inače tone (7, bilješke - 1)]); // reproduciraj zvuk koji odgovara gumbu koji je korisnik dodirnuo } } }
Reprodukujte, snimite, ponovite i ponovite!:
Izradite hardver prema prikazanom shematskom spoju i prenesite kod na Arduino ploču i prikazano vrijeme. Postavite SPDT u način snimanja i započnite s reprodukcijom tonova po vašem izboru, pritiskom svake tipke proizvest će se drugačiji ton. Tijekom ovog načina rada LCD će prikazati " Snimanje…", a u drugom retku vidjet ćete naziv bilješke koja se trenutno pritiska, kao što je prikazano dolje

Nakon što odsvirate ton, prebacite preklopku SPDT na drugu stranu i na LCD-u će se prikazati " Now Playing..", a zatim započnite reprodukciju tona koji ste upravo svirali. Isti ton reproducirat će se iznova i iznova dok god se preklopni prekidač drži u položaju kao što je prikazano na donjoj slici.

Kompletni rad projekta možete pronaći u video prilogu dolje. Nadam se da ste razumjeli projekt i uživali u njegovoj izradi. Ako imate bilo kakvih problema s izradom ovog članka, objavite ih u odjeljku za komentare ili koristite forume za tehničku pomoć za svoj projekt. Također ne zaboravite provjeriti demonstracijski video dani u nastavku.
