Como usar un zumbador con un ESP8266,ESP32 o un Arduino


Vamos a hablar de la librería Easybuzeer que nos va a ayudar a gestionar cualquier zumbador pasivo con casi todas las variantes de Arduino ,pues de hecho esta biblioteca se ha probado en los siguientes dispositivos: Arduino UNO,Arduino MEGA 2560 ,ESP32 y ESP8266

Como mejoras a esperar en las próximas actualizaciones su creador promete soporte para múltiples instancias de EasyBuzzerClass, lo que hace posible tener más de un Buzzer asi como funciones de acceso directo a sonidos predefinidos como; éxito, error y advertencia.

Para empezar a usar esta librería, necesitaremos incluir la biblioteca en el boceto mediante la opción Herramientas->Administrar Bibliotecas->Buscar «EasyBuzzer»


Empezando

Incluir la biblioteca en el skectch

#include <EasyBuzzer.h>

Establecer el pin donde está conectado el zumbador

De forma predeterminada, la biblioteca está configurada para utilizar el número de pin 4. Puede cambiar el número de pin predeterminado, modificando el valor de DEFAULT_PIN en el archivo Config.h . Para establecer el número de pin en el boceto, llame a la función EasyBuzzer.setPin(pin)en la configuración.

int pin = 2 ;
configuración vacía  () {
  EasyBuzzer. setPin (pin);
};  

Ejecutar la biblioteca

void  loop () {
   / * Llame siempre a esta función en el ciclo para que EasyBuzzer funcione. * / 
  EasyBuzzer. actualizar ();
};

Usos

Bip regular

Bip continuamente a una frecuencia determinada.

/ * Bip continuamente a una frecuencia determinada. * /
EasyBuzzer.beep (
  frecuencia	 // Frecuencia en Hertz (HZ). 
);

Emite un pitido a una frecuencia determinada un número específico de veces.

/ * 
 	Emite un pitido a una frecuencia determinada un número específico de veces. 
	Los valores predeterminados onDuration y offDuration se establecen en el archivo Config.h. 
* /
EasyBuzzer.beep (
  frecuencia,	 // Frecuencia en Hertz (HZ). 
  pitidos		 // El número de pitidos. 
);

Emite un pitido a una frecuencia determinada un número específico de veces, con función de devolución de llamada.

/ * 
 	Emite un pitido a una frecuencia determinada un número específico de veces, con funcionalidad de devolución de llamada. 
	Los valores predeterminados onDuration y offDuration se establecen en el archivo Config.h. 
* /
EasyBuzzer.beep (
  frecuencia,	 // Frecuencia en Hertz (HZ). 
  pitidos,	 // El número de pitidos. 
  callback	 // [Opcional] Función para llamar cuando termine. 
);

Secuencia de pitidos

Cree una secuencia de pitidos con una frecuencia determinada.

/ * Crea una secuencia de pitidos con una frecuencia determinada. * /
EasyBuzzer.beep (
  frecuencia,		 // Frecuencia en hercios (HZ). 
  onDuration, 		 // On Duración en milisegundos (ms). 
  offDuration, 		 // Off Duración en milisegundos (ms). 
  pitidos, 		 // El número de pitidos por ciclo. 
  pauseDuration, 	 // Duración de la pausa. 
  ciclos, 		 // El número de ciclo. 
  callback		 // [Opcional] Función para llamar cuando termine. 
);	

Bip único para una duración

Bip único a una frecuencia determinada, durante un período específico.

/ * Un solo pitido. * /
EasyBuzzer.singleBeep (
  frecuencia,	 // Frecuencia en hercios (HZ). 
  duración	 // Duración del pitido en milisegundos (ms). 
);

Bip único a una frecuencia determinada, durante un período específico, con función de devolución de llamada.

/ * Un solo pitido a una frecuencia determinada, durante un período específico, con funcionalidad de devolución de llamada. * /
EasyBuzzer.singleBeep (
  frecuencia, 	 // Frecuencia en hercios (HZ). 
  duración, 	 // Duración del pitido en milisegundos (ms). 
  callback	 // [Opcional] Función para llamar cuando termine. 
);

Dejar de pitar

Utilice esta función para detener el pitido. Puede llamar a esta función en todo momento, en cualquier lugar del código.

EasyBuzzer.stopBeep ();

Modificar los valores de duración predeterminados

Los valores de duración predeterminados se definen en el archivo Config.h . Puede cambiar esos valores en el archivo Config.h o usar la función provista para cambiarlos.

EasyBuzzer.setOnDuration (duración);	// Establecer en duración. 
EasyBuzzer.setOffDuration (duración);	// Establecer la duración de Off. 
EasyBuzzer.setPauseDuration (duración);	// Establecer la duración de la pausa.

Ejemplo

A continuación vamos a usar un sensor de sonido para Arduino mediante su salida digital D0 que conectaremos al pin D6 del ESP8266 que correspondel al GPIO16

El circuito se alimentara con 5V DC desde Vin y GND del ESP8266

Finalmente conectaremos un zumbador piezoelectrico pasivo entre D1(GPIO 5) y GND

Este es el código de ejemplo para probar el circuito comentado anteriormente del sensor de sonido para Arduino mediante su salida digital D0 que conectaremos al pin D6(GPIO16) del ESP8266 ,alimentado con 5V DC desde Vin y GND del ESP8266 y conectando un zumbador piezoeléctrico pasivo entre D1(GPIO 5) y GND .

#include <EasyBuzzer.h>


int sensor = 16 ;
bool estado = false ;


void sonidoTerminado(){
  Serial.println("Sonido terminado");
}


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  
  pinMode(5, OUTPUT);
   // Configuración del pin
  EasyBuzzer.setPin(5);
  
  Serial.begin(2000000);    // Iniciamos la puerta serie
 

  pinMode( sensor , INPUT_PULLUP) ;
 // digitalWrite(LED_BUILTIN , LOW) ; // Apagamos el LED al empezar
 
  // 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
//  );
  
  
  int init=0;
  Serial.println("Empezamos");
//pausa
for (int n=0 ;n<200 ; n++)
        {     
        delay (100);
        }
}


void loop() {
//EasyBuzzer.update();

 bool  valor ;
for (int n=0 ;n<10 ; n++)
{ valor=  digitalRead(sensor) *digitalRead(sensor ); //leemos el estado del sensor
 }

 if ( valor == true ) //Si está activada la salida D0
 

  {    estado = ! estado ;                       // cambiamos el estado del LED
    digitalWrite(LED_BUILTIN, false) ;            // escribimos el nuevo valor
    digitalWrite(5, 1) ;            // escribimos el nuevo valor
    Serial.println("TRUE");
    for (int n=0 ;n<10 ; n++)
        {   EasyBuzzer.beep(3000, 100,100, 2, 300, 3, sonidoTerminado);   
        delay (100);
        }
  }
  else
  {
   // Serial.println( "FALSE");
      delay (10);
      digitalWrite(LED_BUILTIN, true) ;
      digitalWrite(5, 0) ;            // escribimos el nuevo valor
  ;
  }

  
}

Como fácilmente se puede ver estamos leyendo el puerto al que esta conectado el sensor de sonido, circunstancia que se detectara con la condición valor=true , lo que provocara que se active el zumbador

Para minimizar los rebotes, por cierto, ejecutamos un pequeño ciclo de 10 lecturas

Además, para evitar disparos involuntarios al inicio también un bucle de 200x100ms

Problemas al reconocer el puerto con el ESP8266



Node MCU
 es una plataforma para el desarrollo de proyectos IoT que integra el famoso chip ESP8266, el cual se ha extendido enormemente debido a su facilidad para desarrollar proyectos open source  que pueden ademas  pueden   involucrar el IoT  .

Esta placa  destaca  porque integra capacidades de comunicación via WiFi , conteniendo en su interior  un microprocesador que puede ser programado fácilmente usando el  conocido lenguaje de programación Lua o bien vía Arduino IDE.

Obviamente ante todo no podemos perder de vista su bajisimo precio ( menos de 7.5€  ) comparados con otras opciones , pues no debemos olvidar  que incluye  el modulo wifi integrado  y un bus GPIO para conectar dispositivos de E/S.
Node MCU es una plataforma de desarrollo permite un prototipado rápido, para una vez satisfechos con el resultado, portar el desarrollo a un sistema final con un chip ESP8266 como pieza central.

A la hora de programar nuevas funciones, si optamos por utilizar Lua, dispondremos de un sistema simple con buena comunidad de usuarios. En cambio programar con el sistema Arduino nos aporta un fantástico IDE y un sinfin de manuales y ejemplos de desarrollo.

Este modulo es Ideal como una solución independiente en lugar de Arduino además de Wi-Fi  integrado siendo fácil de programar a través del IDE de Arduino (como vamos a ver ) , al igual que un Arduino.
Todos los periféricos con bus I2C puede unirse,por ejemplo Pantallas OLED, pantallas LCD, temperatura, presión, sensores de humedad pueden ser conectados en paralelo. También se puede conectar múltiples DS18B20

Sin embargo, sólo hay una entrada analógica y salida y las pantallas táctiles no se pueden conectar con ella.

Los pasos  a seguir   para conectar un ESP8266     son los siguientes:

  •  Instalación del IDE de Arduino .Si aun no lo tiene instalado ,se puede hacer  desde aqui
  • Instalación  del paquete de la placa ESP8266 en Arduino IDE  siguiendo las instrucciones del sitio : https://github.com/esp8266/Arduino
esp
  • Instalación de los controladores USB

Es necesario instalar el controlador USB requerido en su ordenador  para que pueda programar el ESP8266.  Independientemente de la opción de firmware que elijamos, primero necesitamos comunicarnos con la placa de desarrollo ESP-12E utilizando la interfaz USB de la computadora.

El módulo USB a Serial UART incluido en la placa es Silicon Labs ‘CP2012, para lo cual generalmente necesitamos instalar los controladores de puerto COM virtual (VCP) fácilmente disponibles para su sistema operativo específico.Una vez instalado, debemos verificar que el CP2102 sea reconocido por su ordenador.

Una vez que el controlador está instalado, podemos conectar el cable USB al puerto USB de la computadora y la placa. Después de hacerlo, deberíamos ver el mensaje: software del controlador del dispositivo instalado correctamente.

Además, podemos verificar manualmente que todo funcione correctamente siguiendo estos pasos:

Abra el Administrador de dispositivos (disponible a través del Panel de control → Sistema y seguridad → Administrador de dispositivos en la sección Sistema)
Debajo de la entrada Puertos (COM & LPT), debe haber un puerto abierto llamado USB-SERIAL CP2102 (COM) donde hay un número típicamente mayor o igual a 3.

Ahora que estamos listos para comunicarnos con nuestro ESP8266 a través del CP2102, podemos explorar algunas de las diferentes opciones de firmware disponibles.

  • Conecte  un cable usb  de datos al ESP8266
  • Seleccione   Herramientas –>ESP8266   y ahi la placa que haya comprado. En caso de  haberla comprado en Amazon aqui seleccione  NodeMCU 1.0 (ESP-12EModule).

node.png
  • En el IDE de Arduino, vaya al menú de herramientas, seleccionada su placa y elija el  puerto al que está conectado su ESP8266.En el ejemplo  es el COM11
puerto.png

Problemas al reconocer el puerto

En varios casos, la placa no se detecta debido a que faltan los controladores. Sin embargo, también puede ser por el puerto USB o el cable.

Si después de instalar los controladores sigue sin funcionar, por favor:

  • Verifique conectando la placa en otro puerto
  • Intente cambiar el cable USB de conexión por otro porque a veces aunque haya alimentación pueden fallar ( no olvidar que en un cable USB standard deberia haber 4 hilos)
  • Pruebae en otro ordenador distinta

Una vez dicho eso, veamos los controladores de NodeMCU 8266 en Windows.

Controladores para esp8266 en Windows

Hay que ir al siguiente enlace:

https://github.com/nodemcu/nodemcu-devkit/tree/master/Drivers

Y descargar el archivo que se llama CH341SER_WINDOWS.zip. Si quieres un enlace directo lo dejo aquí:

https://github.com/nodemcu/nodemcu-devkit/raw/master/Drivers/CH341SER_WINDOWS.zip

Una vez que lo descargues, extraer el fichero comprimido con extension .zip. Tendrá un programa llamado CH341SER.EXE, ejecútelo y dale permisos de administrador.

En la siguiente ventana haz click en Install:

Instalar drivers de NodeMCU 8266 en Windows

Espere a recibir la notificación de que se ha instalado y eso es todo. Debe detectar el dispositivo en un puerto COM; yo lo tenía en el COM4.

Conclusión

Es necesario mencionar que esto lo probé en Windows 10 de 64 bits usando PlatformIO dentro de Visual Studio Code, pero supongo que debe funcionar de igual modo en otras plataformas.

Lo explicado aquí está en un issue de GitHub.