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í.