Las características principales de esta placa son:
- Emisor piezoeléctrico pasivo
- No requiere componentes externos
- Rango de alimentación del zumbador entre 1,5V y 15V
- Rango de frecuencias de uso entre 1,5Khz y 2,5Khz
PINEADO
El pineado de esta placa es:
1 : Este pin es la entrada negativa que alimenta la placa. Alimenta directamente al emisor piezoeléctrico
2 : Este pin no va conectado a ningún sitio
3 : Este pin es la entrada de la placa y va conectado directamente al emisor.
LED's INDICADORES
No tenemos ningún led indicador en esta placa sensora
PROBEMOS EL SENSOR KY-006
Vamos a montar en una placa protoboard el emisor KY-006 y conectarlo a un Arduino UNO. Cargaremos dos Sketch en el mismo montaje, el primero lanzará, según pulsemos cuatro tonos diferentes a la placa y podremos oirlos y el segundo usaremos uno de los Timer el Arduino UNO para, mediante interrupciones, generar una onda mas precisa. Para ello usaremos la librería TimerOne que está incluida dentro del propio IDE (a lo mejor hay que descargarla) para configurar fácilmente el Timer1.
NECESITAREMOS
Placa Emisora KY-006
Placa protoboard pequeña
Arduino UNO R3
Diodo LED verde de 3mm, resistencias de 220Ω - 2K7 y 1/4W y pulsadores para protoboard
Cableado macho-macho o hilo rígido que entre en la protoboard
Cable USB corto de USB tipo A a USB tipo B
Opcionalmente si disponemos de un osciloscopio sería muy útil
ESQUEMA
En es esquema podemos ver:
- La placa Arduino UNO se encarga de alimentar la protoboard
- La placa emisora KY-006 está conectada en la protoboard
- El led y la resistencia R1 están conectados a la alimentación de +5V para indicarnos cuando tiene alimentación la protoboard
- El pin de la placa emisora de entrada está conectado al pin 2 del Arduino UNO
- Tenemos un pulsador para realizar cambios en el programa. Está conectado a la entrada digital 7
- La alimentación de todo el sistema se realiza a través del puerto USB
- Hemos colocado la resistencia R3 de 220Ω y 1/4W en serie con la placa KY-006, de este modo reducimos el volumen, que puede llegar a ser molesto.
Para calcular la resistencia R1 del LED solo tenemos que ver el voltaje que va a caer en la resistencia y dividirlo entre la intensidad que queremos que pase por el LED.
La tensión que tiene la resistencia sería el voltaje total menos el voltaje que se queda el LED rojo (aprox. 1,5V). Esto nos deja 5V-1,5V = 3,5V caen en la resistencia.
Vamos a fijar una intensidad por el LED de 15mA (suficientes para que se encienda a buen brillo un LED rojo). Tendriamos entonces una resistencia de 3,5V/0,015A = 233,33Ω
El valor mas cercano al calculado es de 220Ω (Rojo-Rojo-Marrón). Las resistencias comunes de 1/4W deberían servir, ya que la potencia disipada por nuestra resistencia será de 3,5Vx0,015A = 0,05W, valor muy por debajo de los 0,25W máximos que es capaz la resistencia de disipar.
La resistencia pull-down del pulsador puede ser entre 1KΩ y 10KΩ. Pusimos en este caso una resistencia de 2K7 y 1/4W.
Vamos a ver algunas imágenes mas de cerca del montaje
Detalle de la conexión de la placa emisora
Detalle de la conexión del pulsador y de la sonda del osciloscopio
Detalle de la conexión del LED y la resistencia
Detalle de la conexión de la placa Arduino UNO
PROGRAMACIÓN
¿Qué vamos a programar?, Vamos a cargar la librería TimerOne en nuestro Sketch (si no la tenemos añadida en la lista de librerías disponibles ahora mas abajo veremos como añadirla). Para probar nuestra placa emisora, esta vez vamos a escribir dos Sketch:
El primero se encargará de generar un tono por la salida 2 del Arduino UNO. Para generar la onda cuadrada que necesitamos solo tenemos que hacer pasar cíclicamente la salida de valor alto a bajo y alto de nuevo. Cuanto mas rápido lo haga, mas agudo será el sonido emitido. Vamos a usar un bucle While que se repetirá infinitamente hasta que reciba una señal por la entrada del pulsador. Dentro del bucle While tenemos las instruciones que pasan a alto y bajo la salida 2 y entre una y otra una orden delaymicroseconds que le indica el tiempo que tarda en realizar el cambio y al fin y al cabo la frecuencia que mandamos a la placa KY-006. Todos los bucles While con iguales menos el parametro delaymicroseconds, que cambiará para variar la frecuencia. La frecuencia que generamos se calcula: Uno dividido por la suma de los delaymicroseconds (en segundos) y el resultado será en Herzios. Por ejemplo, en el primer bucle While las instruciones delaymicroseconds tienen el valor de 3000 cada una de ellas, la suma 6000. 6000µs = 6ms = 0,006s por lo que 1/0,006 = 166,6Hz.
El pulsador hará que pasemos de un bucle al siguiente cíclicamente.
El segundo Sketch va a usar la librería TimerOne que gestiona fácilmente la configuración del Timer1 del Arduino UNO. Tener en cuenta que al programar directamente el Timer1 perdemos la función PWM de las salidas digitales 9 y 10. Lo que vamos a programar es que el Timer1 realice cíclicamente un disparo cada, por ejemplo 1ms. Este disparo genera una interrupción que ejecutará la función definida y volverá al programa. Las interrupciones siempre se ejecutan e interrumpen el programa actual para ser ejecutadas, por lo que la precisión de esta forma de generar la onda cuadrada será mayor.
Si no pulsamos genera una onda de 1Khz y si pulsamos una onda de 2Khz
Ahora vamos a añadir a nuestro IDE la librería TimerOne. No es necesario descargarla de internet por separado, ya que se puede descargar desde el gestor de librerías.
Pulsamos "Programa - Incluir Librería" y vemos que no tenemos la librería TimerOne
/*
* AFPT - Arduino Fácil Para Todos
*
* Prueba Arduino UNO + KY006
*
* Modulo_KY-006.ino
*
* www.fantasystudios.es/arduino
*
* Creado el 23 de Abril de 2020
* Por Manuel Peláez
*
*/
//Pines I/O
int altavoz = 2; //definimos el pin de salida al altavoz
int pulsador = 7; //definimos el pin de entrada del pulsador
//Variables
int estado_pulsador = 0; //variable que almacena el estado leido del pulsador
void setup() {
// put your setup code here, to run once:
pinMode(altavoz, OUTPUT); //configuramos el pin del altavoz como salida digital
pinMode(pulsador, INPUT); //configuramos el pin del pulsador como entrada digital
}
void loop() {
// put your main code here, to run repeatedly:
estado_pulsador = digitalRead (pulsador); //leemos el estado del pulsador y lo almacenamos
/* Descripcion del programa
Vamos a generar cuatro bucles WHILE. En cada uno vamos a generar un tono de salida
por el pin del altavoz.
Cada vez que pulsemos el pulsador, saldremos el bucle en el que estemos y pasaremos al siguiente
hasta volver al primero y asi indefinidamente. Hemos dejado un delay medio segundo entre bucles
para dar tiempo a soltar el pulsador y no saltemos dos bucles de golpe.
Vamos a describir el primer bucle WHILE y los demas son iguales, solo cambiando el valor del
delayMicroseconds para variar el periodo de la señal de salida y asi su frecuencia.
*/
//Este bucle generara una frecuencia de 166,6Hz
while (estado_pulsador == 0) { //el bucle se ejecutara mientras el pulsador este sin pulsar
digitalWrite (altavoz, HIGH); //subo a nivel alto la salida del altavoz
delayMicroseconds (3000); //espero 3000µseg (o 3ms). La mitad del periodo
digitalWrite (altavoz,LOW); //bajo a nivel bajo la salida del altavoz
delayMicroseconds (3000); //espero 3000µseg. La mitad que faltaba del periodo
estado_pulsador = digitalRead (pulsador); //leo el pulsador y almaceno su estado
}
delay(500); //pausa de 0,5seg para esperar a que soltemos el pulsador
estado_pulsador = 0; //reseteamos el estado leido del pulsador
//Este bucle generara una frecuencia de 250Hz
while (estado_pulsador == 0) {
digitalWrite (altavoz, HIGH);
delayMicroseconds (2000);
digitalWrite (altavoz,LOW);
delayMicroseconds (2000);
estado_pulsador = digitalRead (pulsador);
}
delay(500);
estado_pulsador = 0;
//Este bucle generara una frecuencia de 500Hz
while (estado_pulsador == 0) {
digitalWrite (altavoz, HIGH);
delayMicroseconds (1000);
digitalWrite (altavoz,LOW);
delayMicroseconds (1000);
estado_pulsador = digitalRead (pulsador);
}
delay(500);
estado_pulsador = 0;
//Este bucle generara una frecuencia de 1KHz
while (estado_pulsador == 0) {
digitalWrite (altavoz, HIGH);
delayMicroseconds (500);
digitalWrite (altavoz,LOW);
delayMicroseconds (500);
estado_pulsador = digitalRead (pulsador);
}
delay(500);
estado_pulsador = 0;
}
CÓDIGO ARDUINO - Modulo_KY-006.ino
CÓDIGO ARDUINO - Modulo_KY-006-Timer1.ino
/*
* AFPT - Arduino Fácil Para Todos
*
* Prueba Arduino UNO + KY006
*
* Modulo_KY-006-Timer1.ino
*
* www.fantasystudios.es/arduino
*
* Creado el 25 de Abril de 2020
* Por Manuel Peláez
*
*/
//Cargamos la libreria "TimerOne.h" para gestionar el Timer 1 del Arduino UNO
//Recordar que al programar el Timer1 perdemos la funcion PWM (analogWrite) de las salidas 9 y 10
#include <TimerOne.h>
//Pines I/O
int altavoz = 2; //definimos el pin de salida al altavoz
int pulsador = 7; //definimos el pin de entrada del pulsador
int estado_pulsador = 0; //variable que almacena el estado leido del pulsador
int estado_pulsador_anterior = 0; //variable que almacena el estado anterior a una nueva lectura
int estado_altavoz = 0; //variable que almacena el estado digital de la salida del altavoz
void setup() {
// put your setup code here, to run once:
pinMode(altavoz, OUTPUT); //configuramos el pin del altavoz como salida digital
pinMode(pulsador, INPUT); //configuramos el pin del pulsador como entrada digital
Timer1.initialize(500); //Inicializamos el Timer1 con un disparo cada 500µseg
Timer1.attachInterrupt(cambio_estado); //le indicamos al Timer1 que funcion tiene que ejecutar en cada disparo
Serial.begin(9600); //configuramos el puerto serie al IDE a 9600baudios
Serial.println("Inicializado Timer1"); //mandamos mesaje al visor serie del IDE
Serial.println("Sonando 1000Hz"); //mandamos mesaje al visor serie del IDE
}
//funcion que se ejecuta cada vez que Timer1 se dispara. Recordar que tiene que ser lo mas pequeña posible
void cambio_estado(void) {
estado_altavoz = !estado_altavoz; //cambio de estado la salida del altavoz
digitalWrite(altavoz, estado_altavoz); //envio el estado actual al pin donde esta conectado el altavoz KY-006
}
void loop() {
// put your main code here, to run repeatedly:
estado_pulsador = digitalRead(pulsador); //leo el estado del pulsador y lo almaceno
if (estado_pulsador != estado_pulsador_anterior) { //bucle detecta un cambio en el estado del pulsador
estado_pulsador_anterior = estado_pulsador; //almaceno el nuevo estado del pulsador
if (estado_pulsador) { //si el pulsador esta pulsado
Timer1.setPeriod(250); //disparo del Timer1 a 250µseg (500µseg = 2Khz)
Serial.println("Sonando 2000Hz"); //mandamos mesaje al visor serie del IDE
}
else { //si el pulsador no esta pulsado
Timer1.setPeriod(500); //disparo del Timer1 a 500µseg (1000µseg = 1Khz)
Serial.println("Sonando 1000Hz"); //mandamos mesaje al visor serie del IDE
}
}
delay(1); //con esto ganamos estabilidad
}
CÓDIGO ARDUINO - Modulo_KY-006-Timer1.ino
PRUEBA DEL MONTAJE
Vamos a probar el primer Sketch y estas son las capturas del osciloscopio:
Esta imagen es del primer Sketch (bucles While). Estamos viendo el primer bucle que deberia generar 166,6Hz y genera 165,3Hz. No está demasiado alejado del valor calculado.
Esta imagen es del primer Sketch (bucles While). Estamos viendo el segundo bucle que deberia generar 250Hz y genera 247,5Hz. Según aumentamos la frecuencia nos alejamos mas del valor calculado.
Esta imagen es del primer Sketch (bucles While). Estamos viendo el tercer bucle que deberia generar 500Hz y genera 493,7Hz. Nos hemos alejado aun mas del valor ideal.
Esta imagen es del primer Sketch (bucles While). Estamos viendo el cuarto bucle que deberia generar 1000Hz y genera 981,8Hz. El desfase ya llega a 18,2Hz. Si no deseamos mucha precisión podría valer este sistema de generar señales.
Esta imagen es del segundo Sketch (Timer1 e interrupciones). Estamos viendo la onda que se genera sin pulsar el pulsador que debería de ser de 1000Hz y genera 998,6Hz, solo 1,4Hz de desfase. Claramente este sistema de generar ondas o temporizando eventos es mas precisa.
Esta imagen es del segundo Sketch (Timer1 e interrupciones). Estamos viendo la onda que se genera al pulsar el pulsador que debería de ser de 2Khz y genera 1,997, solo 3Hz de desfase. Nuevamente la precisión es muy aceptable.
Video con todo el proceso completo de los 2 Sketch