4 votos

Piezo apenas audible

Permítanme comenzar diciendo que soy bastante nuevo para la electrónica, tan gentil ;)

Soy capaz de obtener una buena, sólida tonos de mi piezoeléctrico cuando nada está conectado. Cuando me conecto con mi servo + teclado, los tonos son tan tranquila que yo no puede oír a menos que me pongo muy cerca de ella. Estoy suponiendo que el piezo no está recibiendo suficiente corriente, pero no sé si esta hipótesis es correcta, o cómo solucionar el problema.

La pieza reproduce un tono en cada pulsación de los botones en el teclado. Una vez que la correcta combinación ha sido introducido, el servo está conectado, se trasladó a 90 grados, luego separados, y el Led cambia de rojo a verde.

Aquí está mi versión:

Fritzing render

Esquema:

Schematic

Partes:

La función de llamada para la reproducción de los 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);
  }
}

Llama la 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 la salida correcta de la pieza?

2voto

SandeepJ Puntos 1339

Bueno, si usted no está utilizando las interrupciones (pensé que posiblemente fueron interrumpir su tono de rutina), entonces parece que la sobrecarga de la fuente de alimentación.

Si es un Arduino, entonces, si recuerdo correctamente el poco (no heatsinked) regulador lineal no es bueno para mucho más que 150mA o así.
Una manera fácil para confirmar sería medir la alimentación de +5V ferrocarril y a ver si se hunde (alcance o multímetro) cuando se hace funcionar el servo y el zumbador (es decir, ejecutar el código normal)
Si usted tiene un ámbito de aplicación también se puede comprobar que la salida del pin de la alarma está conectada.

No hay ninguna hoja de datos para el servo, pero se puede dibujar fácilmente un par de cientos de mA.
Exactamente cuánto actual del servo es el dibujo depende de la carga, sólo debe dibujar tal vez 10-20mA cuando está inactivo, pero tal vez 500mA si la conducción de una gran carga. De nuevo, la única manera de saberlo es a medida.

Teniendo en cuenta el zumbador está clasificado para 35mA, no es lo ideal a la unidad directamente desde el pin de Arduino de todos modos, como puede probablemente la única fuente de ~20mA o sin la tensión de salida flacidez (revise la hoja de datos de las cifras exactas, nunca he usado un Arduino)
Mucho mejor sería la unidad mediante un transistor, o el uso de una corriente inferior zumbador (piezo son generalmente más bajos, aunque se puede llegar muy baja corriente magnética tipos)

2voto

Andrew Walker Puntos 9038

El problema no es actual, pero la tensión. Piezo elementos son inherentemente bastante dispositivos de alto voltaje; están aquellos que trabajar un poco en la lógica de los niveles, e incluso puede ser diseñado para él, pero que será más fuerte a mayor tensión hasta el punto de que despolarizar (o dependiendo de cómo montado, posiblemente de la grieta).

Algunos de los de baja tensión piezo dispositivos de alerta que no necesita un oscilador externo porque tienen una interna que explotar el comportamiento de resonancia para aumentar la tensión por encima de la oferta externa.

Además, piezo dispositivos generarán más de salida a altas frecuencias de audio que a los más bajos - que puede actuar con rapidez, pero no muy lejos.

Mientras tu pregunta dice piezeo, y eso es lo que me ha contestado, que no puede en realidad ayudar a su problema. Su enlace es la hoja de datos para un transductor magnético con una bobina, que es completamente diferente tipo de dispositivo. Un piezoeléctrico es un cristal de una cerámica especial que se deforma en respuesta a un campo eléctrico (normalmente está ligada a un disco de metal para una mejor adaptación de impedancia al aire en la frecuencia de audio)

1voto

Jim Paris Puntos 2310

Lo de las frecuencias que han intentado? El timbre que está utilizando está diseñado para ser conducido en 2048 Hz. Su hoja de datos muestra un gráfico de la respuesta esperada frente a la frecuencia en la página 2. Nota de que el gráfico que la respuesta esperada a 200 Hz es de alrededor de 25 dB menor que la respuesta a 2 kHz-esa es una gran diferencia! Es difícil convertir de "dB" a "volumen percibido", en particular cuando diferentes frecuencias están involucrados, pero es una escala logarítmica, por lo que es bastante grande. Si quieres probar a entrar en detalles, consulte esta página, pero mucho más fácil sería simplemente el intento de 2 kHz y ver cómo es diferente.

1voto

user1587329 Puntos 1

He descubierto cómo hacer un Piezo voz alta después de demasiado tiempo jugando con este problema! Usted puede utilizar 5V y se obtiene una tonelada de ruido.. El truco es agregar un Auto-transformador para el circuito que usted puede conseguir en la tienda de dólar. Hice un instructable sobre ella aquí:

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

Si alguien puede identificar este almacén del dólar parte en Mouser, que sería genial. saludos, tom

especificaciones: Pin-1/2 ~154 ohmios Pin 2/3 ~ 8 ohmios. No estoy seguro de la inductancia aunque un proyecto similar al que se utiliza 91mH y 2mH como se muestra en el instructable.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X