Piezo kaum hörbar

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:

Fritzing rendern

Schema:

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?

Schön, dass du den Render verlinkt hast. Öffnen Sie nun Fritzing, gehen Sie zur Registerkarte Schaltplan und posten Sie einen Link zum Schaltplan, damit wir ihn bearbeiten können.
Hast du auch irgendwelche Informationen über das Servo oder den Piezo? Teilenummern wären gut und Links zu Datenblättern noch besser.
Können Sie den Abschnitt des Codes posten, den Sie verwenden, um Töne für das Piezo zu erzeugen? Der Mikrocontroller in Arduino sollte in der Lage sein, genügend Strom zu liefern, damit der Piezo richtig funktioniert (Piezo verbraucht höchstens 30 mA, während der Ausgangspin bis zu 40 mA liefern kann, bevor er beschädigt wird).
Verwenden Sie Interrupts im Rest Ihres Codes?
Nein, ich verwende keine Interrupts (ich habe tatsächlich erst vor ein paar Minuten zum ersten Mal darüber gelesen). Ist dies eine Situation, in der sie nützlich wären?
Sie können davon abhängen, was Ihr Code tut, da sie beispielsweise den Code von der Abfrage von Ereignissen in einer Schleife befreien können, um andere Dinge zu tun. Wenn Sie beispielsweise einen Interrupt bei Änderung für einen Tastenstift festlegen, müssen Sie keine Zyklen für die Abfrage der Änderung verschwenden, der Interrupt kümmert sich darum, dies zu "überwachen", und die Interrupt-Routine behandelt ihn nach Bedarf. Wie auch immer, der Grund, warum ich hier gefragt habe, ist, dass es möglicherweise tatsächlich Probleme verursacht hat, wenn Sie einen Interrupt falsch eingestellt hatten und es Ihren Hauptcode daran gehindert hat, reibungslos zu laufen.
In anderen Kommentaren erwähnst du immer wieder Dinge wie "...nicht annähernd so laut wie wenn nur der Piezo angeschlossen wäre" und "der Piezo klingt toll wenn sonst nichts angeschlossen ist". Was eindeutig bedeutet, dass der Piezo gut funktioniert. Sie müssen mehr darüber erklären, was mit Ihrer Hardware los ist und was Sie genau ändern, wenn es laut klingt und wann nicht. Es könnten Probleme mit Ihrer Stromversorgung sein, die nicht genug Strom liefert, einige Timing-Interaktionen im Code, wer weiß! Wir brauchen mehr Informationen.
Hängt der Piezo in freier Luft? Wenn ja, drücken Sie es gegen Ihren Schreibtisch, um es als Soundboard zu verwenden.
@JimParis: Das einzige, was sich geändert hat, ist die Einführung des Servos und der Tastatur. Die Beschaltung des Piezos ist unverändert. Wenn eine Taste auf der Tastatur gedrückt wird, wird die Ziffer in einem Array gespeichert, der Ton wird abgespielt und das Array wird mit dem gespeicherten Code verglichen. Das Servo wird erst aktiviert, wenn die richtige Sequenz eingegeben wurde.
@jippie: Nein, es ist am Steckbrett befestigt, das auf dem Schreibtisch steht
"Das einzige, was sich geändert hat, ist die Einführung des Servos und der Tastatur" - Sie haben sie einfach eingesteckt oder auch den Code geändert? Sie müssen uns wirklich alle Informationen zur Verfügung stellen. Das Teilen des Codes ist auch entscheidend, wenn Sie den Code ändern, wenn er funktioniert und wenn er nicht funktioniert.
Ich habe den vollständigen Code des Projekts hinzugefügt
Versuchen Sie Folgendes: Besorgen Sie sich eine 6-V-Gleichstromversorgung für das Arduino oder legen Sie 4 AA-Batterien in Reihe und verbinden Sie positiv mit Vin und negativ mit GND. Ändern Sie die Stromverbindung zum Servo von 5 V auf dem Arduino auf VIN auf dem Arduino. Sehen Sie nun, ob der Piezo laut ist.

Antworten (4)

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).

Entschuldigung für den schlechten Link. Ich habe anfangs die falsche Produktnummer genommen und den Link korrigiert, als ich ihn entdeckte. Anscheinend warst du etwas zu schnell für mich ;) Der richtige Link ist hier
Außerdem klingt der Piezo großartig, wenn nichts anderes angeschlossen ist. Ich füttere 5V über USB.
Versuchen Sie es mit einer höheren Frequenz. Versuchen Sie auch, die anderen Teile der Schaltung drahtweise anzuschließen, und sehen Sie, wann Sie den Ausgang verlieren.
Ach! Habe den gleichen falschen Link kopiert. Ich habe die Frage mit dem richtigen Link bearbeitet: chinasound.com/Product/CET/CET12A3.5-42-2.0R.htm
@Steve, das könnte das Teil sein, das Sie tatsächlich haben, aber es ist auch kein Piezo. Wie der Sparkfun-Teil ist es ein magnetischer Wandler. Piezos (für den hörbaren Gebrauch in Luft) haben tendenziell einen größeren Durchmesser, wie das Arduino-Tutorial-Bild. Wenn die geräuscherzeugenden Baugruppen blank sind, handelt es sich um eine dünne Messingscheibe mit einer grau-weißen Piezokeramikschicht darauf, wie hier: dlnmh9ip6v2uc.cloudfront.net/images/products/10293=02.jpg
Ah, das ist definitiv nicht das Teil, das ich habe, obwohl das Sparkfun-Kit den Wandler als Piezo identifiziert. Die Markierungen auf der Rückseite sind "CET12A3.5", was mich zu dem aktualisierten Link führte, den ich bereitgestellt habe. Hier ist ein Bild davon . Rückblickend auf die Sparkfun-Seite scheint es, dass der erste Link tatsächlich richtig gewesen sein könnte.
Bis zu einem gewissen Grad ist ein magnetischer Wandler für einen Induktor das, was ein Piezeo-Wandler für einen Kondensator ist. Wenn Sie also einen Gleichstromwiderstand von mehreren zehn Ohm bei einer niedrigen Testspannung messen, ist er wahrscheinlich magnetisch. Die Geometrie legt auch nahe, dass - ein so kleines Piezeo eine extrem hohe Resonanzfrequenz hätte. Wenn Sie mit einer Piezo-Scheibe experimentieren möchten, suchen Sie in einem Dollar-Laden nach dem kleinen Knopfzellen-Magnetschalter-Alarm-Gizmo - darin finden Sie möglicherweise einen nicht versiegelten Reed-Schalter, eine Piezo-Scheibe, eine Induktivität und einen Transistor. Aber für einen mit Spezifikationen gehen Sie zu einem Elektroniklieferanten.

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).

Ich habe einen Transistor (P2N2222A) hinzugefügt, wobei die Basis mit Pin 11 eines 10-kOhm-Widerstands verbunden ist, der Kollektor den Piezo mit 5 V überbrückt und der Emitter mit Masse verbunden ist. Der Piezo erzeugt die gleiche Lautstärke wie zuvor. Ich bin mir nicht sicher, ob ich die richtigen Verbindungen verwende ... es ist eine Modifikation eines Beispiels, das ich gefunden habe.
Der Transistor wird es nicht beheben, wenn das Problem die Versorgungsspannung ist, Sie müssen dies zuerst bestätigen und beheben. Hast du ein Multimeter und/oder Oszilloskop? Können Sie die Versorgungsspannung (den +5-V-Reglerausgang, nicht den Adaptereingang - Sie können sie am +5-V-Anschlussstift messen) mit und ohne angeschlossenem Servo / Tastenfeld messen? Lassen Sie uns wissen, was Sie gelesen haben.
Ich habe nie wirklich gelernt, einen zu benutzen (wie gesagt, ich fange gerade erst an). Ich habe ein analoges Multimeter mit 19 Bereichen, das ich von RadioShack abgeholt habe, aber die Bedienungsanleitung ist ziemlich schlecht ... : /
In einem einfachen Test mit einer AA-Batterie erhielt ich einen Messwert von 2,5 V, wobei das Zifferblatt auf den 5-V-Bereich eingestellt war. Dies stimmt mit einer der schlechten Bewertungen überein, die ich auf demselben Messgerät gelesen habe. Wenn wir es nicht beide falsch verwenden, sieht es so aus, als wäre das Messgerät Schrott und wird in meiner Situation nicht viel helfen :(
Ah, okay. Sie müssen sich wirklich ein anständiges Multimeter und ein einfaches Oszilloskop besorgen, wenn Sie vorhaben, so etwas oft zu tun (es hört sich so an, als würden Sie es tun). Diese Tools geben Ihnen einen Einblick in die elektronische Domäne, ansonsten sind Sie auf Vermutungen beschränkt , Versuch und Irrtum. Das Zielfernrohr wird schnell zu Ihrem meistgenutzten und wertvollsten Werkzeug.
Sieht so aus, als ob ein Ausflug in den Elektronikladen in naher Zukunft ansteht :)

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.

Tut mir leid, wenn ich hier wie ein totaler Noob klinge ... Ihre Erklärung macht für mich absolut Sinn, aber ich bin mir nicht sicher, wie Sie Hz berechnen. Ich habe die Frequenz in meinen Funktionsparametern auf 2000 erhöht und erhalte eine viel "lautere" Antwort vom Piezo, aber es ist immer noch nicht annähernd so laut wie als das Piezo das einzige angeschlossene Gerät war. Wie kann ich mit der von mir verwendeten Funktion den maximalen Frequenzbereich berechnen?
Das Piezo-Datenblatt, das ich bei sparkfun finden konnte, ist für eine Familie von Geräten, und die niedrigste Resonanzfrequenz beträgt 2 kHz, andere gehen bis zu 6. Gehen Sie also weiter höher. Erwägen Sie, eine Skizze zu erstellen, die auf die Serie abhört und auf +/- Tasten reagiert, die vom seriellen Monitor gesendet werden, und die neuen Zählwerte druckt (Sie müssen sich wahrscheinlich nicht um die tatsächliche Frequenz kümmern).

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.