- Nepieciešamie materiāli:
- Ķēdes shēma:
- Shēmas un skaidrojums:
- Izpratne par
- Klavieru toņu atskaņošana vietnē Arduino:
- Arduino programmēšana:
- Spēlējiet, ierakstiet, atkārtojiet un atkārtojiet! :
Arduino ir bijis noderīgs cilvēkiem, kuri nav no elektronikas, viegli veidot lietas. Tas ir bijis lielisks prototipu veidošanas rīks vai izmēģināt kaut ko foršu. Šajā projektā mēs izveidosim nelielu, bet jautru klavieres, izmantojot Arduino. Šīs klavieres ir diezgan vienkāršas ar tikai 8 pogām un skaņas signālu. Tas izmanto Arduino toņa () funkciju, lai uz skaļruņa izveidotu dažāda veida klavieru piezīmes. Lai to nedaudz papildinātu, esam projektā pievienojuši ierakstīšanas funkciju, kas ļauj mums atskaņot melodijas ierakstu un atkārtoti atskaņot atkārtoti, ja nepieciešams. Izklausās interesanti labi !! Tātad ļaujiet mums būvēt….
Nepieciešamie materiāli:
- Arduino Uno
- 16 * 2 LCD displejs
- Buzzer
- Trimmeris 10k
- SPDT slēdzis
- Spiedpoga (8 nos.)
- Rezistori (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Maizes dēlis
- Savienojošie vadi
Ķēdes shēma:
Pilnīgu Arduino klavieru projektu var uzcelt virs maizes dēļa ar dažiem savienojošajiem vadiem. Shēma, kas izveidota, izmantojot fritzing, kas parāda projekta paneļa skatu, ir parādīta zemāk
Vienkārši izpildiet ķēdes shēmu un attiecīgi pievienojiet vadus, spiedpogas un skaņas signālu, ko lieto kopā ar PCB moduli, bet faktiskajā aparatūrā mēs izmantojām tikai slēdzi un skaņas signālu, tam nevajadzētu jūs daudz sajaukt, jo tiem ir tāda paša veida spraudnis. Lai izveidotu savienojumus, varat arī atsaukties uz zemāk redzamo aparatūras attēlu.
Rezistoru vērtība no kreisās puses ir šādā secībā: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k un 10k. Ja jums nav tā paša DPST slēdža, varat izmantot parasto pārslēgšanas slēdzi, piemēram, to, kas parādīts augšējā ķēdes shēmā. Tagad aplūkosim projekta shēmas, lai saprastu, kāpēc mēs esam izveidojuši šādus savienojumus.
Shēmas un skaidrojums:
Shēmas shēmai shēmai, kas parādīta iepriekš, ir sniegta zemāk, tā tika izgatavota arī, izmantojot Fritzing.
Viens no galvenajiem savienojumiem, kas mums jāsaprot, ir tas, ka mēs esam savienojuši 8 spiedpogas ar Arduino caur Analog A0 tapu. Būtībā mums ir nepieciešamas 8 ieejas tapas, kuras var savienot ar 8 ieejas spiedpogām, taču šādiem projektiem mēs nevaram izmantot 8 mikrokontrollera tapas tikai spiedpogām, jo mums tās var būt vajadzīgas vēlākai izmantošanai. Mūsu gadījumā mums ir saskarne ar LCD displeju.
Tāpēc mēs izmantojam Arduino analogo tapu un izveidojam potenciālu dalītāju ar dažādām rezistora vērtībām, lai pabeigtu ķēdi. Tādā veidā, nospiežot katru pogu, analogajam spraudnim tiks piegādāts atšķirīgs analogais spriegums. Zemāk ir parādīta parauga ķēde ar tikai diviem rezistoriem un divām spiedpogām.
Šajā gadījumā ADC tapa saņem + 5V, kad netiek nospiesti spiedpogas, ja tiek nospiesta pirmā poga, potenciālais dalītājs tiek pabeigts caur 560R rezistoru un, ja tiek nospiesta otrā poga, tad potenciālais dalītājs sacenšas, izmantojot 1.5 k rezistors. Tādā veidā spriegums, ko saņem ADC tapa, mainīsies atkarībā no potenciālā dalītāja formulām. Ja vēlaties uzzināt vairāk par to, kā darbojas potenciālais dalītājs un kā aprēķināt sprieguma vērtību, ko saņem ADC tapa, varat izmantot šo potenciālā dalītāja kalkulatora lapu.
Izņemot to, visi savienojumi ir taisni uz priekšu, LCD ir savienots ar tapām 8, 9, 10, 11 un 12. Skaņas signāls ir savienots ar tapu 7 un SPDT slēdzis ir savienots ar Arduino tapu 6. Viss projekts tiek darbināts, izmantojot klēpjdatora USB portu. Ar DC ligzdu jūs varat arī savienot Arduino ar 9V vai 12V barošanas avotu, un projekts joprojām darbosies tāpat.
Izpratne par
Arduino ir ērta toņa () funkcija, kuru var izmantot, lai radītu dažādas frekvences signālus, kurus var izmantot dažādu skaņu radīšanai, izmantojot skaņas signālu. Tātad, sapratīsim, kā funkcija darbojas un kā to var izmantot ar Arduino.
Pirms tam mums vajadzētu zināt, kā darbojas Pjezo skaņas signāls. Mēs, iespējams, esam mācījušies par Pjezo kristāliem savā skolā, tas ir nekas cits kā kristāls, kas pārveido mehāniskās vibrācijas elektrībā vai otrādi. Šeit mēs izmantojam mainīgu strāvu (frekvenci), kurai kristāls vibrē, tādējādi radot skaņu. Tāpēc, lai pieskaņotu pjezo skaņas signālu, mums jāpadara Pjezo elektriskais kristāls vibrējošs, trokšņa augstums un tonis ir atkarīgs no tā, cik ātri kristāls vibrē. Tādējādi toņu un augstumu var kontrolēt, mainot strāvas frekvenci.
Labi, tad kā mēs iegūstam mainīgu frekvenci no Arduino? Šeit parādās funkcija tone (). Tonis () var ģenerēt noteiktu frekvenci uz konkrētas tapas. Vajadzības gadījumā var minēt arī laika ilgumu. Signāla () sintakse ir
Sintakses signāla (piespraudes, frekvences) signāls (piespraudes, frekvence, ilgums) Parametri pin: tapa, uz kuras ģenerēt signāla frekvenci: signāla frekvence hercos - neparakstīts int ilgums: signāla ilgums milisekundēs (pēc izvēles1) - neparakstīts garš
Piespraudes vērtības var būt jebkuras jūsu digitālās tapas. Es šeit esmu izmantojis tapu numuru 8. Ģenerējamā frekvence ir atkarīga no taimera lieluma jūsu Arduino dēlī. UNO un lielākajai daļai citu parasto dēļu minimālā frekvence, ko var ražot, ir 31Hz, bet maksimālā - 65535Hz. Tomēr mēs, cilvēki, dzirdam tikai frekvences no 2000Hz līdz 5000 Hz.
Klavieru toņu atskaņošana vietnē Arduino:
Labi, pirms es pat sāku nodarboties ar šo tēmu, ļaujiet man skaidri pateikt, ka esmu iesācējs ar mūzikas notīm vai klavierēm, tāpēc, lūdzu, piedodiet, ja kaut kas, kas minēts šajā sadaļā, ir neķītrs.
Tagad mēs zinām, ka mēs varam izmantot toņu funkciju Arduino, lai radītu dažas skaņas, bet kā mēs varam atskaņot konkrētas piezīmes toņus, izmantojot tos pašus. Mums paveicās, ka ir bibliotēka ar nosaukumu “pitches.h”, kuru sarakstījis Brets Hagmans. Šajā bibliotēkā ir visa informācija par to, kura frekvence ir līdzvērtīga tai piezīmei uz klavierēm. Mani pārsteidza tas, cik labi šī bibliotēka faktiski var darboties un atskaņot gandrīz visas piezīmes uz klavierēm, es to pašu izmantoju, lai spēlētu Karību jūras pirātu, Trakās vardes, Mario un pat titānikas klavieru notis, un tās izklausījās satriecoši. Hmm… Mēs šeit nedaudz atkāpjamies no tēmas, tāpēc, ja jūs interesē tas, pārbaudiet melodiju atskaņošanu, izmantojot Arduino projektu. Šajā projektā atradīsit arī plašāku skaidrojumu par pitch.h bibliotēku.
Mūsu projektā ir tikai 8 spiedpogas, tāpēc katra poga var atskaņot tikai vienu noteiktu mūzikas noti, un tādējādi mēs varam atskaņot tikai 8 piezīmes. Es uz klavierēm atlasīju visbiežāk lietotās piezīmes, bet vai varat izvēlēties jebkuru 8 vai pat paplašināt projektu ar vairākām pogām un pievienot vairāk piezīmju.
Šajā projektā izvēlētās piezīmes ir piezīmes C4, D4, E4, F4, G4, A4, B4 un C5, kuras var atskaņot, izmantojot attiecīgi 1. līdz 8. pogu.
Arduino programmēšana:
Pietiekami daudz teorijas ļaujiet mums nokļūt Arduino programmēšanas jautrajā daļā. Pilnīga Arduino Programma tiek dota beigās Šajā lapā jūs varat nolēkt, ja esat ieinteresēts vai lasīt tālāk, lai saprastu, kā kods darbojas.
Mūsu Arduino programmā mums ir jāizlasa analogais spriegums no tapas A0, pēc tam jāparedz, kura poga ir nospiesta, un jāspēlē attiecīgais pogas signāls. To darot, mums arī jāreģistrē, kuru pogu lietotājs ir nospiedis un cik ilgi viņš / viņa ir nospiedis, lai mēs vēlāk varētu atjaunot to, kuru lietotājs atskaņoja.
Pirms doties uz loģikas daļu, mums jāpaziņo, kuras 8 piezīmes mēs spēlēsim. Attiecīgais piezīmju biežums tiek ņemts no pitches.h bibliotēkas un pēc tam tiek izveidots masīvs, kā parādīts zemāk. Šeit C4 piezīmes atskaņošanas biežums ir 262 un tā tālāk.
int piezīmes = {262, 294, 330, 349, 392, 440, 494, 523}; // Iestatiet frekvenci C4, D4, E4, F4, G4, A4, B4,
Tālāk mums jāpiemin, pie kurām tapām ir pieslēgts LCD displejs. Ja jūs sekojat tieši tām pašām shēmām, kas norādītas iepriekš, jums nekas šeit nav jāmaina.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Piespraudes, kurām ir pievienots LCD, LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Pēc tam iestatīšanas funkcijas iekšpusē mēs vienkārši inicializējam LCD moduli un sērijveida monitoru atkļūdošanai. Mēs arī parādām ievada ziņojumu tikai tāpēc, lai pārliecinātos, ka viss darbojas kā plānots. Tālāk galvenās cilpas funkcijas iekšpusē mums ir divas cilpas .
Viena cilpa tiks izpildīta tik ilgi, kamēr SPDT slēdzis ir ievietots ierakstā vairāk. Ierakstīšanas režīmā lietotājs var samaksāt nepieciešamos signālus, un vienlaikus tiks saglabāts arī atskaņotais signāls. Tātad, kamēr cilpa izskatās šādi zemāk
while (digitalRead (6) == 0) // Ja pārslēgšanas slēdzis ir iestatīts ierakstīšanas režīmā {lcd.setCursor (0, 0); lcd.print ("Ierakstīšana.."); lcd.setCursor (0, 1); Detect_button (); Atskaņošanas_tone (); }
Kā jūs, iespējams, pamanījāt, kamēr cilpa iekšpusē ir divas funkcijas. Pirmo funkciju Detect_button () izmanto, lai atrastu, kuru pogu lietotājs ir nospiests, un otro funkciju Play_tone () izmanto, lai atskaņotu attiecīgo signālu. Papildus šai funkcijai funkcija Detect_button () arī reģistrē, kura poga tiek nospiesta, un Play_tone () funkcija reģistrē pogas nospiešanas laiku.
Inside Detect_button () funkciju, mēs lasām analogo spriegumu no pin A0 un salīdzināt to ar dažiem noteiktiem vērtībām, lai noskaidrotu, kura poga ir nospiesta. Vērtību var noteikt, izmantojot iepriekš minēto sprieguma dalītāja kalkulatoru, vai izmantojot seriālo monitoru, lai pārbaudītu, kāda analogā vērtība tiek nolasīta katrai pogai.
void Detect_button () { analogVal = analogRead (A0); // nolasīt analogo voltagu uz tapas A0 pev_button = button; // atcerieties iepriekšējo lietotāja nospiedušo pogu, ja (analogVal <550) poga = 8; ja (analogVal <500) poga = 7; ja (analogVal <450) poga = 6; ja (analogVal <400) poga = 5; ja (analogVal <300) poga = 4; ja (analogVal <250) poga = 3; ja (analogVal <150) poga = 2; ja (analogVal <100) poga = 1; ja (analogVal> 1000) poga = 0; / **** Vadi nospiestās pogas masīvā *** / ja (poga! = pev_button && pev_button! = 0) { ierakstīta_poga = pev_button; button_index ++; ierakstīta_poga = 0; button_index ++; } / ** Ierakstīšanas programmas beigas ** / }
Kā teicām, šīs funkcijas iekšpusē mēs arī ierakstām pogu nospiešanas secību. Reģistrētās vērtības tiek glabātas masīvā ar nosaukumu ierakstīts_poga. Vispirms pārbaudām, vai nav nospiesta jauna poga, ja tiek nospiesta, tad arī pārbaudām, vai tā nav poga 0. Kur poga 0 nav nekas, bet netiek nospiesta neviena poga. If cilpas iekšpusē mēs saglabājam vērtību indeksa atrašanās vietā, ko sniedz mainīgais button_index, un pēc tam mēs arī palielinām šo indeksa vērtību, lai mēs nepārrakstītu tajā pašā vietā.
/ **** R saspiediet nospiestās pogas masīvā *** / if (poga! = Pev_button && pev_button! = 0) { ierakstīta_poga = pev_poga; button_index ++; ierakstīta_poga = 0; button_index ++; } / ** Ierakstīšanas programmas beigas ** /
Inside Play_tone () funkciju, mēs varētu spēlēt attiecīgo toni pogas nospiešanas, izmantojot vairākus , ja apstākļi. Arī mēs izmantosim masīva nosaukumu recorded_time iekšpusi, ko mēs ietaupīt laika ilgumu, par kuru tika nospiesta poga. Darbība ir līdzīga pogu secības ierakstīšanai, jo mēs izmantojam funkciju milis (), lai noteiktu, cik ilgi katra poga ir nospiesta, kā arī mainīgā lieluma samazināšanai mēs vērtību dalām ar 10. Pogai 0, kas nozīmē, ka lietotājs nav nospiežot jebko, mēs to pašu laiku nespēlējam. Pilns kods funkcijas iekšpusē ir parādīts zemāk.
void Play_tone () { / **** Rnorādiet laika aizturi starp katru pogas nospiešanu masīvā *** / if (poga! = pev_poga) { lcd.clear (); // Tad notīriet to note_time = (millis () - start_time) / 10; ierakstīts_laiks = piezīmju laiks; time_index ++; sākuma_ laiks = milis (); } / ** Ierakstīšanas programmas beigas ** / if (poga == 0) { noTone (7); lcd.print ("0 -> Pauze.."); } ja (poga == 1) { signāls (7, piezīmes); lcd.print ("1 -> NOTE_C4"); } ja (poga == 2) { signāls (7, piezīmes); lcd.print ("2 -> NOTE_D4"); } ja (poga == 3) { tonis (7, piezīmes); lcd.print ("3 -> NOTE_E4"); } ja (poga == 4) { tonis (7, piezīmes); lcd.print ("4 -> NOTE_F4"); } ja (poga == 5) { tonis (7, piezīmes); lcd.print ("5 -> NOTE_G4"); } ja (poga == 6) { tonis (7, piezīmes); lcd.print ("6 -> NOTE_A4"); } ja (poga == 7) { tonis (7, piezīmes); lcd.print ("7 -> NOTE_B4"); } ja (poga == 8) { tonis (7, piezīmes); lcd.print ("8 -> NOTE_C5"); } }
Visbeidzot, pēc ierakstīšanas lietotājam ir jāpārslēdz DPST uz citu virzienu, lai atskaņotu ierakstīto signālu. Kad tas ir izdarīts, programma izlaužas no iepriekšējās, kamēr cilpa, un ievada otro, kamēr cilpu, kur mēs atskaņojam piezīmes pogu secībā, kas tika nospiesta uz laiku, kas tika ierakstīts. Kods, lai izdarītu to pašu, ir parādīts zemāk.
while (digitalRead (6) == 1) // Ja pārslēgšanas slēdzis ir iestatīts atskaņošanas režīmā { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Tagad spēlē.."); par (int i = 0; i <izmērs (ierakstītā_poga) / 2; i ++) { aizkave ((ierakstītais_laiks) * 10); // Pagaidiet, pirms samaksājat nākamo melodiju if (ierakstīts_poga == 0) noTone (7); // lietotājs pieskaras jebkuram taustiņam cits tonis (7, piezīmes - 1)]); // atskaņo skaņu, kas atbilst pogai, kurai pieskāries lietotājs } } }
Spēlējiet, ierakstiet, atkārtojiet un atkārtojiet!:
Izveidojiet aparatūru atbilstoši parādītajai shēmai un augšupielādējiet kodu Arduino dēlī un tā parādītajā laikā. Novietojiet SPDT ierakstīšanas režīmā un sāciet atskaņot izvēlētos toņus, nospiežot katru pogu, tiks iegūts atšķirīgs signāls. Šajā režīmā LCD displejā tiks parādīts uzraksts “ Recording…”, un otrajā rindā jūs redzēsit pašreiz nospiestās piezīmes nosaukumu, kā parādīts zemāk
Kad esat atskaņojis signālu, pārslēdziet SPDT slēdzi uz otru pusi, un LCD displejā jāparādās “ Now Playing..” un pēc tam sāciet atskaņot tikko atskaņoto signālu. Tas pats signāls tiks atskaņots atkal un atkal, kamēr pārslēgšanas slēdzis tiek turēts pozīcijā, kā parādīts zemāk esošajā attēlā.
Pilnīga projekta darbība ir atrodama zemāk redzamajā video. Ceru, ka sapratāt projektu un patika to veidot. Ja jums ir kādas problēmas ar šī ziņojuma izveidi, komentāru sadaļā vai izmantojiet forumus tehniskai palīdzībai savam projektam. Neaizmirstiet arī pārbaudīt zemāk sniegto demonstrācijas video.