Skip to Content

Sensor de distancia VL6180X con Arduino

Sensor de distancia VL6180X con Arduino

En este tutorial aprenderás a usar el sensor de distancia láser VL6180X con un Arduino o cualquier otro microcontrolador común (ESP32/ESP8266) para medir distancias de hasta 100 mm.

El VL6180X es un sensor de distancia Time-of-Flight (ToF) muy pequeño que utiliza luz láser infrarroja para medir la proximidad de un objeto. Midiendo el tiempo que tarda la luz en reflejarse en un objeto, puede calcular distancias con alta precisión. Debido a su rango comparativamente corto, es especialmente adecuado como sensor de proximidad o para reconocimiento simple de gestos.

Partes necesarias

Obviamente, necesitarás un sensor de distancia VL6180X. Para el microcontrolador, usé un Arduino Uno para este proyecto, pero cualquier otro Arduino o ESP32/ESP8266 también funcionará, ya que el sensor opera con 5V o 3.3V. También usaremos un OLED para mostrar las distancias medidas por el VL6180X en una pantalla.

Sensor de distancia VL6180X

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cable USB para Arduino UNO

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Protoboard

OLED display

Pantalla OLED

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.

Características del VL6180X

El VL6180X es un chip diminuto (4.8 x 2.8 x 1.0 mm) con varios orificios en la parte superior. Uno es para el emisor de luz láser, otro para el detector de luz láser y también hay un detector de luz ambiental. Mira la imagen a continuación:

VL6180X Chip
Chip VL6180X (source)

El VL6180X funciona enviando un pulso de luz láser desde el emisor, recibiendo la luz reflejada de un objeto en el detector, y basándose en el tiempo que tardó (tiempo de vuelo) calcula la distancia al objeto. La imagen a continuación muestra los conos del emisor (iluminación) y del detector (visión).

Working Principle of VL6180X
Principio de funcionamiento del VL6180X (source)

Aquí están las principales características y especificaciones técnicas del VL6180X según la hoja de datos:

Features of VL6180X
Características del VL6180X (source)

Ten en cuenta que, aunque la hoja de datos indica un rango de 100 mm, yo pude medir rangos de hasta 170 mm. Por otro lado, si el objeto está a menos de 10 mm, las lecturas se vuelven inexactas.

Esquema de aplicación del VL6180X

El siguiente esquema de aplicación muestra el cableado externo necesario para usar el chip VL6180X. Puedes ver las resistencias pull-up para la interfaz I2C que conecta el VL6180X a un microcontrolador, y dos condensadores que estabilizan la línea de alimentación de 2.8V.

Application schematic for VL6180X
Esquema de aplicación para VL6180X (source)

SDA y SCL son los pines para la interfaz I2C. GPIO0 es el pin de habilitación del chip. En sensores de rango láser similares como VL53L1X o VL53L0X este pin se etiqueta como XSHUT (apagado), que permite apagar el sensor cuando se conecta a tierra. Esto es útil si quieres conectar varios sensores a la misma línea I2C. GPIO1 es un pin de interrupción que puede señalar al microcontrolador que los datos están listos.

En lugar de usar directamente el pequeño chip VL6180X, es mejor obtener una placa breakout que ya tenga la electrónica mencionada integrada y sea mucho más fácil de conectar.

Placa breakout para VL6180X

La siguiente imagen muestra la placa breakout para el VL6180X. El chip rectangular en el centro es el VL6180X. La placa también tiene un regulador de voltaje y convertidores de nivel, para que puedas conectar la placa a microcontroladores de 5V o 3.3V.

Breakout board for VL53L1X
Placa breakout para VL6180X (source)

El pinout corresponde en gran medida con los pines mostrados en el esquema de aplicación. SDA, SCL para I2C, VIN y GND para alimentación y GPIO1 como señal de interrupción. SHDN (= GPIO0, XSHUT) es el pin de habilitación/apagado del chip. Finalmente, 2v8 es la salida de 2.8V del regulador de voltaje a bordo, que puede entregar hasta 100mA.

Conectando el VL6180X al Arduino

Gracias a la interfaz I2C del VL6180X, conectarlo a un Arduino es sencillo. Primero, conecta los pines SCL y SDA de la placa breakout del VL6180X a los pines correspondientes del Arduino como se muestra abajo. Luego, conecta tierra a GND y 3.3V a VIN del VL6180X y listo.

Connecting VL6180X with Arduino
Conexión del VL6180X con Arduino

La placa breakout del VL6180X funciona con 5V o 3.3V y puedes usar cualquiera para VIN. Ahora, escribamos algo de código para probar el funcionamiento del sensor VL6180X.

Código para medir distancia con VL6180X

Antes de poder medir distancias con el sensor VL6180X, tendrás que instalar una biblioteca. Las más comunes son la Adafruit VL6180X Library y la VL6180X library by Pololu. Sin embargo, tuve problemas con las bibliotecas de Adafruit al escribir el tutorial para el VL53L0X Distance Sensor, por lo que usaré la VL6180X library by Pololu.

Instalando la biblioteca VL6180X de Pololu

Para instalar la VL6180X library by Pololu, solo busca VL6180X, encuentra la de Pololu e instálala usando el Library Manager. La imagen a continuación muestra cómo se ve una vez instalada la biblioteca:

Installing VL6180X Library by Pololu via Library Manager
Instalando la biblioteca VL6180X de Pololu vía Library Manager

Con la biblioteca instalada, probemos el sensor. El siguiente código lee las distancias medidas por el VL6180X y las imprime en el monitor serial.

#include "Wire.h"
#include "VL6180X.h"

VL6180X sensor;

void setup() {
  Serial.begin(9600);
  Wire.begin();  
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

void loop() { 
  Serial.println(sensor.readRangeSingleMillimeters()); 
  delay(1000);
}

Veamos más de cerca el código de ejemplo anterior.

Inclusión de bibliotecas

La primera parte del código incluye las bibliotecas necesarias para la comunicación con el sensor.

#include "Wire.h"
#include "VL6180X.h"

La biblioteca Wire.h se usa para la comunicación I2C, que es cómo el Arduino se comunica con el sensor VL6180X. La biblioteca VL6180X.h contiene las funciones y definiciones específicas para el sensor VL6180X, facilitando la interacción con él.

Creación de un objeto sensor

A continuación, creamos una instancia de la clase VL6180X.

VL6180X sensor;

Esta línea declara una variable llamada sensor que usaremos para acceder a los métodos proporcionados por la biblioteca VL6180X.

Función setup

En la función setup(), inicializamos la comunicación serial y el sensor.

void setup() {
  Serial.begin(9600);
  Wire.begin();  
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}
  • Serial.begin(9600) inicializa la comunicación serial a una velocidad de 9600 baudios, permitiéndonos enviar datos al Monitor Serial.
  • Wire.begin() inicializa el bus I2C, habilitando la comunicación con el sensor.
  • sensor.init() inicializa el sensor VL6180X, preparándolo para su funcionamiento.
  • sensor.configureDefault() configura el sensor con ajustes predeterminados, asegurando que esté correctamente configurado para la medición de distancia.
  • sensor.setTimeout(500) establece un tiempo de espera para las lecturas del sensor de 500 milisegundos. Si el sensor no responde en ese tiempo, devolverá un error.

Función loop

La función loop() lee continuamente la distancia del sensor y la imprime en el Monitor Serial.

void loop() { 
  Serial.println(sensor.readRangeSingleMillimeters()); 
  delay(1000);
}

La función readRangeSingleMillimeters() lee la distancia medida por el sensor y la devuelve en milímetros. Este valor se imprime luego en el Monitor Serial. Si el sensor no detecta ningún objeto (fuera de rango), se imprimirá un valor de 255. La siguiente captura de pantalla muestra algunas mediciones de ejemplo en el Monitor Serial:

Distance Measurements of VL6180X on Serial Monitor
Mediciones de distancia del VL6180X en el Monitor Serial

La función delay(1000) pausa el programa durante 1000 milisegundos (1 segundo) antes de la siguiente lectura, ralentizando las lecturas del sensor.

En la siguiente sección vamos a añadir un OLED a nuestro circuito y mostrar las distancias en él, en lugar de imprimirlas en el Monitor Serial.

Añadiendo un OLED para mostrar datos del VL6180X

Como el OLED también es un dispositivo I2C, conectarlo es sencillo. Simplemente conectamos SDA y SCL a los mismos pines a los que está conectado el sensor VL6180X. Y como el OLED funciona a 3.3V, también podemos compartir las líneas de alimentación.

Connecting OLED and VL6180X with Arduino
Conexión del OLED y VL6180X con Arduino

Código para mostrar distancias medidas por VL6180X en OLED

El siguiente código lee las mediciones de distancia del sensor VL6180X y las muestra en el OLED. Echa un vistazo rápido al código completo primero, y luego discutiremos sus detalles.

#include "Wire.h"
#include "VL6180X.h"
#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
VL6180X sensor;

void sensor_init() {
  Wire.begin();
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void display() {
  static char text[30];
  int dist = sensor.readRangeSingleMillimeters();
  sprintf(text, "%4d mm", dist);

  oled.clearDisplay();
  oled.setCursor(20, 25);
  oled.print(text);
  oled.display();
}

void setup() {
  oled_init();
  sensor_init(); 
}

void loop() {
  display();
}

Desglosemos el código en sus partes para una mejor comprensión.

Bibliotecas incluidas

Al inicio del código, incluimos las bibliotecas necesarias para la comunicación I2C (Wire), el sensor VL6180X y la pantalla OLED Adafruit SSD1306.

#include "Wire.h"
#include "VL6180X.h"
#include "Adafruit_SSD1306.h"

Si aún no has instalado la Adafruit_SSD1306 Library, tendrás que hacerlo. Solo instálala vía Library Manager como de costumbre:

Adafruit_SSD1306 library installed in Library Manager
Biblioteca Adafruit_SSD1306 instalada en Library Manager

Inicialización de objetos

Creamos instancias de la pantalla OLED y del sensor VL6180X. La pantalla OLED se inicializa con un ancho de 128 píxeles y una altura de 64 píxeles.

Adafruit_SSD1306 oled(128, 64, &Wire, -1);
VL6180X sensor;

Función de inicialización del sensor

La función sensor_init() inicializa la comunicación I2C y configura el sensor VL6180X con ajustes predeterminados. También establece un tiempo de espera de 500 milisegundos para las lecturas del sensor.

void sensor_init() {
  Wire.begin();
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

Función de inicialización del OLED

La función oled_init() inicializa la pantalla OLED. Configura la pantalla para usar la bomba de carga interna y especifica la dirección I2C (0x3C). El tamaño del texto se establece en 2 y el color del texto en blanco.

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Ten en cuenta que la dirección I2C para la pantalla OLED está configurada en 0x3C en oled.begin(). La mayoría de estos pequeños OLED usan esta dirección, pero la tuya podría ser diferente. Si no ves nada en el OLED, probablemente tenga una dirección I2C distinta y tendrás que cambiarla. Si no sabes la dirección I2C, echa un vistazo al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.

Función de visualización

La función display() lee la distancia del sensor en milímetros y la formatea en una cadena. Luego limpia la pantalla OLED, establece la posición del cursor, imprime la distancia y actualiza la pantalla.

void display() {
  static char text[30];
  int dist = sensor.readRangeSingleMillimeters();
  sprintf(text, "%4d mm", dist);

  oled.clearDisplay();
  oled.setCursor(20, 25);
  oled.print(text);
  oled.display();
}

Si el sensor no detecta un objeto porque está fuera de rango, se mostrará un valor de 255 mm en el OLED:

Output of VL6180X on OLED
Salida del VL6180X en OLED

Función setup

En la función setup() llamamos a las funciones de inicialización tanto de la pantalla OLED como del sensor para prepararlos para su uso.

void setup() {
  oled_init();
  sensor_init(); 
}

Función loop

Finalmente, la función loop() llama continuamente a la función display(), permitiendo que las lecturas de distancia se actualicen en la pantalla OLED en tiempo real.

void loop() {
  display();
}

El siguiente breve video muestra el sensor VL6180X y la pantalla en acción:

Distance measurements with VL6180X sensor
Mediciones de distancia con el sensor VL6180X

Conclusiones

En este tutorial aprendiste a usar el sensor de distancia VL6180X con un Arduino para medir distancias y mostrarlas en un OLED.

El sensor VL6180X es un sensor muy pequeño que usa luz láser infrarroja para medir distancias. El VL6180X es similar a los sensores VL53L1X, VL53L0X y TOF10120 pero tiene un rango más corto. Si necesitas un sensor para un rango mucho mayor, echa un vistazo al TF Luna que puede medir distancias de hasta 8 metros.

Es más adecuado como sensor de proximidad o de gestos simples que como medidor de distancia de largo alcance. También incluye un sensor de luz ambiental integrado, aunque no pude obtener ninguna lectura del sensor de luz usando la biblioteca VL6180X de Pololu.

Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.

¡Feliz bricolaje ; )