Zeit für etwas Musik! In dieser Lektion verwendest du dein Poti und den Piezo, um damit stufenlos Töne in einem bestimmten Bereich zu erzeugen.
Zum Einsatz kommt wieder die Funktion map(), die du bereits kennst. Darüber hinaus verwendest du eine weitere, neue Funktion: tone()
Was sind Töne?
Zunächst müssen wir jedoch kurz einen Blick darauf werfen, was Töne eigentlich sind. Im Prinzip handelt es sich hierbei um Schwingungen mit einer bestimmten Frequenz. Genauer gesagt, sind es Druckschwankungen, deren Schnelligkeit unterschiedlich hohe Töne erzeugen.
Je größer die Frequenz der Schwankungen ist, desto höher der Ton. Wenn du ein Festnetztelefon besitzt, kannst du dir hier das Freizeichen anhören. Das ist der sogenannte Kammerton A, der mit einer Frequenz von 440 Hertz (Hz) ertönt.
___STEADY_PAYWALL___
Um ein A eine Okatve tiefer zu erzeugen, musst du eine Schwingung erzeugen, die halb so groß ist: 220 Hz. Alle anderen Töne der Tonleiter besitzen ebenso festgelegte Frequenzen. Du kannst dir auf Github eine recht umfangreiche Liste von Tönen und entsprechenden Frequenzen anschauen.
Töne erzeugen
Wie eingangs kurz erwähnt, gibt es eine praktische Funktion, die mit deinem Piezo Töne erzeugen kann: tone()
Diese Funktion erwartet mindestens zwei Parameter: Den Pin, an dem dein Piezo angeschlossen ist und die Frequenz. Ein optionaler dritter Parameter ist die Tonlänge.
tone(piezoPin, Frequenz, Länge);
Wenn du also den Kammerton A mit deinem Piezo an Pin 10 erzeugen willst – ohne die Tonlänge zu begrenzen – sieht der Code hierfür so aus:
tone(10, 440);
Ganz einfach, oder? Allerdings möchtest du ja eine variable Tonhöhe, die du mit Hilfe deines Potis bestimmst. Deshalb liest du zunächst das Signal des Potis und „mapst“ dieses wieder auf einen bestimmten Bereich.
potiWert = analogRead(potiPin);
piezoWert = map(potiWert, 0, 1023, 262, 523);
Dieser Bereich liegt diesmal zwischen 262 Hz und 523 Hz. Das sind jeweils die beiden Töne C – in zwei unterschiedlichen Oktaven.
Der Variablen piezoWert weist du dann die mit der Funktion map() gefundene Frequenz zu. Anschließend kommt die Funktion tone() ins Spiel:
tone(piezoPin, piezoWert);
Hier gibst du dann also die Frequenz über den Piezo-Summer am Pin piezoPin aus. Allerdings: Der Tonbereich ist zwar von einem tiefen und einem hohen C begrenzt – die Töne dazwischen sind jedoch „stufenlos“, das heißt, sie entsprechen nicht unbedingt einem D, E oder F etc.
Lade den Sketch aus den Downloads dieser Funktion auf deinen Arduino. Hörst du die Töne und kannst du sie verändern, indem du am Poti drehst? Klingt etwas nach Science Fiction, oder? In der nächsten Lektion baust du dir eine Art Spieluhr, die einen Klassiker abspielt: Beethovens „Für Elise“.