Skip to Content

Tutorial Arduino del sensor de distancia ultrasónico MaxBotix MB1240

Tutorial Arduino del sensor de distancia ultrasónico MaxBotix MB1240

El MB1240 XL-MaxSonar-EZ4 es un sensor de distancia ultrasónico de alto rendimiento con un alcance de 20 a 765 cm. Es una gran alternativa para el popular HC-SR04 cuando se necesita un mejor filtrado de ruido y fiabilidad. Aunque este tutorial está escrito para el MB1240, 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 cómo se puede activar el sensor con un pulsador.

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

MB1240 XL-MaxSonar EZ4× 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.

Cómo funcionan los sensores ultrasónicos Maxbotix
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 MB1240 XL-MaxSonar-EZ4 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.

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 las interferencias por ruido acústico o eléctrico. Esto significa que se puede utilizar para aplicaciones robóticas con múltiples motores y servos. El MB1240 que he utilizado en este tutorial tiene un alcance de hasta 765 cm y ofrece una resolución de 1 cm. Maxbotix también vende sensores con una resolución de 1 mm(HRLV-MaxSonar-EZ) y una mayor frecuencia de actualización(LV-MaxSonar-EZ). La línea de sensores HR también cuenta con compensación interna de temperatura.

Especificaciones del TM1240 XL-MaxSonar-EZ4

Tensión de funcionamiento3.3 - 5.5 V
Corriente de trabajo3,4 mA de media (100 mA de pico)
Gama(0)* 20 - 765 cm
Resolución1 cm
Frecuencia42 kHz
Ritmo de lectura10 Hz
Salidas de los sensoresTensión analógica, ancho de pulso, RS232
Dimensiones totales22,1 x 19,9 x 25,11 mm
Temperatura de funcionamiento0 - 65 °C
VentajaPequeño, ligero, haz estrecho, calibración automática (tensión, humedad, ruido ambiental), filtrado de firmware, 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 20 cm tienen un alcance de 20 cm.

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

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 MB1240 (sensores XL-MaxSonar), el factor de escala es 58 µs/cm. Por tanto, basta con dividir la lectura del TOF por 58 para obtener la distancia en centí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.

MaxBotix MB1240 vs HC-SR04

Al comprar un sensor de distancia por ultrasonidos, es probable que también se haya encontrado con el popular HC-SR04. Este sensor de bajo coste está disponible en muchos fabricantes chinos. El HC-SR04 y el MB1240 funcionan con un principio similar, pero hay algunas diferencias clave (sobre todo en cuanto a calidad y precio).

Lo primero que puede notar es la diferencia de tamaño. El MaxBotix MB1240 sólo utiliza un transductor ultrasónico para enviar y recibir las ondas sonoras. El HC-SR04, en cambio, utiliza dos. Esto significa que el MB1240 es considerablemente más pequeño.

El montaje de un sensor HC-SR04 puede ser difícil y a menudo requiere tornillos diminutos, 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 pequeño ángulo del haz, la alta tolerancia al ruido y el filtrado incorporado.

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 significa que no obtendrá reflejos tempranos de objetos cercanos al sensor. El HC-SR04 tiene un haz en forma de cono 3D de 15°. Esto significa que no puede medir con precisión los objetos que están lejos del sensor. El haz es simplemente demasiado ancho y captará los objetos que estén más cerca del sensor.

Además, me gusta el funcionamiento continuo de los sensores (más adelante) y la salida analógica. La salida analógica hace que la programación de los sensores sea súper fácil. Estas características adicionales son muy buenas, pero hay que tener en cuenta que el precio es también bastante más alto que el de los sensores chinos. En definitiva, si buscas un sensor fiable de alta calidad, los sensores MaxBotix pueden ser una buena opción. Para ver una comparación, consulte la siguiente tabla.

Tabla comparativa MB1240 vs HC-SR04

MB1240HC-SR04
Tensión de funcionamiento3.3 - 5.5 V5 V
Corriente de trabajo3,4 mA de media (100 mA de pico)15 mA
Gama(0) 20 - 765 cm2 - 400 cm
Resolución1 cm>3 mm
Patrón de haz de luzver aquíCono de 15°.
Frecuencia42 kHz40 kHz
Salidas de los sensoresTensión analógica, ancho de pulso, RS232Anchura del pulso
Dimensiones22,1 x 19,9 x 25,11 mm45 x 20 x 15 mm
Compensación de temperatura*.NoNo
FiltradoNo
Autocalibración en tiempo realNo
Tolerancia al ruidoAltaBajo
Fabricado enEE.UU.China
PrecioComprobar el precioComprobar el precio

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

Tanto el HC-SR04 como el MB1240 no compensan el cambio de temperatura del aire durante el funcionamiento. Los sensores XL-MaxSonar y LV-MaxSonar asumen una temperatura del aire de 22,5 grados Celsius. La línea de sensores HR cuenta con una calibración de temperatura interna, por lo que no es necesario añadir ningún sensor. Si quieres ver un ejemplo que incluye un sensor de temperatura para calibrar la velocidad del sonido en tiempo real, echa un vistazo a este artículo.

Cableado - Conexión de MaxBotix MB1240 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 MB1240 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 (es lo que yo hice) o un conector.

MaxBotix-MB1240-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:

MB1240 Conexiones - Tensión analógica

Sensor MaxBotix MB1240Arduino
GNDGND
V+5 V
Clavija 3A0
MaxBotix-MB1240-sensor de distancia ultrasónico-con-ancho-de-pulso-Arduino-esquema-de-cableado
Diagrama de cableado de ancho de pulso

MB1240 Conexiones - Ancho de pulso

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

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

Con el siguiente ejemplo, puedes leer la distancia medida 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 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ía ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).

MB1240 Salida de monitor de tensión analógica en serie
Salida del monitor de serie MB1240

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 MB1240 utiliza un factor de escala de (Vcc/1024) por cm o 4,9 mV/cm cuando se utiliza una fuente de alimentación de 5 V. Esto hace que la conversión del valor de analogRead a centímetros sea súper fácil, simplemente puedes multiplicar 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 serie.

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

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 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 de MaxBotix MB1240 Arduino - Ancho de pulso

En este ejemplo, utilizaremos 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, 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 centímetros dividiendo la medición de 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 el mismo que el del ejemplo anterior.

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 99 ms (tasa de lectura de 10 Hz para el MB1240, 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.

El sensor consume la mayor cantidad de corriente cuando envía 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.

El siguiente diagrama de cableado le muestra las conexiones que debe realizar para este ejemplo.

MaxBotix-MB1240-Sensor de distancia ultrasónico con anchura de pulso Arduino-UNO-operación no continua-diagrama de cableado
MaxBotix MB1240 con pulsador momentáneo y diagrama de cableado de Arduino

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.

Conexiones del MB1240 - 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 MB1240 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 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ía ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).

Salida de monitorización en serie del modo de disparo MB1240
Salida de monitorización en serie

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

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.

XL-MaxSonar-EZ-Dimensiones mecánicas
XL-MaxSonar Board

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 MaxBotix MB1240 XL-MaxSonar-EZ4 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.