Learning Examples | Foundations | Hacking | Links
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
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.
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);
}
}