Learning   Examples | Foundations | Hacking | Links

Melodia

Este ejemplo utiliza un altavoz piezoelectrico para tocar melodias. Envia una onda cuadrada de la frecuencia apropiada al piezo, generando el tono correspondiente.

Los calculos de los tonos se realizan a traves de la siguiente operación matemática.

      tiempoEncendido = período / 2 = 1 / (2 * frecuenciaTono)

donde los diferenrtes tonos se describen en la tabla:

nota    frecuencia    período    tiempoEncendido
c       261 Hz       3830       1915 	
d       294 Hz       3400       1700 	
e       329 Hz       3038       1519 	
f       349 Hz       2864       1432 	
g       392 Hz       2550       1275 	
a       440 Hz       2272       1136 	
b       493 Hz       2028       1014	
C       523 Hz       1912        956

Circuito

Los piezos tienen polaridad. Los que encontramos en el mercado comunmente poseen un rojo (positivo) y un negro (negativo). Conecta el cable rojo al pin digital 9 y el cable negro a la tierra. A veces es posible adquirir piezos sin un receptaculo plastico, en esos casos se ven como simples discos metalicos.

Un piezo conectado al pin 9.

Código

int speakerPin = 9;

int duration = 15; // cantidad de notas
char notes[] = "ccggaagffeeddc "; // un espacio significa un silencio
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

  // reproduce el tono correspondiente a la nota
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

void setup() {
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }

    // pause between notes
    delay(tempo / 2); 
  }
}

Share