neděle 21. června 2015

Oddechovka: Arduino a piezzo bzučák

Rozdělal jsem starý analogový telefon, kterých jsme desítku vyřazovali ve firmě.



Na zvuk zvonění telefonu je tam obvod LS1240 a piezzo reproduktor.


Připojil jsem ten piezzo reproduktor k Arduinu napřímo, protože, na rozdíl od dynamického reproduktoru, nezničí pin nadměrným proudem (aspoň doufám, neboť ohmmetr mi ukazuje u piezzo nekonečný odpor). Takže jeden pin toho piezzo vede na pin č. 9 (D9) Arduina a zároveň i na pin A0. Druhý pin piezzo vede na zem (GND).

Inspiroval jsem se několika zdrojovými kódy programů dostupných přes vyhledávač na frázi "Arduino piezzo" a nakonec si svůj program upravil do následující podoby. Čtení z pinu A0 se používá na detekci zvuku (zaklepání na stůl), protože ten piezzo jev zjevně funguje obousměrně (mění elektrické napětí na zvuk, i zvuk na elektrické napětí).

const int buzzerPin = 9;

char Indiana_notes[] = "e2f1g1 1C3 2d1e1f3 4g2a1b1 1F3 1a1b1C3D3E3 4e2f1g1 1C3 2d1e1f3 2D1D1E2 2D1D1E2 2D1D1E3 2D2D2F2 2E2D2C2";
char Kocka_notes[] = "c2d2e2f2g4g4a4a4g5 2a4a4g4 2f2f2f2f2e4e4d4d4c5";

unsigned int tempo = 150;
bool melody;

void setup() 
{
}

void loop()
{
    while(analogRead(A0) < 50) ;
    
    playMelody(melody ? Indiana_notes : Kocka_notes);
    melody = !melody;

    delay(500);
}

void playMelody(const char *notes)
{
    pinMode(buzzerPin, OUTPUT);
    unsigned int len = strlen(notes);
    for (unsigned int i = 0; i < len; i+=2) {
        unsigned int duration = (notes[i+1]-'0') * tempo;
        if (notes[i] != ' ')
            tone(buzzerPin, frequency(notes[i]), duration);
        delay(duration + tempo/10);
    }
    pinMode(buzzerPin, INPUT);
}


unsigned int frequency(char note) 
{
    char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B' };
    unsigned int frequencies[] = {262, 294, 330, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880, 988};

    for (byte i = 0; i < sizeof(names); i++) {
        if (names[i] == note)
            return frequencies[i];
    }
    return 0;
}

Výsledek jsem nadšeně hodil na YouTube. Nechte se inspirovat a taky něco s Arduinem spíchněte :-)


1 komentář:

  1. Víš, co se používá v zapalovačích, které mají elektrickou jiskru? Přesně takovýto podobný piezoelement. Takže nejenom že piezoelektrický jev je plně reverzibilní, on ten měnič dokáže vyrobit i hodně vysoké napětí, pro které by nebyl problém Arduino zničit. Ale pravda, to bys ho musel vyndat z toho plastového obalu a ohnout pořádně.

    OdpovědětVymazat