- Tarvittavat materiaalit:
- Piirikaavio:
- Kaaviot ja selitykset:
- Ymmärtäminen
- Pianoäänien soittaminen Arduinolla:
- Arduinon ohjelmointi:
- Toista, tallenna, toista ja toista! :
Arduino on ollut lahja ihmisille, jotka eivät ole elektroniikan taustalta, rakentamaan tavaraa helposti. Se on ollut hieno prototyyppityökalu tai kokeilla jotain hienoa, tässä projektissa rakennamme pienen mutta hauskan pianon Arduinolla. Tämä piano on melko yksinkertainen vain 8 painikkeella ja summerilla. Se käyttää Arduinon tone () -toimintoa luodakseen erityyppisiä piano-nuotteja kaiuttimeen. Mausteen lisäämiseksi olemme lisänneet projektiin äänitysominaisuuden, mikä antaa meille mahdollisuuden soittaa sävelevy ja toistaa sitä tarvittaessa uudelleen toistuvasti. Kuulostaa mielenkiintoiselta! Joten rakennetaan….
Tarvittavat materiaalit:
- Arduino Uno
- 16 * 2 LCD-näyttö
- Summeri
- Trimmeri 10k
- SPDT-kytkin
- Painike (8 Nosta)
- Vastukset (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Leipälauta
- Johtojen liittäminen
Piirikaavio:
Koko Arduino-pianoprojekti voidaan rakentaa leipälautan päälle, jossa on joitain liitäntäjohtoja. Alla on esitetty piirikaavio, joka on tehty fritzingillä ja joka osoittaa projektin leipälautanäkymän
Seuraa vain kytkentäkaaviota ja kytke johdot vastaavasti, painikkeet ja summeri, joita käytetään piirilevymoduulin kanssa, mutta todellisessa laitteistossa olemme käyttäneet vain kytkintä ja summeria, sen ei pitäisi hämmentää sinua, koska niillä on saman tyyppinen tappi. Voit myös muodostaa yhteyden alla olevasta laitteiston kuvasta.
Vastusten arvo vasemmalta on seuraavassa järjestyksessä: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k ja 10k. Jos sinulla ei ole samaa DPST-kytkintä, voit käyttää normaalia vaihtokytkintä kuten yllä olevassa piirikaaviossa. Tarkastellaan nyt projektin kaavioita ymmärtääkseen, miksi olemme luoneet seuraavat yhteydet.
Kaaviot ja selitykset:
Edellä esitetyn piirikaavion kaaviot on annettu alla, se on myös valmistettu käyttämällä Fritzingiä.
Yksi tärkeimmistä yhteyksistä, jotka meidän on ymmärrettävä, on se, kuinka olemme yhdistäneet 8 painonappia Arduinoon Analog A0 -nastan kautta. Pohjimmiltaan tarvitsemme 8 tulonastaa, jotka voidaan liittää 8 tulopainikkeeseen, mutta tällaisissa projekteissa emme voi käyttää mikro-ohjaimen 8 nastaa vain painikkeisiin, koska saatamme tarvita niitä myöhempää käyttöä varten. Meidän tapauksessamme LCD-näyttö on liitettävä.
Joten käytämme Arduinon analogista nastaa ja muodostamme potentiaalijakajan vaihtelevilla vastusarvoilla piirin loppuun saattamiseksi. Tällä tavalla, kun kutakin painiketta painetaan, eri analoginen jännite syötetään analogiseen tapiin. Alla on esimerkkipiiri, jossa on vain kaksi vastusta ja kaksi painonappia.
Tässä tapauksessa ADC-nasta saa + 5 V, kun painikkeita ei paineta, jos ensimmäistä painiketta painetaan, potentiaalijakaja valmistuu 560R-vastuksen kautta ja jos toista painiketta painetaan, potentiaalijakaja kilpailee 1,5 k vastus. Tällä tavalla ADC-nastan vastaanottama jännite vaihtelee potentiaalijakajan kaavojen mukaan. Jos haluat tietää enemmän potentiaalijakajan toiminnasta ja kuinka laskea ADC-nastan vastaanottaman jännitteen arvo, voit käyttää tätä potentiaalijakajan laskimen sivua.
Tämän lisäksi kaikki liitännät ovat suoraan eteenpäin, nestekidenäyttö on kytketty nastoihin 8, 9, 10, 11 ja 12. Summeri on kytketty nastaan 7 ja SPDT-kytkin Arduinon nastaan 6. Koko projekti saa virtansa kannettavan tietokoneen USB-portista. Voit myös liittää Arduinon 9 V: n tai 12 V: n virtalähteeseen DC-liittimen kautta, ja projekti toimii edelleen samalla tavalla.
Ymmärtäminen
Arduinossa on kätevä ääni () -toiminto, jota voidaan käyttää vaihtelevien taajuussignaalien tuottamiseen, joita voidaan käyttää tuottamaan erilaisia ääniä summerilla. Joten ymmärretään, miten toiminto toimii ja miten sitä voidaan käyttää Arduinon kanssa.
Ennen sitä meidän pitäisi tietää, miten Piezo-summeri toimii. Olemme voineet oppia Piezo-kiteistä koulussa, se ei ole muuta kuin kide, joka muuntaa mekaaniset värähtelyt sähköksi tai päinvastoin. Tässä käytetään muuttuvaa virtaa (taajuutta), jolle kide värisee ja tuottaa äänen. Näin ollen, jotta Piezo-summeri aiheuttaisi melua, meidän on saatava Piezo-sähkökide värisemään, melun äänenvoimakkuus ja sävy riippuvat siitä, kuinka nopeasti kristalli värisee. Siksi ääntä ja äänenvoimakkuutta voidaan säätää vaihtelemalla virran taajuutta.
Okei, niin miten saamme vaihtelevan taajuuden Arduinolta? Tässä tulee ääni () -toiminto. Sävy () voi tuottaa tietyn taajuuden tietylle tappi. Ajan kesto voidaan myös mainita tarvittaessa. Äänen () syntaksia on
Syntaksiääni (tappi, taajuus) sävy (tappi, taajuus, kesto) Parametrit nasta: tappi, jolle äänitaajuus luodaan: äänen taajuus hertseinä - allekirjoittamaton int kesto: äänen kesto millisekunteina (valinnainen1) - allekirjoittamaton pitkä
Nastan arvot voivat olla mitä tahansa digitaalista nastaa. Olen käyttänyt tappi numero 8 täällä. Generoitava taajuus riippuu ajastimen koosta Arduino-kortillasi. UNO: n ja useimpien muiden yleisten piirilevyjen tuottama vähimmäistaajuus on 31 Hz ja suurin tuotettava taajuus on 65535 Hz. Kuitenkin me ihmiset kuulemme vain taajuuksia välillä 2000Hz - 5000 Hz.
Pianoäänien soittaminen Arduinolla:
Okei, ennen kuin aloitan tämän aiheen, anna minun tehdä selväksi, että olen aloittelija nuottien tai pianon kanssa, joten anna anteeksi, jos jokin tässä otsikossa mainittu on katkera.
Tiedämme nyt, että voimme käyttää ääniä funktiolla Arduinossa tuottamaan joitain ääniä, mutta kuinka voimme toistaa tietyn nuotin ääniä samalla. Onneksi meille on kirjasto nimeltä “pitches.h”, jonka on kirjoittanut Brett Hagman. Tämä kirjasto sisältää kaikki tiedot siitä, mikä taajuus vastaa mitä tahansa nuottia pianolla. Olin yllättynyt siitä, kuinka hyvin tämä kirjasto pystyi todella toimimaan ja soittamaan melkein kaikkia nuotteja pianolla, käytin samaa soittamaan Karibian merirosvojen, Crazy Frogin, Marion ja jopa titaanien pianosäveleitä, ja ne kuulostivat mahtavilta. Oho! Olemme hieman poissa aiheesta täällä, joten jos olet kiinnostunut siitä, tarkista melodioiden soittaminen Arduino-projektilla. Löydät myös lisää selitystä pitches.h- kirjastosta kyseisessä projektissa.
Projektissamme on vain 8 painonappia, joten jokaisella painikkeella voi soittaa vain yhden tietyn nuotin, joten voimme soittaa vain 8 nuottia. Valitsin pianolle eniten käytetyt nuotit, mutta voitko valita minkä tahansa kahdeksan tai jopa laajentaa projektia useammilla painikkeilla ja lisätä muistiinpanoja.
Tässä projektissa valitut nuotit ovat nuotit C4, D4, E4, F4, G4, A4, B4 ja C5, joita voidaan toistaa painikkeilla 1-8.
Arduinon ohjelmointi:
Tarpeeksi teoriasta päästään Arduinon ohjelmoinnin hauskaan osaan. Täydellinen Arduino ohjelma annetaan lopussa tämän sivun voit hypätä alas, jos innokas lukea edelleen ymmärtää, miten koodi toimii.
Arduino-ohjelmassa joudumme lukemaan analogisen jännitteen nastasta A0, ennustamaan sitten mitä painiketta painettiin ja toistamaan kyseisen painikkeen vastaava ääni. Tätä tehtäessä meidän on myös tallennettava, mitä painiketta käyttäjä on painanut ja kuinka kauan hän on painanut, jotta voimme luoda käyttäjän soittaman sävyn myöhemmin.
Ennen kuin siirrymme logiikkaosaan, meidän on ilmoitettava, mitä 8 nuottia soitamme. Vastaava nuottien taajuus otetaan sitten pitches.h- kirjastosta ja muodostetaan sitten taulukko alla olevan kuvan mukaisesti. Tässä soittotaajuus C4 on 262 ja niin edelleen.
int nuotit = {262, 294, 330, 349, 392, 440, 494, 523}; // Aseta taajuus malleille C4, D4, E4, F4, G4, A4, B4,
Seuraavaksi on mainittava, mihin nastoihin LCD-näyttö on kytketty. Jos noudatat täsmälleen samoja kaavioita kuin yllä, sinun ei tarvitse muuttaa mitään tässä.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // nastat, joihin LCD on kytketty LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Seuraavaksi asetustoimintomme sisällä alustamme vain LCD-moduulin ja sarjamonitorin virheenkorjausta varten. Näytämme myös intro-viestin vain varmistaaksemme, että asiat toimivat suunnitellusti. Seuraava sisällä tärkein silmukan toiminta on kaksi, kun silmukoita.
Yksi silmukka suoritetaan niin kauan kuin SPDT-kytkin on asetettu tallentamiseen enemmän. Tallennustilassa käyttäjä voi maksaa tarvittavat äänet ja samalla myös soiva ääni tallennetaan. Joten while-silmukka näyttää tältä alla
while (digitalRead (6) == 0) // Jos vaihtokytkin on asetettu tallennustilaan {lcd.setCursor (0, 0); lcd.print ("Tallennus.."); lcd.setCursor (0, 1); Tunnista_painike (); Toistoääni (); }
Kuten olet ehkä huomannut, meillä on kaksi toimintoa while-silmukan sisällä. Ensimmäistä toimintoa Tunnista_painiketta () käytetään etsimään mitä painiketta käyttäjä on painanut, ja toista toimintoa Toista_ääni () käytetään vastaavan äänen toistamiseen. Tämän toiminnon lisäksi Detect_button () -toiminto tallentaa myös mitä painiketta painetaan ja Play_tone () -toiminto tallentaa kuinka kauan painiketta painettiin.
Sisällä Detect_button () funktio luemme analogijänni- pin A0 ja verrata sitä joidenkin ennalta määrätyt arvot selvittää mikä on painettu. Arvo voidaan määrittää joko käyttämällä yllä olevaa jännitteenjakajan laskinta tai käyttämällä sarjamonitoria tarkistaaksesi, mikä analoginen arvo luetaan jokaiselle painikkeelle.
void Detect_button () { analogVal = analogRead (A0); // lue analoginen jännite nastasta A0 pev_button = button; // muistaa edellinen käyttäjän painama painike, jos (analogVal <550) -painike = 8; jos (analogVal <500) -painike = 7; jos (analogVal <450) -painike = 6; jos (analogVal <400) -painike = 5; jos (analogVal <300) -painike = 4; jos (analogVal <250) -painike = 3; jos (analogVal <150) -painike = 2; jos (analogVal <100) -painike = 1; jos (analogVal> 1000) -painike = 0; / **** Nosta painetut painikkeet taulukossa *** / jos (painike! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; tallennettu_painike = 0; button_index ++; } / ** Tallennusohjelman loppu ** / }
Kuten sanottu, tämän toiminnon sisällä tallennamme myös painikkeiden painamisjärjestyksen. Tallennetut arvot tallennetaan taulukkoon nimeltä nimeltä_nappia. Tarkistamme ensin, onko uutta painiketta painettu, jos sitä painetaan, tarkistamme myös, onko se painike 0. Missä painiketta 0 ei ole mitään, mutta mitään painiketta ei paineta. If-silmukan sisällä tallennamme arvon muuttujan button_index antamaan indeksin sijaintiin ja sitten kasvatamme myös tätä indeksiarvoa, jotta emme kirjoita liikaa samaan sijaintiin.
/ **** Rkaapaa painetut painikkeet taulukkoon *** / if (painike! = Pev_button && pev_button! = 0) { felvetty_painike = pev_button; button_index ++; tallennettu_painike = 0; button_index ++; } / ** Tallennusohjelman loppu ** /
Play_tone () -toiminnon sisällä soitamme painikkeen painikkeen vastaavan sävyn käyttämällä useita, jos olosuhteita. Lisäksi käytämme taulukkoa nimeltä record_time, jonka sisällä säästämme aikaa, jonka ajan painiketta painettiin. Toiminto on samanlainen kuin painikesarjan tallennus, sillä millis () -toiminnolla määritetään, kuinka kauan kutakin painiketta painettiin, myös muuttujan koon pienentämiseksi jaamme arvon 10: lle. Painikkeelle 0, mikä tarkoittaa, että käyttäjä ei ole painamalla mitä tahansa, emme soi sävyä saman ajan. Funktion sisällä oleva täydellinen koodi näkyy alla.
void Play_tone () { / **** R kirjoita viive taulukon jokaisen painalluksen välillä *** / if (painike! = pev_painike) { lcd.clear (); // Puhdista sitten note_time = (millis () - start_time) / 10; nauhoitettu aika = muistiinpanon aika; aika_indeksi ++; alkamisaika = millis (); } / ** Tallennusohjelman loppu ** / if (painike == 0) { noTone (7); lcd.print ("0 -> Tauko.."); } if (painike == 1) { ääni (7, muistiinpanot); lcd.print ("1 -> NOTE_C4"); } if (painike == 2) { ääni (7, muistiinpanot); lcd.print ("2 -> NOTE_D4"); } jos (painike == 3) { sävy (7, muistiinpanot); lcd.print ("3 -> NOTE_E4"); } if (painike == 4) { ääni (7, muistiinpanot); lcd.print ("4 -> NOTE_F4"); } if (painike == 5) { ääni (7, muistiinpanot); lcd.print ("5 -> NOTE_G4"); } if (painike == 6) { ääni (7, muistiinpanot); lcd.print ("6 -> NOTE_A4"); } if (painike == 7) { ääni (7, muistiinpanot); lcd.print ("7 -> NOTE_B4"); } if (painike == 8) { ääni (7, muistiinpanot); lcd.print ("8 -> NOTE_C5"); } }
Lopuksi tallennuksen jälkeen käyttäjän on vaihdettava DPST toiseen suuntaan nauhoitetun äänen toistamiseksi. Kun tämä on tehty, ohjelma irtautuu edellisestä while- silmukasta ja siirtyy toiseen while-silmukkaan, jossa soitamme nuotteja painettujen painikkeiden järjestyksessä aiemmin tallennetun ajan. Koodi saman tekemiseksi näkyy alla.
while (digitalRead (6) == 1) // Jos vaihtokytkin on asetettu toistotilassa { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Toistaa nyt.."); for (int i = 0; i <(tallennetun painikkeen) koko / 2; i ++) { viive ((tallennettu aika) * 10); // Odota ennen seuraavan kappaleen maksamista if (nauhoitettu_painike == 0) noTone (7); // käyttäjä koskettaa mitä tahansa painiketta muuta ääntä (7, muistiinpanot - 1)]); // toista käyttäjän koskettamaa painiketta vastaava ääni } } }
Toista, tallenna, toista ja toista!:
Tee laitteisto esitetyn piirikaavion mukaisesti ja lataa koodi Arduino-kortille ja sen näytetty aika. Aseta SPDT äänitystilaan ja aloita valitsemiesi äänien toisto. Kunkin painikkeen painaminen tuottaa eri äänen. Tässä tilassa nestekidenäytössä näkyy ” Tallennus…” ja toisella rivillä näet parhaillaan painettavan nuotin nimen alla olevan kuvan mukaisesti
Kun olet soittanut äänesi, vaihda SPDT-kytkin toiselle puolelle, ja nestekidenäytössä pitäisi olla ” Now Playing..” ja aloita sitten soittamasi ääni. Samaa ääntä toistetaan uudestaan ja uudestaan, kunhan vaihtokytkintä pidetään alla olevan kuvan osoittamassa asennossa.
Projektin täydellinen toiminta löytyy alla olevasta videosta. Toivottavasti ymmärrät projektin ja nautit sen rakentamisesta. Jos sinulla on ongelmia tämän viestin rakentamisessa kommenttiosioon tai käytä foorumeita tekniseen apuun projektissasi. Älä myöskään unohda tarkistaa alla olevaa esittelyvideota.