Jetzt wird es ernst. Du hast den Ultraschallsensor bereits auf deinem Breadboard installiert und auch schon Entfernungen gemessen. Mit dem Sensor wirst du die Tonhöhe bestimmen, indem du deine Hand davor bewegst. Fehlt nur noch ein Lautsprecher – in unserem Fall der passive Piezo-Summer. Auch diesen hast du ja bereits kennengelernt.
Baue das Theremin wie folgt auf deinem Breadboard auf – bzw. ergänze den Piezo, falls du den Ultraschallsensor noch installiert hast.
Sobald du fertig bist, kann es gleich mit dem Sketch weitergehen.
___STEADY_PAYWALL___
DIE BENÖTIGTEN KONSTANTEN UND VARIABLEN
Für dein Theremin benötigst du eine ganze Reihe von Konstanten und Variablen. Zunächst die drei Konstanten für die Pins, an denen dein Ultraschallsensor und der Piezo angeschlossen sind.
const int trigger = 7;
const int echo = 6;
const int piezo = 10;
Dann benötigst du noch zwei Variablen für die Entfernungen, die dein HC-SR04 misst. In der ersten Variablen distance speicherst du fortlaufend das aktuelle Messergebnis. Die zweite distanceHigh benötigst du, um zu Beginn des Sketchs die maximale Distanz deiner Hand zum Sensor abzuspeichern – dazu gleich mehr.
int distance = 0;
int distanceHigh = 0;
Fehlt noch eine Variable für die Note, die dein Piezo spielt. Wie bei der Drehorgel mit dem Poti unterscheiden sich die Frequenzwerte (Tonhöhen) von den Werten, die dein Ultraschallsensor misst. Deshalb kommt später auch wieder die Funktion map() zum Einsatz. Doch zunächst setzt du die Variable auf Null:
int note = 0;
DIE SETUP-FUNKTION
Hier definierst du zunächst wieder den jeweiligen pinMode der Pins Echo und Trig deines Sensors:
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
Anschließend folgt ein While-Loop mit dem Zweck, deinen Sensor zu kalibrieren. Du misst in den ersten drei Sekunden nach dem Programmstart die maximale Entfernung deiner Hand zum Sensor.
Hierfür verwendest du die Funktion millis(), die die Anzahl der seit dem Programmstart vergangenen Millisekunden zurückgibt. Solange (while) noch keine 3000 Millisekunden – also drei Sekunden – vergangen sind, misst dein Sensor immer wieder die Entfernung und speichert sie in der Variablen distance:
while (millis() < 3000) {
digitalWrite(trigger, HIGH);
digitalWrite(trigger, LOW);
distance = pulseIn(echo, HIGH);
Doch das reicht noch nicht, sondern du möchtest auch die maximale Entfernung in der Variablen distanceHigh speichern, um dein “Spielfeld” zu begrenzen. Das machst du mit einer bedingten Abfrage nach jeder Messung.
Immer, wenn die gerade Entfernung distance die maximale Entfernung distanceHigh überschreitet, wird diese auf den Wert von distance aktualisiert.
if (distance > distanceHigh) {
distanceHigh = distance;
}
Wie gesagt, der While-Loop wird nur in den ersten drei Sekunden nach dem Programmstart ausgeführt. Sobald diese Zeit verstrichen ist, geht es sofort weiter – mit der Musik. 🙂
IM LOOP SPIELT DIE MUSIK
Auch der Loop beginnt jedes Mal mit der Messung der Entfernung deiner Hand. Anschließend speicherst du diese Entfernung in der Variablen distance.
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
distance = pulseIn(echo, HIGH);
Diese Entfernung kann natürlich immer noch die von dir kalibrierte maximale Entfernung überschreiten – was sie aber nicht soll. Deshalb prüfst du als nächstes, ob distance über distanceHigh liegt. Ist das der Fall, limitierst du den gemessenen Wert auf die maximale Entfernung:
if (distance > distanceHigh) {
distance = distanceHigh;
}
Alles, was jetzt noch fehlt, sind Töne. Hierfür benötigst du wieder die Funktion map(). Du nimmst hier die Entfernung distance, deren Wertebereich du auf 50 bis distanceHigh begrenzt. Den Frequenzbereich deiner Töne legst auf 50 bis 3000 Hz. fest. Den in der Funktion “gemappten” Wert weist du dann der Variablen note zu.
note = map(distance, 50, distanceHigh, 50, 3000);
tone(piezo, note);
delay(10);
Anschließend spielst du die gefundene Note mit tone() und schließt den Loop mit einem ganz kurzen Delay ab.
Und das war es! Lade den Sketch aus den Downloads dieser Lektion auf deinen Arduino, kalibriere deinen Sensor und leg mit deiner Karriere am Theremin los! 🙂