En este proyecto vamos a utilizar un zumbador pasivo (pasive buzzer) o altavoz, con el que generaremos tonos audibles o melodías con nuestro Arduino.
Qué es un zumbador pasivo?
Un zumbador es un dispositivo electrónico que tiene la capacidad de transformar una señal variable de voltaje en una seña audible, los zumbadores pasivos se les conoce así por lo que no tiene componentes internos que generen señales con frecuencias audibles, debido a esto utilizaremos el Arduino para generar las frecuencias de las notas que queremos escuchar.
También existen los zumbadores activos, los cuales internamente tienen un oscilador, por lo cual solo hay que alimentar el zumbador para que genere un sonido, son comúnmente llamado también como chicharra.
Componentes
En el diagrama podemos apreciar las conexiones, utilizamos el pin digital 8 para el pin positivo del altavoz y el negativo al GND del Arduino.
Código
const int pinBuzzer = 8; void setup() { } void loop() { //generar tono de 440Hz durante 1000 ms tone(pinBuzzer, 440); delay(1000); //detener tono durante 500ms noTone(pinBuzzer); delay(500); //generar tono de 523Hz durante 500ms, y detenerlo durante 500ms. tone(pinBuzzer, 523, 300); delay(500); }
En este código vamos a encontrar dos funciones nuevas tone() y noTone(), las cuales se utilizarán para generar los sonidos en nuestro zumbador.
La sintaxis de estas funciones es:
tone(pin, frecuencia)
tone(pin, frecuencia, duración)
noTone(pin)
Parámetros:
pin: Pin donde el Arduino va a generar el tono, es decir al pin al cual está conectado el zumbador.
frecuencia: La frecuencia en hertz o hercios del tono.
duración: La duración del tono en milisegundos, es un parámetro opcional.
Vamos a revisar el código paso a paso, lo primero que vemos en este código es la declaración de las variables.
const int pinBuzzer = 8;
Se declaran una constante del tipo entero llamada pinBuzzer, a la cual le asignamos el 8, que va a ser el puerto digital en el que conectaremos el zumbador.
En la función setup no tenemos nada, así que miraremos la función loop:
//generar tono de 440Hz durante 1000 ms tone(pinBuzzer, 440); delay(1000); //detener tono durante 500ms noTone(pinBuzzer); delay(500); //generar tono de 523Hz durante 500ms, y detenerlo durante 500ms. tone(pinBuzzer, 523, 300); delay(500);
De ahora en adelante voy a adicionar comentarios entre el código de algunos programas para hacerlos más legibles y explicar en algunas acciones que hacemos en él. Para hacer los comentarios vamos a utilizar «//», lo que siga de los // es un comentario y estos no afectaran el código al momento de la compilación, el compilador solo los va a ignorar.
Primero tenemos tone(pinBuzzer, 440)
, donde le entregamos a tone como primero parámetro el número del pin donde tenemos conectado el zumbador y como segundo parámetro la frecuencia en hertz que queremos que suene, esto hará que suene el zumbador con un tono de 440Hz. Luego tenemos un delay(1000)
, lo que nos permite que el tono de 440Hz dure un 1000 milisegundos.
Luego tenemos el n
oTone(pinBuzzer)
que hace que del zumbador deje de sonar y como el delay(500)
, hace que el zumbador esté en silencio por 500 milisegundos.
Resultado
Nuestro Arduino va a hacer a sonar en el zumbador pasivo una señal de 440Hz por un lapso de un segundo, luego una pausa de medio segundo, después sonaría una señal de 523Hz por medio segundo y una pausa de medio segundo antes de volver a comenzar el ciclo
Código 2
const int pinBuzzer = 8; const int frecuencias[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};//Arreglo que contiene las frecuencias que queremos escuchar en nuestro buzzer const int numFrecuencias = 12; void setup() { } void loop() { for (int i = 0; i < numFrecuencias; i++) { tone(pinBuzzer, frecuencias[i]); delay(1000); } noTone(pinBuzzer); }
En este proyecto vamos utilizar el Arduino para generar en el zumbador pasivo una escala de 12 notas, basada en la tabla que sigue a continuación, donde vemos las frecuencias de las notas de la 4 octava, donde tomamos los valores de la frecuencia siendo ajustadas al entero más próximo.
Nota | Octava | Frecuencia (Hz) |
---|---|---|
Do / C | 4 | 261,63 |
Do# / C# | 4 | 277,18 |
Re / D | 4 | 293,67 |
Re# / D# | 4 | 311,13 |
Mi / E | 4 | 329,63 |
Fa / F | 4 | 349,23 |
Fa# / F# | 4 | 369,99 |
Sol / G | 4 | 392 |
Sol# / G# | 4 | 415,31 |
La / A | 4 | 440 |
La# / A# | 4 | 466,16 |
Si / B | 4 | 493,88 |
const int pinBuzzer = 8; const int frecuencias[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};//Arreglo que contiene las frecuencias que queremos escuchar en nuestro buzzer const int numFrecuencias = 12;
En la parte de la declaración de las variables vemos como se ha declarado una constante de tipo entera pinBuzzer a la que le asignamos el valor 8, que es el pin al cual va a ir conectado el zumbador.
Luego declaramos un arreglo de enteros (también constante) frecuencias[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494}
, donde tenemos los 12 valores de las frecuencias que vamos a utilizar.
Finalmente declaramos una constante entera const int numFrecuencias = 12
, que utilizaremos para recorrer el arreglo de las frecuencias para que suenen nuestras notas.
Veamos el loop:
for (int i = 0; i < numFrecuencias; i++) { tone(pinBuzzer, frecuencias[i]); delay(1000); } noTone(pinBuzzer);
En el loop tenemos un for que va hacer 12 repeticiones, recorriendo nuestro arreglo para hacer sonar cada una de las frecuencias que tenemos, y esto se hace con tone(pinBuzzer, frecuencias[i])
, luego de sonar el tono por un segundo iría al siguiente y así hasta recorrer todo el arreglo, una vez termine de recorrer el arreglo sale del for y llama la función noTone(pinBuzzer)
, la cual silencia el zumbador, luego vuelve a repetirse todo el loop.
En el ejemplo anterior tenemos una escala de 12 notas y las hacemos sonar por un segundo cada una, así podríamos crear una melodía con diferentes notas y diferentes tiempos, lo que yo recomendaría para que suene una canción es la de crear un arreglo con las frecuencias de las notas y un arreglo con los tiempos y usaríamos la función tone(pinBuzzer, frecuencia[i], tiempo[i]);