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

ROBOTICKÉ RAMENO

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy. 

Electronic TiltMaze

Cílem tohoto projektu je vytvoření jednoduchého ovládacího systému, který umožňuje naklápění dvou servomotorů pomocí analogového joysticku. Platforma řízená servomotory může simulovat pohyb například v ose X a Y — tedy naklánění doleva/doprava a dopředu/dozadu. Tento systém může sloužit jako základ pro různé aplikace:

- Manuální ovládání kamery nebo senzoru (např. na pohyblivé konstrukci nebo robotovi)
- Interaktivní ovládací panel pro školní projekty nebo herní ovladač