Hudba s Arduinem

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

Další podobné články

Test ESC a BLDC motoru

Cílem tohoto Arduino projektu je testování a kalibrace obousměrného regulátoru otáček (ESC) pomocí PWM signálu. Program simuluje sekvenci pohybů: dopředu, neutrální pozici a reverzní chod, což umožňuje ověřit správnou funkci ESC včetně přepínání směru otáčení motoru.

Laserový alarm

Cílem tohoto projektu je vytvořit jednoduchý, ale funkční bezpečnostní systém, který detekuje narušení prostoru pomocí vysílače (laserového paprsku) a přijímače (fotorezistoru). Jakmile je paprsek přerušen, Arduino to vyhodnotí jako narušení a spustí alarm – například zvukový signál pomocí piezo bzučáku.