Hallo zusammen An meinem Arduino hängt ein Piezo Buzzer, der über einen P-Channel MOSFET angesteuert wird. Leider ist durch diesen der Schaltzustand invertiert. Sobald der Pin nach dem Aufrufen der tone() Methode wieder auf Status LOW geht, liegt die Spannung am Piezo durchgehend an, da der MOSFET durchschaltet. Dasselbe natürlich auch mit der analogWrite() Methode. Hat jemand von euch eine Idee, wie nach dem Abspielen von tone() der Pin auf HIGH gesetzt wird? Eventuell kann die PWM invertiert werden? Hardware ist fix, da kann ich in meinen Setup nichts ändern. Es muss also softwareseitig gelöst werden. Vielen Dank!
Max schrieb: > liegt die Spannung am Piezo durchgehend an Das sollte einem Piezo recht egal sein. Max schrieb: > Eventuell kann die PWM invertiert werden? evtl. ja... Doku zum Timer lesen. Die Arduino Funktionen können das nicht. Max schrieb: > Hardware ist fix, da kann ich in meinen Setup nichts ändern. Es muss > also softwareseitig gelöst werden. Ein bisschen spät, dran... Aber so ist das halt, mit dem planen....
Max schrieb: > An meinem Arduino hängt ein Piezo Buzzer, der über einen P-Channel > MOSFET angesteuert wird. Leider ist durch diesen der Schaltzustand > invertiert. Sobald der Pin nach dem Aufrufen der tone() Methode wieder > auf Status LOW geht, liegt die Spannung am Piezo durchgehend an Bei einem Piezo-Schallwandler ist das völlig Wurscht. Es fließt kein Strom, auch wenn eine Spannung dauerhaft anliegt. > Es muss > also softwareseitig gelöst werden. Muss es nicht. Da es kein Problem gibt, muss auch keins gelöst werden...
c-hater schrieb: > Da es kein Problem gibt, muss auch keins gelöst werden... Ich höre aber ein leises "Rauschen/Pfeifen" und der Piezo wird nach einiger Zeit warm. Ich vermute, das Rauschen kommt von der Spannungsversorgung. Der Arduino hängt an meinem MacBook Pro. Hänge ich mein Board an ein anderes Netzteil, ist das Rauschen noch lauter. Der Piezo liegt direkt an den 5V des USB Anschlusses.
Nach Ende des Tones digitalWrite(pin#, HIGH) oder pinMode(pin#, INPUT) aufrufen.
Beitrag #5917968 wurde von einem Moderator gelöscht.
Mario M. schrieb: > Nach Ende des Tones digitalWrite(pin#, HIGH) oder pinMode(pin#, INPUT) > aufrufen. Das funktioniert leider nicht, da tone() asynchron ausgeführt wird.
Max schrieb: > da kann ich in meinen Setup nichts ändern. Es muss > also softwareseitig gelöst werden. Kommt mir sehr bekannt vor. Am Ende müssen es immer die Softwareentwickler ausbaden. Anschließend muss man sich dann auch noch nicht selten persönliche Kritik von Prüfern/Beratern gefallen lassen, die Keine Ahnung von der Entstehungsgeschichte haben.
Max schrieb: > Ich höre aber ein leises "Rauschen/Pfeifen" und der Piezo wird nach > einiger Zeit warm. Dann ist es kein Piezo Schallwandler.
Das der Piezo rauscht, liegt am Scheiß Netzteil, oder möglicherweise auch dran, das der Transistor nicht richtig angesteuert wird. Liegt der Transistor auch auf 5V? Warum ist der überhaupt da drin, einen Piepser anzutreiben sollte der Pin des ATmega auch so schaffen. Und ein Piezo der warm wird, da ist was im argen. Und zwar derbe. Die bei "Gehörsturz" umgesetzte Leistung ist so gering, das selbst da keine Erwärmung festzustellen ist. Wenn das bei "Stille" passiert, ist da was falsch.
>> Nach Ende des Tones digitalWrite(pin#, HIGH) oder pinMode(pin#, INPUT) >> aufrufen. > Das funktioniert leider nicht, da tone() asynchron ausgeführt wird. Dann musst du das eben zum richtigen Zeitpunkt machen. Oder die Tatsache ausnutzen, dass das Arduino Framework quell-offen ist. Sprich: Du kannst und darfst es modifizieren.
Hab mal so ein Modul aufgebrochen. Es scheint, doch ein Lautsprecher zu sein :-/ Eine kleine Kupferspule unterhalb eines piezoähnlichen Blech. Das nervt jetzt umso mehr. Stefanus F. schrieb: > Dann musst du das eben zum richtigen Zeitpunkt machen. Das wird die Lösung sein. Wie kann der Zeitpunkt zuverlässig ermittelt werden, wenn tone() asynchron ausgeführt wird?
Max schrieb: > Das wird die Lösung sein. Wie kann der Zeitpunkt zuverlässig ermittelt > werden, wenn tone() asynchron ausgeführt wird? Weiss ich jetzt nicht. Schau Dir die Quelltexte von Arduino an. Vielleicht wird am Ende des Tones irgendein globales Flag gesetzt, dass du abfragen kannst. Aber wenn du schon so weit gehst, kannst du vermutlich gleich den Code verändern, so dass der Pin nach Ende des Tones als Input umkonfiguriert wird.
So wie's aussieht, muss folgende Datei angepasst werden. https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Tone.cpp Vielen Dank für alle Antworten!
Wie groß ist der Basisvorwiderstand zum Treibertransistor? Was ist das für einer? Hier einen pnp-RET einsetzen, https://www.nexperia.com/products/bipolar-transistors/resistor-equipped-transistors-rets/rets-500-ma-single-double/PDTB113ZT.html den Basisvorwiderstand vom Board nehmen und dort einen (von der Baugröße her passenden) Kondensator einlöten. Oder der SW-Mann muss ran. Ich bade meine HW-Fehlerchen (wenns geht) gern selbst aus ;)
Max schrieb: > So wie's aussieht, muss folgende Datei angepasst werden. Ja. Ich würde mir die Stellen anschauen, wo "// keep pin low after stop" steht. Ich denke, genau dort kannst du den finalen Pegel am Pin umkehren.
Für alle, die das dann irgendwann brauchen werden. Code anpassen in Tone.cpp. Kommentierten Code auskommentieren und [PIN] ersetzen. Das ist schnell, unsauber und nur zum Testen. Ich werde meine Hardware anpassen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.