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 ultrasónico de distancia 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 exteriores como la medición del nivel de tanques de agua o contenedores. Tiene un ángulo de haz muy pequeño y también puede usarse en aplicaciones robóticas. Aunque este tutorial está escrito para el MB7389, también puede aplicarse a otros sensores MaxBotix.

En este tutorial aprenderás cómo funciona el sensor y cómo puedes usarlo con un Arduino. He incluido 3 ejemplos con diagramas de conexión que muestran el funcionamiento básico del sensor. Veremos las diferentes salidas del sensor y te mostraré la diferencia entre el modo free-run y el modo trigger.

Después de cada ejemplo, desgloso y explico cómo funciona el código, para que no tengas problemas en modificarlo según tus necesidades.

Materiales

Componentes de hardware

MB7389-100 HRXL-MaxSonar-WRMT × 1 Amazon
Arduino Uno Rev 3Arduino Uno Rev3 × 1 Amazon
Breadboard × 1 Amazon
Jumper wires ~ 10 Amazon
Header pins (opcional) × 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.

¿Cómo funciona un sensor ultrasónico?

Un sensor ultrasónico de distancia funciona enviando ondas ultrasónicas. Estas ondas se reflejan en un objeto y el sensor ultrasónico las detecta. Midiendo el tiempo que pasa entre el envío y la recepción de las ondas sonoras, puedes 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 aproximadamente 343 m/s o 0.034 cm/µs.

How does an ultrasonic distance sensor work
Principio de funcionamiento de sensores ultrasónicos de distancia. Fuente:  https://www.maxbotix.com/

Ten en cuenta que debes dividir el resultado entre dos. Esto se debe a que las ondas sonoras viajan desde el sensor al objeto y luego de regreso del objeto al sensor. Por lo tanto, la distancia entre el sensor y el objeto es solo la mitad de la distancia total que recorrieron las ondas sonoras.

Para más información sobre cómo funcionan los sensores ultrasónicos, puedes consultar mi artículo sobre el HC-SR04. En este artículo se explican con mayor detalle los principios de funcionamiento de un sensor ultrasónico de distancia.

Información sobre el sensor

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

MaxBotix no denomina a sus sensores como ‘impermeables’, pero están debidamente probados y cuentan con una clasificación de resistencia a la intemperie IP67. Puedes encontrar la definición de esta clasificación en Wikipedia.

Lo que quizás no sepas es que la velocidad del sonido depende mucho de la temperatura y la humedad del aire. La velocidad del sonido en el aire aumenta aproximadamente 0.6 metros por segundo por cada grado centígrado. A diferencia de muchos otros sensores, el MB7389 cuenta con compensación interna de temperatura a bordo. Esto significa que el sensor compensará automáticamente los cambios en la velocidad del sonido y seguirá proporcionando lecturas precisas. También puedes instalar un sensor de temperatura externo para una compensación aún más precisa.

Más especificaciones del sensor se pueden encontrar en la tabla a continuación.

Especificaciones del MB7389 HRXL-MaxSonar-WR

Voltaje de operación 2.7 – 5.5 V
Corriente de operación 3.1 mA promedio a 5 V (98 mA pico)
Rango 30* – 500 cm
Ángulo/forma del haz See here
Protección IP67
Resolución 1 mm
Frecuencia 42 kHz
Tasa de lectura 6.66 Hz
Salidas del sensor Voltaje analógico, ancho de pulso, RS232
Dimensiones generales 22.1 x 19.9 x 25.11 mm
Temperatura de operación -40 – +65 °C
Ventajas Pequeño, ligero, haz estrecho, calibración automática (voltaje, humedad, ruido ambiental), filtrado por firmware, resistente a la intemperie (IP67), compensación de temperatura, fácil de usar
Fabricado en EE.UU.
Costo Check price

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

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

Dimensiones del sensor

Las dimensiones exactas del sensor se pueden ver en la imagen a continuación:

MB7389 Ultrasonic Distance Sensor dimensions
Sensor ultrasónico de distancia MB7389

Salidas del sensor MaxBotix

Como habrás visto en la tabla de especificaciones arriba, los sensores MaxBotix de la familia MaxSonar tienen diferentes salidas: voltaje analógico, ancho de pulso y RS232 serial (I2C sensores también están disponibles). En este tutorial veremos tanto la salida de voltaje analógico como la de ancho de pulso.

Voltaje analógico

Esta es probablemente la forma más sencilla de leer la distancia medida por el sensor. La salida de voltaje analógico del sensor entrega un voltaje lineal que aumenta a medida que un objetivo se aleja del sensor.

136_AnalogVoltage_lg
Salida de voltaje analógico. 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 exacto de sensor, consulta la hoja de datos).

Ancho de pulso

Otra opción es usar la salida de ancho de pulso. Este pin entrega una representación en ancho de pulso de la distancia. Puedes usar la  pulseIn()  función en el código Arduino para leer la duración de este pulso de salida en microsegundos (µs). Para obtener la distancia, debes multiplicar esta lectura por un factor de escala constante. Para el MB7389, el factor de escala es 1 µs/mm. Así que simplemente puedes multiplicar la lectura TOF por 1 para obtener la distancia en milímetros.

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

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

Conexiones – Cómo conectar el MaxBotix MB7389 al Arduino UNO

Como se mencionó en la introducción, los sensores MaxBotix pueden operar en diferentes modos. Los diagramas de conexión a continuación muestran cómo conectar el sensor MB7389 al Arduino para operación con voltaje analógico o ancho de pulso.

Puedes soldar los cables directamente al sensor, o instalar pines header o un conector.

MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-analog-voltage-wiring-diagram-schematic
Diagrama de conexión para voltaje analógico

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

Conexiones MB7389 – Voltaje analógico

Sensor MaxBotix MB7389 Arduino
GND GND
V+ 5 V
Pin 3 A0
MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-pulse-width-wiring-diagram-schematic
Diagrama de conexión para ancho de pulso

Conexiones MB7389 – Ancho de pulso

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

Cuál salida usar depende de la aplicación. Una diferencia importante es que la salida de voltaje analógico muestra la distancia con una resolución de 5 mm, mientras que la salida de ancho de pulso ofrece una resolución de 1 mm.

Código de ejemplo para Arduino con MaxBotix MB7389 – Voltaje analógico

Con el siguiente código de ejemplo, puedes leer la distancia desde la salida analógica del sensor y mostrarla en el monitor serial. Como verás, el código es muy simple pero encontrarás una explicación de cómo funciona a continuación.

/* 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ías ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).

MaxBotix MB7389 Analog voltage serial monitor output
Salida del Monitor Serial MB7389

Cómo funciona el código

El primer paso es definir el pin de conexión. La instrucción  #define  se usa para dar un nombre a un valor constante. Cuando se compila el programa, el compilador reemplaza todas las referencias a esta constante con el valor definido. Así que donde menciones  sensorPin, el compilador lo reemplazará por A0 al compilar el programa.

#define sensorPin A0

Luego, necesitamos crear una variable para almacenar la distancia medida.

int distance = 0;

En el setup, inicializamos la comunicación serial a una velocidad de 9600 baudios. Más adelante mostraremos la distancia medida en el monitor serial, que se puede abrir con Ctrl + Shift + M o Tools > Serial Monitor. Asegúrate de que la velocidad en el monitor serial también esté configurada a 9600.

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

Después, creé dos funciones:  read_sensor  y  print_data.

En la función read_sensor, simplemente leemos la salida de voltaje analógico del sensor con la función  analogRead(pin). Las placas Arduino contienen un convertidor analógico a digital multicanal de 10 bits. Esto significa que mapea el voltaje de entrada entre 0 y el voltaje de operación 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 usa un factor de escala de (Vcc/5120) por 1 mm o 0.98 mV/mm cuando se alimenta con 5 V. Esto hace que convertir el valor de analogRead a mm sea muy fácil, simplemente multiplica el resultado por 5. Ten en cuenta que esto significa que la salida de voltaje analógico 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 serial.

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

En el loop, primero llamamos a la función read_sensor para obtener la distancia y luego a print_data para enviarla al monitor serial. Añadí un retardo de 1000 milisegundos, pero podrías 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);
}

Código de ejemplo para Arduino con MaxBotix MB7389 – Ancho de pulso

En este ejemplo usaremos 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, creé dos variables:  duration  y  distance. Duration almacena la duración del pulso enviado por el sensor. La variable distance se usa para guardar la distancia calculada.

long distance = 0;
long duration = 0;

En el setup, además de inicializar la comunicación serial, también configuramos sensorPin como INPUT. Para esto usamos la función  pinMode(pin, mode).

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

La función read_sensor es diferente al ejemplo anterior. Ahora no mediremos el voltaje analógico, sino la duración del pulso enviado por el sensor. Para esto usamos la función  pulseIn(pin, value). Esta función espera a que el pin pase de LOW a HIGH, comienza a medir el tiempo, luego espera a que el pin vuelva a LOW y detiene la medición. Devuelve la duración del pulso en microsegundos.

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

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

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

Si planeas usar el sensor para monitoreo o medición de nivel en contenedores, recomiendo tomar múltiples lecturas seguidas y luego calcular el promedio o media de esas lecturas. En mi configuración, las lecturas fluctuaban ± 3 mm.

Operación en modo trigger

Todos los sensores MaxSonar operan en modo free-running por defecto. Esto significa que el sensor continuará midiendo hasta que se le quite la alimentación. Envía veinte ondas de 42 kHz cada 150 ms (tasa de lectura de 6.66 Hz para MB7389, consulta la hoja de datos para otros sensores).

Generalmente, esta es la forma más sencilla de operar el sensor, ya que no tienes que activarlo tú mismo y solo tomas una lectura de voltaje analógico o ancho de pulso para obtener la distancia.

Para algunas aplicaciones, como cuando se alimenta el sensor con batería, puede ser mejor operarlo con un trigger. Esto significa que puedes indicarle al sensor que inicie un ciclo de medición solo cuando se le ordene. Así puedes controlar el pico de corriente del sensor, que ocurre cuando transmite un pulso sonar.

Para operar el sensor con trigger, usaremos una conexión extra entre el pin 4 del sensor y el Arduino. Cuando no conectas nada a este pin, como en los ejemplos anteriores, el sensor mide a la tasa de refresco indicada en la hoja de datos.

Para activar el sensor cuando sea necesario, debes conectar el pin 4 a nivel lógico bajo. Cuando quieras tomar una lectura, debes poner el pin 4 en alto durante al menos 20 μs. El sensor entonces iniciará un ciclo de medición.

En este ejemplo usaremos un pulsador momentáneo para activar el sensor. Conecta una de las patas a tierra y la pata diagonalmente opuesta al pin 4 del Arduino.

Las conexiones también se indican en la tabla a continuación.

Conexiones MB7389 – Modo trigger

Pin Arduino
GND GND
V+ 5 V
Pin 2 Pin 2
Pin 4 Pin 3
Pata 1 del botón Pin 4
Pata 2 del botón GND

Código de ejemplo para Arduino con MaxBotix MB7389 – Trigger con botón

Puedes usar este sketch de ejemplo para controlar el sensor con un trigger. En este caso, el sensor tomará una lectura cuando presiones el botón y mostrará la medición de 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ías ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).

MB7389 trigger mode serial monitor output
Tarda unos segundos en aparecer el primer mensaje.

Cómo funciona el código

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

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

Además de las variables duration y distance usadas en el ejemplo anterior, necesitamos algunas nuevas para almacenar el estado del botón. Las variables time y debounce se usan para  debounce  el rebote de la entrada.

Puedes aumentar el tiempo de debounce si recibes activaciones falsas.

long distance = 0;
long duration = 0;

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

En el setup, configuramos triggerPin como salida y read y buttonPin como entrada. Nota que usé INPUT_PULLUP en la función pinMode. Hay resistencias pullup de 20K integradas en el chip Atmega que se pueden activar por software. Esta configuración mantiene buttonPin en ALTO cuando no está presionado y lo pone en BAJO al presionar el botón.

Luego, ponemos triggerPin en BAJO para que el sensor no inicie mediciones.

Para imprimir los datos del sensor, iniciamos la comunicación serial a 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, definí dos funciones, read_sensor y print_data.

En la función read_sensor, puedes ver que ponemos triggerPin en alto durante 20 microsegundos. Esto indica al sensor que envíe un pulso sonar. Luego leemos la duración del pulso de salida y la convertimos en distancia (igual que en el ejemplo anterior). Añadí un retardo de 100 ms, que es el tiempo mínimo entre lecturas.

La función print_data es igual 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 loop, primero leemos el estado del botón (presionado/no presionado) y lo almacenamos en buttonState. La siguiente línea verifica si has presionado el botón (es decir, si la entrada pasó de ALTO a BAJO) y si ha pasado suficiente tiempo desde la última pulsación para ignorar ruido.

Si esto es cierto, llama a las funciones read_sensor y 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;
}

Finalmente, la variable previous se actualiza con el estado actual buttonState.

CAD

MaxBotix ofrece archivos CAD gratuitos para todos sus sensores en su sitio web. Esto facilita diseñar piezas o soportes personalizados para usar con el sensor. Puedes descargar un archivo zip con un modelo 3D del sensor a continuación (7 formatos diferentes). Más modelos de distintos sensores están disponibles en su Website.

Conclusión

En este artículo te he mostrado cómo usar el sensor ultrasónico resistente a la intemperie MaxBotix MB7389 HRXL-MaxSonar-WR con Arduino. Espero que te haya resultado útil e informativo.

Si quieres aprender más sobre otros sensores de distancia, los artículos a continuación pueden ser útiles:

Si tienes alguna pregunta, por favor deja un comentario abajo.