Skip to Content

Tutoriel Arduino pour le capteur de distance à ultrasons MaxBotix MB1240

Tutoriel Arduino pour le capteur de distance à ultrasons MaxBotix MB1240

Le MB1240 XL-MaxSonar-EZ4 est un capteur de distance à ultrasons haute performance avec une portée de 20 à 765 cm. C’est une excellente alternative au populaire HC-SR04 lorsque vous avez besoin d’un meilleur filtrage du bruit et d’une plus grande fiabilité. Bien que ce tutoriel soit écrit pour le MB1240, il peut également ê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 comment vous pouvez déclencher le capteur avec un bouton-poussoir.

Fournitures

Composants matériels

MB1240 XL-MaxSonar EZ4 × 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 à ultrasons ?

Un capteur de distance à ultrasons fonctionne en émettant des ondes ultrasonores. Ces ondes sont réfléchies par un objet et le capteur à ultrasons 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

Où  Temps  est le temps entre l’émission et la réception des ondes sonores en microsecondes.

How Ultrasonic Sensors Work Maxbotix
Principe de fonctionnement des capteurs de distance à ultrasons. 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 à ultrasons, vous pouvez consulter mon article How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino. Dans cet article, les principes de fonctionnement d’un capteur de distance à ultrasons sont expliqués en détail.

Informations sur le capteur

Le  MB1240 XL-MaxSonar-EZ4  est un capteur de distance à ultrasons fabriqué par MaxBotix Inc. MaxBotix est un fabricant américain spécialisé dans les capteurs à ultrasons. Ils produisent des capteurs pour toutes sortes d’applications, aussi bien en intérieur qu’en extérieur.

Le MB1240 est l’un de leurs capteurs les plus populaires et est idéal pour les applications robotiques. La famille XL-MaxSonar-EZ offre une grande tolérance aux interférences acoustiques ou électriques. Cela signifie que vous pouvez l’utiliser pour des applications robotiques avec plusieurs moteurs et servomoteurs.

Le MB1240 utilisé dans ce tutoriel a une portée allant jusqu’à 765 cm et offre une résolution de 1 cm. MaxBotix vend également des capteurs avec une résolution de 1 mm (HRLV-MaxSonar-EZ) et un taux de rafraîchissement plus élevé (LV-MaxSonar-EZ). La gamme HR de capteurs intègre également une compensation interne de la température.

Spécifications du TM1240 XL-MaxSonar-EZ4

Tension d’alimentation 3,3 – 5,5 V
Courant de fonctionnement 3,4 mA en moyenne (100 mA en pointe)
Portée (0)* 20 – 765 cm
Résolution 1 cm
Fréquence 42 kHz
Taux de lecture 10 Hz
Sorties du capteur Tension analogique, largeur d’impulsion, RS232
Dimensions générales 22,1 x 19,9 x 25,11 mm
Température de fonctionnement 0 – 65 °C
Avantages Petit, léger, faisceau étroit, calibration automatique (tension, humidité, bruit ambiant), filtrage firmware, facile à utiliser
Fabriqué aux USA
Coût Check price

*Le capteur n’a pratiquement pas de zone morte, les objets plus proches que 20 cm sont détectés à 20 cm.

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

Sorties des capteurs MaxBotix

Comme vous avez pu le voir dans le tableau des spécifications ci-dessus, les capteurs MaxBotix de la famille MaxSonar disposent de différentes sorties : tension analogique, largeur d’impulsion, RS232 série et I2C. 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 du capteur fournit une tension linéaire qui augmente à mesure que la cible s’éloigne du capteur.

136_AnalogVoltage_lg
Sortie tension analogique (source)

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 fournit une impulsion dont la largeur 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 MB1240 (capteurs XL-MaxSonar), ce facteur est de 58 µs/cm. Vous pouvez donc simplement diviser la lecture TOF par 58 pour obtenir la distance en centimè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.

MaxBotix MB1240 vs HC-SR04

Lorsque vous cherchez un capteur de distance à ultrasons, vous avez probablement rencontré le populaire HC-SR04. Ce capteur à bas coût est disponible chez de nombreux fabricants chinois. Le HC-SR04 et le MB1240 fonctionnent sur un principe similaire, mais présentent quelques différences clés (principalement en qualité et en prix).

La première chose que vous remarquerez peut-être est la différence de taille. Le MaxBotix MB1240 utilise un seul transducteur ultrasonore pour l’émission et la réception des ondes sonores. Le HC-SR04, en revanche, en utilise deux. Cela signifie que le MB1240 est nettement plus petit.

Le montage d’un capteur HC-SR04 peut être difficile et nécessite souvent de toutes petites vis, alors que le MB1240 dispose de deux trous pour des boulons M3.

Pour moi, les principaux avantages des capteurs MaxBotix sont la calibration automatique en temps réel, l’angle de faisceau étroit, la haute tolérance au bruit et le filtrage embarqué.

Le MB1240 a un faisceau très étroit sur toute sa plage de mesure (pour les grands objets). Cela le rend idéal pour cartographier précisément une pièce (robots évitant les obstacles) et évite les réflexions précoces provenant d’objets proches du capteur. Le HC-SR04 a un faisceau en forme de cône 3D de 15°. Cela signifie que vous ne pouvez pas mesurer précisément des objets éloignés du capteur. Le faisceau est simplement trop large et captera des objets plus proches.

De plus, j’apprécie le fonctionnement continu des capteurs (plus d’infos plus tard) et la sortie analogique. La sortie analogique facilite grandement la programmation des capteurs. Ces fonctionnalités supplémentaires sont très appréciables, mais notez que le prix est aussi nettement plus élevé que celui des capteurs chinois. En résumé, si vous cherchez un capteur fiable et de haute qualité, les capteurs MaxBotix peuvent être une bonne option. Pour une comparaison, consultez le tableau ci-dessous.

Tableau comparatif MB1240 vs HC-SR04

MB1240 HC-SR04
Tension d’alimentation 3,3 – 5,5 V 5 V
Courant de fonctionnement 3,4 mA en moyenne (100 mA en pointe) 15 mA
Portée (0) 20 – 765 cm 2 – 400 cm
Résolution 1 cm >3 mm
Diagramme du faisceau see here Cône de 15°
Fréquence 42 kHz 40 kHz
Sorties du capteur Tension analogique, largeur d’impulsion, RS232 Largeur d’impulsion
Dimensions 22,1 x 19,9 x 25,11 mm 45 x 20 x 15 mm
Compensation de température* Non Non
Filtrage Oui Non
Calibration automatique en temps réel Oui Non
Tolérance au bruit Élevée Faible
Fabriqué en USA Chine
Prix Check priceCheck price

*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.

Ni le HC-SR04 ni le MB1240 ne compensent les variations de température de l’air pendant le fonctionnement. Les capteurs XL-MaxSonar et LV-MaxSonar supposent une température de l’air de 22,5 degrés Celsius. La gamme HR line de capteurs intègre une calibration interne de la température, vous n’avez donc pas besoin d’ajouter de capteurs vous-même. Si vous souhaitez voir un exemple incluant un capteur de température pour calibrer la vitesse du son en temps réel, consultez le How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino tutoriel.

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

Comme mentionné dans l’introduction, les capteurs MaxBotix peuvent être utilisés en différents modes. Les schémas de câblage ci-dessous montrent comment connecter le capteur MB1240 à l’Arduino pour un fonctionnement en tension analogique ou largeur d’impulsion.

Vous pouvez souder les fils directement au capteur, ou installer des broches d’en-tête (ce que j’ai fait) ou un connecteur.

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

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

Connexions MB1240 – Tension analogique

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

Connexions MB1240 – Largeur d’impulsion

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

Exemple de code Arduino MaxBotix MB1240 – Tension analogique

Avec l’exemple suivant, vous pouvez lire la distance mesurée et l’afficher sur le moniteur série. Comme vous pouvez le voir, le code est très simple mais vous trouverez quelques explications sur son fonctionnement ci-dessous.

Vous pouvez téléverser le code exemple avec l’IDE Arduino.

/* Arduino example code for MaxBotix MB1240 XL-MaxSonar-EZ4 
   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) * 1;
}

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

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

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

MB1240 Analog voltage serial monitor output
Sortie du Moniteur Série MB1240

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. Lorsque le programme est compilé, le compilateur remplace 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 également réglé sur 9600 dans le moniteur série.

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

Après cela, 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 4,9 mV par unité.

Le MB1240 utilise un facteur d’échelle de (Vcc/1024) par cm, soit 4,9 mV/cm avec une alimentation 5 V. Cela rend la conversion de la valeur analogRead en centimètres très simple, vous pouvez simplement multiplier le résultat par 1 (analogRead(sensorPin) = distance en centimètres).

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

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

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

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

Exemple de code Arduino MaxBotix MB1240 – Largeur d’impulsion

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

/* Arduino example code for MaxBotix MB1240 XL-MaxSonar-EZ4 
   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 / 58;
}

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

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 est utilisée pour stocker la distance calculée.

long distance = 0;
long duration = 0;

Dans le setup, en plus d’initialiser la communication série, nous devons aussi configurer sensorPin en 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, puis 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 centimètres en divisant la durée par 58. Pour d’autres capteurs MaxBotix, vous pouvez trouver ce facteur d’échelle dans la fiche technique.

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

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

Mode de fonctionnement par déclenchement

Tous les capteurs MaxSonar fonctionnent par défaut en mode libre (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 99 ms (taux de lecture de 10 Hz pour le MB1240, 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 d’une impulsion sonar.

Le capteur consomme le plus de courant lorsqu’il émet une 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 au taux de rafraîchissement indiqué dans la fiche technique.

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

Le schéma de câblage ci-dessous montre les connexions nécessaires pour cet exemple.

MaxBotix-MB1240-ultrasonic-distance-sensor-with-Arduino-UNO-pulse-width-non-continuous-operation-wiring-diagram-schematic
MaxBotix MB1240 avec bouton-poussoir momentané et câblage Arduino

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 également indiquées dans le tableau ci-dessous.

Connexions MB1240 – Mode déclenchement

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 MB1240 – Déclenchement avec bouton-poussoir

Vous pouvez utiliser ce sketch exemple pour contrôler le capteur avec un déclencheur. Dans ce cas, le capteur prendra une mesure lorsque vous appuyez 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 MB1240 XL-MaxSonar-EZ4 
   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 / 58;
  delay(100);
}

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

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).

MB1240 trigger mode serial monitor output
Sortie du Moniteur Série

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 à éliminer les rebonds (debounce) de l’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 configurons 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!");
}

Après cela, j’ai défini deux fonctions, read_sensor et print_data.

Dans la fonction 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 / 58;
  delay(100);
}

Dans la boucle, 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 suffisamment longtemps depuis la dernière pression pour ignorer les bruits.

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.

XL-MaxSonar-EZ-Mechanical Dimensions
Carte XL-MaxSonar

CAO

MaxBotix fournit gratuitement des fichiers CAO pour tous leurs capteurs sur leur site web. Cela facilite grandement 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 à ultrasons MaxBotix MB1240 XL-MaxSonar-EZ4 avec Arduino.

Si vous souhaitez en savoir plus sur d’autres capteurs de distance, les articles ci-dessous pourraient vous être utiles :

Si vous avez des questions, des suggestions ou si vous pensez que des éléments manquent dans ce tutoriel, merci de laisser un commentaire ci-dessous.