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 Rev3 | × 1 | Amazon | |
| Breadboard | × 1 | Amazon | |
| Jumper wires | ~ 10 | Amazon | |
| Header pins (opcional) | × 7 | Amazon | |
| Momentary push button | × 1 | Amazon | |
| USB cable type A/B | × 1 | Amazon |
Software
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.

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:

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.

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.

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.

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 |

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

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

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:
- How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino
- Waterproof JSN-SR04T Ultrasonic Distance Sensor with Arduino Tutorial
- How to use a SHARP GP2Y0A710K0F IR Distance Sensor with Arduino
- How to use a SHARP GP2Y0A21YK0F IR Distance Sensor with Arduino
- TOF10120 Distance Sensor with Arduino
- VL53L1X/TOF400C Distance Sensor with Arduino
- VL53L0X Distance Sensor with Arduino
Si tienes alguna pregunta, por favor deja un comentario abajo.

