Dneska si ukážeme jak udělat hudbu pomocí Arduina v našem případě pomocí Arduina Una R3.
Jako mnoho jiných podobných projektů i tento generuje tóny, které odpovídají klávesám na klavíru. Oproti ostatním projektům, které používají tabulku pro vyhledání frekvencí, atd., nejsou nutná. Užitečnější může být výpočet. Výpočet přijímá číslo od 1 do 88. Číslo od 1 do 88 znamená klávesu klavíru s 88 klávesami. Knihovna Arduino obsahuje funkci nazvanou tone(). Můžete použít tone() k generování tónů ve tvaru obdélníkových vln. Je však třeba poznamenat, že tato funkce nemůže generovat žádné tóny s frekvencí menší než 31 Hz. Klavír s 88 klávesy má několik tónů s frekvencemi menšími než 31 Hz. Proto pro generování spektra tónů z klavíru s 88 klávesami nemůžeme použít tone(). Ukážu vám, jak lze pomocí obyčejného (delaye) provádět tónování obdélníkovou vlnou.
CO POTŘEBUJU?
- Arduino (v tomto případě Uno R3 může být i klon)
- Rezistor 220R
- Reproduktor 8 ohmů
- Dráty (3)
- Nepájivé pole (Nemusí být)
Kde můžu získat reproduktor?:
Například ze starých sluchátek, bedniček atp.
Viz foto:
ZAPOJENÍ:
Reproduktor zapojíme na GND pin u Arduina a digitální pin 12 přes 220 ohmový rezistor.
Viz schéma:
KÓD A OŽIVENÍ:
V Arduino IDE zadáme kód a uploadujeme:
#include <Stepper.h> #include <math.h> // Pro funkci pow() // Pin, ke kterému je připojen 8 Ohm reproduktor (použij odpor 150 - 220 Ohm) #define speakerPin 12 // Tempo (počet úderů za minutu) #define bpm 96 // Pauza mezi notami, vyjádřena jako procento času mezi dvěma údery #define noteGapPercentage 10 // 2D pole obsahující noty, které se mají přehrát // Každá nota má frekvenci (číslo klávesy) a délku (typ noty) uint8_t notes[][2] = { {35,4}, {35,4}, {42,4}, {42,4}, {44,4}, {44,4}, {42,2}, {40,4}, {40,4}, {39,4}, {39,4}, {37,4}, {37,4}, {35,2}, {42,4}, {42,4}, {40,4}, {40,4}, {39,4}, {39,4}, {37,2}, {42,4}, {42,4}, {40,4}, {40,4}, {39,4}, {39,4}, {37,2}, {35,4}, {35,4}, {42,4}, {42,4}, {44,4}, {44,4}, {42,2}, {40,4}, {40,4}, {39,4}, {39,4}, {37,4}, {37,4}, {35,2} }; // Čas mezi dvěma údery v mikrosekundách (délka čtvrťové noty) #define beatDuration ((60.0 / bpm) * 1000000L) // Pauza mezi notami v mikrosekundách #define noteGap (beatDuration * (noteGapPercentage / 100.0)) void setup() { // Nastavení speakerPin jako výstupu pinMode(speakerPin, OUTPUT); // Přehrání každé noty v poli notes for(int i = 0; i < (sizeof(notes) / sizeof(notes[0])); i++) { playNote(notes[i][0], notes[i][1]); } } /* * Přehrává jednotlivou notu. * * keyNumber - Číslo klávesy (1 - 88) * noteType - Typ noty (1, 2, 4, 8, atd.) */ void playNote(uint8_t keyNumber, uint8_t noteType) { long halfPeriod = getPeriodForKey(keyNumber) / 2; long noteDuration = beatDuration * (4.0 / noteType); long elapsed = 0; // Dokud je tu nota k přehrání while(halfPeriod > 0 & elapsed < (noteDuration - noteGap)) { // Nastav speakerPin na HIGH na polovinu periody digitalWrite(speakerPin, HIGH); wait(halfPeriod); // Nastav speakerPin na LOW na polovinu periody digitalWrite(speakerPin, LOW); wait(halfPeriod); // Aktualizace uplynulého času elapsed += halfPeriod * 2; } // Přidání pauzy mezi notami wait(noteDuration - elapsed); } /* * Vrací periodu pro klávesu nebo nulu pro čísla kláves mimo rozsah 1 - 88. * * keyNumber - Číslo klávesy (1 - 88) */ long getPeriodForKey(uint8_t keyNumber) { if (keyNumber >= 1 & keyNumber <= 88) { return 1000000L / (pow(2.0, (keyNumber - 49.0) / 12.0) * 440.0); } return 0; } /* * Čeká na zadaný počet mikrosekund. * * us - Čekání v mikrosekundách */ void wait(long us) { delay(us / 1000); // Zpoždění pro celé milisekundy delayMicroseconds(us % 1000); // Zpoždění pro zbývající mikrosekundy } void loop() { // Není použito. Hudba se přehraje jednou. }
Reproduktor by měl hrát. Přeji příjemné oživování.