Skip to Content

Tutorial del sensor de distancia resistente a la intemperie MaxBotix MB7389

Tutorial del sensor de distancia resistente a la intemperie MaxBotix MB7389

El MaxBotix MB7389 HRXL-MaxSonar-WR es un sensor de distancia ultrasónico resistente a la intemperie con un rango de 30 a 500 cm y una resolución de 1 mm. Este sensor es ideal para aplicaciones en exteriores, como la medición del nivel de un depósito de agua o de un contenedor. Tiene un ángulo de haz muy pequeño y también puede utilizarse para aplicaciones robóticas. Aunque este tutorial está escrito para el MB7389, también puede utilizarse para otros sensores MaxBotix.

En este tutorial, aprenderás cómo funciona el sensor y cómo puedes utilizarlo con un Arduino. He incluido 3 ejemplos con diagramas de cableado que muestran el funcionamiento básico del sensor. Veremos las diferentes salidas del sensor y te mostraré la diferencia entre el modo de funcionamiento libre y el modo activado.

Después de cada ejemplo, desgloso y explico cómo funciona el código, por lo que no deberías tener problemas para modificarlo y adaptarlo a tus necesidades.

Si tiene alguna pregunta, deje un comentario a continuación.

Si quiere saber más sobre otros sensores de distancia, los siguientes artículos pueden resultarle útiles:

Suministros

Componentes de hardware

MB7389-100 HRXL-MaxSonar-WRMT× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
Tablero de pruebas× 1Amazon
Cables de puente~ 10Amazon
Clavijas de cabecera (opcional)× 7Amazon
pulsador momentáneoPulsador momentáneo× 1Amazon
Cable USB tipo A/B× 1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.

¿Cómo funciona un sensor ultrasónico?

Un sensor de distancia por ultrasonidos funciona enviando ondas ultrasónicas. Estas ondas de ultrasonido se reflejan en un objeto y el sensor ultrasónico las detecta. Midiendo el tiempo transcurrido entre el envío y la recepción de las ondas sonoras, se puede calcular la distancia entre el sensor y el objeto.

Distancia (cm) = Velocidad del sonido (cm/µs) × Tiempo (µs) / 2

Donde Tiempo es el tiempo entre el envío y la recepción de las ondas sonoras en microsegundos. A 20 °C la velocidad del sonido es de aproximadamente 343 m/s o 0,034 cm/µs.

Cómo funciona un sensor de distancia por ultrasonidos
Principio de funcionamiento de los sensores de distancia por ultrasonidos. Fuente: https://www.maxbotix.com/

Tenga en cuenta que debe dividir el resultado por dos. Esto se debe a que las ondas sonoras viajaron del sensor al objeto y de vuelta del objeto al sensor. Así que la distancia entre el sensor y el objeto es sólo la mitad de la distancia que recorrieron las ondas sonoras.

Para obtener más información sobre el funcionamiento de los sensores ultrasónicos, puede consultar mi artículo sobre el HC-SR04. En este artículo se explican con más detalle los principios de funcionamiento de un sensor de distancia por ultrasonidos.

Información sobre el sensor

El MaxBotix MB7389 HRXL-MaxSonar-WR es un sensor de distancia ultrasónico fabricado por MaxBotix Inc. MaxBotix es un fabricante estadounidense especializado en sensores ultrasónicos. Fabrican sensores para todo tipo de aplicaciones, tanto para interiores como para exteriores.

MaxBotix no llama a sus sensores "resistentes al agua", sino que los sensores están debidamente probados y clasificados con una clasificación de resistencia a la intemperie IP67. Puede encontrar la definición de esta clasificación aquí en Wikipedia.

Lo que quizá no sepas es que la velocidad del sonido depende en gran medida de la temperatura y la humedad del aire. La velocidad del sonido en el aire aumenta unos 0,6 metros por segundo, por grado centígrado. A diferencia de muchos otros sensores, el MB7389 incorpora una compensación de temperatura interna. Esto significa que el sensor compensará automáticamente los cambios en la velocidad del sonido y seguirá dando lecturas precisas. También puede instalar un sensor de temperatura externo, para una compensación de temperatura aún más precisa.

En la siguiente tabla se pueden encontrar más especificaciones del sensor.

Especificaciones del MB7389 HRXL-MaxSonar-WR

Tensión de funcionamiento2.7 - 5.5 V
Corriente de trabajo3,1 mA de media a 5 V (98 mA de pico)
Gama30* - 500 cm
Ángulo/forma del hazVer aquí
ProtecciónIP67
Resolución1 mm
Frecuencia42 kHz
Ritmo de lectura6,66 Hz
Salidas de los sensoresTensión analógica, ancho de pulso, RS232
Dimensiones totales22,1 x 19,9 x 25,11 mm
Temperatura de funcionamiento-40 - +65 °C
VentajaPequeño, ligero, haz estrecho, calibración automática (tensión, humedad, ruido ambiental), filtrado de firmware, resistente a la intemperie (IP67), compensación de temperatura, fácil de usar
Fabricado enEE.UU.
CosteComprobar el precio

*El sensor no tiene prácticamente ninguna zona muerta, los objetos más cercanos a 30 cm se reportan como 30 cm.

Para más información, puede consultar la hoja de datos aquí:

Dimensiones del sensor

Las dimensiones exactas del sensor se pueden encontrar en la siguiente imagen:

Dimensiones del sensor de distancia ultrasónico MB7389
MB7389 Ultrasonic Distance Sensor

Salidas de los sensores MaxBotix

Como habrás visto en la tabla de especificaciones anterior, los sensores MaxBotix de la familia MaxSonar tienen diferentes salidas: tensión analógica, ancho de pulso y serie RS232(también hay sensores I2C). En este tutorial veremos las salidas de voltaje analógico y de ancho de pulso.

Tensión analógica

Esta es probablemente la forma más fácil de leer la distancia medida desde el sensor. La salida de tensión analógica del sensor emite una tensión lineal que aumenta a medida que el objetivo se aleja del sensor.

136_AnalogVoltage_lg
Salida de tensión analógica. Fuente: https://www.maxbotix.com/

Podemos leer esta salida con un microcontrolador como el Arduino y calcular la distancia multiplicando la lectura por un factor de escala constante (este factor depende del tipo de sensor exacto, véase la hoja de datos).

Ancho de pulso

Otra opción es utilizar la salida de ancho de pulso. Esta clavija emite una representación del ancho de pulso de la distancia. Se puede utilizar el pulseIn() en el código de Arduino para leer la longitud de este pulso de salida en microsegundos (µs). Para obtener la distancia, hay que multiplicar esta lectura por un factor de escala constante. Para el MB7389, el factor de escala es 1 µs/mm. Por lo tanto, basta con multiplicar la lectura del TOF por 1 para obtener la distancia en milímetros.

PW-Salida
Salida de ancho de pulso. Fuente: https://www.maxbotix.com/

Para otros tipos de sensores, puede encontrar los factores de escala en las hojas de datos.

Cableado - Conexión de MaxBotix MB7389 a Arduino UNO

Como se mencionó en la introducción, los sensores MaxBotix pueden funcionar en diferentes modos. Los siguientes diagramas de cableado muestran cómo se puede conectar el sensor MB7389 al Arduino para que funcione con tensión analógica o con ancho de pulso.

Puedes soldar los cables directamente al sensor, o instalar unos pines de cabecera o un conector.

MaxBotix-MB7389-Sensor de distancia ultrasónico con diagrama de cableado de tensión analógica Arduino-UNO
Diagrama de cableado de tensión analógica

Las conexiones también se indican en la siguiente tabla:

MB7389 Conexiones - Tensión analógica

Sensor MaxBotix MB7389Arduino
GNDGND
V+5 V
Clavija 3A0
MaxBotix-MB7389-Sensor de distancia ultrasónico con diagrama de cableado de ancho de pulso Arduino-UNO
Diagrama de cableado de ancho de pulso

MB7389 Conexiones - Ancho de pulso

Sensor MaxBotix MB7389Arduino
GNDGND
V+5 V
Clavija 2Clavija 2

La salida que debe utilizar depende de la aplicación. Una diferencia importante es que la salida de tensión analógica muestra la distancia con una resolución de 5 mm, mientras que la salida de ancho de pulso da una resolución de 1 mm.

MaxBotix MB7389 Arduino código de ejemplo - Tensión analógica

Con el siguiente código de ejemplo, puedes leer la distancia desde la salida analógica del sensor y mostrarla en el monitor serie. Como puedes ver, el código es muy sencillo pero puedes encontrar alguna explicación sobre su funcionamiento a continuación.

Puedes cargar el código de ejemplo con el IDE de Arduino.

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

Debería ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).

MaxBotix MB7389 Salida de monitor de tensión analógica en serie
MB7389 Salida de Monitor Serial

Cómo funciona el código

El primer paso es definir el pin de conexión. La declaración #define se utiliza para dar un nombre a un valor constante. Al compilar el programa, el compilador sustituirá cualquier referencia a esta constante por el valor definido. Por lo tanto, en todos los casos en los que se menciona sensorPinel compilador lo sustituirá por A0 cuando se compile el programa.

#define sensorPin A0

A continuación, tenemos que crear una variable para almacenar la distancia medida.

int distancia = 0;

En la configuración, inicializamos la comunicación en serie a una tasa de baudios de 9600. Más tarde mostraremos la distancia medida en el monitor serie, al que se puede acceder con Ctrl + Shift + M o Herramientas > Monitor Serie. Asegúrate de que la tasa de baudios también está ajustada a 9600 en el monitor serie.

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

Después de esto, he creado dos funciones: read_sensor y print_data.

En la función read_sensor, simplemente leemos la salida del sensor de voltaje analógico con la función analogRead(pin). Las placas Arduino contienen un convertidor analógico-digital multicanal de 10 bits. Esto significa que mapeará la tensión de entrada entre 0 y la tensión de funcionamiento en valores enteros entre 0 y 1023. En un Arduino Uno, esto resulta en 5 voltios / 1024 unidades o, 4,9 mV por unidad.

El MB7389 utiliza un factor de escala de (Vcc/5120) por 1 mm o 0,98 mV/mm cuando se utiliza una fuente de alimentación de 5 V. Esto hace que la conversión del valor de analogRead a mm sea súper fácil, simplemente se puede multiplicar el resultado por 5. Tenga en cuenta que esto significa que la salida de tensión analógica muestra la distancia con una resolución de 5 mm.

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

En la función print_data, imprimimos la distancia medida en el monitor serie.

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

En el bucle, primero llamamos a la función read_sensor para obtener la distancia y luego llamamos a la función print_data para enviarla al monitor serie. He añadido un retraso de 1000 milisegundos, pero puedes reducirlo a 150 si quieres. La frecuencia de lectura del MB7389 es de 6,66 Hz por lo que puedes tomar 6,66 lecturas por segundo.

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

MaxBotix MB7389 Arduino código de ejemplo - Ancho de pulso

En este ejemplo, utilizaremos la otra salida del sensor: la salida de ancho de pulso.

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

Explicación del código

Después de definir el pin de conexión, he creado dos variables: duration y distance. La duración almacena la longitud del pulso enviado por el sensor. La variable distancia se utiliza para almacenar la distancia calculada.

distancia larga = 0;
duración larga = 0;

En la configuración, además de inicializar la comunicación en serie, también necesitamos establecer el sensorPin como una ENTRADA. Para ello utilizamos la función pinMode(pin, mode).

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

La función read_sensor es diferente a la del ejemplo anterior. Ahora no vamos a medir la salida de tensión analógica, sino la longitud del pulso enviado por el sensor. Para ello utilizamos la función pulseIn(pin, value). Esta función espera a que el pin pase de LOW a HIGH, inicia la temporización, luego espera a que el pin pase a LOW y detiene la temporización. Devuelve la longitud del pulso en microsegundos.

Después de esto, podemos calcular la distancia en mm. Para el sensor MB7389, el factor de escala es simplemente 1 μs/mm, por lo que distancia = duración. Para otros sensores MaxBotix, puedes encontrar este factor de escala en la hoja de datos.

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

El resto del código es el mismo que el del ejemplo anterior.

Si tiene previsto utilizar el sensor para controlar y medir el nivel del contenedor, le recomiendo que tome varias lecturas seguidas y que calcule la media de esas lecturas. En mi instalación, las lecturas fluctuaron en ± 3 mm.

Funcionamiento del modo de disparo

Todos los sensores MaxSonar operarán en modo de funcionamiento libre por defecto. Esto significa que el sensor continuará su alcance hasta que se le quite la energía. Envía veinte ondas de 42kHz cada 150 ms (tasa de lectura de 6.66 Hz para el MB7389, ver hoja de datos para otros sensores).

Esta es generalmente la forma más fácil de operar el sensor, ya que no tiene que dispararlo usted mismo y puede simplemente tomar una lectura analógica de voltaje o de ancho de pulso para obtener la distancia.

Para algunas aplicaciones, como cuando el sensor funciona con una batería, puede ser mejor utilizar el sensor con un disparador. Esto significa que puedes decirle al sensor que inicie un ciclo de alcance, pero sólo cuando se le indique. De esta manera, puedes controlar el mayor consumo de corriente del sensor, que es cuando transmite un pulso de sonar.

Para hacer funcionar el sensor con un trigger, utilizaremos una conexión extra entre el pin 4 del sensor y el Arduino. Cuando no conectes nada a este pin, como en los ejemplos anteriores, el sensor tendrá un rango de la frecuencia de refresco del sensor mencionada en la hoja de datos del sensor.

Para disparar el sensor cuando sea necesario, tienes que conectar el pin 4 a un nivel lógico bajo. Cuando quieras tomar una lectura, tienes que poner el pin 4 en alto durante un mínimo de 20 μs. El sensor iniciará entonces un ciclo de medición.

En este ejemplo, utilizaremos un pulsador momentáneo para activar el sensor. Puedes comprar estos bonitos pulsadores redondos en Amazon, que puedes conectar a una protoboard. Conecta una de las patas a tierra y la pata diagonalmente opuesta al pin 4 de Arduino.

Las conexiones también se indican en la tabla siguiente.

MB7389 Conexiones - Modo de disparo

PinArduino
GNDGND
V+5 V
Clavija 2Clavija 2
Clavija 4Clavija 3
Clavija del botón 1Clavija 4
Clavija del botón 2GND

Código de ejemplo de MaxBotix MB7389 Arduino - Disparo con pulsador

Puedes utilizar este sketch de ejemplo para controlar el sensor con un disparador. En este caso, el sensor tomará una lectura cuando presiones el botón y mostrará la medida de la distancia en el Monitor Serial. También puedes simplemente llamar a la función read_sensor cuando quieras tomar una lectura.

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

Debería ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).

Salida de monitorización en serie del modo de disparo MB7389
El primer mensaje tarda unos segundos en aparecer.

Cómo funciona el código

El primer paso es definir las conexiones. Utilizaremos la salida de ancho de pulso del sensor para leer la distancia.

#define readPin 2
#define triggerPin 3
#define botónPin 4

Además de las variables de duración y distancia que utilizamos en el ejemplo anterior, también necesitamos algunas variables nuevas para almacenar el estado del botón. Las variables de tiempo y debounce se utilizan para debotar la entrada.

Puede aumentar el tiempo de rebote si obtiene falsos disparos.

distancia larga = 0;
duración larga = 0;

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

En la configuración, establecemos el triggerPin como salida y el read y buttonPin como entrada. Ten en cuenta que he utilizado INPUT_PULLUP en la función pinMode. Hay resistencias pullup de 20K integradas en el chip Atmega a las que se puede acceder desde el software. Esta configuración pone el buttonPin en HIGH cuando no está pulsado y se pondrá en LOW cuando se pulse el botón.

A continuación, ponemos el triggerPin en LOW, para que el sensor no comience a oscilar.

Para imprimir los datos del sensor, iniciamos la comunicación en serie a una velocidad de 9600 baudios.

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

Después de esto, definí dos funciones, la función read_sensor y print_data.

En la función read_sensor, puedes ver que ponemos el triggerPin en alto durante 20 microsegundos. Esto le dirá al sensor que envíe un pulso de sonar. A continuación, leemos la longitud del pulso de salida y lo convertimos en la distancia (esto es lo mismo que el ejemplo anterior). He añadido un retraso de 100 ms, ya que este es el tiempo mínimo entre lecturas.

La función print_data es la misma que en los ejemplos anteriores.

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

En el bucle, primero leemos el estado del botón (pulsado / no pulsado) y lo almacenamos como buttonState. La siguiente línea comprueba si se ha pulsado el botón (es decir, la entrada pasó de HIGH a LOW) y si se ha esperado lo suficiente desde la última pulsación para ignorar cualquier ruido.

Si esto es cierto, llama a la función read_sensor e print_data y reinicia el temporizador.

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

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

  previous = buttonState;
}

Por último, la variable anterior se establece en el buttonState actual.

CAD

MaxBotix proporciona archivos CAD gratuitos para todos sus sensores en su sitio web. Esto hace que el diseño de piezas o soportes personalizados para usar con el sensor sea súper fácil. Puede descargar un archivo zip con un modelo 3D del sensor a continuación (7 formatos de archivo diferentes). Puedes encontrar más modelos de diferentes sensores en su página web.

Conclusión

En este artículo, te he mostrado cómo puedes utilizar el sensor de distancia ultrasónico resistente a la intemperie MaxBotix MB7389 HRXL-MaxSonar-WR con Arduino. Espero que lo hayas encontrado útil e informativo. Si lo has hecho, ¡compártelo con un amigo al que también le guste la electrónica y hacer cosas!

Me encantaría saber qué proyectos planeas construir (o ya has construido) con este sensor. Si tienes alguna pregunta, sugerencia o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.

Zeeshan Khan

Monday 18th of December 2023

Hey . These ultrasonic sensor have auto sensitivity adjustment noise,rejection how do they that is it using hardware on the board of the sensors or using some algorithms ?

Stefan Maetschke

Monday 18th of December 2023

Yes, there is additionally electronics and not just the plain ultrasonic transducer.

Bill

Domingo 3 de mayo de 2020

Me parece interesante e informativo su artículo sobre el uso del Arduino Uno. Tengo un Arduino y dos sensores Maxbotix. Estoy intentando montar un dispositivo que ayude a meter el coche en el garaje sin quitar los espejos laterales. El principio que quiero hacer es usar dos sensores, restar los dos y si están dentro de un rango, emitir una señal a una de las tres pantallas, izquierda, derecha u OK. Tengo la intención de utilizar la salida de serie para la exactitud por lo que estaba buscando las señales de sincronización necesarios para el Arduino. Estoy usando el método diferencial porque la superficie frontal de un auto es irregular y probablemente no es demasiado precisa repetible. Es un experimento pero ahora mismo necesito saber como programar el Arduino. Si tienes algún consejo te lo agradecería. Bill