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:
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?
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)
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)
¿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.
¡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.
AndrejaKo
AndrejaKo
AndrejaKo
Oli Glaser
Steve
Oli Glaser
Jim París
yippie
Steve
Steve
Jim París
Steve
geométrico