Piezo apenas audible

Permítanme comenzar diciendo que soy bastante nuevo en electrónica, así que sean amables;)

Puedo obtener buenos tonos sólidos de mi piezo cuando no hay nada más conectado. Cuando lo conecto junto con mi servo + teclado, los tonos son tan bajos que no puedo escucharlo a menos que me acerque mucho. Supongo que el piezoeléctrico no recibe suficiente corriente, pero no sé si esa suposición es correcta o cómo solucionar el problema.

El piezo reproduce un tono con cada pulsación de los botones del teclado. Una vez que se ha ingresado la combinación correcta, el servo se conecta, se mueve 90 grados, luego se desconecta y los LED cambian de rojo a verde.

Aquí está mi construcción:

render fritzing

Esquemático:

Esquemático

Partes:

Función llamada para reproducir tonos:

void playTone(long duration, int freq)
{
  duration *=1000;
  int period = (1.0 / freq) * 1000000;
  long elapsed_time = 0;
  while(elapsed_time < duration)
  {
    digitalWrite(pinSpeaker, HIGH);
    delayMicroseconds(period / 2);
    digitalWrite(pinSpeaker, LOW);
    elapsed_time += (period);
  }
}

Llamado al presionar una tecla:

playTone(750, 500);

Código completo:

#include <Servo.h>
#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 3;
const byte PINLENGTH = 4;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 2};
byte colPins[COLS] = {8, 7, 6};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char PIN[PINLENGTH]={'2','5','8','0'};
char attempt[PINLENGTH]={0,0,0,0};
int z=0;

Servo lock;
int pos=0;

int pinSpeaker=11;

int redLED = 12;
int grnLED = 13;
boolean armed = true;

void setup()
{
  pinMode(pinSpeaker, OUTPUT);
  pinMode(redLED, OUTPUT);
  pinMode(grnLED, OUTPUT);
  Serial.begin(9600);
  resetLock();
  Serial.println("* SYSTEM ARMED *");
  Serial.println("  Ready...");
}

void resetLock()
{
  lock.attach(9);
  for(pos=20; pos>0; pos-=1)
  {
    lock.write(pos);
    delay(15);
  }
  lock.detach();
}

void closeLock()
{
  lock.attach(9);
  for(pos=lock.read(); pos>=1; pos-=1)
  {
    lock.write(pos);
    delay(15);
  }
  lock.detach();
}

void openLock()
{
  lock.attach(9);
  for(pos=lock.read(); pos<100; pos+=1)
  {
    lock.write(pos);
    delay(15);
  }
  lock.detach();
}

void correctPIN()
{
  armed=false;
  playTone(750, 2500);
  openLock();
  Serial.println("* SYSTEM DISARMED *");
  Serial.println("  Ready...");
}

void incorrectPIN()
{
  playTone(750, 1000);
  Serial.println(" * Incorrect PIN *");
  z=0;
  Serial.println("  Ready...");
}

void checkPIN()
{
  int correct=0;
  for (int q=0; q<PINLENGTH; q++) {
    if (attempt[q]==PIN[q]) {
      correct++;
    }
  }

  if (correct==PINLENGTH) {
    correctPIN();
  } else {
    incorrectPIN();
  }

  for (int zz=0; zz<PINLENGTH; zz++)
  {
    attempt[zz]=0;
  }
}

void readKeypad()
{
  char key = keypad.getKey();
  if (key != NO_KEY)
  {
    switch(key)
    {
    case '*':
      if(armed==false){
        armed=true;
        playTone(750, 1000);
        closeLock();
        Serial.println("* SYSTEM ARMED *");
        Serial.println("  Ready...");
      }
      z=0;
      break;
    case '#':
      if(armed==true){
        Serial.print("\n");
        delay(100);
        checkPIN();
      }
      break;
    default:
      if(armed==true){
        playTone(250, 2000);
        Serial.print(key);
        attempt[z]=key;
        z++;
      }
    }
  }
}

void playTone(long duration, int freq)
{
  duration *=1000;
  int period = (1.0 / freq) * 1000000;
  long elapsed_time = 0;
  while(elapsed_time < duration)
  {
    digitalWrite(pinSpeaker, HIGH);
    delayMicroseconds(period / 2);
    digitalWrite(pinSpeaker, LOW);
    elapsed_time += (period);
  }
}

void loop()
{
  if(armed==true)
  {
    digitalWrite(grnLED, LOW);
    digitalWrite(redLED, HIGH);
  } else {
    digitalWrite(redLED, LOW);
    digitalWrite(grnLED, HIGH);
  }
  readKeypad();
}

¿Cómo puedo obtener una salida adecuada del piezoeléctrico?

Es bueno que te vincules al render. Ahora abra Fritzing, vaya a la pestaña del esquema y publique un enlace al esquema para que podamos editarlo.
¿También tienes alguna información sobre el servo o el piezoeléctrico? Los números de pieza serían buenos y los enlaces a las hojas de datos aún mejores.
¿Puedes publicar la sección del código que estás usando para generar tonos para el piezoeléctrico? El microcontrolador en Arduino debería poder proporcionar suficiente corriente para que el piezoeléctrico funcione correctamente (el piezoeléctrico utiliza como máximo 30 mA, mientras que el pin de salida puede proporcionar hasta 40 mA antes de dañarse).
¿Está utilizando interrupciones en el resto de su código?
No, no estoy usando interrupciones (de hecho, estaba leyendo sobre ellas por primera vez hace unos minutos). ¿Es esta una situación en la que serían útiles?
Pueden depender de lo que esté haciendo su código, ya que, por ejemplo, pueden liberar el código del sondeo de eventos en un bucle para hacer otras cosas. Por ejemplo, si establece una interrupción en el cambio de un pin de botón, no tiene que desperdiciar ciclos buscando el cambio, la interrupción se encargará de "supervisar" esto, luego la rutina de interrupción se ocupa de ello según sea necesario. De todos modos, la razón por la que pregunté aquí es que en realidad puede haber causado problemas si había configurado una interrupción incorrectamente y estaba impidiendo que su código principal se ejecutara sin problemas.
En otros comentarios, sigues mencionando cosas como "... no tan fuerte como cuando el piezo era lo único conectado" y "el piezo suena muy bien cuando no hay nada más conectado". Lo que claramente significa que el piezo está funcionando bien. Tendrá que explicar más sobre lo que está pasando con su hardware y qué está cambiando específicamente entre cuando suena fuerte y cuando no. Podrían ser problemas con su fuente de alimentación que no proporciona suficiente corriente, alguna interacción de tiempo en el código, ¡quién sabe! Necesitamos más información.
¿Está el piezo colgando al aire libre? Si es así, presiónalo contra tu escritorio para usarlo como placa de sonido.
@JimParis: Lo único que cambió es la introducción del servo y el teclado. El cableado del piezo no cambia. Cuando se presiona una tecla en el teclado, el dígito se almacena en una matriz, se reproduce el tono y la matriz se compara con el código almacenado. El servo no se activa hasta que se haya ingresado la secuencia correcta.
@jippie: No, está conectado a la placa de prueba, que está sobre el escritorio.
"Lo único que cambió es la introducción del servo y el teclado". ¿Simplemente los conectó o también cambió el código? Realmente necesita proporcionarnos toda la información. Compartir el código también es crucial si está cambiando el código entre cuando funciona y cuando no funciona.
He añadido el código completo del proyecto.
Intente esto: obtenga una fuente de alimentación de 6v CC para el arduino, o coloque 4 baterías aa en serie y conecte el positivo a vin y el negativo a GND. Cambie la conexión de alimentación al servo de 5v en el arduino a VIN en el arduino. Ahora mira si el piezo es ruidoso.

Respuestas (4)

El problema no es la corriente, sino el voltaje. Los elementos piezoeléctricos son dispositivos inherentemente de bastante alto voltaje; hay algunos que funcionarán un poco a niveles lógicos e incluso pueden estar diseñados para ello, pero serán más fuertes a un voltaje más alto hasta el punto en que se despolaricen (o dependiendo de cómo estén montados, es posible que se rompan).

Algunos de los dispositivos de alerta piezoeléctrica de bajo voltaje que no necesitan un oscilador externo porque tienen uno interno aprovechan el comportamiento de resonancia para aumentar el voltaje por encima del suministro externo.

Además, los dispositivos piezoeléctricos generarán más salida en frecuencias de audio más altas que en las más bajas: pueden moverse rápidamente, pero no muy lejos.

Si bien su pregunta dice piezeo, y eso es lo que he respondido, es posible que eso no ayude a resolver su problema. Su enlace es a la hoja de datos de un transductor magnético con una bobina, que es un tipo de dispositivo completamente diferente. Un piezoeléctrico es un cristal de una cerámica especial que se deforma en respuesta a un campo eléctrico (por lo general, está unido a un disco de metal para una mejor coincidencia de impedancia con el aire en la frecuencia de audio)

Lo siento por el mal enlace. Tomé el número de producto incorrecto inicialmente y corregí el enlace cuando lo descubrí. Parece que fuiste demasiado rápido para mí;) El enlace correcto está aquí
Además, el piezo suena muy bien cuando no hay nada más conectado. Estoy alimentando 5v a través de USB.
Pruebe con una frecuencia más alta. También intente conectar las otras partes del circuito un cable a la vez y vea cuándo pierde la salida.
¡Ay! Copié el mismo enlace incorrecto. Edité la pregunta con el enlace correcto: chinasound.com/Product/CET/CET12A3.5-42-2.0R.htm
@Steve, esa podría ser la parte que realmente tienes, pero tampoco es un piezoeléctrico. Al igual que la parte sparkfun, es un transductor magnético. Los piezos (para uso audible en el aire) tienden a tener un diámetro mayor, como la imagen del tutorial de arduino. Cuando los conjuntos generadores de ruido están desnudos, son un disco delgado de latón con una capa de cerámica piezoeléctrica gris-blanca sobre ellos, así: dlnmh9ip6v2uc.cloudfront.net/images/products/10293=02.jpg
Ah, definitivamente esa no es la parte que tengo, aunque el kit Sparkfun identifica el transductor como piezoeléctrico. Las marcas en la parte posterior son "CET12A3.5", que es lo que me llevó al enlace actualizado que proporcioné. Aquí hay una foto de eso . Mirando hacia atrás en la página de Sparkfun, parece que el primer enlace puede haber sido correcto.
Hasta cierto punto, un transductor magnético es para un inductor lo que un transductor piezeo es para un capacitor, por lo que si mide una resistencia de CC de decenas de ohmios a través de él a un voltaje de prueba bajo, es probable que sea magnético. La geometría también sugiere que: un piezeo tan pequeño tendría una frecuencia de resonancia extremadamente alta. Si desea experimentar con un disco piezoeléctrico, busque el pequeño artilugio de alarma de interruptor magnético de celda de moneda en una tienda de dólar; dentro puede encontrar un interruptor de lengüeta sin sellar, un disco piezoeléctrico, un inductor y un transistor. Pero para uno con especificaciones, diríjase a un proveedor de productos electrónicos.

De acuerdo, si no está utilizando interrupciones (pensé que posiblemente estaban interrumpiendo su rutina de tono), entonces parece que está sobrecargando su fuente de alimentación.

Si es un Arduino, entonces, si no recuerdo mal, el pequeño regulador lineal (no disipador de calor) no es bueno para mucho más de 150 mA más o menos.
Una manera fácil de confirmar sería medir el riel de alimentación de +5 V y ver si se hunde (alcance o multímetro) cuando opera el servo y el zumbador (es decir, ejecute su código normalmente) Si tiene un alcance, también puede verificar la
salida del pin al que está conectado el zumbador.

No hay una hoja de datos para el servo, pero pueden extraer fácilmente unos pocos cientos de mA.
La cantidad exacta de corriente que consume el servo depende de la carga, solo debería consumir entre 10 y 20 mA cuando está inactivo, pero quizás 500 mA si maneja una carga grande. Una vez más, la única forma de averiguarlo es medirlo.

Teniendo en cuenta que el zumbador tiene una capacidad nominal de 35 mA, no es ideal conducirlo directamente desde el pin Arduino de todos modos, ya que probablemente solo pueda generar ~ 20 mA más o menos sin que el voltaje de salida disminuya (consulte la hoja de datos para ver las cifras exactas, nunca he usado un Arduino )
Mucho mejor sería conducirlo usando un transistor, o usar un zumbador de corriente más baja (los piezoeléctricos son generalmente más bajos, aunque puede obtener tipos magnéticos de corriente muy baja)

Agregué un transistor (P2N2222A), con la base conectada al pin 11 en una resistencia de 10Kohm, el colector conectando el piezoeléctrico a 5v y el emisor a tierra. El piezo está produciendo el mismo volumen que antes. No estoy seguro de estar usando las conexiones adecuadas... es una modificación de un ejemplo que encontré.
El transistor no lo arreglará si el problema es el voltaje de suministro, primero debe confirmar y arreglar esto. ¿Tiene un multímetro y / o alcance? ¿Puede medir el voltaje de suministro (la salida del regulador de +5 V, no la entrada del adaptador; puede medirlo en el pin del cabezal del conector de +5 V) con y sin el servo/teclado conectado? Háganos saber lo que lee.
En realidad, nunca he aprendido a usar uno (como dije, recién estoy comenzando). Tengo un multímetro analógico de 19 rangos que compré en RadioShack, pero la guía del usuario apesta bastante... :/
En una prueba simple con una batería AA, obtuve una lectura de 2.5v con el dial configurado en el rango de 5v. Esto es consistente con una de las malas críticas que leí en este mismo medidor. A menos que ambos lo estemos usando incorrectamente, parece que el medidor es basura y no será de mucha ayuda en mi situación :(
Ah bien. Realmente necesita conseguir un multímetro decente y un alcance básico si planea hacer este tipo de cosas a menudo (parece que puede serlo). Estas herramientas le dan una idea del dominio electrónico, de lo contrario, está limitado a conjeturas. , prueba y error. El alcance se convertirá rápidamente en su herramienta más utilizada y valiosa.
Parece que un viaje a la tienda de electrónica está en mi futuro cercano :)

¿Qué frecuencias has probado? El zumbador que está utilizando está diseñado para funcionar a 2048 Hz. Su hoja de datos muestra un gráfico de la respuesta esperada frente a la frecuencia en la página 2. Tenga en cuenta en ese gráfico que la respuesta esperada a 200 Hz es aproximadamente 25 dB más baja que la respuesta a 2 kHz, ¡esa es una gran diferencia! Es difícil convertir de "dB" a "sonoridad percibida", especialmente cuando se trata de diferentes frecuencias, pero es una escala logarítmica, por lo que es bastante grande. Si quiere intentar entrar en detalles, vea esta página, pero mucho más fácil sería simplemente probar 2 kHz y ver cómo difiere.

Lo siento si sueno como un novato total aquí... Su explicación tiene mucho sentido para mí, pero no estoy seguro de cómo está calculando Hz. Aumenté la frecuencia en mis parámetros de función a 2000, y obtengo una respuesta mucho más "fuerte" del piezoeléctrico, pero todavía no es tan fuerte como cuando el piezoeléctrico era lo único conectado. Con la función que estoy usando, ¿cómo puedo calcular el rango de frecuencia máximo?
La hoja de datos piezoeléctricos que pude encontrar en sparkfun es para una familia de dispositivos, y la frecuencia de resonancia más baja es de 2 KHz, otras suben a 6. Así que sigue subiendo. Considere hacer un boceto que escuche en la serie y responda a las teclas +/- enviadas desde el monitor en serie, imprimiendo los nuevos valores de conteo (probablemente no necesite preocuparse por la frecuencia real)

¡Descubrí cómo hacer que un Piezo suene fuerte después de demasiado tiempo jugando con este problema! Puedes usar 5V y obtienes una tonelada de ruido. El truco es agregar un Auto-transformador al circuito que puedes conseguir en la tienda de dólar. Hice un instructable aquí:

http://www.instructables.com/id/How-to-make-an-Arduino-driven-Piezo-LOUD/

Si alguien puede identificar esta parte de la tienda de dólar en Mouser, sería genial. salud, tom

especificaciones: Pin-1/2 ~154 ohms Pin 2/3 ~ 8ohms. No estoy seguro de la inductancia, aunque un proyecto similar usó 91mH y 2mH como se muestra en el instructable.