Einfacher Sound  

Lass uns die Theorie aus dem letzten Kapitel in die Praxis umsetzen. Der Piezo-Lautsprecher ist ein rundes Bauelement, das einfache Töne erzeugt. Sie werden in Druckern, Computern oder Spielzeugen verbaut. Man kann sie in zwei Kategorien unterteilen: aktiver oder passiver Piezo.

Ein aktiver Piezo besitzt im Gegensatz zum passiven einen integrierten Oszillator, der eigenständig Schwingungen erzeugt. Wird 5V an den aktiven Piezo angelegt, gibt er einen Dauerton mit einer festen Frequenz von sich. Wir können aber keine anderen Töne oder Melodie wiedergeben und sind nur auf diese eine Frequenz beschränkt.

Mit einem passiven Piezo haben wir zwar mehr Programmieraufwand, können aber eine große Bandbreite an Tönen erzeugen. Eines sollte ich hier vorab erwähnen: akustische Meisterwerke können wir mit Piezos nicht erzeugen. Die Piep-Töne erinnern eher an antike Computerspiele der 80er Jahre. Trotzdem kann es Töne erzeugen, die hervorragend für akustische Signale geeignet sind. Es funktioniert nach dem gleichen Grundprinzip eines Lautsprechers, in dem es durch Elektroimpulse Schall erzeugen kann: Eine Membran (aus Keramik) wird durch Elektrosignale hin- und herbewegt, die wiederum Luftmoleküle zum Schwingen bringt und Schallwellen erzeugt.

Piezos sind hochohmige Elemente, d.h. sie ziehen nur wenig Strom. Aus diesem Grund können sie direkt an einen Arduino-Pin angeschlossen werden. Die maximale Lautstärke (Amplitude) des Piezos ist auf die Stromspannung des Arduinos (5V) beschränkt. Würden wir 9 oder 12V benutzen, wäre sie wesentlich lauter.

Der Aufbau

###Bild

Der Sketch

Wie bei analogRead() können wir in Wirklichkeit mit dem Piezo keine geschwungenen Sinuskurven wiedergeben. Wir können uns aber an diese durch das digitale Rechtecksignal annähern und ein Quasi-Sinus-Signal erzeugen. Für uns bedeutet es, dass jeweils ein HIGH und ein LOW eine Schwingungsdauer darstellt. Und die Anzahl von HIGH und LOW Signalen innerhalb einer Sekunde stellt die Frequenz dar.

In diesem Kapitel lassen wir die Frequenz außen vor und reden eher von einer zeitunabhängigen Oszillation (Hin und Her schwingen). Wir werden später mithilfe der tone()-Funktion auf genaue Frequenzeinstellungen eingehen. Lass uns jetzt etwas freier experimentieren.

Ein Ton wird durch die Zeit bestimmt, die es braucht, um den Piezo ein- und auszuschalten. Der dabei erzeugte Ton wird umso höher, je kürzer der Zeitraum zwischen HIGH und LOW-Pegel. Andersrum wird er tiefer, je mehr Zeit zwischen den beiden Pegel liegt. Da liegt es sehr nahe, unserem altbekannten Blink-Sketch herzunehmen.

const int piezoPin = 7;
int oscillation = 5000;

void setup() 
{
  pinMode(piezoPin, OUTPUT);
}

void loop() 
{
  digitalWrite(piezoPin, HIGH);
  delayMicroseconds(oscillation);
    
  digitalWrite(piezoPin, LOW);
  delayMicroseconds(oscillation);
}

Im Detail

Der obere Sketch ist identisch mit dem Blink-Sketch - bis auf einen Unterschied: Wahrscheinlich wunderst du dich über die delayMicroseconds()-Funktion. Diese Funktion erfüllt die gleiche Funktion wie delay(). Jedoch operiert sie in noch viel kleineren Schritten. Sie ist um den Faktor 1000 kleiner als delay().

###Bild delaymicroseconds……..

Während delay() in Millisekunden operiert, kann man mit delayMicroseconds() in Mikrosekunden arbeiten.

 

als bild ### 1s = 1000ms 1ms = 1000µs

Das heißt, 1 Sekunde kann in 1.000.000 Mikrosekunden eingeteilt werden. Das Piezo braucht diese extrem feine Einteilung, um die Membran zum Schwingen zu bringen. Wir können auch mit dem normalen delay() Töne erzeugen, vorausgesetzt der eingesetzte Wert ist klein genug.

Setze unterschiedliche Werte für delayMicroseconds() ein und experimentiere mit unterschiedlichen Tönen.

Der Sketch

Der obere Sketch ist bei umfangreichem Code nicht von Vorteil. Wir bekommen mehr Kontrolle mit einer for-Schleife. So können wir auch pulsierende Töne (Alarmsound) erzeugen. Der obere Sketch gibt nur einen durchgängigen Ton aus. ###hier fehlt noch text

const int piezoPin = 7;
int oscillation = 1000;
int pause = 20;

void setup() 
{
  pinMode(piezoPin, OUTPUT);
}

void loop() 
{
  for(int i = 0; i < 500; i++)
  {
    digitalWrite(piezoPin, HIGH);
    delayMicroseconds(oscillation);
    
    digitalWrite(piezoPin, LOW);
    delayMicroseconds(oscillation);
  }

  delay(pause);
}

Ohne das delay() außerhalb der for-Schleife unterscheidet sich die Ausgabe nicht von dem oberen Sketch – auch nicht, wenn cycle einen Wert von 5 oder 5000 hat. Erst das delay() macht den Sketch zu einem pulsierenden Ton. Gleichzeitig gibt es der Variable cycle ein Gewicht. Wird diese Zahl verändert, hat es Auswirkungen auf den Sound. Experimentiere mit den Werten für oscillation, pause und cycle und hör die an, wie der Ton darauf reagiert.

###den oeberen code kann man sich sparen

const int piezoPin = 7;

int oscillation = 1000;
int pause = 20;
int cycle = 500;

void setup() 
{
  pinMode(piezoPin, OUTPUT);
}

void loop() 
{
  for(int i = 0; i < cycle; i++)
  {
    digitalWrite(piezoPin, HIGH);
    delayMicroseconds(oscillation);
    
    digitalWrite(piezoPin, LOW);
    delayMicroseconds(oscillation);
  }

  delay(pause);
}

Aufgabe

Erweitere den oberen Sketch so, dass die Wert für oscillation, cycle und pause durch drei Potentiometern eingespeist wird.

Den Schaltungsaufbau und die Lösung findest du hier auf meiner Webseite.