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:
Esquema:
Partes:
- Servo: Micro A0090 Sparkfun página del producto
- Piezoeléctrico: CEM-1203 Hoja de datos
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?