Kompletní sestava

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:

Komponety pro sestavu

ZAPOJENÍ:

Reproduktor zapojíme na GND pin u Arduina a digitální pin 12 přes 220 ohmový rezistor.
Viz schéma:
Zapojení

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

FB tw

Další podobné články