- Potřebné materiály:
- Kruhový diagram:
- Schémata a vysvětlení:
- Pochopení
- Hra na klavírní tóny na Arduinu:
- Programování Arduina:
- Hrajte, nahrávejte, přehrávejte a opakujte! :
Arduino bylo požehnáním pro lidi, kteří nepocházejí z elektronického prostředí, aby mohli snadno vytvářet věci. Byl to skvělý prototypový nástroj nebo vyzkoušet něco skvělého, v tomto projektu postavíme malé, ale zábavné Piano pomocí Arduina. Tento klavír je docela prostý s pouhými 8 tlačítky a bzučákem. Využívá funkci tone () Arduina k vytváření různých typů klavírních not na reproduktoru. Abychom to trochu okořenili, přidali jsme do projektu funkci nahrávání, což nám umožňuje přehrávat melodii, nahrávat ji a v případě potřeby ji opakovaně přehrávat. Zní to zajímavě správně !! Pojďme tedy stavět…
Potřebné materiály:
- Arduino Uno
- 16 * 2 LCD displej
- Bzučák
- Zastřihovač 10k
- Přepínač SPDT
- Tlačítko (8 Nos)
- Rezistory (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Nepájivá deska
- Připojovací vodiče
Kruhový diagram:
Celý projekt Arduino Piano lze postavit na prkénku s několika spojovacími dráty. Schéma zapojení provedené pomocí fritování, které zobrazuje pohled na projektový panel, je uvedeno níže
Postupujte podle schématu zapojení a odpovídajícím způsobem připojte vodiče, tlačítka a bzučák, jak jsou použity s modulem PCB, ale ve skutečném hardwaru jsme použili pouze spínač a bzučák, nemělo by vás to moc zmást, protože mají stejný typ kolíku. Chcete-li provést připojení, můžete se také podívat na obrázek hardwaru níže.
Hodnota rezistorů zleva je v následujícím pořadí, 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k a 10k. Pokud nemáte stejný přepínač DPST, můžete použít normální přepínací přepínač, který je uveden ve schématu výše. Nyní se podívejme na schémata projektu, abychom pochopili, proč jsme vytvořili následující spojení.
Schémata a vysvětlení:
Schémata schématu zapojení, která jsou uvedena výše, jsou uvedena níže, byla také vytvořena pomocí Fritzinga.
Jedním z hlavních připojení, které musíme pochopit, je to, jak jsme připojili 8 tlačítek k Arduinu přes pin Analog A0. V zásadě potřebujeme 8 vstupních pinů, které lze připojit k 8 vstupním tlačítkům, ale pro takové projekty nemůžeme použít 8 pinů mikrokontroléru jen pro tlačítka, protože je možná budeme potřebovat pro pozdější použití. V našem případě máme k dispozici rozhraní LCD.
K dokončení obvodu tedy použijeme analogový kolík Arduina a vytvoříme dělič potenciálu s různými hodnotami rezistorů. Tímto způsobem se při stisknutí každého tlačítka přivede na analogový kolík jiné analogové napětí. Níže je uveden ukázkový obvod pouze se dvěma odpory a dvěma tlačítky.
V tomto případě pin ADC obdrží + 5V, když nejsou stisknuta tlačítka, pokud je stisknuto první tlačítko, pak se dělič potenciálu dokončí přes odpor 560R a pokud je stisknuto druhé tlačítko, dělič potenciálu bude soutěžit pomocí 1,5 k odpor. Tímto způsobem se napětí přijaté pinem ADC bude lišit podle vzorců děliče potenciálu. Pokud se chcete dozvědět více o tom, jak funguje dělič potenciálu a jak vypočítat hodnotu napětí přijatého kolíkem ADC, můžete použít tuto stránku kalkulačky potenciálního děliče.
Kromě toho jsou všechna připojení přímá, LCD je připojen k pinům 8, 9, 10, 11 a 12. Bzučák je připojen k pinu 7 a přepínač SPDT je připojen k pinu 6 Arduina. Celý projekt je napájen přes USB port notebooku. Arduino můžete také připojit k 9V nebo 12V zdroji přes DC jack a projekt bude stále fungovat stejně.
Pochopení
Arduino má užitečnou funkci tone (), kterou lze použít ke generování signálů různých frekvencí, které lze použít k produkci různých zvuků pomocí bzučáku. Pojďme tedy pochopit, jak tato funkce funguje a jak ji lze použít s Arduinem.
Před tím bychom měli vědět, jak funguje bzučák Piezo. Možná jsme se v naší škole dozvěděli o krystalech Piezo, není to nic jiného než krystal, který převádí mechanické vibrace na elektřinu nebo naopak. Zde aplikujeme proměnný proud (frekvenci), pro který krystal vibruje, čímž vytváří zvuk. Proto, aby piezoelektrický bzučák vydával nějaký hluk, musíme dát elektrickému krystalu piezo vibrovat, výška a tón šumu závisí na tom, jak rychle vibruje krystal. Tón a výšku tónu lze tedy regulovat změnou frekvence proudu.
Dobře, tak jak získáme proměnnou frekvenci od Arduina? To je místo, kde přichází funkce tone (). Tón () může generovat konkrétní frekvenci na konkrétním pinu. V případě potřeby lze také uvést dobu trvání. Syntaxe pro tone () je
Syntaxe tón (pin, frekvence) tón (pin, frekvence, doba trvání) Parametry pin: pin, na kterém se má generovat frekvence tónu: frekvence tónu v hertzích - unsigned int duration: doba trvání tónu v milisekundách (volitelně1) - dlouho nepodepsáno
Hodnoty kolíku mohou být kterékoli z vašich digitálních kolíků. Zde jsem použil pin číslo 8. Frekvence, kterou lze generovat, závisí na velikosti časovače na vaší desce Arduino. Pro UNO a většinu ostatních běžných desek je minimální frekvence, kterou lze vytvořit, 31 Hz a maximální frekvence, kterou lze vyrobit, 65535 Hz. My lidé však můžeme slyšet pouze frekvence mezi 2 000 Hz a 5 000 Hz.
Hra na klavírní tóny na Arduinu:
Dobře, ještě než začnu s tímto tématem, dovolte mi objasnit, že jsem nováček s hudebními notami nebo klavírem, tak mi prosím odpusťte, pokud je něco zmíněného v této kapitole nesmyslné.
Nyní víme, že k vytvoření některých zvuků můžeme použít funkci tónů v Arduinu, ale jak můžeme pomocí stejných tónů přehrávat tóny konkrétní noty. Naštěstí pro nás existuje knihovna s názvem „pitches.h“, kterou napsal Brett Hagman. Tato knihovna obsahuje všechny informace o tom, která frekvence je ekvivalentní které notě na klavíru. Byl jsem překvapen, jak dobře tato knihovna může ve skutečnosti fungovat a hrát téměř na každou notu na klavíru, stejně jsem ji používal k hraní na klavírní noty Pirátů z Karibiku, Crazy Frog, Maria a dokonce i titanských a zněly úžasně. Jejda! Tady začínáme být trochu mimo téma, takže pokud vás to zajímá, podívejte se na hraní melodií pomocí projektu Arduino. V tomto projektu také najdete další vysvětlení týkající se knihovny pitches.h .
Náš projekt má pouze 8 tlačítek, takže každé tlačítko může hrát pouze jednu konkrétní notu, a tedy můžeme hrát pouze 8 not. Vybral jsem nejpoužívanější noty na klavíru, ale můžete vybrat libovolnou osmičku nebo dokonce rozšířit projekt o další tlačítka a přidat další noty.
Noty vybrané v tomto projektu jsou noty C4, D4, E4, F4, G4, A4, B4 a C5, které lze přehrávat pomocí tlačítek 1 až 8.
Programování Arduina:
Dost teorie, pojďme se dostat k zábavné části programování Arduina. Kompletní Arduino Program je uveden na konci této stránky si můžete skočit dolů, když se touží nebo číst dále pochopit, jak kód funguje.
V našem programu Arduino musíme načíst analogové napětí z pinu A0, poté předpovědět, které tlačítko bylo stisknuto, a přehrát příslušný tón pro toto tlačítko. Při tom bychom měli také zaznamenat, které tlačítko uživatel stiskl a jak dlouho stiskl, abychom mohli znovu vytvořit tón, který uživatel později přehrál.
Před přechodem na logickou část musíme deklarovat, které 8 noty budeme hrát. Příslušná frekvence pro noty je poté převzata z knihovny pitches.h a poté je vytvořeno pole, jak je znázorněno níže. Zde je frekvence pro přehrávání noty C4 262 atd.
int poznámky = {262, 294, 330, 349, 392, 440, 494, 523}; // Nastavení frekvence pro C4, D4, E4, F4, G4, A4, B4,
Dále musíme zmínit, ke kterým pinům je připojen LCD displej. Pokud sledujete přesně stejná schémata uvedená výše, nemusíte zde nic měnit.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Kolíky, ke kterým je připojen LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Dále v naší funkci nastavení pouze inicializujeme LCD modul a sériový monitor pro ladění. Zobrazujeme také úvodní zprávu, abychom se ujistili, že věci fungují podle plánu. Dále uvnitř funkce hlavní smyčky máme dvě while smyčky.
Smyčka while bude provedena, pokud je přepínač SPDT umístěn v záznamu více. V režimu nahrávání může uživatel zaplatit požadované tóny a současně se uloží i přehrávaný tón. Takže smyčka while vypadá takto níže
while (digitalRead (6) == 0) // Pokud je přepínač v režimu záznamu {lcd.setCursor (0, 0); lcd.print ("Záznam.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Jak jste si možná všimli , uvnitř smyčky while máme dvě funkce. První funkce Detect_button () slouží k nalezení, které tlačítko uživatel stiskl, a druhá funkce Play_tone () slouží k přehrání příslušného tónu. Kromě této funkce zaznamenává funkce Detect_button () také to, které tlačítko je stisknuto, a funkce Play_tone () zaznamenává, jak dlouho bylo tlačítko stisknuto.
Uvnitř Detect_button () funkce čteme analogové napětí z pinu A0 a porovnat jej s několika předdefinovaných hodnot, které mají zjistit, které tlačítko bylo stisknuto. Hodnotu lze určit buď pomocí výše uvedeného kalkulátoru děliče napětí, nebo pomocí sériového monitoru ke kontrole, jaká analogová hodnota je načtena pro každé tlačítko.
void Detect_button () { analogVal = analogRead (A0); // načte analogový voltag na pinu A0 pev_button = tlačítko; // zapamatuje si předchozí tlačítko stisknuté uživatelem if (analogVal <550) button = 8; if (analogVal <500) button = 7; if (analogVal <450) button = 6; if (analogVal <400) tlačítko = 5; if (analogVal <300) tlačítko = 4; if (analogVal <250) tlačítko = 3; if (analogVal <150) tlačítko = 2; if (analogVal <100) tlačítko = 1; if (analogVal> 1000) button = 0; / **** Zaznamenejte stisknutá tlačítka do pole *** / if (button! = pev_button && pev_button! = 0) { zaznamenané_button = pev_button; button_index ++; zaznamenané tlačítko = 0; button_index ++; } / ** Konec programu nahrávání ** / }
Jak již bylo řečeno, uvnitř této funkce také zaznamenáváme sekvenci, ve které jsou tlačítka stisknuta. Zaznamenané hodnoty jsou uloženy v poli s názvem registered_button. Nejprve zkontrolujeme, zda je stisknuto nové tlačítko, pokud je stisknuto, zkontrolujeme také, zda to není tlačítko 0. Kde tlačítko 0 není nic, ale není stisknuto žádné tlačítko. Uvnitř smyčky if uložíme hodnotu na umístění indexu dané proměnnou button_index a poté také zvýšíme tuto hodnotu indexu, abychom nepřekračovali zápis na stejném místě.
/ **** Zaznamenejte stisknutá tlačítka do pole *** / if (tlačítko! = Pev_button && pev_button! = 0) { zaznamenané_button = pev_button; button_index ++; zaznamenané tlačítko = 0; button_index ++; } / ** Program ukončení záznamu ** /
Uvnitř Play_tone () funkci budeme hrát příslušný tón stisknutého tlačítka pomocí více pokud podmínek. Také použijeme pole s názvem zaznamenaný_čas, do kterého uložíme dobu, po kterou bylo tlačítko stisknuto. Operace je podobná záznamu sekvence tlačítek, kdy pomocí funkce millis () určíme, jak dlouho bylo každé tlačítko stisknuto, také pro zmenšení velikosti proměnné vydělíme hodnotu 10. U tlačítka 0, což znamená, že uživatel není stisknutí čehokoli, co hrajeme, nebude mít po stejnou dobu žádný tón. Celý kód uvnitř funkce je uveden níže.
void Play_tone () { / **** Zaznamenejte časovou prodlevu mezi stiskem každého tlačítka v poli *** / if (tlačítko! = pev_button) { lcd.clear (); // Poté jej vyčistěte note_time = (millis () - start_time) / 10; zaznamenaný_čas = čas poznámky; time_index ++; start_time = millis (); } / ** Konec programu nahrávání ** / if (tlačítko == 0) { noTone (7); lcd.print ("0 -> Pozastavit.."); } if (tlačítko == 1) { tón (7, poznámky); lcd.print ("1 -> NOTE_C4"); } if (tlačítko == 2) { tón (7, poznámky); lcd.print ("2 -> NOTE_D4"); } if (tlačítko == 3) { tón (7, poznámky); lcd.print ("3 -> NOTE_E4"); } if (tlačítko == 4) { tón (7, poznámky); lcd.print ("4 -> NOTE_F4"); } if (tlačítko == 5) { tón (7, poznámky); lcd.print ("5 -> NOTE_G4"); } if (tlačítko == 6) { tón (7, poznámky); lcd.print ("6 -> NOTE_A4"); } if (tlačítko == 7) { tón (7, poznámky); lcd.print ("7 -> NOTE_B4"); } if (tlačítko == 8) { tón (7, poznámky); lcd.print ("8 -> NOTE_C5"); } }
Nakonec musí uživatel po nahrávání přepnout DPST do druhého směru, aby přehrál zaznamenaný tón. Když je to hotové, program se vymaní z předchozí smyčky while a vstoupí do druhé smyčky while, kde přehráváme noty v pořadí stisknutých tlačítek po dobu, která byla dříve zaznamenána. Níže uvedený kód je stejný.
while (digitalRead (6) == 1) // Pokud je přepínač v režimu přehrávání { lcd.clear (); lcd.setCursor (0, 0); lcd.print („Právě se hraje…“); pro (int i = 0; i <sizeof (zaznamenané_tlačítko) / 2; i ++) { zpoždění ((zaznamenané_čas) * 10); // Počkejte před zaplacením další melodie if (zaznamenal_button == 0) noTone (7); // uživatel se dotkne libovolného tlačítka jiného tónu (7, poznámky - 1)]); // přehrát zvuk odpovídající tlačítku stisknutému uživatelem } } }
Hrajte, nahrávejte, přehrávejte a opakujte!:
Vyrobte hardware podle zobrazeného schématu zapojení a nahrajte kód na desku Arduino a jeho zobrazený čas. Umístěte SPDT do režimu nahrávání a začněte přehrávat tóny podle vašeho výběru, stisknutím každého tlačítka vytvoříte jiný tón. Během tohoto režimu se na LCD displeji zobrazí „ Nahrávání…“ a na druhém řádku uvidíte název aktuálně stisknuté noty, jak je uvedeno níže
Jakmile přehrajete svůj tón, přepněte přepínač SPDT na druhou stranu a na LCD by se mělo zobrazit „ Now Playing..“ a poté začněte přehrávat tón, který jste právě hráli. Stejný tón bude přehráván znovu a znovu, pokud bude přepínač v poloze, jak je znázorněno na následujícím obrázku.
Kompletní fungování projektu najdete ve videu níže. Doufám, že jste pochopili projekt a užili jste si jeho stavbu. Pokud máte nějaké problémy s vytvořením tohoto příspěvku, uveďte je v sekci komentářů nebo použijte fóra pro technickou pomoc s vaším projektem. Nezapomeňte také zkontrolovat ukázkové video uvedené níže.