Piezo

Inhalt

  • Piezo-Buzzer als einfaches Ton-Ausgabe-Gerät
  • tone -Funktion

Einführung

Die Ausgabe von akustischen Informationen – etwa Signaltöne – ist in vielen Anwendungen selbstverständlich. Das Gehör hat nämlich die wichtige Eigenschaft, dass es ungerichtet ist. Das bedeutet, es nimmt auch Schall wahr, wenn wir nicht direkt auf das schallerzeugende Element konzentriert sind. Deshalb kann es uns leicht auf diverse Dinge, wie etwa Fehlfunktionen, aufmerksam machen, auch wenn wir nicht auf das Gerät konzentriert sind.

Eine sehr günstige (und daher oft eingesetzte Methode) um Töne zu erzeugen ist die Verwendung eines Piezo-Elemements.

Der Piezoelektrische Effekt

Der piezoelektrische Effekt besagt, dass an gewissen Materialien eine elektrische Spannung auftritt, wenn man diese mechanisch verformt. Umgekehrt  bewirkt das Anlegen einer elektrischen Spannung an diesen Elementen eine mechanische Verformung (inverser piezoelektrischer Effekt). Dieser Effekt kann sowohl als Sensor (Druck) als auch Aktor (Schallerzeugung, Vibration) eingesetzt werden.

Hier wird ein Piezo-Element als Schallerzeuger (Summer) verwendet.

Beispiel: toneMelody

Im folgenden Beispiel wird ein Piezo als Klangerzeuger für Melodien verwendet.

Der Code für dieses Beispiel ist unter File / Examples / 02.Digital / toneMelody zu finden. Eine detaillierte Beschreibung des Beispiels findet man auf der Arduino-Webseite.

Die tone -Funktion

Die tone -Funktion erzeugt ein rechteckiges Signal (HIGH-LOW-HIGH-LOW…) mit einer bestimmten Frequenz für eine bestimmte Dauer. Intern wird hierfür ein Timer verwendet. Timer sind Routinen, die der Mikrocontroller zur Verfügung stellt, um Abläufe mit zeitlicher Relevanz steuern zu können. (Intern werden diese Timer auch verwendet um die Pulsweitenmodulation zu kontrollieren). Da die Anzahl der verfügbaren Timer am Arduino begrenzt ist, kann immer nur ein Ton an einem Pin ausgegeben werden. Soll die tone-Funktion an einem anderen Pin verwendet werden, ist zunächst für den ersten Pin die Funktion noTone  aufzurufen.

Weiters ist zu beachten, dass mit der Verwendung der Funktion tone  am Arduino UNO die Pulsweitenmodulation für Pins 3 und 11 gestört wird. Ursache hierfür ist, dass tone  intern denselben Timer verwendet, der an diesen Pins das PWM-Signal erzeugt.

Weiterführende Links

Drehencoder

Inhalt

  • Dreh-Encoder als Endlos-Regler

Einführung

Dreh-Encoder sind Input-Module, die endlos in die eine oder andere Richtung gedreht werden können (im Unterschied zu Potentiometern, die in ihrer Drehung begrenzt sind). Sie werden überall dort eingesetzt, wo die absolute Dreh-Ausrichtung nicht ausschlaggebend ist, sondern nur die Anzahl der zurückgelegten Drehschritte (sie werden daher auch als Inkrementalgeber bezeichnet).

Funktionsweise von Drehncodern

Im Gegensatz zu Potentiometern geben Encoder keine analoge Spannung, sondern eine definierte Folge von binären Pulsen an zwei Anschlüssen aus. Im Wesentlichen sind die beiden Anschlüsse nichts anderes als zwei Kontakte, die sich schließen und öffnen können – ähnlich den Tastern. Die Drehposition entscheidet, welche Kontakte verbunden sind. Anhand der Wechsel zwischen den Zuständen kann man erkennen, ob der Encoder eine Vorwärts- oder Rückwärtsbewegung ausführt:

Modifiziert von: Von MatthiasDD - Eigenes Werk, CC0, https://commons.wikimedia.org/w/index.php?curid=19086154
Modifiziert von: Von MatthiasDD – Eigenes Werk, CC0, https://commons.wikimedia.org/w/index.php?curid=19086154

Beispiel Rückwärtsbewegung gegen den Uhrzeigersinn (eng. counter clockwise -CCW):
Bei der Rückwärtsbewegung werden die Zeitpunkte von links nach rechts gelesen. Bei Zeitpunkt 1 erfolgt für A ein Wechsel von LOW auf HIGH. Ausgang B liegt auf LOW, daher kann angenommen werden, dass hier eine Rückwärtsbewegung passiert ist.

Beispiel Vorwärtsbewegung im Uhrzeigersinn (engl. clockwise – CW):
Bei der Vorwärtsbewegung müssen die Zeitpunkte von rechts nach links gelesen werden. Beim Zeitpunkt 3 erfolgt von rechts kommend für A ein Wechsel von LOW auf HIGH. Ausgang B liegt an dieser Stelle aber auf HIGH. Daher kann hier auf eine Vorwärtsbewegung geschlossen werden.

Anschlüsse eines Drehencoders

Ein klassischer Drehencoder besitzt 3 Anschlüsse: A,B und Common. Die Anschlüsse A und B sind wie Taster zu benutzen und können daher mit einem (Arduino-internen) PullUp-Widerstand versehen werden. Common wird mit der Masse (GND) verbunden.

Drehencoder_Steckplatine

Beispiel 1: Drehencoder simpel

Folgendes Beispiel dient dazu, das Prinzip des Drehencoders zu illustrieren. In der Praxis ist es fast immer besser, eine Bibliothek zu verwenden (siehe Beispiel 3), da auch Encoder vom Bouncing-Problem betroffen sind.

Folgendes Beispiel nimmt darauf keine Rücksicht:

Code-Analyse

Um festzustellen, in welche Richtung der Encoder gedreht wurde genügt es, eine Flanke eines Pins zu analysieren. In diesem Beispiel wird überprüft ob an Pin A eine steigende Flanke auftritt. In diesem Fall wird der Zustand von Pin B ausgelesen um zu erkennen, in welche Richtung gedreht wurde und dann dementsprechend eine Zählvariable erhöht oder erniedrigt.

Beispiel 2 (extern): Verwendung von Interrupts

Die Drehbewegung von Encodern kann durchaus sehr schnell ausgeführt werden. Bei der Ausführung des normalen Programmcodes kann es daher passieren, dass manche Zustandswechsel nicht erkannt werden, weil sie wieder vorbei sind, wenn Pins ausgelesen werden. Oft werden daher Interrupts verwendet, um auch wirklich jeden wichtigen Zustandswechsel zu erkennen.

Auf der Arduino Playground Seite für Encoder gibt es eine Menge von Beispielen, wie ein Encoder mit Interrupts angewandt werden können.

Beispiel 3: Anwendung einer Library

Die wahrscheinlich einfachste Möglichkeit einen Drehencoder einzusetzen ist die Verwendung einer hierfür spezialisierten Bibliothek, wie die Encoder Bibliothek von Paul Stoffregen (die auch via Library Manager installierbar ist).

Sie kümmert sich um das Bouncing Problem und kann mit oder ohne Interrupts verwendet werden. Hier das Beispiel der Anwendung

 

Zusammenfassung

Drehencoder sind praktische Input-Elemente für inkrementielle Werte. Intern verwenden sie zwei Kontakte, die wechselseitig geöffnet und geschlossen werden können. Am einfachsten werden sie mit einer Bibliothek eingesetzt, da diese das Contact-Bounce Problem behandeln und auch mit Interrupts arbeiten.

Weiterführende Links