- Mga Materyal na Kinakailangan:
- Diagram ng Circuit:
- Mga Iskematika at Paliwanag:
- Pag-unawa sa
- Nagpe-play ang mga piano tone sa Arduino:
- Programming ang Arduino:
- Patugtugin, Itala, I-replay at Ulitin! :
Ang Arduino ay naging isang biyaya para sa mga taong hindi mula sa background ng electronics upang madaling makabuo ng mga bagay. Ito ay naging isang mahusay na tool ng prototyping o upang subukan ang isang bagay na cool, sa proyektong ito magtatayo kami ng isang maliit ngunit nakakatuwang Piano gamit ang Arduino. Ang piano na ito ay medyo payak na may lamang 8 mga pindutan ng push at buzzer. Gumagamit ito ng tone () na pag- andar ng Arduino upang lumikha ng iba't ibang mga uri ng mga tala ng piano sa nagsasalita. Upang pagandahin ito ng kaunti naidagdag namin ang tampok na pagrekord sa proyekto, binibigyang-daan ito sa amin na i- play ang isang tune record ito at i-play ito ulit nang paulit-ulit kung kinakailangan. Tunog kagiliw-giliw na tama !! Hinahayaan nating makakuha ng pagbuo….
Mga Materyal na Kinakailangan:
- Arduino Uno
- 16 * 2 LCD Display
- Buzzer
- Trimmer 10k
- Lumipat ang SPDT
- Push button (8 Nos)
- Mga resistors (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Breadboard
- Mga kumokonekta na mga wire
Diagram ng Circuit:
Ang kumpletong Arduino Piano Project ay maaaring maitayo sa tuktok ng isang breadboard na may ilang mga wires na nagkokonekta. Ang circuit diagram na ginawa gamit ang fritzing na nagpapakita ng view ng breadboard ng proyekto ay ipinapakita sa ibaba
Sundin lamang ang diagram ng circuit at ikonekta ang mga wire nang naaayon, ang mga pindutan ng push at buzzer tulad ng ginamit sa isang module ng PCB ngunit sa aktwal na hardware ay ginamit lamang namin ang switch at buzzer, hindi ka dapat masyadong lituhin dahil mayroon silang parehong uri ng pin out. Maaari ka ring mag-refer sa larawan sa ibaba ng hardware upang magawa ang iyong mga koneksyon.
Ang halaga ng mga resistors mula sa kaliwa ay nasa sumusunod na pagkakasunud-sunod, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k at 10k. Kung wala kang parehong switch ng DPST maaari kang gumamit ng normal na toggle switch tulad ng ipinakita sa circuit diagram sa itaas. Ngayon tingnan natin ang mga iskema ng proyekto upang maunawaan kung bakit ginawa namin ang mga sumusunod na koneksyon.
Mga Iskematika at Paliwanag:
Ang mga iskema para sa circuit diagram na ipinakita sa itaas ay ibinibigay sa ibaba, ginawa rin ito gamit ang Fritzing.
Ang isang pangunahing koneksyon na kailangan nating maunawaan ay kung paano namin nakakonekta ang 8 mga pindutan ng push sa Arduino sa pamamagitan ng Analog A0 pin. Karaniwan kailangan namin ng 8 mga input pin na maaaring maiugnay sa 8 mga pindutan ng push push, ngunit para sa mga proyektong tulad nito hindi namin maaaring gamitin ang 8 mga pin ng microcontroller para lamang sa mga push button dahil maaaring kailanganin namin ang mga ito para magamit sa paglaon. Sa aming kaso mayroon kaming LCD display upang ma-interfaced.
Kaya ginagamit namin ang analog pin ng Arduino at bumubuo ng isang potensyal na divider na may iba't ibang mga halaga ng risistor upang makumpleto ang circuit. Sa ganitong paraan kapag ang bawat pindutan ay pinindot ang isang iba't ibang mga boltahe ng analog ay ibibigay sa Analog pin. Ang isang sample na circuit na may lamang dalawang resistors at dalawang mga pindutan ng push ay ipinapakita sa ibaba.
Sa kasong ito ang ADC pin ay makakatanggap ng + 5V kapag ang mga pindutan ng push ay hindi pinindot, kung ang unang pindutan ay pinindot pagkatapos ay ang potensyal na divider ay nakumpleto sa pamamagitan ng 560R risistor at kung ang pangalawang pindutan ay pinindot pagkatapos ay ang potensyal na divider ay makakumpitensya gamit ang 1.5 k resistor. Sa ganitong paraan ang boltahe na natanggap ng ADC pin ay magkakaiba batay sa mga formula ng potensyal na divider. Kung nais mong malaman ang tungkol sa kung paano gumagana ang potensyal na divider at kung paano makalkula ang halaga ng boltahe na natanggap ng ADC pin pagkatapos ay maaari mong gamitin ang potensyal na pahina ng calculator ng divider.
Maliban dito ang lahat ng mga koneksyon ay tuwid na pasulong, ang LCD ay konektado sa mga pin 8, 9, 10, 11 at 12. Ang buzzer ay konektado sa pin 7 at ang SPDT switch ay konektado sa pin 6 ng Arduino. Ang kumpletong proyekto ay pinalakas sa pamamagitan ng USB port ng laptop. Maaari mo ring ikonekta ang Arduino sa isang 9V o 12V supply sa pamamagitan ng DC jack at gagana pa rin ang proyekto.
Pag-unawa sa
Ang Arduino ay may madaling gamiting function na () na maaaring magamit upang makabuo ng iba't ibang mga signal ng dalas na maaaring magamit upang makabuo ng iba't ibang mga tunog gamit ang isang buzzer. Kaya't maunawaan natin kung paano gumagana ang pagpapaandar at kung paano ito magagamit sa Arduino.
Bago ito dapat nating malaman kung paano gumagana ang isang Piezo buzzer. Maaaring nalaman natin ang tungkol sa mga kristal ng Piezo sa aming paaralan, walang anuman kundi isang kristal na nagpapalit ng mga pang-mechanical na pag-vibrate sa elektrisidad o kabaligtaran. Dito inilalagay namin ang isang variable na kasalukuyang (dalas) kung saan ang kristal ay nagvibrate kaya gumagawa ng tunog. Samakatuwid upang makagawa ng Piezo buzzer upang makagawa ng ingay kailangan nating gawin ang Piezo electric kristal upang mag-vibrate, ang pitch at tone ng ingay ay nakasalalay sa kung gaano kabilis ang pag-vibrate ng kristal. Samakatuwid ang tono at tono ay maaaring makontrol sa pamamagitan ng pag-iiba-iba ng dalas ng kasalukuyang.
Okay, kaya paano tayo makakakuha ng variable variable mula sa Arduino? Dito papasok ang pagpapaandar ng tone (). Ang tone () ay maaaring makabuo ng isang partikular na dalas sa isang tukoy na pin. Ang tagal ng oras ay maaari ding mabanggit kung kinakailangan. Ang syntax para sa tone () ay
Tone ng Syntax (pin, frequency) tone (pin, frequency, tagal) Parameter pin: ang pin kung saan bubuo ng frequency ng tone: ang dalas ng tone sa hertz - unsigned int tagal: ang tagal ng tone sa milliseconds (opsyonal1) - matagal na hindi pinirmahan
Ang mga halaga ng pin ay maaaring maging anuman sa iyong digital pin. Gumamit ako ng pin number 8 dito. Ang dalas na maaaring mabuo ay nakasalalay sa laki ng timer sa iyong Arduino board. Para sa UNO at karamihan sa iba pang mga karaniwang board ang minimum na dalas na maaaring magawa ay 31Hz at ang maximum na dalas na maaaring magawa ay 65535Hz. Gayunpaman kaming mga tao ay maaaring makarinig lamang ng mga frequency sa pagitan ng 2000Hz at 5000 Hz.
Nagpe-play ang mga piano tone sa Arduino:
Okay, bago pa man ako makapagsimula sa paksang ito hayaan mo akong linawin na ako ay isang baguhan na may mga tala ng musika o piano, kaya't mangyaring patawarin ako kung ang anumang nabanggit sa ilalim ng heading na ito ay hindi maganda.
Alam namin ngayon na maaari naming gamitin ang paggana ng mga tono sa Arduino upang makagawa ng ilang mga tunog, ngunit paano kami makakapagpatugtog ng mga tono ng isang partikular na tala gamit ang pareho. Masuwerte para sa atin mayroong isang silid-aklatan na tinatawag na "pitches.h" na isinulat ni Brett Hagman. Naglalaman ang library na ito ng lahat ng impormasyon tungkol sa kung aling dalas ang katumbas ng kung aling tala sa isang piano. Nagulat ako sa kung gaano kahusay ang aklatan na ito talaga na gumana at makapagpatugtog ng halos bawat tala sa isang piano, ginamit ko ang parehong upang i-play ang mga tala ng piano ng Pirates of Caribbean, Crazy Frog, Mario at kahit na titanic at tunog nila ang galing. Naku! Kami ay nakakakuha ng isang medyo off paksa dito, kaya kung ikaw ay interesado sa na suriin ang paglalaro ng mga himig gamit ang proyekto ng Arduino. Mahahanap mo rin ang karagdagang paliwanag tungkol sa mga pitch ng pitch.h sa proyekto na iyon.
Ang aming proyekto ay mayroon lamang 8 mga pindutan ng push upang ang bawat pindutan ay maaaring maglaro lamang ng isang partikular na tala ng musikal at sa gayon ganap na maaari kaming maglaro ng 8 mga tala lamang. Pinili ko ang pinaka ginagamit na mga tala sa isang piano, ngunit maaari mo bang piliin ang anumang 8 o kahit na palawakin ang proyekto na may higit pang mga pindutan ng push at magdagdag ng higit pang mga tala.
Ang mga tala na napili sa proyektong ito ay ang mga tala C4, D4, E4, F4, G4, A4, B4 at C5 na maaaring i-play gamit ang mga pindutan na 1 hanggang 8 ayon sa pagkakabanggit.
Programming ang Arduino:
Sapat na ng teorya ipaalam sa amin makakuha ng nakakatuwang bahagi ng pagprograma ng Arduino. Ang kumpletong Arduino Program ay ibinibigay sa dulo ng pahinang ito maaari kang tumalon pababa kung sabik ka o basahin pa upang maunawaan kung paano gumagana ang code.
Sa aming programa ng Arduino kailangan naming basahin ang boltahe ng analog mula sa pin A0, pagkatapos hulaan kung aling pindutan ang pinindot at i-play ang kani-kanilang tono para sa pindutang iyon. Habang ginagawa ito dapat din naming itala kung aling pindutan ang pinindot ng gumagamit at kung gaano katagal siya pinindot, upang maaari naming likhain muli ang tono na nilalaro ng gumagamit sa paglaon.
Bago pumunta sa bahagi ng lohika, kailangan nating ideklara kung aling 8 mga tala ang ilalaro namin. Ang kani-kanilang dalas para sa mga tala ay pagkatapos ay kinuha mula sa mga pitches.h library at pagkatapos ay isang array ay nabuo tulad ng ipinakita sa ibaba. Narito ang dalas upang i-play ang tala C4 ay 262 at iba pa.
int note = {262, 294, 330, 349, 392, 440, 494, 523}; // Itakda ang dalas para sa C4, D4, E4, F4, G4, A4, B4,
Susunod na nabanggit namin sa aling mga pin ang koneksyon sa LCD ay konektado. Kung sumusunod ka sa eksaktong parehong mga eskematiko na ibinigay sa itaas at pagkatapos ay hindi mo kailangang baguhin ang anumang bagay dito.
Const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pins kung saan ang LCD ay konektado sa LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Susunod, sa loob ng aming pag- andar sa pag- setup ay pinasimuno lamang namin ang module ng LCD at serial monitor para sa pag-debug. Nagpapakita rin kami ng isang mensahe ng intro upang matiyak lamang na gumagana ang mga bagay ayon sa plano. Susunod , sa loob ng pangunahing pag- andar ng loop mayroon kaming dalawa habang mga loop.
Ang isa habang ang loop ay papatayin hangga't ang SPDT switch ay inilalagay sa pag-record ng higit pa. Sa recording mode ang gumagamit ay maaaring magbayad ng mga kinakailangang tono at sa parehong oras ang tono na pinatugtog ay mai-save din. Kaya't ang loop habang ito ay ganito sa ibaba
habang (digitalRead (6) == 0) // Kung ang switch ng toggle ay nakatakda sa recording mode {lcd.setCursor (0, 0); lcd.print ("Pagre-record.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Tulad ng napansin mo na mayroon kaming dalawang pag-andar sa loob ng habang loop. Ginamit ang unang pagpapaandar na Detect_button () hanapin kung aling pindutan ang pinindot ng gumagamit at ang pangalawang pagpapaandar na Play_tone () ay ginagamit upang patugtugin ang kani-kanilang tono. Bukod sa pagpapaandar na ito ang function na Detect_button () ay nagtatala din kung aling pindutan ang pinindot at itinatala ng pagpapaandar ng Play_tone () kung gaano katagal pinindot ang pindutan.
Sa loob ng Detect_button () function na binabasa natin ang analog boltahe mula sa pin A0 at ihambing ito sa ilang nauna nang natukoy na mga halaga upang malaman kung aling mga pindutan ay pinindot. Ang halaga ay maaaring matukoy sa pamamagitan ng alinman sa paggamit ng calculator ng divider ng boltahe sa itaas o sa pamamagitan ng paggamit ng serial monitor upang suriin kung ano ang binasang halaga ng analog para sa bawat pindutan.
walang bisa ang Detect_button () { analogVal = analogRead (A0); // basahin ang analog voltag sa pin A0 pev_button = button; // tandaan ang nakaraang pindutan na pinindot ng gumagamit kung (analogVal <550) na butones = 8; kung (analogVal <500) pindutan = 7; kung (analogVal <450) pindutan = 6; kung (analogVal <400) pindutan = 5; kung (analogVal <300) pindutan = 4; kung (analogVal <250) pindutan = 3; kung (analogVal <150) pindutan = 2; kung (analogVal <100) pindutan = 1; kung (analogVal> 1000) na buton = 0; / **** I- record ang mga pindutang pinindot sa isang array *** / kung (button! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; naitala_button = 0; button_index ++; } / ** Katapusan ng Pag-record ng programa ** / }
Tulad ng sinabi, sa loob ng pagpapaandar na ito ay itinatala din namin ang pagkakasunud-sunod kung saan pinindot ang mga pindutan. Ang mga naitala na halaga ay nakaimbak sa isang array na pinangalanang naitala na pindutan Una naming sinuri kung mayroong isang bagong pindutan na pinindot, kung pinindot pagkatapos ay suriin din namin kung hindi ito ang pindutan 0. Kung saan ang pindutan 0 ay wala ngunit walang pindutan na pinindot. Sa loob ng if loop ay iniimbak namin ang halaga sa lokasyon ng index na ibinigay ng variable button_index at pagkatapos ay dinaragdagan namin ang halagang ito sa index upang hindi kami labis na magsulat sa parehong lokasyon.
/ **** I- record ang mga pindutang pinindot sa isang array *** / if (button! = Pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; naitala_button = 0; button_index ++; } / ** Katapusan ng Pag-record ng programa ** /
Sa loob ng pag- andar ng Play_tone () i - play namin ang kani-kanilang tono para sa pindutan na pinindot sa pamamagitan ng paggamit ng maramihang kung kundisyon. Gagamit din kami ng isang array na pinangalanang naitala na oras sa loob kung saan mai-save namin ang tagal ng oras kung saan pinindot ang pindutan. Ang operasyon ay katulad ng pag-record ng pagkakasunud-sunod ng pindutan sa pamamagitan ng paggamit namin ng millis () function upang matukoy kung gaano katagal pinindot ang bawat pindutan, din para sa pagbawas ng laki ng variable na hinahati namin ang halaga ng 10. Para sa pindutan 0, na nangangahulugang ang gumagamit ay hindi pagpindot sa anumang bagay na hindi namin tinutugtog para sa parehong tagal. Ang kumpletong code sa loob ng pagpapaandar ay ipinapakita sa ibaba.
walang bisa ang Play_tone () { / **** I-record ang pagkaantala ng oras sa pagitan ng bawat pindutan ng pindutin sa isang array *** / if (button! = pev_button) { lcd.clear (); // Pagkatapos linisin ito note_time = (millis () - start_time) / 10; naitala_time = note_time; time_index ++; start_time = millis (); } / ** Katapusan ng Pag-record ng programa ** / kung (pindutan == 0) { noTone (7); lcd.print ("0 -> I-pause.."); } kung (button == 1) { tone (7, mga tala); lcd.print ("1 -> TANDAAN_C4"); } kung (pindutan == 2) { tone (7, mga tala); lcd.print ("2 -> TANDAAN_D4"); } kung (pindutan == 3) { tone (7, tala); lcd.print ("3 -> TANDAAN_E4"); } kung (pindutan == 4) { tone (7, mga tala); lcd.print ("4 -> TANDAAN_F4"); } kung (button == 5) { tone (7, mga tala); lcd.print ("5 -> TANDAAN_G4"); } kung (pindutan == 6) { tone (7, mga tala); lcd.print ("6 -> TANDAAN_A4"); } kung (pindutan == 7) { tone (7, mga tala); lcd.print ("7 -> TANDAAN_B4"); } kung (pindutan == 8) { tone (7, mga tala); lcd.print ("8 -> TANDAAN_C5"); } }
Sa wakas pagkatapos ng pag-record ang gumagamit ay kailangang i-toggle ang DPST sa iba pang direksyon upang i-play ang naitala na tono. Kapag tapos na ito ang programa ay humihiwalay sa nakaraang habang loop at pumapasok sa pangalawa habang loop kung saan pinapatugtog namin ang mga tala sa pagkakasunud-sunod ng mga pindutan na pinindot para sa isang tagal na naunang naitala. Ang code na gawin ang pareho ay ipinapakita sa ibaba.
habang (digitalRead (6) == 1) // Kung ang switch ng toggle ay nakatakda sa Playing mode { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Nagpe-play Ngayon.."); para sa (int i = 0; i <sizeof (naitala_button) / 2; i ++) { pagkaantala ((naitala_panahon) * 10); // Maghintay para sa bago magbayad ng susunod na tono kung ( naitala_button == 0) noTone (7); // user dint ugnay sa anumang pindutan ibang tono (7, mga tala - 1)]); // patugtugin ang tunog na naaayon sa pindutang hinawakan ng gumagamit } } }
Patugtugin, Itala, I-replay at Ulitin!:
Gawin ang hardware ayon sa ipinapakitang diagram ng circuit, at i-upload ang code sa Arduino board at ang ipinapakitang oras nito. Iposisyon ang SPDT sa mode ng pag-record at simulang patugtugin ang mga tono na iyong pinili, ang pagpindot sa bawat pindutan ay magbubunga ng ibang tono. Sa mode na ito, ipapakita ng LCD ang " Pagre-record…" at sa pangalawang linya makikita mo ang pangalan ng tala na kasalukuyang pinindot tulad ng ipinapakita sa ibaba
Kapag na-play mo na ang iyong tono ay i-toggle ang SPDT switch sa kabilang panig at dapat ipakita ng LCD ang " Now Playing.." at pagkatapos ay simulan ang pag-play ng tone na iyong nilaro. Ang parehong tono ay i-play muli at muli hangga't ang toggle switch ay itinatago sa posisyon tulad ng ipinakita sa larawan sa ibaba.
Ang kumpletong pagtatrabaho ng proyekto ay matatagpuan sa video na ibinigay sa ibaba. Inaasahan kong naintindihan mo ang proyekto at nasiyahan sa pagbuo nito. Kung mayroon kang anumang mga problema sa pagbuo ng post na ito ang mga ito sa seksyon ng komento o gamitin ang mga forum para sa panteknikal na tulong sa iyong proyekto. Huwag ding kalimutang suriin ang video ng demonstrasyon na ibinigay sa ibaba.