KY-006

Esta placa emisora está basada en un zumbador o pequeño altavoz pasivo, y no necesita alimentación

Tendríamos a grandes rasgos una placa que:
- Es capaz de emitir sonido desde el pequeño altavoz
- El altavoz va conectado directamente a las patillas de la placa.
- No necesita alimentación de ningún tipo

CARACTERISTICAS

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

Pulsamos "Programa - Incluir Librería - Administrar Biliotecas"

Se abre el gestor de librerías y filtramos con "timerone" para buscar esta librería

Nos aparece la librería en su versión 1.1.0. Pulsamos Instalar

Comprobamos que la librería a aparecido


A continuación tenemos el código fuente del los dos Sketch terminados para consultarlo.

Podemos escribirlo copiándolo o descargarlo desde aquí

CÓDIGO ARDUINO - Modulo_KY-006.ino
/*
 * 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