Nr.08 – Töne erzeugen

Mit dem Arduino und einem Lautsprecher Töne erzeugen

Mit dem Arduino lassen sich auf verschiedenen Art und Weisen Töne erzeugen. Die einfachste Möglichkeit ist die Tonerzeugung mit einem aktiven Lautsprecher (active Buzzer), der lediglich an die Spannung von 5V angeschlossen wird. Die Tonerzeugung übernimmt eine im Inneren eingebaute Elektronik. Der Nachteil liegt jedoch darin, dass ein „active buzzer“ nur einen einzigen Ton erzeugen kann – Melodien oder Sirenengeräusche sind damit nicht möglich.

Mit einem passiven Lautsprecher (passive buzzer) hat man die Möglichkeit mit Hilfe des Arduino Mikrocontrollers verschiedene Töne, Melodien oder Sirenensignale zu generieren, da im passive buzzer keine Elektronik vorhanden ist, die einen Ton vorgibt.

Aufgabe: Mit einem passiven Lautsprecher sollen unterschiedliche Töne und eine Melodie erzeugt werden.

Material: Arduino Mikrocontroller / Ein passiver Lautsprecher (passive buzzer) / Breadboard / Kabel

Materialbeschaffung: www.funduinoshop.com

Aufbau:

arduino-lautsprecher

Die Erzeugung des Tones basiert maßgeblich auf dem Befehl „tone(x, y)“, wobei der x-Wert den Pin angibt, an dem der Lautsprecher mit der positiven Seite angeschlossen ist und der y-Wert der die Tonhöhe angibt.

Ein Beispiel:

tone(8, 100); // Der Lautsprecher an Pin 8 wird mit der Tonhöhe „100“ aktiviert

delay(1000); // Pause mit 1000 Millisekunden, also 1 Sekunde – Der Lautsprecher bleibt für diese //Zeit aktiv.

noTone(8); // Der Lautsprecher an Pin 8 wird deaktiviert

Code1: Einfache Tonerzeugung

void setup() // Im Setup werden keine Informationen benötigt.
//Die Spannungsausgabe für den Piezo-Lautsprecher wird im Sketch durch den Arduino-Befehl "tone" automatisch festgelegt.
{
}

void loop()
{
tone(8, 100); // Im Hauptteil wird nun mit dem Befehl "tone ( x , y )" ein Ton abgegeben.
delay(1000); // mit einer Dauer von 1 Sekunde
noTone(8); // Der Ton wird abgeschaltet
delay(1000); // Der Lautsprecher bleibt eine Sekunde aus
}

Code2: Abwechselnde Tonhöhen

Im zweiten Beispiel werden im Hauptteil (loop) nur ein paar Zeilen ergänzt. Dadurch ertönen zwei Töne abwechselnd mit der Tonhöhe “100” bzw. “200”, wie bei einer Sirene. Eine pause zwischen den Tönen gibt es nicht.

void setup()
{
}
void loop()
{
tone(8, 100);
delay(1000);
noTone(8); // An dieser Stelle geht der erste Ton aus.
tone(8, 200); // Der zweite Ton mit der neuen Tonhöhe “200” ertönt.
delay(1000); //… und zwar für eine Sekunde...
noTone(8); // An dieser Stelle geht der zweite Ton aus und der Loop-Teil des Sketches beginnt von vorn.
}

 

Code3: Ton erzeugen durch Tastendruck

Im dritten Beispiel wird ein Taster an Pin6 zum Aufbau hinzugefügt. Im Hauptteil wird durch eine “IF-Abfrage” der Taster ausgelesen. Falls der Taster gedrückt ist, ertönt für eine Sekunde ein Ton mit der Tonhöhe “300”.

arduino-lautsprecher-skizze-1

 

int Taster1=6;
int Tasterstatus=0;

void setup()
{
pinMode(Taster1, INPUT);
}

void loop()
{
Tasterstatus = digitalRead(Taster);
if (Tasterstatus == HIGH)
{
tone(8, 300);
noTone(8);
}
}

 

Code4: Töne in Abhängigkeit von verschiedenen Tasten

Im vierten Beispiel soll je nach Betätigung unterschiedlicher Tasten entschieden werden, welcher Ton vom Lautsprecher abgegeben wird. Dazu wird jeweils ein Taster an den Pins 6 und 7 angeschlossen. Im Hauptteil wird durch zwei “IF-Abfragen” entschieden, welcher Ton abgegeben wird.

arduino-lautsprecher-skizze-2

 

int Taster1=6; // Taster1 an Pin6 angeschlossen
int Taster2=7; // Taster2 an Pin7 angeschlossen
int Tasterstatus1=0; // Variable um den Status des Tasters 1 zu speichern.
int Tasterstatus2=0; // Variable um den Status des Tasters 2 zu speichern.

void setup()
{
pinMode(Taster1, INPUT); // Taster1 als Eingang festlegen
pinMode(Taster2, INPUT); // Taster2 als Eingang festlegen
}

void loop()
{
Tasterstatus1 = digitalRead(Taster1); // Status von Taster1 auslesen (HIGH oder LOW)
Tasterstatus2 = digitalRead(Taster2); // Status von Taster2 auslesen (HIGH oder LOW)

if (Tasterstatus1 == HIGH) // Wenn der Taster1 gedrückt ist, dann...
{
tone(8, 100); // Ausgabe eines Tons mit der Tonhöhe 100.
delay (1000); // mit der Dauer von einer Sekunde
noTone(8); // Ausschalten des Tons.
}

if (Tasterstatus2 == HIGH)
{
tone(8, 200);
delay (1000); // mit der Dauer von einer Sekunde
noTone(8); // Ausschalten des Tons.
}
}

 

Melodien erzeugen

In der Arduino-Software ist eine Datei speziell zum generieren von Tönen mit Hilfe eines Lautsprechers (passive Buzzer) enthalten. Anstelle von Tonhöhen in Form von Zahlen wie bspw. “tone(8, 200)”, können nun auch Töne aus der Tonleider ausgewählt werden.

Als Beispiel gibt es dafür in der Arduino-Software den Sketch “toneMelody”.

arduino-lautsprecher-software

Zu finden unter “Beispiele” -> “02.Digital” -> “toneMelody”

In dem Beispiel ist bereits die Datei hinterlegt, in der sich die Zuordnung von Tonhöhe und Zahlenwert befindet. Sie hat den Namen “pitches.h”. Den Inhalt kann man sich ansehen, wenn man in dem geöffneten Beispielprogramm auf den zweiten Kartenreiter innerhalb des Sketches klickt, wie im folgenden Bild dargestellt.

arduino-lautsprecher-software-2

Um auf die Datei zurückgreifen zu können, muss im Sketch lediglich der Befehl #include „pitches.h“ eingebaut werden und die Datei selber muss als Tab geöffnet sein. Am besten geht das, indem man den Sketch “toneMelody” aus den Beispielen in der Arduino-Software öffnet und dann bearbeitet. Dadurch wird die Datei “pitches.h” automatisch als Tab aufgerufen. Das wird im folgenden Beispiel deutlich.

Dies ist ein ganz kleiner Sketch, der Abwechselnd zwei Töne aus der Datei “pitches.h” abspielt.

 

#include "pitches.h"

void setup()
{
pinMode (8,OUTPUT); // Lautsprecher an Pin8
}

void loop()
{
tone(8, NOTE_C4, 1000); // An Pin8 wird die Note C4 für 1000ms gespielt
delay(3000); //Nachdem die Note ertönt, pausiert der Sketch für 3 Sekunden. Das bedeutet, dass nachdem der Ton zu ende gespielt wurde, noch zwei Sekunden Pause ohne Ton verbleiben.
tone(8, NOTE_G3, 1000); // An Pin8 wird die Note G3 für 1000ms gespielt
delay(3000); //Nachdem die Note ertönt, pausiert der Sketch für 3 Sekunden. Das bedeutet, dass nachdem der Ton zu ende gespielt wurde, noch zwei Sekunden Pause ohne Ton verbleiben.
}

 

In diesem Sketch wird durch den erweiterten “tone-” Befehl die Beendigung des Tones nicht mehr benötigt.

Befehl: “tone(x, y, z)” x= Pin des Lautsprechers, y= Tonhöhe, z= Dauer des Tons in Millisekunden.