Lassen Sie mich damit beginnen, dass ich ziemlich neu in der Elektronik bin, also seien Sie vorsichtig ;)
Ich kann gute, solide Töne von meinem Piezo bekommen, wenn nichts anderes angeschlossen ist. Wenn ich es neben meinem Servo + Tastatur anschließe, sind die Töne so leise, dass ich es nicht hören kann, es sei denn, ich komme ihm sehr nahe. Ich gehe davon aus, dass der Piezo nicht genug Strom erhält, aber ich weiß nicht, ob diese Annahme richtig ist oder wie das Problem behoben werden kann.
Der Piezo spielt bei jedem Tastendruck auf der Tastatur einen Ton ab. Sobald die richtige Kombination eingegeben wurde, wird das Servo befestigt, um 90 Grad bewegt, dann gelöst, und die LEDs wechseln von rot auf grün.
Hier mein Aufbau:
Schema:
Teile:
Funktion zum Abspielen von Tönen aufgerufen:
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);
}
}
Auf Tastendruck aufgerufen:
playTone(750, 500);
Vollständiger Code:
#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();
}
Wie bekomme ich die richtige Leistung vom Piezo?
Das Problem ist nicht der Strom, sondern die Spannung. Piezoelemente sind von Natur aus Geräte mit ziemlich hoher Spannung; Es gibt solche, die bei Logikpegeln einigermaßen funktionieren und möglicherweise sogar dafür ausgelegt sind, aber bei höherer Spannung bis zu dem Punkt lauter sind, an dem sie depolarisieren (oder je nach Montage möglicherweise knacken).
Einige der Niederspannungs-Piezo-Alarmgeräte, die keinen externen Oszillator benötigen, weil sie einen internen haben, nutzen das Resonanzverhalten, um die Spannung über die externe Versorgung zu erhöhen.
Darüber hinaus erzeugen Piezogeräte bei höheren Audiofrequenzen mehr Leistung als bei niedrigeren - sie können sich schnell bewegen, aber nicht sehr weit.
Während Ihre Frage Piezeo sagt, und das habe ich beantwortet, hilft das Ihrem Problem möglicherweise nicht wirklich. Ihr Link führt zum Datenblatt eines Magnetwandlers mit Spule, der eine ganz andere Art von Gerät ist. Ein Piezo ist ein Kristall aus einer speziellen Keramik, der sich als Reaktion auf ein elektrisches Feld verformt (normalerweise ist er mit einer Metallscheibe verbunden, um eine bessere Impedanzanpassung an Luft bei Audiofrequenz zu erreichen).
Okay, wenn Sie keine Interrupts verwenden (ich dachte, sie unterbrechen möglicherweise Ihre Tonroutine), dann scheint es, als würden Sie Ihre Stromversorgung überlasten.
Wenn es sich um einen Arduino handelt, ist der kleine (nicht gekühlte) Linearregler, wenn ich mich richtig erinnere, nicht für viel mehr als 150 mA oder so geeignet.
Eine einfache Möglichkeit zur Bestätigung wäre, die +5-V-Stromschiene zu messen und zu sehen, ob sie durchhängt (Oszilloskop oder Multimeter), wenn Sie das Servo und den Summer bedienen (dh Ihren Code wie gewohnt ausführen). Wenn Sie ein Oszilloskop haben, können Sie auch den Ausgang
überprüfen des Pins, an dem der Summer angeschlossen ist.
Es gibt kein Datenblatt für das Servo, aber sie können leicht ein paar hundert mA ziehen.
Wie viel Strom das Servo zieht, hängt von der Last ab, es sollte im Leerlauf vielleicht nur 10-20 mA ziehen, aber vielleicht 500 mA, wenn eine große Last gefahren wird. Auch hier ist der einzige Weg, dies herauszufinden, es zu messen.
Wenn man bedenkt, dass der Summer für 35 mA ausgelegt ist, ist es sowieso nicht ideal, ihn direkt vom Arduino-Pin anzusteuern, da er wahrscheinlich nur etwa 20 mA liefern kann, ohne dass die Ausgangsspannung abfällt (siehe Datenblatt für genaue Zahlen, ich habe noch nie einen Arduino verwendet). )
Viel besser wäre es, es mit einem Transistor anzusteuern oder einen Summer mit niedrigerem Strom zu verwenden (Piezos sind im Allgemeinen niedriger, obwohl Sie magnetische Typen mit sehr niedrigem Strom erhalten können).
Welche Frequenzen hast du probiert? Der von Ihnen verwendete Summer ist für den Betrieb mit 2048 Hz ausgelegt. Sein Datenblatt zeigt auf Seite 2 ein Diagramm der erwarteten Reaktion gegenüber der Frequenz. Beachten Sie aus diesem Diagramm, dass die erwartete Reaktion bei 200 Hz etwa 25 dB niedriger ist als die Reaktion bei 2 kHz – das ist ein großer Unterschied! Es ist schwierig, von „dB“ in „empfundene Lautstärke“ umzuwandeln, insbesondere wenn verschiedene Frequenzen beteiligt sind, aber es ist eine logarithmische Skala, also ziemlich groß. Wenn Sie versuchen möchten, ins Detail zu gehen, sehen Sie sich diese Seite an, aber viel einfacher wäre es, einfach 2 kHz auszuprobieren und zu sehen, wie es sich unterscheidet.
Ich habe herausgefunden, wie man einen Piezo laut macht, nachdem ich viel zu lange an diesem Problem herumgebastelt habe! Sie können 5 V verwenden und Sie erhalten eine Menge Rauschen. Der Trick besteht darin, der Schaltung einen Spartransformator hinzuzufügen, den Sie im Dollarspeicher erhalten können. Ich habe hier ein anweisbares dazu gemacht:
http://www.instructables.com/id/How-to-make-an-Arduino-driven-Piezo-LOUD/
Wenn jemand dieses Ein-Dollar-Ladenteil auf Mouser identifizieren kann, wäre das cool. tschüss, tom
Spezifikationen: Pin-1/2 ~ 154 Ohm Pin 2/3 ~ 8 Ohm. Nicht sicher über die Induktivität, obwohl ein ähnliches Projekt 91 mH und 2 mH verwendete, wie auf dem anweisbaren gezeigt.
Andreja Ko
Andreja Ko
Andreja Ko
Oli Glaser
Steve
Oli Glaser
Jim Paris
Jippie
Steve
Steve
Jim Paris
Steve
geometrisch