- Potrebné materiály:
- Schéma zapojenia:
- Schémy a vysvetlenie:
- Pochopenie
- Hra na klavírne tóny na Arduine:
- Programovanie Arduina:
- Prehrávajte, nahrávajte, opakujte a opakujte! :
Arduino bolo požehnaním pre ľudí, ktorí nepochádzajú z elektronického prostredia, aby mohli ľahko vytvárať veci. Bol to skvelý prototypovací nástroj alebo vyskúšať niečo super, v tomto projekte pomocou Arduina postavíme malé, ale zábavné Piano. Tento klavír je celkom jednoduchý, má iba 8 tlačidiel a bzučiak. Využíva funkciu tone () Arduina na vytváranie rôznych typov klavírnych nôt na reproduktore. Aby sme to trochu okorenili, pridali sme do projektu funkciu nahrávania, čo nám umožňuje prehrať melódiu a potom ju podľa potreby opakovane prehrať. Znie to zaujímavo, dobre !! Takže poďme stavať….
Potrebné materiály:
- Arduino Uno
- 16 * 2 LCD displej
- Bzučiak
- Zastrihávač 10k
- Prepínač SPDT
- Tlačidlo (8 Nos)
- Rezistory (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Nepál
- Pripojovacie vodiče
Schéma zapojenia:
Kompletný projekt Arduino Piano Project je možné postaviť na vrchnej doske s pripojovacími vodičmi. Schéma zapojenia, ktorá bola vytvorená pomocou fritovania a ktoré zobrazuje pohľad na projekt, je uvedená nižšie
Postupujte podľa schémy zapojenia a podľa toho pripojte vodiče, tlačidlá a bzučiak, ktoré sa používajú s modulom plošných spojov, ale v skutočnom hardvéri sme použili iba spínač a bzučiak, nemalo by vás to veľa mýliť, pretože majú rovnaký typ kolíka. Pri vytváraní pripojení sa môžete tiež pozrieť na obrázok hardvéru, ktorý je uvedený nižšie.
Hodnota rezistorov zľava je v nasledujúcom poradí, 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k a 10k. Ak nemáte rovnaký prepínač DPST, môžete použiť normálny prepínací prepínač, ktorý je uvedený na schéme zapojenia vyššie. Teraz sa pozrime na schémy projektu, aby sme pochopili, prečo sme vytvorili nasledujúce spojenia.
Schémy a vysvetlenie:
Schémy zapojenia, ktoré sú zobrazené vyššie, sú uvedené nižšie. Boli tiež vytvorené pomocou Fritzinga.
Jedným z hlavných prepojení, ktoré musíme pochopiť, je to, ako sme prostredníctvom pinu Analog A0 pripojili 8 tlačidiel k Arduinu. V zásade potrebujeme 8 vstupných pinov, ktoré je možné pripojiť k 8 vstupným tlačidlám, ale pre projekty, ako je tento, nemôžeme použiť 8 pinov mikrokontroléra iba pre tlačidlá, pretože by sme ich mohli potrebovať pre ďalšie použitie. V našom prípade máme k dispozícii rozhranie LCD.
Použijeme teda analógový pin Arduina a na dokončenie obvodu vytvoríme delič potenciálov s rôznymi hodnotami rezistorov. Týmto spôsobom, keď je stlačené každé tlačidlo, bude na analógový pin napájané iné analógové napätie. Nižšie je uvedený vzorový obvod s iba dvoma rezistormi a dvoma tlačidlami.
V takom prípade pin ADC dostane + 5 V, keď nie sú stlačené tlačidlá, ak je stlačené prvé tlačidlo, potom sa delič potenciálu dokončí cez odpor 560R a ak je stlačené druhé tlačidlo, delič potenciálu bude súťažiť pomocou 1,5 k odpor. Týmto spôsobom sa napätie prijaté kolíkom ADC bude líšiť na základe vzorcov deliča potenciálu. Ak sa chcete dozvedieť viac o tom, ako funguje delič potenciálov a ako vypočítať hodnotu napätia prijatého pinom ADC, môžete použiť túto stránku kalkulačky potenciálneho deliča.
Okrem toho sú všetky pripojenia priame, LCD je pripojený k pinom 8, 9, 10, 11 a 12. Bzučiak je pripojený k pinu 7 a prepínač SPDT je pripojený k pinu 6 Arduina. Celý projekt je napájaný z USB portu notebooku. Arduino môžete tiež pripojiť k zdroju 9V alebo 12V cez DC jack a projekt bude stále fungovať rovnako.
Pochopenie
Arduino má užitočnú funkciu tone (), ktorú je možné použiť na generovanie signálov s rôznou frekvenciou, ktoré sa dajú použiť na výrobu rôznych zvukov pomocou bzučiaka. Poďme teda pochopiť, ako funkcia funguje a ako sa dá používať s Arduinom.
Predtým by sme mali vedieť, ako funguje bzučiak Piezo. Možno sme sa o kryštáloch Piezo dozvedeli v našej škole, nie je to nič iné ako kryštál, ktorý premieňa mechanické vibrácie na elektrinu alebo naopak. Tu aplikujeme premenlivý prúd (frekvenciu), pre ktorý kryštál vibruje, čím vytvára zvuk. Preto, aby bol piezoelektrický bzučiak vydaný nejaký hluk, musíme urobiť, aby elektrický kryštál piezo vibroval, výška a tón šumu závisí od toho, ako rýchlo kryštál vibruje. Tón a výšku tónu je teda možné ovládať zmenou frekvencie prúdu.
Dobre, tak ako získame premennú frekvenciu od Arduina? Tu prichádza na rad funkcia tone (). Tón () môže generovať konkrétnu frekvenciu na konkrétnom kolíku. V prípade potreby je možné uviesť aj časovú dĺžku. Syntax pre tone () je
Syntax tón (pin, frekvencia) tón (pin, frekvencia, trvanie) Parametre pin: pin, na ktorom sa má generovať frekvencia tónu: frekvencia tónu v hertzoch - nepodpísané int trvanie: doba tónu v milisekundách (voliteľné1) - dlho nepodpísané
Hodnoty špendlíka môžu byť ktorékoľvek z vašich digitálnych špendlíkov. Použil som tu pin číslo 8. Frekvencia, ktorú je možné generovať, závisí od veľkosti časovača na vašej doske Arduino. Pre UNO a väčšinu ostatných bežných dosiek je minimálna frekvencia, ktorá sa dá vytvoriť, 31 Hz a maximálna frekvencia, ktorá sa dá vytvoriť, 65535 Hz. My ľudia však môžeme počuť iba frekvencie medzi 2 000 Hz a 5 000 Hz.
Hra na klavírne tóny na Arduine:
Dobre, ešte predtým, ako sa do tejto témy pustím, dovoľte mi objasniť, že som nováčik v oblasti hudobných nôt alebo klavíra, takže mi, prosím, odpustite, ak je niečo spomenuté v tejto časti nezmysly.
Teraz vieme, že na vytvorenie niektorých zvukov môžeme použiť funkciu tónov v Arduine, ale ako môžeme pomocou rovnakých tónov hrať tóny konkrétnej noty. Našťastie pre nás existuje knižnica s názvom „pitches.h“, ktorú napísal Brett Hagman. Táto knižnica obsahuje všetky informácie o tom, ktorá frekvencia je ekvivalentná ktorej note na klavíri. Prekvapilo ma, ako dobre môže táto knižnica skutočne fungovať a hrať takmer na každej note na klavíri, rovnako som ich používal aj na klavírne noty Pirátov z Karibiku, Crazy Frog, Mario a dokonca aj na titanic a zneli úžasne. Ojoj! Začíname tu byť trochu mimo témy, takže ak vás to zaujíma, pozrite si hru melódií pomocou projektu Arduino. V tomto projekte tiež nájdete ďalšie vysvetlenie knižnice pitches.h .
Náš projekt má iba 8 tlačidiel, takže každé tlačidlo môže hrať iba jednu konkrétnu notu, a teda dokážeme hrať iba 8 not. Vybral som najpoužívanejšie noty na klavíri, ale môžete zvoliť ľubovoľnú 8 alebo dokonca rozšíriť projekt o ďalšie tlačidlá a pridať ďalšie noty.
Noty vybrané v tomto projekte sú noty C4, D4, E4, F4, G4, A4, B4 a C5, ktoré je možné prehrať pomocou tlačidiel 1 až 8.
Programovanie Arduina:
Dostatok teórie, poďme k zábavnej časti programovania Arduina. Kompletné Arduino Program je uvedený na konci tejto stránky si môžete skočiť dole, keď sa túži alebo čítať ďalej pochopiť, ako kód funguje.
V našom programe Arduino musíme načítať analógové napätie z kolíka A0, potom predpovedať, ktoré tlačidlo bolo stlačené, a prehrať príslušný tón pre dané tlačidlo. Pritom by sme si mali tiež zaznamenať, ktoré tlačidlo užívateľ stlačil a ako dlho stlačil, aby sme mohli znova vytvoriť tón, ktorý používateľ zaznel.
Predtým, ako prejdeme k logickej časti, musíme deklarovať, ktorých 8 nôt budeme hrať. Príslušná frekvencia pre poznámky sa potom prevezme z knižnice pitches.h a potom sa vytvorí pole, ako je uvedené nižšie. Tu je frekvencia hrania noty C4 262 atď.
int poznámky = {262, 294, 330, 349, 392, 440, 494, 523}; // Nastaviť frekvenciu pre C4, D4, E4, F4, G4, A4, B4,
Ďalej musíme spomenúť, ku ktorým pinom je pripojený LCD displej. Pokiaľ postupujete podľa úplne rovnakých schém uvedených vyššie, nemusíte tu nič meniť.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Kolíky, ku ktorým je pripojený LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Ďalej vo vnútri našej funkcie nastavenia iba inicializujeme LCD modul a sériový monitor pre ladenie. Zobrazujeme tiež úvodnú správu, aby sme sa ubezpečili, že veci fungujú podľa plánu. Ďalej máme vo vnútri funkcie hlavnej slučky dve cykly while.
Smyčka while bude vykonaná, pokiaľ je prepínač SPDT umiestnený v zázname viac. V režime nahrávania môže používateľ zaplatiť požadované tóny a súčasne sa uloží aj tón, ktorý sa prehráva. Takže slučka while vyzerá takto nižšie
while (digitalRead (6) == 0) // Ak je prepínač nastavený na režim nahrávania {lcd.setCursor (0, 0); lcd.print ("Nahrávanie.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Ako ste si mohli všimnúť, vo vnútri while máme dve funkcie. Prvá funkcia Detect_button () sa používa na vyhľadanie toho, ktoré tlačidlo používateľ stlačil, a druhá funkcia Play_tone () sa používa na prehranie príslušného tónu. Okrem tejto funkcie funkcia Detect_button () zaznamenáva aj to, ktoré tlačidlo je stlačené a funkcia Play_tone () zaznamenáva, ako dlho bolo tlačidlo stlačené.
Vnútri Detect_button () funkcia čítame analógové napätie z pinu A0 a porovnať ho s niekoľkými preddefinovaných hodnôt, ktoré majú zistiť, ktoré tlačidlo bolo stlačené. Hodnotu je možné určiť pomocou vyššie uvedeného kalkulátora deliča napätia alebo pomocou sériového monitora na kontrolu analogickej hodnoty načítanej pre každé tlačidlo.
void Detect_button () { analogVal = analogRead (A0); // prečítajte analógový voltag na kolíku A0 pev_button = tlačidlo; // zapamätať si predchádzajúce tlačidlo stlačené používateľom if (analogVal <550) button = 8; if (analogVal <500) button = 7; if (analogVal <450) button = 6; if (analogVal <400) tlačidlo = 5; if (analogVal <300) tlačidlo = 4; if (analogVal <250) tlačidlo = 3; if (analogVal <150) tlačidlo = 2; if (analogVal <100) tlačidlo = 1; if (analogVal> 1000) button = 0; / **** Zaznamenajte stlačené tlačidlá do poľa *** / if (button! = pev_button && pev_button! = 0) { zaznamenané_button = pev_button; button_index ++; zaznamenané tlačidlo = 0; button_index ++; } / ** Program ukončenia nahrávania ** / }
Ako už bolo povedané, vo vnútri tejto funkcie tiež zaznamenávame postupnosť, v ktorej sú tlačidlá stlačené. Zaznamenané hodnoty sú uložené v poli s názvom zaznamenané tlačidlo. Najskôr skontrolujeme, či je stlačené nové tlačidlo, ak je stlačené, skontrolujeme tiež, či to nie je tlačidlo 0. Kde tlačidlo 0 nie je nič iné, len nie je stlačené žiadne tlačidlo. Vo vnútri cyklu if uložíme hodnotu na umiestnenie indexu dané premennou button_index a potom túto hodnotu indexu tiež zvýšime, aby sme neprepisovali na rovnakom mieste.
/ **** Zaznamenajte stlačené tlačidlá do poľa *** / if (tlačidlo! = Pev_button && pev_button! = 0) { zaznamenané_button = pev_button; button_index ++; zaznamenané tlačidlo = 0; button_index ++; } / ** Program ukončenia nahrávania ** /
Vnútri Play_tone () funkciu budeme hrať príslušný tón stlačeného tlačidla pomocou viacerých pokiaľ podmienok. Použijeme tiež pole s názvom zaznamenané_čas, do ktorého uložíme dobu, po ktorú bolo tlačidlo stlačené. Operácia je podobná ako pri zaznamenávaní postupnosti tlačidiel, keď pomocou funkcie millis () určujeme, ako dlho bolo každé tlačidlo stlačené, taktiež pre zmenšenie veľkosti premennej vydelíme hodnotu 10. Pre tlačidlo 0 znamená, že používateľ nie je stlačenie čohokoľvek, čo hráme, nebude mať za rovnakú dobu žiadny tón. Celý kód vo vnútri funkcie je uvedený nižšie.
void Play_tone () { / **** Zaznamenajte časové oneskorenie medzi jednotlivými stlačeniami tlačidla v poli *** / if (button! = pev_button) { lcd.clear (); // Potom ho vyčisti note_time = (millis () - start_time) / 10; zaznamenaný_čas = poznámkový_čas; time_index ++; start_time = millis (); } / ** Program ukončenia nahrávania ** / if (tlačidlo == 0) { noTone (7); lcd.print ("0 -> Pozastaviť.."); } if (button == 1) { tone (7, notes); lcd.print ("1 -> NOTE_C4"); } if (button == 2) { tone (7, notes); lcd.print ("2 -> NOTE_D4"); } if (tlačidlo == 3) { tón (7, poznámky); lcd.print ("3 -> NOTE_E4"); } if (button == 4) { tone (7, notes); lcd.print ("4 -> NOTE_F4"); } if (button == 5) { tone (7, notes); lcd.print ("5 -> NOTE_G4"); } if (button == 6) { tone (7, notes); lcd.print ("6 -> NOTE_A4"); } if (button == 7) { tone (7, notes); lcd.print ("7 -> NOTE_B4"); } if (button == 8) { tone (7, notes); lcd.print ("8 -> NOTE_C5"); } }
Nakoniec po nahraní musí užívateľ prepnúť DPST do druhého smeru, aby prehral zaznamenaný tón. Keď toto je robené programové prestávky z predchádzajúcej zatiaľ čo slučky a vstupuje do druhej, zatiaľ čo slučky, kde sme hrať poznámky v postupnosti stlačení tlačidiel po dobu, ktorá bola predtým nahrané. Kód, ktorý urobí to isté, je uvedený nižšie.
while (digitalRead (6) == 1) // Ak je prepínač nastavený v režime prehrávania { lcd.clear (); lcd.setCursor (0, 0); lcd.print („Teraz sa hrá…“); pre (int i = 0; i <sizeof (zaznamenal_button) / 2; i ++) { oneskorenie ((zaznamenaný_čas) * 10); // Pred zaplatením ďalšej melódie počkaj, ak (zaznamenané_button == 0) noTone (7); // užívateľ sa nemusí dotknúť ľubovoľného iného tlačidla tón (7, poznámky - 1)]); // prehrá zvuk zodpovedajúci tlačidlu dotknutému používateľom } } }
Prehrávajte, nahrávajte, opakujte a opakujte!:
Vyrobte hardvér podľa zobrazenej schémy zapojenia a nahrajte kód na dosku Arduino a jeho zobrazený čas. Umiestnite SPDT do režimu nahrávania a začnite hrať tóny podľa vášho výberu, stlačením každého tlačidla vyprodukujete iný tón. V tomto režime sa na displeji LCD zobrazí „ Nahrávanie…“ a na druhom riadku uvidíte názov noty, ktorá sa práve stláča, ako je uvedené nižšie.
Po prehraní tónu prepnite prepínač SPDT na druhú stranu a na displeji LCD by sa malo zobraziť „ Now Playing..“ a potom začnite hrať tón, ktorý ste práve zahrali. Rovnaký tón bude znieť znova a znova, pokiaľ je prepínač v polohe, ako je znázornené na obrázku nižšie.
Kompletné fungovanie projektu nájdete vo videu uvedenom nižšie. Dúfam, že ste pochopili projekt a páčilo sa vám jeho zostavenie. Ak máte nejaké problémy s vytváraním tohto príspevku, uverejnite ich v sekcii komentárov alebo použite fóra na získanie technickej pomoci so svojím projektom. Nezabudnite si tiež pozrieť ukážkové video uvedené nižšie.