Skip to Content

Tutoriel capteur de distance résistant aux intempéries MaxBotix MB7389

Tutoriel capteur de distance résistant aux intempéries MaxBotix MB7389

Le MaxBotix MB7389 HRXL-MaxSonar-WR est un capteur de distance ultrasonique résistant aux intempéries, avec une portée de 30 à 500 cm et une résolution de 1 mm. Ce capteur est idéal pour des applications extérieures telles que la mesure du niveau d’un réservoir d’eau ou d’une benne. Il possède un angle de faisceau très étroit et peut également être utilisé pour des applications robotiques. Bien que ce tutoriel soit écrit pour le MB7389, il peut aussi être utilisé avec d’autres capteurs MaxBotix.

Dans ce tutoriel, vous apprendrez comment fonctionne le capteur et comment l’utiliser avec un Arduino. J’ai inclus 3 exemples avec des schémas de câblage qui montrent le fonctionnement de base du capteur. Nous examinerons les différentes sorties du capteur et je vous expliquerai la différence entre le mode free-run et le mode déclenché.

Après chaque exemple, j’analyse et explique le fonctionnement du code, vous ne devriez donc avoir aucun problème à le modifier selon vos besoins.

Fournitures

Composants matériels

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

Logiciel

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.

Comment fonctionne un capteur ultrasonique ?

Un capteur de distance ultrasonique fonctionne en émettant des ondes ultrasonores. Ces ondes sont réfléchies par un objet et le capteur les détecte. En mesurant le temps écoulé entre l’émission et la réception des ondes sonores, vous pouvez calculer la distance entre le capteur et l’objet.

Distance (cm) = Vitesse du son (cm/µs) × Temps (µs) / 2

Temps est le temps entre l’émission et la réception des ondes sonores en microsecondes. À 20 °C, la vitesse du son est d’environ 343 m/s ou 0,034 cm/µs.

How does an ultrasonic distance sensor work
Principe de fonctionnement des capteurs de distance ultrasoniques. Source :  https://www.maxbotix.com/

Notez qu’il faut diviser le résultat par deux. En effet, les ondes sonores parcourent la distance du capteur à l’objet puis reviennent de l’objet au capteur. La distance entre le capteur et l’objet correspond donc à la moitié de la distance totale parcourue par les ondes sonores.

Pour plus d’informations sur le fonctionnement des capteurs ultrasoniques, vous pouvez consulter mon article sur le HC-SR04. Dans cet article, les principes de fonctionnement d’un capteur de distance ultrasonique sont expliqués en détail.

Informations sur le capteur

Le MaxBotix MB7389 HRXL-MaxSonar-WR est un capteur de distance ultrasonique fabriqué par MaxBotix Inc. MaxBotix est un fabricant américain spécialisé dans les capteurs ultrasoniques. Ils produisent des capteurs pour toutes sortes d’applications, aussi bien en intérieur qu’en extérieur.

MaxBotix ne qualifie pas ses capteurs d’« étanches », mais ils sont correctement testés et certifiés avec un indice de protection IP67 résistant aux intempéries. Vous pouvez trouver la définition de cette certification sur Wikipedia.

Ce que vous ne savez peut-être pas, c’est que la vitesse du son dépend fortement de la température et de l’humidité de l’air. La vitesse du son dans l’air augmente d’environ 0,6 mètre par seconde par degré Celsius. Contrairement à beaucoup d’autres capteurs, le MB7389 intègre une compensation interne de la température. Cela signifie que le capteur compense automatiquement les variations de la vitesse du son et continue de fournir des mesures précises. Vous pouvez aussi installer un capteur de température externe pour une compensation encore plus précise.

Vous trouverez plus de spécifications du capteur dans le tableau ci-dessous.

Spécifications du MB7389 HRXL-MaxSonar-WR

Tension de fonctionnement 2,7 – 5,5 V
Courant de fonctionnement 3,1 mA en moyenne à 5 V (98 mA en pointe)
Portée 30* – 500 cm
Angle/forme du faisceau See here
Protection IP67
Résolution 1 mm
Fréquence 42 kHz
Taux de lecture 6,66 Hz
Sorties du capteur Tension analogique, largeur d’impulsion, RS232
Dimensions globales 22,1 x 19,9 x 25,11 mm
Température de fonctionnement -40 – +65 °C
Avantages Petit, léger, faisceau étroit, calibration automatique (tension, humidité, bruit ambiant), filtrage firmware, résistant aux intempéries (IP67), compensation de température, facile à utiliser
Fabriqué aux USA
Coût Check price

*Le capteur n’a pratiquement pas de zone morte, les objets plus proches que 30 cm sont signalés comme étant à 30 cm.

Pour plus d’informations, vous pouvez consulter la fiche technique ici :

Dimensions du capteur

Les dimensions exactes du capteur sont indiquées sur l’image ci-dessous :

MB7389 Ultrasonic Distance Sensor dimensions
Capteur de distance ultrasonique MB7389

Sorties du capteur MaxBotix

Comme vous avez pu le voir dans le tableau des spécifications ci-dessus, les capteurs MaxBotix de la famille MaxSonar ont différentes sorties : tension analogique, largeur d’impulsion et RS232 série (I2C capteurs sont également disponibles). Dans ce tutoriel, nous examinerons les sorties tension analogique et largeur d’impulsion.

Tension analogique

C’est probablement la manière la plus simple de lire la distance mesurée par le capteur. La sortie tension analogique délivre une tension linéaire qui augmente à mesure que la cible s’éloigne du capteur.

136_AnalogVoltage_lg
Sortie tension analogique. Source : https://www.maxbotix.com/

Nous pouvons lire cette sortie avec un microcontrôleur comme l’Arduino et calculer la distance en multipliant la lecture par un facteur d’échelle constant (ce facteur dépend du type exact de capteur, voir la fiche technique).

Largeur d’impulsion

Une autre option est d’utiliser la sortie largeur d’impulsion. Cette broche délivre une impulsion dont la durée représente la distance. Vous pouvez utiliser la fonction  pulseIn()  dans le code Arduino pour lire la durée de cette impulsion en microsecondes (µs). Pour obtenir la distance, il faut multiplier cette lecture par un facteur d’échelle constant. Pour le MB7389, ce facteur est de 1 µs/mm. Vous pouvez donc simplement multiplier la lecture TOF par 1 pour obtenir la distance en millimètres.

PW-Output
Sortie largeur d’impulsion. Source : https://www.maxbotix.com/

Pour d’autres types de capteurs, vous pouvez trouver les facteurs d’échelle dans les fiches techniques.

Câblage – Connexion du MaxBotix MB7389 à l’Arduino UNO

Comme mentionné dans l’introduction, les capteurs MaxBotix peuvent fonctionner en différents modes. Les schémas de câblage ci-dessous montrent comment connecter le capteur MB7389 à l’Arduino pour une utilisation en tension analogique ou largeur d’impulsion.

Vous pouvez souder les fils directement au capteur, ou installer des broches ou un connecteur.

MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-analog-voltage-wiring-diagram-schematic
Schéma de câblage tension analogique

Les connexions sont aussi indiquées dans le tableau suivant :

Connexions MB7389 – Tension analogique

Capteur MaxBotix MB7389 Arduino
GND GND
V+ 5 V
Broche 3 A0
MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-pulse-width-wiring-diagram-schematic
Schéma de câblage largeur d’impulsion

Connexions MB7389 – Largeur d’impulsion

Capteur MaxBotix MB7389 Arduino
GND GND
V+ 5 V
Broche 2 Broche 2

Le choix de la sortie dépend de l’application. Une différence importante est que la sortie tension analogique affiche la distance avec une résolution de 5 mm, tandis que la sortie largeur d’impulsion offre une résolution de 1 mm.

Exemple de code Arduino MaxBotix MB7389 – Tension analogique

Avec l’exemple de code suivant, vous pouvez lire la distance depuis la sortie analogique du capteur et l’afficher sur le moniteur série. Comme vous le verrez, le code est très simple, mais vous trouverez des explications sur son fonctionnement ci-dessous.

/* 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);
}

Vous devriez voir la sortie suivante dans le Moniteur Série (Ctrl + Maj + M).

MaxBotix MB7389 Analog voltage serial monitor output
Sortie Moniteur Série MB7389

Comment fonctionne le code

La première étape est de définir la broche de connexion. L’instruction  #define  est utilisée pour donner un nom à une valeur constante. Lors de la compilation, le compilateur remplacera toutes les références à cette constante par la valeur définie. Ainsi, partout où vous mentionnez  sensorPin, le compilateur le remplacera par A0 lors de la compilation.

#define sensorPin A0

Ensuite, nous devons créer une variable pour stocker la distance mesurée.

int distance = 0;

Dans le setup, nous initialisons la communication série à un débit de 9600 bauds. Plus tard, nous afficherons la distance mesurée dans le moniteur série, accessible avec Ctrl + Maj + M ou Outils > Moniteur Série. Assurez-vous que le débit est aussi réglé à 9600 dans le moniteur série.

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

Ensuite, j’ai créé deux fonctions :  read_sensor  et  print_data.

Dans la fonction read_sensor, nous lisons simplement la sortie tension analogique du capteur avec la fonction  analogRead(pin). Les cartes Arduino contiennent un convertisseur analogique-numérique 10 bits multicanal. Cela signifie qu’il convertit la tension d’entrée entre 0 et la tension d’alimentation en valeurs entières entre 0 et 1023. Sur un Arduino Uno, cela correspond à 5 volts / 1024 unités, soit environ 4,9 mV par unité.

Le MB7389 utilise un facteur d’échelle de (Vcc/5120) par mm, soit 0,98 mV/mm avec une alimentation 5 V. Cela rend la conversion de la valeur analogRead en mm très simple, il suffit de multiplier le résultat par 5. Notez que cela signifie que la sortie tension analogique affiche la distance avec une résolution de 5 mm.

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

Dans la fonction print_data, nous affichons la distance mesurée sur le moniteur série.

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

Dans la boucle loop, nous appelons d’abord read_sensor pour obtenir la distance, puis print_data pour l’envoyer au moniteur série. J’ai ajouté un délai de 1000 millisecondes, mais vous pouvez le réduire à 150 si vous le souhaitez. La fréquence de lecture du MB7389 est de 6,66 Hz, vous pouvez donc effectuer 6,66 lectures par seconde.

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

Exemple de code Arduino MaxBotix MB7389 – Largeur d’impulsion

Dans cet exemple, nous utiliserons l’autre sortie du capteur : la sortie largeur d’impulsion.

/* 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);
}

Explication du code

Après avoir défini la broche de connexion, j’ai créé deux variables :  duration  et  distance. Duration stocke la durée de l’impulsion envoyée par le capteur. La variable distance sert à stocker la distance calculée.

long distance = 0;
long duration = 0;

Dans le setup, en plus d’initialiser la communication série, nous devons définir sensorPin comme une entrée. Pour cela, nous utilisons la fonction  pinMode(pin, mode).

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

La fonction read_sensor est différente de l’exemple précédent. Cette fois, nous ne mesurons pas la tension analogique, mais la durée de l’impulsion envoyée par le capteur. Pour cela, nous utilisons la fonction  pulseIn(pin, value). Cette fonction attend que la broche passe de LOW à HIGH, démarre le chronométrage, attend que la broche repasse à LOW et arrête le chronométrage. Elle retourne la durée de l’impulsion en microsecondes.

Ensuite, nous pouvons calculer la distance en mm. Pour le capteur MB7389, le facteur d’échelle est simplement 1 μs/mm, donc distance = duration. Pour d’autres capteurs MaxBotix, vous trouverez ce facteur dans la fiche technique.

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

Le reste du code est identique à l’exemple précédent.

Si vous prévoyez d’utiliser le capteur pour la mesure de niveau de benne, je recommande de prendre plusieurs mesures consécutives puis de calculer la moyenne. Dans mon installation, les mesures fluctuaient de ± 3 mm.

Fonctionnement en mode déclenché

Tous les capteurs MaxSonar fonctionnent par défaut en mode free-running. Cela signifie que le capteur effectue des mesures en continu tant qu’il est alimenté. Il émet vingt ondes à 42 kHz toutes les 150 ms (taux de lecture de 6,66 Hz pour le MB7389, voir la fiche technique pour d’autres capteurs).

C’est généralement la manière la plus simple d’utiliser le capteur, car vous n’avez pas à le déclencher vous-même et pouvez simplement lire la tension analogique ou la largeur d’impulsion pour obtenir la distance.

Pour certaines applications, comme l’alimentation sur batterie, il peut être préférable d’utiliser un déclencheur. Cela signifie que vous pouvez demander au capteur de démarrer un cycle de mesure uniquement lorsqu’on le lui ordonne. Ainsi, vous contrôlez le courant maximal consommé par le capteur, qui se produit lors de l’émission de l’impulsion sonar.

Pour utiliser le capteur avec un déclencheur, nous utiliserons une connexion supplémentaire entre la broche 4 du capteur et l’Arduino. Si vous ne connectez rien à cette broche, comme dans les exemples précédents, le capteur effectuera des mesures à la fréquence indiquée dans la fiche technique.

Pour déclencher le capteur quand vous le souhaitez, vous devez connecter la broche 4 à un niveau logique bas. Pour prendre une mesure, il faut mettre la broche 4 à l’état haut pendant au moins 20 μs. Le capteur démarrera alors un cycle de mesure.

Dans cet exemple, nous utiliserons un bouton-poussoir momentané pour déclencher le capteur. Connectez une patte à la masse et la patte en diagonale opposée à la broche 4 de l’Arduino.

Les connexions sont aussi indiquées dans le tableau ci-dessous.

Connexions MB7389 – Mode déclenché

Broche Arduino
GND GND
V+ 5 V
Broche 2 Broche 2
Broche 4 Broche 3
Broche 1 du bouton Broche 4
Broche 2 du bouton GND

Exemple de code Arduino MaxBotix MB7389 – Déclenchement avec bouton-poussoir

Vous pouvez utiliser ce sketch d’exemple pour contrôler le capteur avec un déclencheur. Dans ce cas, le capteur prendra une mesure lorsque vous appuierez sur le bouton et affichera la distance sur le Moniteur Série. Vous pouvez aussi simplement appeler la fonction read_sensor quand vous souhaitez prendre une mesure.

/* 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;
}

Vous devriez voir la sortie suivante dans le Moniteur Série (Ctrl + Maj + M).

MB7389 trigger mode serial monitor output
Il faut quelques secondes avant que le premier message apparaisse.

Comment fonctionne le code

La première étape est de définir les connexions. Nous utiliserons la sortie largeur d’impulsion du capteur pour lire la distance.

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

En plus des variables duration et distance utilisées dans l’exemple précédent, nous avons besoin de nouvelles variables pour stocker l’état du bouton. Les variables time et debounce servent à  debounce  le filtrage du signal d’entrée.

Vous pouvez augmenter le temps de debounce si vous avez des déclenchements intempestifs.

long distance = 0;
long duration = 0;

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

Dans le setup, nous définissons triggerPin en sortie et read et buttonPin en entrée. Notez que j’ai utilisé INPUT_PULLUP dans la fonction pinMode. Il y a des résistances pullup de 20K intégrées dans la puce Atmega accessibles par logiciel. Ce réglage maintient buttonPin à HIGH quand il n’est pas pressé et le met à LOW quand vous appuyez sur le bouton.

Ensuite, nous mettons triggerPin à LOW pour que le capteur ne commence pas à mesurer.

Pour afficher les données du capteur, nous démarrons la communication série à 9600 bauds.

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!");
}

Ensuite, j’ai défini deux fonctions, read_sensor et print_data.

Dans read_sensor, vous pouvez voir que nous mettons triggerPin à HIGH pendant 20 microsecondes. Cela indique au capteur d’émettre une impulsion sonar. Ensuite, nous lisons la durée de l’impulsion de sortie et la convertissons en distance (comme dans l’exemple précédent). J’ai ajouté un délai de 100 ms, qui est le temps minimum entre deux mesures.

La fonction print_data est identique aux exemples précédents.

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

Dans la boucle loop, nous lisons d’abord l’état du bouton (appuyé / non appuyé) et le stockons dans buttonState. La ligne suivante vérifie si vous avez appuyé sur le bouton (c’est-à-dire si l’entrée est passée de HIGH à LOW) et si vous avez attendu assez longtemps depuis la dernière pression pour ignorer les parasites.

Si c’est vrai, elle appelle les fonctions read_sensor et print_data et réinitialise le timer.

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

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

  previous = buttonState;
}

Enfin, la variable previous est mise à jour avec l’état actuel buttonState.

CAO

MaxBotix fournit gratuitement des fichiers CAO pour tous leurs capteurs sur leur site web. Cela facilite la conception de pièces ou supports personnalisés pour utiliser avec le capteur. Vous pouvez télécharger un fichier zip contenant un modèle 3D du capteur ci-dessous (7 formats de fichiers différents). D’autres modèles de capteurs sont disponibles sur leur Website.

Conclusion

Dans cet article, je vous ai montré comment utiliser le capteur de distance ultrasonique résistant aux intempéries MaxBotix MB7389 HRXL-MaxSonar-WR avec Arduino. J’espère que vous l’avez trouvé utile et instructif.

Si vous souhaitez en savoir plus sur d’autres capteurs de distance, les articles ci-dessous pourraient vous intéresser :

Si vous avez des questions, n’hésitez pas à laisser un commentaire ci-dessous.