Willkommen zu einem neuen Beitrag des Programmierkurses für Maker mit Arduino und Protocoder! In dieser Kurseinheit verwenden wir zwei Bat-Ultraschallsensoren, um die Entfernung zu messen, in der sich unsere Hand befindet. Anschließend verwenden wir einen kleinen Summer, den buzzer, um einen Klang zu erzeugen.
Materialliste
- ZUM BT-328, Arduino-Platine oder kompatibel
- 2 x Bat-Ultraschallsensoren
- Summer-Modul
Konzepte, die wir kennenlernen werden
In diesem Beitrag lernen wir, wie man einen Ultraschallsensor dazu verwendet, Entfernungen in Zentimetern zu messen und verwenden die Funktion Tone von Arduino dazu, mit dem Summer Töne abzugeben. Um die Bat-Ultraschallsensoren anzuschließen folgen wir den Angaben in der Tabelle:
BAT Modul 1 | BAT Modul 2 | |
VCC | VCC | VCC |
GND | GND | GND |
ECHO | Pin 8 | Pin 9 |
TRIGGER | Pin 10 | Pin 11 |
Auf dem nächsten Bild siehst du wie die Module mit der Platine verbunden werden.
Der Code
Im Arduino-Code beginnen wir damit, die globalen Variablen zu benennen, die sich in diesem Fall nur auf die Verbindungen der zwei Pins beziehen.
1 2 3 4 |
int TP1 = 9, EP1 = 8; // Trigger Pin 1, Echo Pin 1 int TP2 = 11, EP2 = 10; // Trigger Pin 2, Echo Pin 2 int pinBuzzer = 5; |
Anschließend initialisieren wir das Programm mit der setup-Funktion:
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { // pines bat 1 pinMode(EP1, INPUT); pinMode(TP1, OUTPUT); // pines bat 2 pinMode(EP2, INPUT); pinMode(TP2, OUTPUT); pinMode(pinBuzzer, OUTPUT); } |
In dieser Funktion geben wir an, welche Pins als Eingang, INPUT, fungieren und welche als Ausgang, OUTPUT. Der Code der loop-Funktion lautet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void loop() { int frec_maxima = 4000; //maximale Frequenz int distancia_frecuencia = distance(TP1, EP1); int distancia_tiempo = distance(TP2, EP2); distancia_frecuencia = constrain(distancia_frecuencia, 1, 20); distancia_tiempo = constrain(distancia_tiempo, 1, 10); // 1 entspricht 10 ms und 10 entspricht 100 ms distancia_frecuencia = map(distancia_frecuencia, 1, 20, 1, frec_maxima); distancia_tiempo = map(distancia_tiempo, 1, 10, 10, 100); // von (1,10) cm bis (10,100) ms tone(pinBuzzer, distancia_frecuencia, distancia_tiempo); delay(distancia_tiempo); } |
Zunächst deklarieren wir die lokale Variable frec_maxima, die Arduino angibt, welches die höchste Frequenz ist, bei der der Summer erklingt. Anschließend benennen wir die Variablen distancia_frecuencia und distancia_tiempo, die die Entfernung speichern, die bei den Ultraschallsensoren ausgelesen wurden. Es handelt sich um die Entfernungen, die verwendet werden, um die jeweiligen Frequenzen des Klangs und die Dauer jedes “Tons” zu verändern. Für das Auslesen der Entfernung verwenden wir die distance-Funktion, welche die Werte, die wir ihr aus dem Hauptcode senden, die Nummer des Trigger-Pins und das Echo des Ultraschallsensors als Argumente nimmt. Wenn du mehr über den Ultraschallsensor erfahren möchtest, kannst du dir dieses Tutorial auf der Seite von Arduino ansehen. Der Code der distance-Funktion lautet:
1 2 3 4 5 6 7 8 |
long distance(int TP, int EP) { long microseconds = TP_init(TP, EP); int distancia = microseconds / 29 / 2; // Distance_CM = ((Duration of high level)*(Sonic :340m/s))/2 // = ((Duration of high level)*(Sonic :0.034 cm/us))/2 // = ((Duration of high level)/(Sonic :29.4 cm/us))/2 return distancia; } |
Ihr werdet sehen, wie diese Funktion die TP_init-Funktion aufruft, der wir als Argument die Daten der Pins senden, die wir in der loop-Funktion an erster Stelle angegeben haben. Wir können problemlos Daten von einer Funktion an eine andere senden. Die Funktion vTP_init besitzt den folgenden Code:
1 2 3 4 5 6 7 8 9 10 |
long TP_init(int TP, int EP) { digitalWrite( TP , LOW); delayMicroseconds(2); digitalWrite( TP , HIGH); delayMicroseconds(10); digitalWrite( TP , LOW); long microseconds = pulseIn( EP , HIGH); return microseconds; } |
In dieser Funktion ändern wir den Zustand der Pins und senden verschiedene Signale von 2 bis 10 Millisekunden über den Trigger-Pin des Ultraschallsensors. Anschließend verwenden wir die Funktion pulseIn im Echo-Pin, um die Zeit zu berechnen, die der Pin benötigt, um seinen Wert von oben nach unten zu ändern. Diese Zeit entspricht derjenigen, die vergangen ist, bevor der ausgesendete Impuls wieder empfangen wurde. Wenn du mehr über diese Funktion erfahren möchtest, kannst du auf der Referenzseite von Arduino zu pulseIn nachsehen. Die Funktion TP_init gibt den Wert der Funktion pulseIn in Millisekunden aus und in der Funktion distance verwenden wir den Wert in Millisekunden, den wir aus der Berechnung der Entfernung, in der sich das Objekt befindet, erhalten haben. Sobald wir die Entfernungen für beide Ultraschallsensoren berechnet haben, verwenden wir die Funktion constrain, die wir bereits im vorigen Kapitel gesehen haben, um festzulegen, das sich die ausgelesenen Werte in einem bestimmten Bereich befinden. Denk daran, die Werte zum Lernen und Üben zu modifizieren. Nach der Funktion constrain verwenden wir die Funktion map, die wir ebenfalls im vorigen Kapitel angesehen haben, um den Wertebereich zu verändern. Die Variable distancia_tiempo hätte den Wert mit 10 multiplizieren können, weshalb die Verwendung der Funktion map nicht unbedingt notwendig gewesen wäre. Als Letztes bringen wir den Summer mit der Anweisung tone zum Klingen:
1 2 |
tone(pinBuzzer, distancia_frecuencia, distancia_tiempo); delay(distancia_tiempo); |
Die Funktion tone ist dafür zuständig, den vom Summer erzeugten Ton wiederzugeben und besitzt als Parameter den Pin mit dem der Summer verbunden ist, die Frequenz und die Dauer mit der der Ton erklingt. Im Folgenden setzen wir ein delay über die komplette Dauer des Tons ein, sodass sich seine Dauer verdoppelt. Als Übung kannst du versuchen, die Werte der Minimal- und Maximalfrequenzen, die Entfernungen, den Wertebereich, in den die Werte umgewandelt (mapped) werden zu verändern und dir ansehen, was das im Summer auslöst. Wir sehen uns in der nächsten Lektion!