El MB1240 XL-MaxSonar-EZ4 es un sensor ultrasónico de distancia de alto rendimiento con un rango de 20 a 765 cm. Es una excelente alternativa al popular HC-SR04 cuando necesitas mejor filtrado de ruido y mayor fiabilidad. Aunque este tutorial está escrito para el MB1240, también puede usarse con otros sensores MaxBotix.
En este tutorial aprenderás cómo funciona el sensor y cómo 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 cómo puedes activarlo con un pulsador.
Materiales
Componentes de hardware
| MB1240 XL-MaxSonar EZ4 | × 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.

Ten en cuenta que debes dividir el resultado por dos. Esto se debe a que las ondas sonoras viajan desde el sensor al objeto y de vuelta del objeto al sensor. Por lo tanto, la distancia entre el sensor y el objeto es solo la mitad de la distancia que recorrieron las ondas sonoras.
Para más información sobre cómo funcionan los sensores ultrasónicos, puedes consultar mi artículo How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino. En este artículo se explican con más detalle los principios de funcionamiento de un sensor ultrasónico de distancia.
Información sobre el sensor
El MB1240 XL-MaxSonar-EZ4 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.
El MB1240 es uno de sus sensores más populares y es ideal para aplicaciones robóticas. La familia XL-MaxSonar-EZ tiene una alta tolerancia a interferencias acústicas o eléctricas. Esto significa que puedes usarlo en aplicaciones robóticas con múltiples motores y servos.
El MB1240 que usé en este tutorial tiene un rango de hasta 765 cm y ofrece una resolución de 1 cm. MaxBotix también vende sensores con resolución de 1 mm (HRLV-MaxSonar-EZ) y mayor tasa de refresco (LV-MaxSonar-EZ). La línea HR de sensores también cuenta con compensación interna de temperatura.
Especificaciones TM1240 XL-MaxSonar-EZ4
| Voltaje de operación | 3.3 – 5.5 V |
| Corriente de operación | 3.4 mA promedio (100 mA pico) |
| Rango | (0)* 20 – 765 cm |
| Resolución | 1 cm |
| Frecuencia | 42 kHz |
| Tasa de lectura | 10 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 | 0 – 65 °C |
| Ventajas | Pequeño, ligero, haz estrecho, calibración automática (voltaje, humedad, ruido ambiental), filtrado por firmware, fácil de usar |
| Fabricado en | EE.UU. |
| Precio | Check price |
*El sensor prácticamente no tiene zona muerta, los objetos más cercanos que 20 cm se miden como 20 cm.
Para más información, puedes consultar la hoja de datos aquí:
Salidas del sensor MaxBotix
Como viste en la tabla de especificaciones anterior, los sensores MaxBotix de la familia MaxSonar tienen diferentes salidas: voltaje analógico, ancho de pulso y RS232 serial y I2C. En este tutorial veremos tanto la salida de voltaje analógico como la de ancho de pulso.
Voltaje analógico
Probablemente esta sea 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 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 función pulseIn() en el código Arduino para leer la duración de este pulso en microsegundos (µs). Para obtener la distancia, debes multiplicar esta lectura por un factor de escala constante. Para el MB1240 (sensores XL-MaxSonar), el factor de escala es 58 µs/cm. Así que simplemente divides la lectura TOF por 58 para obtener la distancia en centímetros.

Para otros tipos de sensores, puedes encontrar los factores de escala en las hojas de datos.
MaxBotix MB1240 vs HC-SR04
Al buscar un sensor ultrasónico de distancia, probablemente te hayas encontrado con el popular HC-SR04. Este sensor de bajo costo está disponible de muchos fabricantes chinos. El HC-SR04 y el MB1240 operan con un principio similar, pero hay diferencias clave (principalmente en calidad y precio).
Lo primero que notarás es la diferencia de tamaño. El MaxBotix MB1240 usa un solo transductor ultrasónico para enviar y recibir las ondas sonoras. El HC-SR04, en cambio, usa dos. Esto hace que el MB1240 sea considerablemente más pequeño.
Montar un sensor HC-SR04 puede ser complicado y a menudo requiere tornillos muy pequeños, mientras que el MB1240 tiene dos orificios para tornillos M3.
Para mí, las principales ventajas de los sensores MaxBotix son la calibración automática en tiempo real, el ángulo de haz pequeño, la alta tolerancia al ruido y el filtrado a bordo.
El MB1240 tiene un haz realmente estrecho en todo su rango de medición (para objetos grandes). Esto lo hace ideal para mapear con precisión una habitación (robots que evitan obstáculos) y evita reflexiones tempranas de objetos cercanos al sensor. El HC-SR04 tiene un haz en forma de cono 3D de 15°. Esto significa que no puedes medir con precisión objetos lejanos al sensor. El haz es demasiado ancho y detectará objetos más cercanos al sensor.
Además, me gusta la operación continua de los sensores (más adelante hablaremos de esto) y la salida analógica. La salida analógica facilita mucho la programación de los sensores. Estas características extra son muy buenas, pero ten en cuenta que el precio también es bastante más alto que el de los sensores chinos. En resumen, si buscas un sensor fiable y de alta calidad, los sensores MaxBotix pueden ser una buena opción. Para comparar, consulta la tabla a continuación.
Tabla comparativa MB1240 vs HC-SR04
| MB1240 | HC-SR04 | |
|---|---|---|
| Voltaje de operación | 3.3 – 5.5 V | 5 V |
| Corriente de operación | 3.4 mA promedio (100 mA pico) | 15 mA |
| Rango | (0) 20 – 765 cm | 2 – 400 cm |
| Resolución | 1 cm | >3 mm |
| Patrón de haz | see here | Cono de 15° |
| Frecuencia | 42 kHz | 40 kHz |
| Salidas del sensor | Voltaje analógico, ancho de pulso, RS232 | Ancho de pulso |
| Dimensiones | 22.1 x 19.9 x 25.11 mm | 45 x 20 x 15 mm |
| Compensación de temperatura* | No | No |
| Filtrado | Sí | No |
| Calibración automática en tiempo real | Sí | No |
| Tolerancia al ruido | Alta | Baja |
| Fabricado en | EE.UU. | China |
| Precio | Check price | Check price |
*Lo que quizá no sepas es que la velocidad del sonido depende mucho de la temperatura y humedad del aire. La velocidad del sonido en el aire aumenta aproximadamente 0.6 metros por segundo por cada grado centígrado.
Tanto el HC-SR04 como el MB1240 no compensan cambios en la temperatura del aire durante la operación. Los sensores XL-MaxSonar y LV-MaxSonar asumen una temperatura del aire de 22.5 grados Celsius. La HR line línea HR de sensores cuenta con calibración interna de temperatura, por lo que no necesitas añadir sensores adicionales. Si quieres ver un ejemplo que incluye un sensor de temperatura para calibrar la velocidad del sonido en tiempo real, echa un vistazo al How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino tutorial.
Conexiones – Cómo conectar el MaxBotix MB1240 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 MB1240 al Arduino para operación con voltaje analógico o ancho de pulso.
Puedes soldar los cables directamente al sensor, instalar pines de cabecera (como hice yo) o un conector.

Las conexiones también se muestran en la siguiente tabla:
Conexiones MB1240 – Voltaje analógico
| Sensor MaxBotix MB1240 | Arduino |
|---|---|
| GND | GND |
| V+ | 5 V |
| Pin 3 | A0 |

Conexiones MB1240 – Ancho de pulso
| Sensor MaxBotix MB1240 | Arduino |
|---|---|
| GND | GND |
| V+ | 5 V |
| Pin 2 | Pin 2 |
Código de ejemplo Arduino MaxBotix MB1240 – Voltaje analógico
Con el siguiente ejemplo puedes leer la distancia medida y mostrarla en el monitor serial. Como verás, el código es muy simple, pero a continuación encontrarás una explicación de cómo funciona.
Puedes subir el código de ejemplo con el Arduino IDE.
/* 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);
}
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 por 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 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 tasa de baudios también esté configurada a 9600 en el monitor serial.
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 tienen 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 equivale a 5 voltios / 1024 unidades o 4.9 mV por unidad.
El MB1240 usa un factor de escala de (Vcc/1024) por cm o 4.9 mV/cm cuando se alimenta con 5 V. Esto hace que convertir la lectura analogRead a centímetros sea muy fácil, simplemente multiplica el resultado por 1 (analogRead(sensorPin) = distancia en centímetros).
void read_sensor() {
distance = analogRead(sensorPin) * 1;
}
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(" cm");
}
En el loop, primero llamamos a 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 100 si quieres. La frecuencia de lectura del MB1240 es de 10 Hz, por lo que puedes tomar 10 lecturas por segundo.
void loop() {
read_sensor();
print_data();
delay(1000);
}
Código de ejemplo Arduino MaxBotix MB1240 – Ancho de pulso
En este ejemplo usaremos la otra salida del sensor: la salida de ancho de pulso.
/* 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);
}
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, calculamos la distancia en centímetros dividiendo la duración por 58. Para otros sensores MaxBotix, puedes encontrar este factor de escala en la hoja de datos.
void read_sensor() {
duration = pulseIn(sensorPin, HIGH);
distance = duration / 58;
}
El resto del código es igual al ejemplo anterior.
Modo de operación con trigger
Todos los sensores MaxSonar operan en modo libre por defecto. Esto significa que el sensor seguirá midiendo hasta que se le quite la alimentación. Envía veinte ondas de 42 kHz cada 99 ms (tasa de lectura de 10 Hz para MB1240, 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í controlas el consumo máximo de corriente, 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. Si no conectas nada a este pin, como en los ejemplos anteriores, el sensor medirá a la tasa de refresco indicada en la hoja de datos.
Para activar el sensor cuando lo necesites, 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.
El diagrama de conexión a continuación muestra las conexiones necesarias para este ejemplo.

En este ejemplo usaremos un pulsador momentáneo para activar el sensor. Conecta una pata a tierra y la pata diagonalmente opuesta al pin 4 del Arduino. Las conexiones también se muestran en la tabla a continuación.
Conexiones MB1240 – Modo trigger
| Pin | Arduino |
|---|---|
| GND | GND |
| V+ | 5 V |
| Pin 2 | Pin 2 |
| Pin 4 | Pin 3 |
| Pata 1 del pulsador | Pin 4 |
| Pata 2 del pulsador | GND |
Código de ejemplo Arduino MaxBotix MB1240 – Trigger con pulsador
Puedes usar este sketch de ejemplo para controlar el sensor con un trigger. En este caso, el sensor tomará una lectura cuando pulses el botón y mostrará 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 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;
}
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 nuevas variables para almacenar el estado del botón. Las variables time y debounce se usan para eliminar rebotes en 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 entradas. 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 HIGH cuando no se pulsa y lo pone en LOW al pulsar el botón.
Luego, ponemos triggerPin en LOW para que el sensor no empiece a medir.
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, verás 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 / 58;
delay(100);
}
En el loop, primero leemos el estado del botón (presionado/no presionado) y lo almacenamos en buttonState. La siguiente línea comprueba si has pulsado el botón (es decir, si la entrada pasó de HIGH a LOW) y si ha pasado suficiente tiempo desde la última pulsación para ignorar ruido.
Si es así, 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 de distancia MaxBotix MB1240 XL-MaxSonar-EZ4 con Arduino.
Si quieres aprender más sobre otros sensores de distancia, los artículos a continuación pueden ser útiles:
- Waterproof JSN-SR04T Ultrasonic Distance Sensor with Arduino Tutorial
- How to use a SHARP GP2Y0A21YK0F IR Distance Sensor with Arduino
- How to use a SHARP GP2Y0A710K0F IR Distance Sensor with Arduino
- How to use a HC-SR04 Ultrasonic Distance Sensor
Si tienes alguna pregunta, sugerencia o crees que falta algo en este tutorial, por favor deja un comentario abajo.

