Lektion 14 – Melodie
Nach so viel Arbeit sollte man das Feiern nicht vergessen. Dafür brauchen wir jetzt etwas Musik!
Um einen Ton zu spielen, muss man Schallwellen erzeugen. Wenn man auf eine Trommel schlägt, versetzt man das Trommelfell in Schwingung. Diese Schwingung erzeugt Schallwellen, die über die Luft übertragen und von uns gehört werden können. Lautsprecher erzeugen Schwingungen durch elektrische Signale. Wir benutzen hierzu Piezo-Lautsprecher. Diese kann man übrigens sehr gut aus quietschendem Spielzeug oder Melodie-Grußkarten ausbauen.
Wenn du einen anderen Piezo-Lautsprecher hast, kannst du natürlich auch diesen verwenden (3b).
Wie bringen wir den Piezo nun zum klingen? Fangen wir wieder mit dem Blink-Beispiel-Code an:
int ledPin = 9; void setup(){ pinMode(ledPin,OUTPUT); } void loop(){ digitalWrite(ledPin, HIGH); delay(200); digitalWrite(ledPin, LOW); delay(200); }
Hm, wenn man genau hinhört, nimmt man ein sich wiederholendes Knacken wahr, oder? Das wäre jetzt eine sehr langsame Schwingung. Wir brauchen also eine schnellere Schwingung. Lass uns die Wartezeit der delays verringern:
int ledPin = 9; void setup(){ pinMode(ledPin,OUTPUT); } void loop(){ digitalWrite(ledPin, HIGH); delay(2); digitalWrite(ledPin, LOW); delay(2); }
Schon etwas besser. Durch das Verringern der Wartezeit haben wir die Frequenz (also die Wiederholung von An und Aus) erhöht.
Erhöht? Wir haben sie doch verringert.
Gutes Argument, aber die Frequenz wird immer pro Zeit gerechnet. Übrigens: Was Meter für Entfernungen ist, ist Hz (Hertz) für die Frequenz – eine Einheit. Sie ist nach dem Physiker Heinrich Hertz benannt.
Wenn wir 10 Wiederholungen pro Sekunde haben, ist die Frequenz 10/1s = 10 Hz. Haben wir 100 Wiederholungen ist die Frequenz 100/1s = 100 Hz, also höher. Je höher also die Frequenz, desto höher der Ton. Probieren wir das aus:
int ledPin = 9; void setup(){ pinMode(ledPin,OUTPUT); } void loop(){ digitalWrite(ledPin, HIGH); delay(1); digitalWrite(ledPin, LOW); delay(1); }
Und noch etwas tiefer:
int ledPin = 9; void setup(){ pinMode(ledPin,OUTPUT); } void loop(){ digitalWrite(ledPin, HIGH); delay(4); digitalWrite(ledPin, LOW); delay(4); }
Super. Ich würde sagen, das probieren wir jetzt hintereinander. Damit wir aber auch den Unterschied hören, muss jede Frequenz ein paar mal wiederholt werden. Das machen wir wieder mit der for-Schleife:
int ledPin = 9; void setup(){ pinMode(ledPin,OUTPUT); } void loop(){ for (int wiederholungen=0;wiederholungen<=100;wiederholungen=wiederholungen+1){ digitalWrite(ledPin, HIGH); delay(1); digitalWrite(ledPin, LOW); delay(1); } for (int wiederholungen=0;wiederholungen<=100;wiederholungen=wiederholungen+1){ digitalWrite(ledPin, HIGH); delay(2); digitalWrite(ledPin, LOW); delay(2); } for (int wiederholungen=0;wiederholungen<=100;wiederholungen=wiederholungen+1){ digitalWrite(ledPin, HIGH); delay(4); digitalWrite(ledPin, LOW); delay(4); } }
Klingt gut? Auf jeden Fall haben wir jetzt schon mal verstanden, wie das mit dem Tonerzeugen funktioniert.
Damit wir aber nicht jedes Mal so viel schreiben müssen, hat Arduino einen extra Befehl, um Töne zu erzeugen:
tone(Pin, Tonhöhe);
Zwei Parameter bekommt der Befehl zugewiesen. Der Pin, an dem der Lautsprecher angeschlossen ist und die Tonhöhe als Frequenzwert. Dazu kommt noch ein weiterer wichtiger Befehl
noTone(Pin);
Dieser Befehl stoppt den Ton an dem übergebenen Pin. Übrigens, wenn wir den Befehl tone() benutzen, brauchen wir den Pin im Setup nicht mit pinMode als OUTPUT anlegen.
So, jetzt probieren wir das gleich mal aus:
void setup() { } void loop() { tone(9, 440); delay(500); noTone(9); delay(500); }
Die Frequenz 440 Herz entspricht dem so genannten Kammerton. Wenn du mehr darüber erfahren willst, lies hier mal weiter: Kammerton
Andere Frequenzen findest du auch im Internet: Frequenzen der gleichstufigen Stimmung
Spielen wir eine Melodie:
void setup() { } void loop() { tone(9, 262); delay(200); noTone(9); delay(200); tone(9, 294); delay(200); noTone(9); delay(200); tone(9, 330); delay(200); noTone(9); delay(200); tone(9, 349); delay(200); noTone(9); delay(200); tone(9, 392); delay(400); noTone(9); delay(200); tone(9, 392); delay(400); noTone(9); delay(2000); }
So, und jetzt kannst Du das Lied zu Ende programmieren. Versuch es wieder zuerst allein.
void setup() { } void loop() { tone(9, 262); delay(200); noTone(9); delay(200); tone(9, 294); delay(200); noTone(9); delay(200); tone(9, 330); delay(200); noTone(9); delay(200); tone(9, 349); delay(200); noTone(9); delay(200); tone(9, 392); delay(400); noTone(9); delay(400); tone(9, 392); delay(400); noTone(9); delay(400); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 392); delay(800); noTone(9); delay(800); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 440); delay(200); noTone(9); delay(200); tone(9, 392); delay(800); noTone(9); delay(800); tone(9, 349); delay(200); noTone(9); delay(200); tone(9, 349); delay(200); noTone(9); delay(200); tone(9, 349); delay(200); noTone(9); delay(200); tone(9, 349); delay(200); noTone(9); delay(200); tone(9, 330); delay(400); noTone(9); delay(400); tone(9, 330); delay(400); noTone(9); delay(400); tone(9, 392); delay(200); noTone(9); delay(200); tone(9, 392); delay(200); noTone(9); delay(200); tone(9, 392); delay(200); noTone(9); delay(200); tone(9, 392); delay(200); noTone(9); delay(200); tone(9, 262); delay(800); noTone(9); delay(800); }
Anton 16. Februar 2015
Ein fehlender Buchstabe mit großer Wirkung:
„Die Einheit der Frequenz wird Herz (1Hz = 1/s) genannt..“
Vorschlag für diesen Abschnitt::
Die Einheit Hz (Hertz) der Frequenz ist nach dem deutschen Physiker Heinrich Hertz benannt. Wenn wir also 10 Wiederholungen pro Sekunde haben, ist die Frequenz 10/1s = 10 Hz. Haben wir 100 Wiederholungen ist die Frequenz 100/1s = 100 Hz, also höher. Je höher also die Frequenz, desto höher der Ton.
Stefan Hermann 17. Februar 2015
Hallo Anton,
das ist eine super Idee. Nehme ich gleich auf.
Liebe Grüße
Stefan“