bclose

Buzzers o zumbadores

Sonido básico con Arduino
tienda online prometec

Objetivos

 

 

    • Familiarizarnos con un buzzer piezoeléctrico.
    • Las funciones tone() y notone().
    • Primeros pasos con la música electrónica
 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o similar.

Esta sesión acepta cualquier otro modelo de Arduino.

 

Protoboard conexionesUna Protoboard más Cables .
Zumbador piezoelectrico Un buzzer piezoeléctrico.

 

Piezoelectricidad

 

Según la Wikipedia, la piezoelectricidad es un fenómeno que ocurre en determinados cristales que, al ser sometidos a tensiones mecánicas, adquieren una polarización eléctrica y aparece una diferencia de potencial y cargas eléctricas en su superficie que generan una tensión eléctrica.

Este fenómeno también ocurre a la inversa: se deforman bajo la acción de fuerzas internas al ser sometidos a un campo eléctrico. El efecto piezoeléctrico es normalmente reversible: al dejar de someter los cristales a un voltaje exterior o campo eléctrico, recuperan su forma.

Es decir, que son materiales (el cuarzo es el más conocido) que si los sometemos a una tensión eléctrica variable (como una señal PWM, que ya nos son familiares) vibran.

 
  • Es un fenómeno bastante conocido y muchos encendedores domésticos de gas funcionan bajo este principio. Un resorte golpea un cuarzo y como resultado tenemos la chispa que enciende el gas o el calentador de agua con un característico click).
  • En otro orden de cosas, los circuitos electrónicos digitales, suelen disponer de un reloj interno que vibra a una velocidad patrón, basados en cristales de cuarzo piezoeléctrico. El cristal de Arduino late a 16Mhz por segundo y la flecha indica su posición. Detalle posicion clock
  • En una sesión próxima utilizaremos uno de estos cristales  para sincronizar un circuito discreto con el corazón de un Arduino, el ATmega 328.
 

Si conectamos un piezo con una señal digital, vibran a una frecuencia sigue bastante fielmente la variación eléctrica con que los excita, y si vibran a la frecuencia audible, oiremos el sonido que producen. A un componente que hace esto, le llamamos Buzzer o zumbador.

Naturalmente, la calidad del sonido que producen dista bastante de lo que podríamos denominar alta fidelidad. Pero es suficiente para generar tonos audibles (como la típica alarma de los despertadores digitales) e incluso tonos musicales reconocibles que podemos secuenciar,  hasta en piezas musicales (por más que uno quisiera estar en otro lugar cuando las oyes).

Como antes o después, disponer de una señal acústica en vuestros proyectos, acaba siendo útil, vamos a ver cómo podemos montar estos elementos, y que tipo de opciones tenemos disponibles.

En esta sesión, montaremos un circuito muy sencillo con un zumbador.

Esquema electrónico

 

 

Esquema buzzerxxConectando un zumbador a arduino

La conexión es tan simple como conectar negativo a GND y positivo al pin 9. De todas maneras hay que tener cuidado. Los piezos tienen polaridad y hay que asegurarse de conectarlos correctamente.

 
  • Si los conectáis al revés, simplemente no sonará, y tendréis que dar la vuelta.
  • Además para este primer montaje, necesitamos usar un pin PWM (como el 9) porque es la alternancia entre HIGH y LOW lo que produce el efecto piezoeléctrico (recordad que una señal PWM envía un tren de ondas cuadradas de amplitud variable), por lo que lo más cómodo es usar un pin PWM en lugar de programar un efecto equivalente en un pin normal.
 

 

El Programa

Vamos a empezar creando una función, Beep(), que haga ruido simplemente:

     void beep(unsigned char pausa)
        {
            analogWrite(9, 20);
            delay(pausa);                 // Espera
            analogWrite(9, 0);            // Apaga
            delay(pausa);                 // Espera
        }

Y ahora prueba

     void setup()
        {
            pinMode(9, OUTPUT);
            beep(50);
            beep(50);
            beep(50);
            delay(1000);
        }
     void loop()
       {    beep(200);
       }

Lo único que beep () hace es poner una señal PWM en el pin 9 de 20 sobre 255. Podéis varias el valor, pero el tono de audio no cambiará gran cosa porque está controlado por la señal de base. Esto es suficiente para generar una de las molestas señales acústicas de un despertador barato.

¿Qué pasa si quiero generar señales de tono variable para hacer una melodía? Bueno pues Arduino dispone de la función tone() que genera una señal de la frecuencia indicada, y notone() que la corta:

     void setup()
        {
            int pinOut = 8;
            int freq = 440;
            int duration = 1000;
            tone(pinOut, freq, duration);
        }

La función tone() genera un audio de la frecuencia y duración definidas.

Podemos definir una matriz con las frecuencias de las notas a utilizar  y lee las correspondencias con las notas musicales. Veamos cómo generar una escala con un zumbador:

     int speakerPin = 9;
  
     int numTones = 10;
     int tones[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494};
                       // mid C C# D D# E F F# G G# A

     void setup()
        { }

     void loop()
        {
             for (int i = 0; i < numTones; i++)
                 {
                     tone(speakerPin, tones[i]);
                     delay(500);
                 }
             noTone(speakerPin);
       }
 
  • Dada la afición reinante a la física recreativa, me aterra la idea de ponerme a perorar sobre la relación entre las notas musicales y la frecuencia correspondiente, así como los distintos métodos de calcularlas y no digamos ya pretender hablar de las escalas temperadas.
  • Así que vamos a mencionar simplemente que existe una relación directa entre la frecuencia de una nota y su posición, en digamos el teclado de un piano.
  • Para aquellos con formación musical e interés en como calcular la frecuencia de una nota dada podeís hacer una búsqueda en  Google, que enseguida encontrareis de todo.
 

Por último, y para cerrar esta sesión, os diré que internet está lleno de gente a quien le sobra tiempo y lo dedica a las extravagancias más inverosímiles. Basta con indicaros aquí la página de alguien que ha dedicado un número indecente de horas en transcribir  la música de la guerra de las galaxias a orquesta de cámara, compuesta por Arduino y zumbador.Descargar ejemplo:

 

Resumen de la sesión

 

 

    • Hemos usado nuestro zumbador piezoeléctrico.
    • Son muy sencillos de usar aunque su calidad es pobre.
    • Son un sistema barato y rápido de añadir sonido a tus proyectos.
    • Hemos planteado unos primeros pasos en generación electrónica de sonido.Si tenemos ocasión dedicaremos algún otra sesión a la generación de sónidos electrónico y MIDI.
 

 

 

(29) Comments

  • qué buzzer me recomiendas para hacer este tutorial? estoy empezando en el arduino y no se mucho de esto hermano

  • Hola muy buenas estoy montando un buzzer y un keypad 4×4 junto con un led cuya finalidad es cuando pulsamos cualquier botón del keypad suene un beep(50); y el led pase a estado HIGH durante unos 50ms, hasta el momento todo correcto y su funcionamiento también. Pero aquí viene el pequeño problemilla, he comprobado que el usar la función Jeep del zumbador cuando en la consola serial me está continuamente escribiendo o mostrando básicamente “nada” y cuando pulso si sale lo que pulso pero desaparece debido a que está como en un continuo mostrar de “nada” y también tengo el led con un leve parpadeo continuo pero cuando pulso se enciende correctamente… Pienso que debe ser ruido de la señal PWM pero no estoy seguro haber si alguien puede iluminarme, muchas gracias, todo lo he realizado con los tutos de prometec. Gracias de antemano.

    • Hola José el problema de la lectura por el puerto serie puede ser si has conectado el teclado a los pines 0 y 1 del Arduino, que son los mismos que usa para comunicarse por el puerto serie. Yo probaría a utilizar otros a ver si así solucionamos, al menos, parte del problema. Un saludo.

  • Buenas, lo primero dar la enhorabuena por la pagina, lo segundo, tengo una duda con el uso de mi buzzer y esque si lo dejo conectado al arduino o esp8266 (da igual cual use) al conecterlo a la corriente emite ya un sonido continuo, imagino que por el pico de tension que llega al conectarse el arduino. La solucion que uso es que dejo desconectado el buzzer del arduino y una vez conectado el arduino a la corriente ya conecto el buzzer, lo cual es algo engorroso cada vez qe lo conecto. ¿Que podria hacer para evitar esto?

    • No estoy muy seguro de cual es el problema pero, yo haria una prueba inicial escribiendo un valor Low en el pin que gobierna el buezzer desde el setup a ver si es suficiente para eliminar el ruido y en caso de que no, siempre puedes usar un transistor tipo 2n2222 para cortar la corriente del circuito del buzzer hasta que decidas activarlo manuelmente

  • Un placer JC y bienvenido a nuestro club 🙂

    • JC

    ¿Que pasa si quiero usar más de un buzzer? Lo he probado, y solo me funciona uno.

    • Probablemente la librería usa alguno de los timers y por eso sólo puedes usarlo con uno. Un saludo.

    • Hola JC puedes usar tantos buzzers como quieras siempre y cuando dispongas de pines PWM disponibles. Recuerda que necesitas enviar una seña PWM para manejar el buzzer

    • David

    Muy buen tuto, pero tengo un problema al momento de hacer sonar el buzzer en un arduino mega con un shield lcd, ya me apaga la pantalla mientras esté emite el sonido. A qué se podría deber?
    He probado con pones digitales y analógico,se repite el problema.

    • Hola David, he probado y yo no tengo ningún problema para ver la pantalla a la vez que suena el buzzer. Igual si nos detallas un poco mejor lo que estás intentando hacer te podemos ayudar. Un saludo.

  • Hola, estuve mirando el circuito que proponés y está directamente conectado al arduino. ¿No es necesaria ninguna resistencia para limitar la corriente? No tengo el datasheet del buzzer que compré, pero generalmente estuve viendo que consumen unos 35 mA, lo cual es mayor a los 20 mA que soportan los pines.
    Además vi que algunos ponían un diodo en paralelo.
    Gracias y felicitaciones por la página. ¡Saludos!

    • Hola Sebstian

      El arduino y puede proporcionar hasta 40 mA en cada pin por lo que en principio estamos dentro de rango. La verdad es que siempre he usado asi el buzzer sin mayores complicacione sy te aseguro que funciona correctamente

    • Coatza

    Hola, qué tal, necesito generar una Frecuencia a 27 KHz en Arduino UNO, es posible? y si es posible, cómo le hago? y sino, qué Arduino me podría sacar del problema. GRACIAS..
    Saludos!!

    • hola! En teoría con la función tone() puedes generar frecuencias desde 31Hz a 65kHz. un saludote

    • Joseph

    hola, como sería si deseo un sensor de nivel con arduino y que al llenarse se apage la bomba.gracias

    • Rosario

    Hola ! Com siempre muy buenos tutoriales.
    Te quería preguntar como hacer para traducir los datos recibidos de un sensor en frecuencias de sonidos.
    se como conectar e iniciar un buzzer y un sensor pero la parte del código mee sta costando.
    debo usar tone?

    • Hola Rosario, ¿Que sensor de frecuencia usas?

  • Excelentes tutoriales muchas gracias por compartir con nosotros

  • para el ejemplo de star wars pide un potenciometro y hay un arreglo que me confunde llama al pin 9 pero lo nombra 7 … no entiendo bien creo que empieza a contar sin el pin 0 y 1 por ser de rx tx…

    • Hola Jorge, no veo donde se usa el pin 7

  • Como se puede poner que una canción suene a partir de un número de pulsaciones?

    • Hola Rodri,

      Simplemente covierte en una funcion la parte que hace el sonido (Ruido o cancion) y llamala cuando se cumpla la condicion

  • Muy fácil y comprensible.
    Gracias me hacia falta algo así sencillo para motivarme.
    Lo de starwars esta bien es un punto a la hora de poner una señal.

  • Nuevamente te molesto con una inquietud elemental pero que desconozco. que función cumple la expresión (unsigned char xxxxx) en la función creada beep, en la primera linea? veo que sin ella la función me genera un error de compilación.

    • No es molestia Edwin, un placer si podemos ayudar.

      Veamos, En C++ todos los typos enteros tienen la versión normal y la unsigned. Esto es cierto para buye, int, char, long ¿porque?

      Todos los tipos normales, utilizan el bit de mas peso para el signo pudiendo albergar enteros positivos o negativos. SI usa un car o byte son 8 bits y eso hace que al usar uno para el sigo solo te quedn 7 digitos disponibles para almacenar tu dato 1 + 2^7 = +- 128

      Si hacemos que sea unsigned tenemos 2^8 = 256 valores y ene ste caso venia bien llegar hasat un cuarto de segundo.

      Aunque aqui el ejemplo es con un char de 8 bits, el rollo de arriba es valido para todos los tipos enteros en C++ : char, byte, int, long, Pero no para los tipos en coma flotante como float y double

    • Andres

    Excelente página. Sin dudas la mejor en español para aprender Arduino. Todo lo que probé funciona de maravillas.

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!