A estas alturas entiendo que ya habrás utilizado un zumbador o buzzer con Arduino. Incluso puede que hayas utilizado la librería Tone para hacer sonar algún que otro pitido.
Yo creo que fue de las primeras cosas que hice después de encender un LED. Sin embargo, no había encontrado una librería que realmente sacara todo el jugo a un zumbador o buzzer con Arduino.
En este tutorial te voy a enseñar una de las mejores librerías que he encontrado para utilizar con un zumbador o buzzer con Arduino. Esta librería se llama EasyBuzzer.
Pero antes de meternos de lleno en ver qué posibilidades nos ofrece, déjame que hable de qué es un zumbador y cómo podemos trabajar con un buzzer con Arduino.
Indice de contenidos
¿Qué es un zumbador o buzzer?
Un buzzer o zumbador es un dispositivo que es capaz de enviar avisos a través del sonido. Puede ser mecánico, electromecánico o piezoeléctrico.
Los zumbadores típicos son los piezoeléctricos vamos, los que vienen en cualquier kit de Arduino.
El zumbador piezoeléctrico se llama así porque en el centro del componente hay un elemento piezoeléctrico. Estos elementos sufren un fenómeno conocido como piezoelectricidad que ocurre en determinados cristales.
Consiste en que determinados materiales (cristales), al ser sometidos a tensiones mecánicas, producen una diferencia de potencial.
Esto también ocurre a la inversa, al someterse a un campo eléctrico, se deforman.
En resumen, si se aplica una señal eléctrica al material este se deforma y al deformarse produce un sonido. Esta es la base del zumbador o buzzer.
Ahora bien, si desde un pin de Arduino conseguimos suministrar una tensión que varíe con el tiempo como una señal PWM, podremos reproducir diferentes sonidos.
A su vez, los zumbadores o buzzer piezoeléctricos se dividen en dos grandes grupos: activos y pasivos.
La diferencia entre estos dos tipos de zumbadores o buzzers es su funcionamiento interno. Veamos un poco por encima cómo funciona cada uno de ellos.
Zumbador o buzzer activo
Un zumbador activo tiene un circuito adicional que lo hace más fácil de usar. Este circuito es un oscilador que hace que el zumbador suene tan pronto como se conecte a la alimentación.
Los zumbadores activos se utilizan en muchos dispositivos como ordenadores, impresoras, copiadoras, alarmas, juguetes eléctricos o teléfonos.
Zumbador o buzzer pasivo
Por el contrario, el zumbador pasivo el oscilador interno desaparece y su funcionamiento depende de la una señal externa. Esta señal debe ser una señal cuadrada.
Además, es necesario que esta señal tenga diferentes frecuencias.
Es como el altavoz que tienes en casa y que utiliza el electromagnetismo. Este tipo de dispositivos necesitan una señal que cambie en el tiempo para poder emitir un sonido.
¿Cómo saber si un zumbador o buzzer es activo o pasivo?
Pues la manera más simple de distinguir un zumbador activo de uno pasivo es conectarlos al pin de 5V de Arduino.
Los zumbadores tienen polaridad es decir, tienen un terminal positivo y otro negativo. Normalmente, el terminal positivo es más largo que el negativo al igual que ocurre con los LEDs. Además, suelen llevar una inscripción que indica cual es el terminal positivo.
Si al conectar el zumbador o buzzer suena es que es activo. Si no suena o hace un chasquido, es que es un zumbador o buzzer pasivo.
El típico buzzer que viene en los kit de Arduino suele ser pasivo. Son más pequeños en tamaño (esto no es determinante), son más baratos y pueden emitir diferentes tonos dependiendo de la frecuencia de la señal de entrada.
En cualquier tienda de Internet como Amazon, lo puedes encontrar por unos cuantos céntimos. Son realmente económicos.
Todo esto está bien pero ¿cómo conectar un zumbador o buzzer con Arduino?
Cómo conectar un zumbador o buzzer con Arduino
La conexión de un zumbador o buzzer con Arduino no puede ser más simple. Sólo tienes que conectar el positivo a un pin digital PWM y el negativo a GND.
En ocasiones, se pone una resistencia entre el pin digital y el zumbador o buzzer. Esto se hace debido a que la intensidad máxima que puede suministrar un Arduino UNO, un Arduino MEGA o un Arduino Nano por cada uno de sus pines es de 40 mA.
Por esta razón necesitamos limitar la corriente que pasa a través del zumbador, para no sobrecargar el microcontrolador. Imagínate todos los pines digitales de Arduino suministrando el máximo, 40 mA.
Un zumbador típico de 16 Ω puede utilizar directamente una resistencia en serie de 100 Ω o 200 Ω. Esto se traduce en una intensidad media de entre 10-20 mA con picos de 20-40 mA lo cual es menos que el máximo de 40 mA.
Por contra, al utilizar una resistencia además de reducir la intensidad, también reduce el volumen del sonido. Por lo tanto, cuanto más alta sea la resistencia más bajo se escuchará el sonido.
Debes hacer coincidir la resistencia con el volumen deseado. Aún así, esta resistencia es opcional.
Por otro lado también se recomienda utilizar un transistor. Su función es la de interruptor. La gran parte del tiempo el zumbador o buzzer no emitirá ningún sonido.
Sin embargo, aunque no emita ningún sonido la corriente sigue fluyendo por el zumbador o el buzzer con el consecuente desperdicio de energía.
Además, se puede producir un sobrecalentamiento del propio zumbador o buzzer ya que funciona como una resistencia.
Para evitar esto se utiliza un transistor NPN o un transistor PNP.
Como todo en la vida, hay un camino fácil. Puedes adquirir un módulo donde viene integrada toda la electrónica: resistencia, transistor y buzzer.
Al igual que pasa con la resistencia, si conectas el zumbador sin el transistor funcionará igual pero ten en cuenta que estará gastando energía. Algo muy importante en proyectos que requieren bajo consumo como con el ESP8266.
A partir de aquí y teniendo en cuenta las posibles opciones que no son obligatorias como la resistencia y el transistor, vamos a suponer que tenemos un buzzer sin módulo.
Las conexiones del zumbador o buzzer con Arduino serían como se muestra en el siguiente esquema.
El terminal positivo se conecta al pin digital PWM 5 y el terminal negativo al pin de GND.
Más sencillo imposible.
Ahora bien, si lo dejamos así sería un poco complicado que el zumbador o buzzer con Arduino reproduzca algún sonido por sí solo. Para que eso ocurra hay que programarlo.
Lo más sencillo y completo es hacerlo con una librería. La que recomiendo es EasyBuzzer. Sin embargo, puedes utilizar una señal PWM básica para que reproduzca un sonido.
Prueba a cargar el siguiente código y escucha un sonido infernal :)
1 2 3 4 5 6 7 8 9 |
const byte pinBuzzer = 5; byte salida = 10; void setup() { } void loop() { analogWrite(pinBuzzer, salida); } |
Ahora, cambia el valor de la variable salida y pon otro número entre el 0 y el 255. A qué suena diferente.
Es lo que he comentado antes, un zumbador o buzzer pasivo necesita una señal cuadrada. Si varías el voltaje, varía la frecuencia que reproduce.
Pero si realmente quieres conseguir efectos de sonido chulos con tu zumbador o buzzer con Arduino, lo mejor es utilizar la librería EasyBuzzer.
Librería EasyBuzzer para buzzer con Arduino
La típica librería que se utiliza para hacer sonar un zumbador o buzzer con Arduino es la librería Tone. No está mal pero da poco juego.
Buscando alternativas dí con una librería que está muy bien. Se llama EasyBuzzer y, como no, es de código abierto. La puedes encontrar en GitHub.
La librería EasyBuzzer permite programar beeps (sonido que parpadea) totalmente configurables. Puedes configurar la duración del sonido, del silencio, cuantas veces se repite, etc…
Una de las funciones más interesantes de la librería EasyBuzzer es que reproduce los sonidos de forma asíncrona es decir, que no bloquea el código.
Más adelante veremos todas las posibilidades.
Vamos a empezar por el principio, instalando la librería en el IDE de Arduino. Abre el Administrador Bibliotecas que se encuentra en Programa/Incluir Librería/Administrar Bibliotecas.
En el Administrador Blibliotecas busca EasyBuzzer e instala la librería.
Esto instala el código necesario y los ejemplos. Suficiente para empezar a crear nuestros propios efectos de sonido con el zumbador o buzzer con Arduino. Pero antes, veamos las funciones principales de EasyBuzzer.
Funciones principales de EasyBuzzer
EasyBuzzer es una clase estática lo que quiere decir que no hace falta crear una instancia u objeto de la clase. Es como la librería Serial.
Directamente escribes la clase (EasyBuzzer) y luego llamas a la función correspondiente. Veamos alguna de estas funciones.
EasyBuzzer.setPin()
Esta función configura el pin digital donde está conectado el zumbador o buzzer con Arduino. Utilizar esta función es opcional ya que por defecto tiene configurado el pin 4.
En nuestro caso, hemos conectado el zumbador o buzzer con Arduino en el pin 5 por lo tanto, sí que necesitaremos utilizar la función para configurar el pin.
Más adelante veremos dónde se guarda la configuración por defecto de la librería.
1 |
EasyBuzzer.setPin(pinZumbador); |
Donde:
- pinZumbador: es el número de pin donde está conectado el zumbador o buzzer con Arduino.
EasyBuzzer.beep()
Si quieres que el zumbador o buzzer con Arduino emita un pitido (beep), debes utilizar esta función. Se puede llamar de cinco maneras diferentes dependiendo del número de parámetros que admita.
Una función que puede ser llamada de diferentes maneras dependiendo el número de parámetros, en el argot de los programadores se dice que es una función o un método sobrecargado.
La primera sobrecarga del método admite un único parámetro.
1 |
EasyBuzzer.beep(fecuencia); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
Esta función emite un pitido continuo hasta que se ejecute la función EasyBuzzer.stopBeep() que luego veremos.
La siguiente sobrecarga del método admite dos parámetros.
1 |
EasyBuzzer.beep(fecuencia, beeps); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
- beeps: es el número de pitidos.
Esta función ejecuta un pitido a una frecuencia específica un número de veces especificado por el parámetro beeps. La duración del pitido y el silencio está configurado por defecto.
Un beep corresponde a un pitido y a un silencio. Como verás luego, tanto el pitido como el silencio se pueden configurar.
La siguiente sobrecarga del método admite tres parámetros.
1 |
EasyBuzzer.beep(fecuencia, beeps, funcionCallback); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
- beeps: es el número de pitidos.
- funcioncallback: es la función que se ejecuta cuando acaban los beeps.
Esta función hace sonar una serie de beeps a una frecuencia determinada como en el caso anterior. La novedad es que con esta función podemos hacer que cuando terminen de sonar la serie de beeps configurados, ejecute una función.
Esto es muy útil si quieres que se ejecute algo justos después de reproducir los sonidos con el zumbador o buzzer con Arduino.
La siguiente sobrecarga del método admite seis parámetros.
1 |
EasyBuzzer.beep(frecuencia, duracionOn, duracionOff, beeps, duracionPausa, secuencia); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
- duracionOn: duración del sonido del beep en milisegundos.
- duracionOff: duración del silencio del beep en milisegundos.
- beeps: es el número de pitidos.
- duracionPausa: duración de la pausa entre los diferentes beeps.
- secuencia: es el número de veces que se repiten los números de beeps.
Esta función hace sonar una serie de beeps a una frecuencia determinada. Hasta aquí no hay nada nuevo. La novedad es que se puede configurar el tiempo de sonido y de pausa del beep.
Además, se puede repetir la secuencia dejando una pausa entre cada secuencia.
La última sobrecarga del método admite siete parámetros.
1 |
EasyBuzzer.beep(frecuencia, duracionOn, duracionOff, beeps, duracionPausa, secuencia, funcionCallback); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
- duracionOn: duración del sonido del beep en milisegundos.
- duracionOff: duración del silencio del beep en milisegundos.
- beeps: es el número de pitidos.
- duracionPausa: duración de la pausa entre los diferentes beeps.
- secuencia: es el número de veces que se repiten los números de beeps.
- funcioncallback: es la función que se ejecuta cuando acaban los beeps.
Esta función hace exactamente lo mismo que la función anterior pero además, ejecuta una función callback cuando terminan de sonar todas las secuencias.
EasyBuzzer.singleBeep()
La función EasyBuzzer.singleBeep() hace sonar un beep simple y, como ocurría con el método anterior, está sobrecargado. Hay dos formas de llamar a este método.
Si llamas al método con dos parámetros.
1 |
EasyBuzzer.singleBeep(frecuencia, duracion); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
- duracion: es la duración del pitido en milisegundos.
Hace sonar un pitido (no es un beep ya que no tiene pausa) a una frecuencia y durante un tiempo determinado.
Y si llamas al método con tres parámetros.
1 |
EasyBuzzer.singleBeep(frecuencia, duracion, funcionCallback); |
Donde:
- frecuencia: es la frecuencia del pitido que reproducirá el zumbador o buzzer con Arduino.
- duracion: es la duración del pitido en milisegundos.
- funcioncallback: es la función que se ejecuta cuando acaban los beeps.
Igual que la función anterior pero además ejecuta una función callback cuando termina el sonido.
EasyBuzzer.stopBeep()
La función EasyBuzzer.stopBeep() para cualquier sonido que se esté reproduciendo por el zumbador.
1 |
EasyBuzzer.stopBeep(); |
Esta función no admite ningún parámetro.
EasyBuzzer.update()
La función EasyBuzzer.update() hace que la librería esté en funcionamiento constantemente. Se debe llamar en cada iteración del bucle loop() como veremos luego.
Ojo, si no llamas a esta función en el bucle loop() no sonará ningún sonido por el zumbador o buzzer con Arduino.
1 |
EasyBuzzer.update(); |
Y estas son las funciones más importantes de esta librería. Te animo a que sigas investigando el resto de funciones que no son tan importantes.
Ahora, vamos a ver un archivo que se instala con la librería y donde vienen las configuraciones por defecto.
Archivo Config.h librería EasyBuzzer
Muchas librerías suelen tener un archivo que se llama Config.h. Incluso nosotros mismos podemos hacer que nuestro programa tenga este archivo. Aquí suelen estar las configuraciones y parámetros por defecto que utiliza un programa o librería.
El nombre Config.h es una convención y significa configuración (en inglés configuration), pero puedes llamar a este archivo de configuración como quieras.
La librería Esasy Buzzer trae un archivo Config.h. Se incluye junto con el archivo de cabecera EasyBuzzer.h y el archivo de implementación EasyBuzzer.cpp.
Estos archivos están en la carpeta configurada por defecto en el IDE de Arduino en la carpeta libararies. Allí encontrarás una carpeta que se llama EasyBuzzer.
Si entras dentro verás la típica estructura de una librería. Los archivos que te he mencionado antes están dentro de la carpeta src.
El archivo que nos interesa es el que se llama Config.h.
Lo puedes editar con el Bloc de notas o con cualquier otro editor de texto. Yo te recomiendo Sublime Text y si quieres ir un poco más allá, PlatformIO.
Sea como sea, si abres el archivo encontrás el siguiente código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* Name: Config.h Version: 1.0.0 Created: 9/29/2017 12:03:48 AM Author: Evert Arias Github: https://github.com/evert-arias/EasyBuzzer Copyright (c) 2017 Evert Arias */ #pragma once #ifndef _Config_h #define _Config_h #define DEFAULT_PIN 4 // Default pin number where the buzzer is connected. #define DEFAULT_FREQ 1000 // Default frequency. #define DEFAULT_CHANNEL 0 // Default PWM channel. #define DEFAULT_RESOLUTION 8 // Default resolution. #define MINIMUM_INTERVAL 20 // Minimum interval allowed in milliseconds(ms). #define DEFAULT_ON_DURATION 100 // Default ON duration of a cycle in milliseconds(ms). #define DEFAULT_OFF_DURATION 100 // Default OFF duration of a cycle in milliseconds(ms). #define DEFAULT_PAUSE_DURATION 100 // Default PAUSE duration of a cycle in milliseconds(ms). #endif |
Código obtenido de GitHub.
Estos son los valores por defecto que utiliza la librería EasyBuzzer. Sirve para que de una forma sencilla puedas reproducir un sonido con un zumbador o buzzer con Arduino.
Sin embargo, lo puedes modificar. Por ejemplo la constante DEFAULT_PIN tiene un valor de 4 lo que viene a decir que el pin que utiliza por defecto es el pin 4. Si quieres que sea el 5 lo único que debes hacer es cambiar el 4 por el 5.
La próxima vez que compiles y subas el código del zumbador o buzzer con Arduino, el pin por defecto será el 5. Y así con el resto de parámetros la duración del silencio, de la pausa o del sonido.
Prueba a cambiar algunos parámetros. No te preocupes por si lo estropeas, siempre puedes recurrir al código original de EasyBuzzer.
Ejemplo zumbador o buzzer con Arduino y la librería EasyBuzzer
Hasta ahora lo único que hemos hecho es reproducir un sonido con un zumbador o buzzer con Arduino a través de una señal PWM, pero se pueden hacer cosas más chulas.
El siguiente ejemplo te muestro cómo utilizar la librería EasyBuzzer para reproducir dos beeps con un zumbador o buzzer con Arduino.
Es un código muy sencillo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <EasyBuzzer.h> void sonidoTerminado(){ Serial.println("Sonido terminado"); } void setup() { Serial.begin(9600); // Configuración del pin EasyBuzzer.setPin(5); Serial.println("Comienza el sonido"); // Configuración del beep EasyBuzzer.beep( 2000, // Frecuencia en herzios 100, // Duración beep en ms 100, // Duración silencio en ms 2, // Números de beeps por ciclos 300, // Duración de la pausa 1, // Número de ciclos sonidoTerminado// Función callback que es llamada cuando termina ); } void loop() { // Función para que funcione la librería EasyBuzzer.update(); } |
Lo primero es importar la librería EasyBuzzer.h.
En la función setup(), después de configurar el monitor serie, se configura el pin del zumbador o buzzer llamando a la función EasyBuzzer.setPin(5).
Esto no haría falta si en el archivo Config.h has cambiado el pin por defecto de 4 a 5.
Lo siguiente es configurar el beep con una de las funciones que hemos visto anteriormente, EasyBuzzer.beep(…). En concreto utilizo la función que admite siete parámetros.
1 |
EasyBuzzer.beep(2000, 100,100, 2, 300, 1, sonidoTerminado); |
Donde:
- 2000: es la frecuencia en hercios, en este caso 2.000.
- 100: es la duración en milisegundos del sonido del beep.
- 100: es la duración en milisegundos del silencio del beep.
- 2: número de beeps seguidos.
- 300: duración en milisegundos de la pausa entre los ciclos.
- 1: número de ciclos.
- sonidoTerminado: función callaback que se ejecuta cuando termina el número de ciclos.
Si te fijas en la función callback lo único que hay que hacer es poner void (porque no devuelve ningún valor) seguido del nombre de la función.
1 2 3 |
void sonidoTerminado(){ Serial.println("Sonido terminado"); } |
Este nombre tiene que coincidir con el nombre de la función que se ha dado al configurar el beep con EasyBuzzer.beep(…). La función callback no admite ningún parámetro.
Dentro de la función lo único que hago es mostrar por el monitor serie un mensaje indicando que el sonido ha terminado.
Por último, en la función loop() se hace la llamada a la función EasyBuzzer.update() que es la encargada de hacer las comprobaciones pertinentes para que la librería funcione.
Un error típico es no poner la llamada a esta función. Te darás cuenta porque no se sonará ningún sonido en el zumbador o buzzer con Arduino.
Ahora solo queda cargar el código a la placa y afinar bien el oído. Abre también el monitor serie para ver que cuando termine de hacer el beep, por el monitor serie sale el mensaje Sonido terminado.
Prueba a cambiar las configuraciones por ejemplo, cambia el número de ciclos de 1 a 5 ¿qué sucede?
Prueba el resto de configuraciones con tu zumbador o buzzer con Arduino y deja tus resultados y dudas en los comentarios de aquí abajo.