Skip to Content

MaxBotix MB7389 wetterfester Abstandssensor Anleitung

MaxBotix MB7389 wetterfester Abstandssensor Anleitung

Der MaxBotix MB7389 HRXL-MaxSonar-WR ist ein wetterfester Ultraschall-Abstandssensor mit einer Reichweite von 30 bis 500 cm und einer Auflösung von 1 mm. Dieser Sensor eignet sich ideal für den Außeneinsatz, beispielsweise zur Messung des Wasserstands in Tanks oder Behältern. Er hat einen sehr kleinen Strahlwinkel und kann auch für Roboteranwendungen verwendet werden. Obwohl dieses Tutorial für den MB7389 geschrieben wurde, kann es auch für andere MaxBotix-Sensoren genutzt werden.

In diesem Tutorial lernst du, wie der Sensor funktioniert und wie du ihn mit einem Arduino verwenden kannst. Ich habe 3 Beispiele mit Schaltplänen beigefügt, die den Grundbetrieb des Sensors zeigen. Wir betrachten die verschiedenen Ausgänge des Sensors und ich erkläre dir den Unterschied zwischen dem Free-Run-Modus und dem Trigger-Modus.

Nach jedem Beispiel erkläre ich den Code im Detail, sodass du ihn problemlos an deine Bedürfnisse anpassen kannst.

Materialien

Hardware-Komponenten

MB7389-100 HRXL-MaxSonar-WRMT × 1 Amazon
Arduino Uno Rev 3Arduino Uno Rev3 × 1 Amazon
Breadboard × 1 Amazon
Jumper wires ~ 10 Amazon
Header pins (optional) × 7 Amazon
momentary-push-buttonMomentary push button × 1 Amazon
USB cable type A/B × 1 Amazon

Software

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Wie funktioniert ein Ultraschallsensor?

Ein Ultraschall-Abstandssensor arbeitet, indem er Ultraschallwellen aussendet. Diese Wellen werden von einem Objekt reflektiert und vom Sensor wieder empfangen. Durch die Messung der Zeitspanne zwischen Aussenden und Empfangen der Schallwellen kann man die Entfernung zwischen Sensor und Objekt berechnen.

Entfernung (cm) = Schallgeschwindigkeit (cm/µs) × Zeit (µs) / 2

Dabei gilt: Zeit ist die Zeit zwischen Aussenden und Empfangen der Schallwellen in Mikrosekunden. Bei 20 °C beträgt die Schallgeschwindigkeit etwa 343 m/s bzw. 0,034 cm/µs.

How does an ultrasonic distance sensor work
Funktionsprinzip von Ultraschall-Abstandssensoren. Quelle:  https://www.maxbotix.com/

Beachte, dass das Ergebnis durch zwei geteilt werden muss, da die Schallwellen vom Sensor zum Objekt und zurück zum Sensor reisen. Die Entfernung zwischen Sensor und Objekt entspricht also nur der halben Strecke, die die Schallwellen zurückgelegt haben.

Für weitere Informationen zur Funktionsweise von Ultraschallsensoren kannst du meinen Artikel über den HC-SR04 lesen. In diesem Artikel werden die Funktionsprinzipien eines Ultraschall-Abstandssensors ausführlicher erklärt.

Informationen zum Sensor

Der MaxBotix MB7389 HRXL-MaxSonar-WR ist ein Ultraschall-Abstandssensor von MaxBotix Inc. MaxBotix ist ein US-amerikanischer Hersteller, der sich auf Ultraschallsensoren spezialisiert hat. Sie fertigen Sensoren für verschiedenste Anwendungen, sowohl für den Innen- als auch den Außenbereich.

MaxBotix bezeichnet seine Sensoren nicht als „wasserdicht“, aber sie sind gründlich getestet und mit der Schutzart IP67 für Wetterbeständigkeit zertifiziert. Die Definition dieser Schutzart findest du auf Wikipedia.

Was du vielleicht nicht weißt: Die Schallgeschwindigkeit hängt stark von Temperatur und Luftfeuchtigkeit ab. Die Schallgeschwindigkeit in Luft steigt um etwa 0,6 Meter pro Sekunde pro Grad Celsius. Im Gegensatz zu vielen anderen Sensoren verfügt der MB7389 über eine interne Temperaturkompensation. Das bedeutet, dass der Sensor automatisch die Änderungen der Schallgeschwindigkeit ausgleicht und weiterhin genaue Messwerte liefert. Für noch genauere Temperaturkompensation kannst du auch einen externen Temperatursensor anschließen.

Weitere Spezifikationen des Sensors findest du in der folgenden Tabelle.

MB7389 HRXL-MaxSonar-WR Spezifikationen

Betriebsspannung 2,7 – 5,5 V
Betriebsstrom 3,1 mA durchschnittlich bei 5 V (98 mA Spitze)
Reichweite 30* – 500 cm
Strahlwinkel/-form See here
Schutzart IP67
Auflösung 1 mm
Frequenz 42 kHz
Abtastrate 6,66 Hz
Sensorausgänge Analogspannung, Pulsbreite, RS232
Gesamtmaße 22,1 x 19,9 x 25,11 mm
Betriebstemperatur -40 – +65 °C
Vorteile Klein, leicht, schmaler Strahl, automatische Kalibrierung (Spannung, Luftfeuchtigkeit, Umgebungsgeräusche), Firmware-Filterung, wetterfest (IP67), Temperaturkompensation, einfach zu bedienen
Hergestellt in USA
Kosten Check price

*Der Sensor hat praktisch keine Totzone, Objekte näher als 30 cm werden als 30 cm gemeldet.

Weitere Informationen findest du im Datenblatt hier:

Sensormaße

Die genauen Maße des Sensors sind im Bild unten zu sehen:

MB7389 Ultrasonic Distance Sensor dimensions
MB7389 Ultraschall-Abstandssensor

MaxBotix Sensorausgänge

Wie du in der obigen Spezifikationstabelle gesehen hast, verfügen die MaxBotix-Sensoren der MaxSonar-Familie über verschiedene Ausgänge: Analogspannung, Pulsbreite und RS232-Seriell (I2C Sensoren sind ebenfalls erhältlich). In diesem Tutorial betrachten wir die Ausgänge Analogspannung und Pulsbreite.

Analogspannung

Dies ist wahrscheinlich die einfachste Methode, die gemessene Entfernung vom Sensor auszulesen. Der Analogspannungsausgang liefert eine lineare Spannung, die größer wird, je weiter ein Zielobjekt vom Sensor entfernt ist.

136_AnalogVoltage_lg
Analogspannungsausgang. Quelle: https://www.maxbotix.com/

Wir können diesen Ausgang mit einem Mikrocontroller wie dem Arduino auslesen und die Entfernung berechnen, indem wir den Messwert mit einem konstanten Skalierungsfaktor multiplizieren (dieser Faktor hängt vom genauen Sensortyp ab, siehe Datenblatt).

Pulsbreite

Eine weitere Möglichkeit ist die Nutzung des Pulsbreiten-Ausgangs. Dieser Pin gibt eine Pulsbreiten-Darstellung der Entfernung aus. Du kannst die  pulseIn()  Funktion im Arduino-Code verwenden, um die Länge dieses Ausgangspulses in Mikrosekunden (µs) zu messen. Um die Entfernung zu erhalten, musst du diesen Wert mit einem konstanten Skalierungsfaktor multiplizieren. Für den MB7389 beträgt der Skalierungsfaktor 1 µs/mm. Du kannst also einfach den TOF-Wert mit 1 multiplizieren, um die Entfernung in Millimetern zu erhalten.

PW-Output
Pulsbreitenausgang. Quelle: https://www.maxbotix.com/

Für andere Sensortypen findest du die Skalierungsfaktoren in den Datenblättern.

Verdrahtung – Anschluss des MaxBotix MB7389 an Arduino UNO

Wie in der Einleitung erwähnt, können MaxBotix-Sensoren in verschiedenen Modi betrieben werden. Die folgenden Schaltpläne zeigen, wie du den MB7389-Sensor für den Betrieb mit Analogspannung oder Pulsbreite an den Arduino anschließt.

Du kannst die Drähte direkt an den Sensor löten oder Header-Pins bzw. einen Stecker installieren.

MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-analog-voltage-wiring-diagram-schematic
Schaltplan für Analogspannung

Die Anschlüsse sind auch in der folgenden Tabelle aufgeführt:

MB7389 Anschlüsse – Analogspannung

MaxBotix MB7389 Sensor Arduino
GND GND
V+ 5 V
Pin 3 A0
MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-pulse-width-wiring-diagram-schematic
Schaltplan für Pulsbreite

MB7389 Anschlüsse – Pulsbreite

MaxBotix MB7389 Sensor Arduino
GND GND
V+ 5 V
Pin 2 Pin 2

Welchen Ausgang du verwenden solltest, hängt von der Anwendung ab. Ein wichtiger Unterschied ist, dass der Analogspannungsausgang die Entfernung mit einer Auflösung von 5 mm anzeigt, während der Pulsbreitenausgang eine Auflösung von 1 mm bietet.

MaxBotix MB7389 Arduino Beispielcode – Analogspannung

Mit dem folgenden Beispielcode kannst du die Entfernung vom analogen Ausgang des Sensors auslesen und im seriellen Monitor anzeigen. Wie du siehst, ist der Code sehr einfach, aber unten findest du eine Erklärung, wie er funktioniert.

/* Arduino example code for MaxBotix MB7389 HRXL-MaxSonar-WR 
   weather resistant ultrasonic distance sensor: 
   analog voltage output. 
   More info: www.www.makerguides.com */

#define sensorPin A0

int distance = 0;

void setup() {
  Serial.begin(9600);
}

void read_sensor() {
  distance = analogRead(sensorPin) * 5;
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

Im Serial Monitor (Strg + Shift + M) solltest du folgende Ausgabe sehen.

MaxBotix MB7389 Analog voltage serial monitor output
MB7389 Serial Monitor Ausgabe

Wie der Code funktioniert

Der erste Schritt ist, den Anschluss-Pin zu definieren. Die Anweisung  #define  wird verwendet, um einem konstanten Wert einen Namen zu geben. Beim Kompilieren ersetzt der Compiler alle Verweise auf diese Konstante durch den definierten Wert. Überall, wo du  sensorPin nennst, ersetzt der Compiler dies beim Kompilieren durch A0.

#define sensorPin A0

Als Nächstes erstellen wir eine Variable, um die gemessene Entfernung zu speichern.

int distance = 0;

Im Setup initialisieren wir die serielle Kommunikation mit einer Baudrate von 9600. Später zeigen wir die gemessene Entfernung im seriellen Monitor an, der mit Strg + Shift + M oder über Tools > Serial Monitor geöffnet werden kann. Achte darauf, dass auch im seriellen Monitor die Baudrate auf 9600 eingestellt ist.

void setup() {
  Serial.begin(9600);
}

Danach habe ich zwei Funktionen erstellt: read_sensor  und  print_data.

In der Funktion read_sensor lesen wir einfach den analogen Spannungsausgang des Sensors mit der Funktion  analogRead(pin) aus. Die Arduino-Boards verfügen über einen mehrkanaligen 10-Bit-Analog-Digital-Wandler. Das bedeutet, dass die Eingangsspannung zwischen 0 und der Betriebsspannung in Ganzzahlen zwischen 0 und 1023 umgewandelt wird. Beim Arduino Uno entspricht das 5 Volt / 1024 Einheiten oder 4,9 mV pro Einheit.

Der MB7389 verwendet einen Skalierungsfaktor von (Vcc/5120) pro 1 mm oder 0,98 mV/mm bei einer 5 V Versorgungsspannung. Dadurch ist die Umrechnung des analogRead-Werts in mm sehr einfach: Du kannst das Ergebnis einfach mit 5 multiplizieren. Beachte, dass der Analogspannungsausgang die Entfernung mit einer Auflösung von 5 mm anzeigt.

void read_sensor() {
  distance = analogRead(sensorPin) * 5;
}

In der Funktion print_data geben wir die gemessene Entfernung im seriellen Monitor aus.

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

In der loop rufen wir zuerst die Funktion read_sensor auf, um die Entfernung zu ermitteln, und danach print_data, um sie im seriellen Monitor anzuzeigen. Ich habe eine Verzögerung von 1000 Millisekunden eingefügt, du kannst sie aber auf 150 ms reduzieren, wenn du möchtest. Die Abtastrate des MB7389 beträgt 6,66 Hz, also kannst du 6,66 Messungen pro Sekunde durchführen.

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

MaxBotix MB7389 Arduino Beispielcode – Pulsbreite

In diesem Beispiel verwenden wir den anderen Ausgang des Sensors: den Pulsbreiten-Ausgang.

/* Arduino example code for MaxBotix MB7389 HRXL-MaxSonar-WR weather resistant ultrasonic distance sensor: pulse width output. More info: www.www.makerguides.com */

#define sensorPin 2

long distance = 0;
long duration = 0;

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}

void read_sensor() {
  duration = pulseIn(sensorPin, HIGH);
  distance = duration;
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

Code-Erklärung

Nach der Definition des Anschluss-Pins habe ich zwei Variablen erstellt: duration  und  distance. Duration speichert die Länge des vom Sensor gesendeten Pulses. Die Variable distance wird verwendet, um die berechnete Entfernung zu speichern.

long distance = 0;
long duration = 0;

Im Setup müssen wir neben der Initialisierung der seriellen Kommunikation auch den sensorPin als INPUT setzen. Dafür verwenden wir die Funktion  pinMode(pin, mode).

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}

Die Funktion read_sensor unterscheidet sich vom vorherigen Beispiel. Jetzt messen wir nicht die analoge Spannung, sondern die Länge des vom Sensor gesendeten Pulses. Dafür verwenden wir die Funktion  pulseIn(pin, value). Diese Funktion wartet darauf, dass der Pin von LOW auf HIGH wechselt, startet die Zeitmessung, wartet dann, bis der Pin wieder LOW wird, und stoppt die Zeitmessung. Sie gibt die Pulsdauer in Mikrosekunden zurück.

Anschließend können wir die Entfernung in mm berechnen. Für den MB7389 ist der Skalierungsfaktor einfach 1 μs/mm, also distance = duration. Für andere MaxBotix-Sensoren findest du den Skalierungsfaktor im Datenblatt.

void read_sensor() {
  duration = pulseIn(sensorPin, HIGH);
  distance = duration;
}

Der Rest des Codes ist identisch zum vorherigen Beispiel.

Wenn du den Sensor zur Füllstandsmessung von Behältern einsetzen möchtest, empfehle ich, mehrere Messungen hintereinander durchzuführen und dann den Durchschnitt zu berechnen. In meinem Setup schwankten die Messwerte um ± 3 mm.

Trigger-Modus Betrieb

Alle MaxSonar-Sensoren arbeiten standardmäßig im Free-Run-Modus. Das bedeutet, dass der Sensor kontinuierlich misst, solange er mit Strom versorgt wird. Er sendet alle 150 ms zwanzig 42-kHz-Wellen aus (6,66 Hz Abtastrate für MB7389, siehe Datenblatt für andere Sensoren).

Dies ist in der Regel die einfachste Betriebsart, da du den Sensor nicht selbst auslösen musst und einfach eine Analogspannungs- oder Pulsbreitenmessung durchführen kannst, um die Entfernung zu erhalten.

Für manche Anwendungen, z. B. wenn der Sensor mit einer Batterie betrieben wird, kann es besser sein, den Sensor mit einem Trigger zu betreiben. Das bedeutet, dass du den Sensor nur dann eine Messung starten lässt, wenn du ihn dazu anweist. So kannst du den maximalen Stromverbrauch steuern, der beim Aussenden eines Sonarpulses am höchsten ist.

Um den Sensor mit einem Trigger zu betreiben, verwenden wir eine zusätzliche Verbindung zwischen Pin 4 des Sensors und dem Arduino. Wenn du diesen Pin nicht anschließt, wie in den vorherigen Beispielen, arbeitet der Sensor mit der im Datenblatt angegebenen Abtastrate.

Um den Sensor bei Bedarf auszulösen, musst du Pin 4 auf logisch LOW setzen. Wenn du eine Messung durchführen möchtest, ziehst du Pin 4 für mindestens 20 μs auf HIGH. Der Sensor startet dann einen Messzyklus.

In diesem Beispiel verwenden wir einen Taster, um den Sensor auszulösen. Verbinde ein Bein mit GND und das diagonal gegenüberliegende Bein mit Arduino Pin 4.

Die Anschlüsse sind auch in der folgenden Tabelle aufgeführt.

MB7389 Anschlüsse – Trigger-Modus

Pin Arduino
GND GND
V+ 5 V
Pin 2 Pin 2
Pin 4 Pin 3
Taster Bein 1 Pin 4
Taster Bein 2 GND

MaxBotix MB7389 Arduino Beispielcode – Trigger mit Taster

Du kannst diesen Beispielsketch verwenden, um den Sensor mit einem Trigger zu steuern. In diesem Fall nimmt der Sensor eine Messung auf, wenn du den Taster drückst, und zeigt die Entfernung im Serial Monitor an. Du kannst auch einfach die Funktion read_sensor aufrufen, wenn du eine Messung durchführen möchtest.

/* Arduino example code for MaxBotix MB7389 HRXL-MaxSonar-WR 
   weather resistant ultrasonic distance sensor with push button. 
   More info: www.www.makerguides.com */

#define readPin 2
#define triggerPin 3
#define buttonPin 4

long distance = 0;
long duration = 0;

int buttonState = HIGH;
int previous = HIGH;
long time = 0;
long debounce = 200;

void setup() {
  pinMode(readPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  Serial.begin(9600);
  delay(3000);
  Serial.println("Sensor is ready, waiting for button press!");
}

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration;
  delay(150);
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previous == HIGH && millis() - time > debounce) {
    read_sensor();
    print_data();
    time = millis();
  }

  previous = buttonState;
}

Im Serial Monitor (Strg + Shift + M) solltest du folgende Ausgabe sehen.

MB7389 trigger mode serial monitor output
Es dauert ein paar Sekunden, bis die erste Meldung erscheint.

Wie der Code funktioniert

Der erste Schritt ist, die Anschlüsse zu definieren. Wir verwenden den Pulsbreiten-Ausgang des Sensors, um die Entfernung auszulesen.

#define readPin 2
#define triggerPin 3
#define buttonPin 4

Neben den Variablen duration und distance aus dem vorherigen Beispiel benötigen wir weitere Variablen, um den Zustand des Tasters zu speichern. Die Variablen time und debounce werden verwendet, um  debounce  den Eingang zu entprellen.

Du kannst die Entprellzeit erhöhen, wenn du Fehltrigger bekommst.

long distance = 0;
long duration = 0;

int buttonState = HIGH;
int previous = HIGH;
long time = 0;
long debounce = 200;

Im Setup setzen wir triggerPin als Ausgang und read sowie buttonPin als Eingänge. Beachte, dass ich in der pinMode-Funktion INPUT_PULLUP verwendet habe. Im Atmega-Chip sind 20K Pullup-Widerstände integriert, die softwareseitig aktiviert werden können. Diese Einstellung zieht den buttonPin auf HIGH, wenn der Taster nicht gedrückt ist, und auf LOW, wenn du den Taster drückst.

Als Nächstes setzen wir triggerPin auf LOW, damit der Sensor nicht sofort mit der Messung beginnt.

Um die Sensordaten auszugeben, starten wir die serielle Kommunikation mit 9600 Baud.

void setup() {
  pinMode(readPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  Serial.begin(9600);
  delay(3000);
  Serial.println("Sensor is ready, waiting for button press!");
}

Danach habe ich zwei Funktionen definiert: read_sensor und print_data.

In der Funktion read_sensor setzen wir triggerPin für 20 Mikrosekunden auf HIGH. Dadurch wird der Sensor angewiesen, einen Sonarpuls auszusenden. Anschließend lesen wir die Länge des Ausgangspulses aus und wandeln sie in die Entfernung um (wie im vorherigen Beispiel). Ich habe eine Verzögerung von 100 ms eingefügt, da dies die minimale Zeit zwischen zwei Messungen ist.

Die Funktion print_data ist identisch zu den vorherigen Beispielen.

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration;
  delay(150);
}

In der loop lesen wir zuerst den Zustand des Tasters (gedrückt / nicht gedrückt) und speichern ihn in buttonState. Die nächste Zeile prüft, ob der Taster gedrückt wurde (d. h. der Eingang von HIGH auf LOW gewechselt ist) und ob seit dem letzten Druck genug Zeit vergangen ist, um Störsignale zu ignorieren.

Wenn das zutrifft, werden die Funktionen read_sensor und print_data aufgerufen und der Timer zurückgesetzt.

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previous == HIGH && millis() - time > debounce) {
    read_sensor();
    print_data();
    time = millis();
  }

  previous = buttonState;
}

Zum Schluss wird die Variable previous auf den aktuellen buttonState gesetzt.

CAD

MaxBotix stellt auf seiner Website kostenlose CAD-Dateien für alle seine Sensoren zur Verfügung. Das erleichtert das Design von individuellen Teilen oder Halterungen für den Sensor erheblich. Du kannst unten eine ZIP-Datei mit einem 3D-Modell des Sensors herunterladen (7 verschiedene Dateiformate). Weitere Modelle verschiedener Sensoren findest du auf ihrer Website.

Fazit

In diesem Artikel habe ich dir gezeigt, wie du den wetterfesten Ultraschall-Abstandssensor MaxBotix MB7389 HRXL-MaxSonar-WR mit Arduino verwenden kannst. Ich hoffe, du fandest ihn nützlich und informativ.

Wenn du mehr über andere Abstandssensoren erfahren möchtest, könnten die folgenden Artikel hilfreich sein:

Wenn du Fragen hast, hinterlasse gerne einen Kommentar unten.