- Reikalingos medžiagos:
- Grandinės schema:
- Schema ir paaiškinimas:
- Supratimas
- Grojimas fortepijono tonais „Arduino“:
- „Arduino“ programavimas:
- Leiskite, įrašykite, pakartokite ir pakartokite! :
„Arduino“ buvo palaima žmonėms, kurie nėra iš elektronikos, lengvai kurti daiktus. Tai buvo puikus prototipų kūrimo įrankis arba išbandyti ką nors šaunaus. Šiame projekte mes pastatysime mažą, bet linksmą pianiną naudodami „Arduino“. Šis fortepijonas yra beveik paprastas, tik su 8 mygtukais ir garsiniu signalu. Jis naudoja „ Arduino“ tono () funkciją, kad garsiakalbyje būtų kuriamos įvairios fortepijono natos. Norėdami šiek tiek pagardinti, įtraukėme įrašymo funkciją į projektą, tai leidžia mums atkurti melodiją ir pakartoti pakartotinai, kai to reikia. Skamba įdomiai teisingai! Taigi leiskime kurtis…
Reikalingos medžiagos:
- Arduino Uno
- 16 * 2 LCD ekranas
- Buzeris
- Žoliapjovė 10 tūkst
- SPDT jungiklis
- Mygtukas (8 nr.)
- Rezistoriai (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Bandomoji Lenta
- Jungiamieji laidai
Grandinės schema:
Visas „ Arduino“ fortepijono projektas gali būti pastatytas ant duonos lentos su kai kuriais jungiamaisiais laidais. Žemiau parodyta grandinės schema, padaryta naudojant fritzing, rodanti projekto rodinį
Tiesiog laikykitės grandinės schemos ir atitinkamai prijunkite laidus, mygtukus ir garsinį signalą, naudojamą kartu su PCB moduliu, tačiau tikroje aparatinėje įrangoje mes naudojome tik jungiklį ir garsinį signalą, tai neturėtų jūsų labai supainioti, nes jie turi tokio paties tipo kaiščius. Norėdami užmegzti ryšį, taip pat galite kreiptis į žemiau pateiktą aparatūros vaizdą.
Rezistorių vertė iš kairės yra tokia tvarka: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k ir 10k. Jei neturite to paties DPST jungiklio, galite naudoti įprastą perjungiklį, kaip parodyta aukščiau esančioje schemoje. Dabar pažvelkime į projekto schemas, kad suprastume, kodėl mes sukūrėme šiuos ryšius.
Schema ir paaiškinimas:
Aukščiau pateiktos schemos schemos pateikiamos žemiau, ji taip pat buvo sukurta naudojant „Fritzing“.
Vienas pagrindinis ryšys, kurį turime suprasti, yra tai, kaip mes prijungėme 8 mygtukus prie „Arduino“ per „Analog A0“ kaištį. Iš esmės mums reikia 8 įvesties kaiščių, kuriuos galima sujungti su 8 įvesties mygtukais, tačiau tokiems projektams mes negalime naudoti 8 mikrovaldiklio kaiščių tik mygtukams, nes jų gali prireikti vėliau. Mūsų atveju turime susieti LCD ekraną.
Taigi mes naudojame analoginį „Arduino“ kaištį ir suformuojame potencialų daliklį su skirtingomis rezistoriaus vertėmis, kad užbaigtume grandinę. Tokiu būdu paspaudus kiekvieną mygtuką, skirtinga analoginė įtampa bus tiekiama į analoginį kaištį. Žemiau parodyta grandinės pavyzdys, kuriame yra tik du rezistoriai ir du mygtukai.
Šiuo atveju ADC kaištis gaus + 5 V, kai nebus paspausti mygtukai. Jei paspaudžiamas pirmasis mygtukas, potencialų daliklis baigiamas per 560R rezistorių, o jei paspaudžiamas antrasis mygtukas, potencialus daliklis varžosi naudodamas k rezistorius. Tokiu būdu įtampa, kurią gauna ADC kaištis, skirsis priklausomai nuo potencialų daliklio formulių. Jei norite sužinoti daugiau apie tai, kaip veikia potencialus daliklis ir kaip apskaičiuoti įtampos, kurią gauna ADC kaištis, vertę, galite naudoti šį potencialų daliklio skaičiuoklės puslapį.
Be to, visos jungtys yra tiesiai į priekį, LCD yra prijungtas prie 8, 9, 10, 11 ir 12 kaiščių. Skambutis yra sujungtas su kaiščiu 7, o SPDT jungiklis - su „Arduino“ kaiščiu 6. Visas projektas maitinamas per nešiojamojo kompiuterio USB prievadą. Taip pat galite prijungti „Arduino“ prie 9 V arba 12 V maitinimo šaltinio per nuolatinės srovės lizdą, o projektas vis tiek veiks taip pat.
Supratimas
„Arduino“ turi patogią tono () funkciją, kuri gali būti naudojama generuoti įvairaus dažnio signalus, kurie gali būti naudojami gaminant skirtingus garsus naudojant garsinį signalą. Taigi supraskime, kaip funkcija veikia ir kaip ją galima naudoti su „Arduino“.
Prieš tai turėtume žinoti, kaip veikia „Piezo“ garsinis signalas. Apie Piezo kristalus galėjome sužinoti savo mokykloje, tai yra ne kas kitas, o tik kristalas, paverčiantis mechanines vibracijas elektra arba atvirkščiai. Čia mes naudojame kintamą srovę (dažnį), kuriai kristalas vibruoja, taip gamindamas garsą. Taigi norėdami priversti Pjezo garsinį signalą kelti triukšmą, turime priversti Pjezo elektrinį kristalą vibruoti, triukšmo aukštis ir tonas priklauso nuo to, kaip greitai kristalas vibruoja. Taigi toną ir aukštį galima valdyti keičiant srovės dažnį.
Gerai, tai kaip mes gauname kintamą dažnį iš „Arduino“? Čia atsiranda funkcija tone (). Tonas () gali sukurti tam tikrą dažnį konkrečiame kaište. Jei reikia, taip pat galima paminėti laiko trukmę. Tono () sintaksė yra
Sintaksės tono (kaištis, dažnis) tonas (kaištis, dažnis, trukmė) Parametrai: kaištis, kuriame generuojamas tono dažnis: tono dažnis hercais - nepasirašyta int trukmė: tono trukmė milisekundėmis (pasirinktinai1) - nepasirašytas ilgas
PIN kodas gali būti bet kuris jūsų skaitmeninis kaištis. Aš čia naudojau PIN kodą 8. Generuojamas dažnis priklauso nuo laikmačio dydžio jūsų „Arduino“ lentoje. UNO ir daugumos kitų įprastų plokščių atveju minimalus dažnis, kurį galima pagaminti, yra 31Hz, o didžiausias - 65535Hz. Tačiau mes, žmonės, girdime tik 2000–5000 Hz dažnius.
Grojimas fortepijono tonais „Arduino“:
Gerai, kol net nepradėjau šios temos, leiskite man aiškiai pasakyti, kad esu naujokas su muzikinėmis natomis ar fortepijonu, todėl, prašau, atleiskite, jei kas nors, kas paminėta šioje rubrikoje, yra nesąžininga.
Dabar mes žinome, kad kai kuriems garsams gaminti galime naudoti „Arduino“ tonų funkciją, bet kaip mes galime atkurti tam tikros natos tonus tuo pačiu. Mums pasisekė, yra biblioteka, pavadinta „pitches.h“, kurią parašė Brettas Hagmanas. Šioje bibliotekoje yra visa informacija apie tai, kuris dažnis prilygsta kuriai natai fortepijonui. Mane nustebino tai, kaip gerai ši biblioteka iš tikrųjų gali dirbti ir groti beveik kiekvieną natą pianinu, tą patį naudojau grodama „Karibų piratų“, „Crazy Frog“, „Mario“ ir netgi „Titanic“ fortepijono natomis, ir jos skambėjo nuostabiai. Oi! Čia mes šiek tiek nukrypstame nuo temos, taigi, jei jus domina tai, patikrinkite grodami melodijas naudodami „Arduino“ projektą. Tame projekte taip pat rasite daugiau paaiškinimų apie „ pitches.h“ biblioteką.
Mūsų projekte yra tik 8 mygtukai, todėl kiekvienas mygtukas gali leisti tik vieną tam tikrą muzikinę natą, taigi mes galime groti tik 8 natas. Pasirinkau dažniausiai naudojamas natas fortepijonu, bet ar galite pasirinkti bet kokius 8 ar net išplėsti projektą naudodami daugiau mygtukų ir pridėti daugiau natų.
Šiame projekte pasirinktos natos yra natos C4, D4, E4, F4, G4, A4, B4 ir C5, kurias galima groti atitinkamai naudojant mygtukus nuo 1 iki 8.
„Arduino“ programavimas:
Užteks teorijos, kad pereitume prie smagios „Arduino“ programavimo dalies. Visa „ Arduino“ programa pateikiama šio puslapio pabaigoje. Jei norite suprasti, kaip veikia kodas, galite pereiti žemyn, jei norite ar skaitysite toliau.
„Arduino“ programoje turime nuskaityti analoginę įtampą iš kaiščio A0, tada numatyti, kuris mygtukas buvo paspaustas, ir paleisti atitinkamą to mygtuko toną. Tai darydami, taip pat turėtume įrašyti, kurį mygtuką vartotojas paspaudė ir kiek laiko jis / ji paspaudė, kad vėliau galėtume atkurti naudotojo skambėjusį toną.
Prieš eidami į loginę dalį, turime deklaruoti, kurias 8 natas grosime. Atitinkamas natų dažnis paimamas iš „ pitches.h“ bibliotekos ir tada suformuojamas masyvas, kaip parodyta žemiau. Čia C4 natos grojimo dažnis yra 262 ir pan.
int užrašai = {262, 294, 330, 349, 392, 440, 494, 523}; // Nustatykite dažnį C4, D4, E4, F4, G4, A4, B4,
Toliau turime paminėti, prie kurių kaiščių yra prijungtas LCD ekranas. Jei laikotės tų pačių schemų, pateiktų aukščiau, jums nereikia nieko čia keisti.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Smeigtukai, prie kurių prijungtas LCD ekranas LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Be to, sąrankos funkcijos metu mes tiesiog inicijuojame LCD modulį ir nuoseklųjį monitorių derinimui. Taip pat rodome įvadinį pranešimą, kad įsitikintume, jog viskas veikia kaip numatyta. Be to , pagrindinės kilpos funkcijos viduje turime dvi, o kilpas.
Vienas ciklas bus vykdomas tol, kol SPDT jungiklis bus įrašytas daugiau. Įrašymo režime vartotojas gali sumokėti reikalingus tonus, o tuo pačiu metu grojamas tonas taip pat bus išsaugotas. Taigi, kol ciklas atrodo taip žemiau
while (digitalRead (6) == 0) // Jei perjungimo jungiklis nustatytas įrašymo režimu {lcd.setCursor (0, 0); lcd.print ("Įrašymas.."); lcd.setCursor (0, 1); Aptikti_ mygtukas (); „Play_tone“ (); }
Kaip pastebėjote , „loop“ viduje turime dvi funkcijas. Pirmoji funkcija „ Detect_button“ () yra naudojama ieškant vartotojo mygtuko, o antroji funkcija „ Play_tone“ () naudojama norint atkurti atitinkamą toną. Be šios funkcijos, funkcija „ Detect_button ()“ taip pat įrašo, kuris mygtukas yra spaudžiamas, o „ Play_tone“ () funkcija įrašo, kiek laiko mygtukas buvo paspaustas.
Viduje Detect_button () funkciją mes skaitome nuo kaiščio A0 analoginį įtampą ir palyginti ją su kai kuriais iš anksto nustatytų verčių išsiaiškinti, kuris mygtukas buvo paspaustas. Vertę galima nustatyti naudojant aukščiau esantį įtampos skirstytuvo skaičiuoklę arba naudojant nuoseklųjį monitorių, kad patikrintumėte, kokia analoginė reikšmė skaitoma kiekvienam mygtukui.
void Detect_button () { analogVal = analogRead (A0); // perskaityti analoginį voltagą ant kaiščio A0 pev_button = button; // prisiminti ankstesnį vartotojo paspaustą mygtuką, jei (analogVal <550) mygtukas = 8; if (analogVal <500) mygtukas = 7; if (analogVal <450) mygtukas = 6; jei (analogVal <400) mygtukas = 5; jei (analogVal <300) mygtukas = 4; if (analogVal <250) mygtukas = 3; if (analogVal <150) mygtukas = 2; if (analogVal <100) mygtukas = 1; if (analogVal> 1000) mygtukas = 0; / **** Įriškite paspaustus mygtukus į masyvą *** / jei (mygtukas! = pev_button && pev_button! = 0) { įrašytas_ mygtukas = pev_button; mygtukas_indeksas ++; įrašytas_ mygtukas = 0; mygtukas_indeksas ++; } / ** Įrašymo programos pabaiga ** / }
Kaip sakyta, šios funkcijos viduje mes taip pat įrašome mygtukų paspaudimo seką. Įrašytos reikšmės saugomos masyve pavadinimu įrašytas_ mygtukas. Pirmiausia patikriname, ar yra paspaustas naujas mygtukas, jei paspaudžiamas, tada taip pat patikriname, ar tai nėra mygtukas 0. Kur mygtukas 0 yra nieko, bet nėra paspaustas nė vienas mygtukas. If kilpos viduje mes išsaugome reikšmę indekso vietoje, kurią pateikia kintamasis mygtukas_index, ir tada mes taip pat padidiname šią indekso vertę, kad neperrašytume toje pačioje vietoje.
/ **** R užfiksuokite paspaustus mygtukus masyve *** / if (mygtukas! = Pev_button && pev_button! = 0) { įrašytas_ mygtukas = pev_ mygtukas; mygtukas_indeksas ++; įrašytas_ mygtukas = 0; mygtukas_indeksas ++; } / ** Įrašymo programos pabaiga ** /
Viduje Play_tone () funkcija žaisime atitinkamą toną mygtuka nuspausta naudojant keletą jeigu sąlygomis. Mes taip pat naudosime masyvą, kurio pavadinimas įrašytas laikas, kuriame sutaupysime laiko trukmę, per kurią buvo paspaustas mygtukas. Ši operacija yra panaši į mygtukų sekos įrašymą, nes mes naudojame funkciją milis (), kad nustatytume, kiek laiko kiekvienas mygtukas buvo paspaustas, taip pat norėdami sumažinti kintamojo dydį, mes padalijame vertę iš 10. Mygtukui 0, tai reiškia, kad vartotojas nėra spausdami bet ką, mes negrojame tono tą pačią trukmę. Visas kodas, esantis funkcijos viduje, parodytas žemiau.
void „Play_tone“ () { / **** Rkaičiuokite laiko atidėjimą tarp kiekvieno mygtuko paspaudimo masyve *** / if (mygtukas! = pev_button) { lcd.clear (); // Tada nuvalykite note_time = (milis () - start_time) / 10; įrašytas_ laikas = pastabos laikas; laiko_indeksas ++; pradžios laikas = milis (); } / ** Įrašymo programos pabaiga ** / if (mygtukas == 0) { noTone (7); lcd.print ("0 -> Pauzė.."); } if (mygtukas == 1) { tonas (7, užrašai); lcd.print ("1 -> NOTE_C4"); } if (mygtukas == 2) { tonas (7, užrašai); lcd.print ("2 -> NOTE_D4"); } jei (mygtukas == 3) { tonas (7, natos); lcd.print ("3 -> NOTE_E4"); } if (mygtukas == 4) { tonas (7, užrašai); lcd.print ("4 -> NOTE_F4"); } if (mygtukas == 5) { tonas (7, užrašai); lcd.print ("5 -> NOTE_G4"); } if (mygtukas == 6) { tonas (7, užrašai); lcd.print ("6 -> NOTE_A4"); } if (mygtukas == 7) { tonas (7, užrašai); lcd.print ("7 -> NOTE_B4"); } if (mygtukas == 8) { tonas (7, užrašai); lcd.print ("8 -> NOTE_C5"); } }
Galiausiai įrašęs vartotojas turi perjungti DPST į kitą pusę, norėdamas paleisti įrašytą toną. Kai tai bus padaryta, programa išeina iš ankstesnės, o ciklo, ir įeina į antrąją, o kilpą, kurioje mes grojame pastabas paspaudę mygtukus, kurie buvo įrašyti anksčiau. Tą patį darantis kodas parodytas žemiau.
while (digitalRead (6) == 1) // Jei perjungimo jungiklis nustatytas grojimo režime { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Dabar groja.."); for (int i = 0; i <dydis (įrašytas_ mygtukas) / 2; i ++) { atidėjimas ((įrašytas_ laikas) * 10); // Palaukite, kol sumokėsite kitą melodiją, jei (įrašytas_ mygtukas == 0) noTone (7); // vartotojas dint paliesti bet kokį mygtuką kitas tonas (7, pastabos - 1)]); // paleisti garsą, atitinkantį vartotojo paliestą mygtuką } } }
Leiskite, įrašykite, pakartokite ir pakartokite!:
Padarykite aparatinę įrangą, kaip parodyta schemoje, ir įkelkite kodą į „Arduino“ plokštę ir jos rodomą laiką. Nustatykite SPDT įrašymo režimu ir pradėkite groti pasirinktus tonus. Paspaudus kiekvieną mygtuką bus gaunamas skirtingas tonas. Šiuo režimu LCD ekrane bus rodoma „ Recording…“, o antroje eilutėje pamatysite šiuo metu spaudžiamo užrašo pavadinimą, kaip parodyta žemiau
Paleidę toną perjunkite SPDT jungiklį į kitą pusę, o LCD ekrane turėtų būti rodoma „ Dabar grojama “ ir pradėkite groti ką tik grotą toną. Tas pats tonas bus grojamas vėl ir vėl, jei perjungimo jungiklis bus laikomas tokioje padėtyje, kaip parodyta žemiau esančiame paveikslėlyje.
Išsamų projekto darbą galite rasti žemiau pateiktame vaizdo įraše. Tikiuosi, kad supratote projektą ir patiko jį kurti. Jei turite kokių nors problemų kurdami šį pranešimą, įdėkite juos į komentarų skyrių arba naudokite forumus, kad gautumėte techninę pagalbą savo projektui. Taip pat nepamirškite patikrinti toliau pateikto demonstracinio vaizdo įrašo.