Piezo apenas audible

4

Permítame comenzar diciendo que soy bastante nuevo en electrónica, así que sea amable;)

Puedo obtener tonos buenos y sólidos de mi piezo cuando no hay nada más conectado. Cuando lo conecto junto con mi teclado servo +, los tonos son tan bajos que no puedo escucharlos a menos que me acerque mucho. Supongo que el piezo no está recibiendo 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 adjunta, se mueve 90 grados, luego se desconecta y los LED cambian de rojo a verde.

Aquí está mi compilación:

Esquema:

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 piezo?

    
pregunta Steve

4 respuestas

2

El problema no es actual, sino voltaje. Los elementos piezo son inherentemente dispositivos de alto voltaje; existen aquellos que funcionarán de alguna manera a niveles lógicos e incluso podrían diseñarse para ello, pero serán más altos a un voltaje más alto hasta el punto en que se despolarizarán (o dependiendo de cómo estén montados, posiblemente se agrieten).

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

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

Si bien tu pregunta dice piezeo, y eso es lo que he respondido, es posible que no ayude a tu 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 piezo es un cristal de una cerámica especial que se deforma en respuesta a un campo eléctrico (normalmente está unido a un disco de metal para una mejor adaptación de impedancia al aire a la frecuencia de audio)     

respondido por el Chris Stratton
2

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 recuerdo correctamente, el pequeño regulador lineal (no disipado por calor) no es bueno para mucho más de 150 mA o algo así.
Una forma fácil de confirmar sería medir el riel de alimentación de + 5V y ver si se hunde (alcance o multímetro) cuando opera el servo y el zumbador (es decir, ejecuta su código de manera normal)
Si tiene un alcance, también puede verificar la salida del pin al que está conectado el zumbador.

No hay hoja de datos para el servo, pero pueden dibujar fácilmente unos cientos de mA.
Exactamente cuánta corriente está consumiendo el servo depende de la carga, solo debería consumir 10-20 mA cuando está inactivo, pero quizás 500 mA si se está manejando una carga grande. Una vez más, la única forma de averiguarlo es medirlo.

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

    
respondido por el Oli Glaser
1

¿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 en función de la frecuencia en la página 2. Tenga en cuenta que en el cuadro, 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 "intensidad percibida", especialmente cuando se trata de diferentes frecuencias, pero es una escala logarítmica, por lo que es bastante grande. Si desea intentar obtener detalles, consulte esta página , pero sería mucho más fácil probar 2 kHz. y ver cómo difiere.

    
respondido por el Jim Paris
1

¡Descubrí cómo hacer que un Piezo sea ruidoso después de demasiado tiempo con este problema! Puedes usar 5 V y obtienes un montón de ruido. El truco es agregar un autotransformador al circuito que puedes obtener en el almacén del dólar. Hice un instructivo en él aquí:

enlace

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

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

    
respondido por el hydronics

Lea otras preguntas en las etiquetas