Mesura de distàncies amb el sensor làser d’infraroigs VL53L0X

Continuo amb la sèrie d’entrades sobre la utilització d’Arduino en el laboratori de Física en Secundària en uns moments de confinament a casa en els que no és possible més que somiar amb que algun dia es tornarà a fer classe amb els nois i noies i a sentir la seva alegria, però aquesta pandèmia passarà i llavors espero que aquesta entrada pugui resultar d’utilitat.

El sensor per ultrasons HC-SR04 connectat a un microcontrolador Arduino és el més popular per a mesurar distàncies i ja he parlar d’ell en un parell d’ocasions (Mesura de distàncies en Física amb Arduino i Mesura de distàncies en Física amb una placa amb esp32), però no el més precís o que dóna menys errors. Avui presento el sensor VL53L0X, un sensor per llum làser infraroja que me encanta.

El sensor VL53L0X

El VL53L0X  (fitxa de dades, datasheet) és un sensor TOF (Time of fligth, Temps de vol) que mesura amb molta precisió el temps que triguen els polsos que emet de llum làser infraroja (940 nm) a arribar a l’objecte més proper i reflectir-se. És capaç de determinar amb precisió la distància absoluta a un objecte sense que la reflectància de l’objecte influeixi molt en el mesurament.

La distància la calcula el sensor multiplicant per la velocitat de la llum el temps d’anada i tornada del fotó que emet, i dividint per dos

El sensor pot mesurar distàncies des de 40 cm fins a 2 m amb una resolució de 1 mm, però el seu abast efectiu i precisió depenen en gran mesura de les condicions ambientals i les característiques de l’objectiu com la reflectància i la mida, així com la configuració del sensor. (La precisió del sensor s’especifica en un rang de ±3 % en el millor dels casos i més de ±10 % en condicions menys òptimes).

Per a distàncies més curtes es pot utilitzar un altre sensor, el VL6180X, que és molt similar però que té un rang de medició entre 5 mm i 20 cm, per exemple per muntar en un robot. També es podrien utilitzar un altre tipus de sensors, el GP2Y0A02YK0F o el més modern GP2Y0E03, que funcionen amb un led infraroig però estan més afectats per la llum ambient i en el primer cas la seva resposta del sensor no és lineal.

En tots els casos els preus de compra estan entre 3 i 4 euros, així que per mi no té color que, pel mateix preu, el que millors mesures en física dona és el sensor VL53L0X, encara que per muntar en un robot pot ser no ho sigui el més idoni ja que el seu angle de medició o FOV (Field of View) es només de 25º, el que pot ser petit si es volen detectar obstacles, però que és magnífic si es vol seguir el moviment d’una pilota que rebota.

El sensor VL53L0X funciona entre 2,6 V i 5,5 V, i les mesures s’obtenen a través de la interfície I²C .

Descripció dels pins

Els diversos fabricants que integren el sensor en una plaqueta ho fan de maneres diverses, però tots inclouen quatre pins, que són els necessaris per a fer-lo funcionar.

  • VIN: Aquesta és la connexió de la font d’alimentació de 2.6 V a 5.5 V.
  • GND: La connexió a terra (0 V).
  • SCL: Línia de rellotge I²C: Alt és VIN, baix és 0 V
  • SDA; Línia de dades I²C: Alt és VIN, baix és 0 V

Algunes altres entrades i sortides que poden incloure les diverses plaquetes, però que no usarem, són:

  • XSHUT: Aquest pin és una entrada d’apagada que s’activa en baix. Per defecte està en alt.
  • INT: Sortida d’interrupció (Open drain).
  • VDD: Regulat a 2,8 V de sortida. Pot proporcionar fins a 150 mA per alimentar components externs. (es pot usar aquest pin com a entrada de 2.8 V amb VIN desconnectat per ometre el regulador intern).
  • GPIO: Entrada o sortida de propòsit general
  • DNC: Sense connexió (Do Not Connect).

Com es veu en la foto del sensor de dalt, el venen amb els pins sense soldar a la plaqueta i, si es vol utilitzar punxada en una placa de proves (protoboard) i connectar-la després a l’Arduino amb cables pont (o Dupont), el primer que s’ha de fer es soldar-la. La millor manera és sobre la mateixa protoboard tal i com l’expliquen els tècnics d’Adafruit, que a més indiquen moltes d’altres coses i com utilitzar-la.

La connexió a la placa

Si s’utilitza el sensor amb una placa Arduino els quatre pins que s’han de connectar ho han de fer així: el VCC a 5 V, el GND a GND (terra), l’SCL a l’entrada A5 i l’SDA a l’entrada A4, tal i com es veu en el dibuix i la fotografia de sota.

Si s’utilitza el sensor amb una placa Wemos (o qualsevol altre placa amb microprocesador esp32) els quatre pins que s’han de connectar ho han de fer així: el VCC a 3,3 ó 5 V, el GND a GND (terra), l’SCL a l’entrada SCL i l’SDA a l’entrada SDA, tal i com es veu en el dibuix i la fotografia de sota.

Aquesta segona placa és la Wemos D1 R32, que incorpora el microprocessador esp32, per la qual cosa s’han d’instal·lar els controladors de l’esp32, si no l’estan encara. Per instal·lar-los s’ha d’anar a l’IDE de Arduino i en Archivo/Preferencias, a la pestanya d’Ajustes s’enganxa la direcció https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json en el Gestor de URLs Adicionales de Tarjetas.

Després a Herramientas/Placa/Gestor de tarjetas apareixerà esp32 by Espressif Systems. Es pitja en More info y després en el botó Instalar. Trigarà una mica mentre indica Descargardo definiciones de tarjetas.

Quan s’hagi descarregat se busca la placa en Herramientas/Placa, es selecciona DOIT ESP32 DEVKIT V1 i ja està preparat l’IDE per a funcionar amb la tarja Wemos D1 R32. També funciona la placa si es selecciona el mòdul ESP 32 Dev.

El projecte

El projecte que proposo està basat en l’entrada de Lúis Llamas Medir distancia con precisión con Arduino y sensor láser VL53L0X y VL6180X.

Per a realitzar la lectura del sensor VL53L0X usarem la llibreria desenvolupada por Adafruit (Adafruit_VL53L0X-master.zip), que està disponible en aquest enllaç. Per descarregar-la s’ha de clicar en Clone or download i després en Download ZIP. Si es volen veure les dades pel mòbil també hem de tenir instal·lada la llibreria del Bluetooth (BluetoothSerial.zip) que la podeu descarregar d’aquí.

Per a installar les llibreries s’ha d’anar a l’IDE d’Arduino i en la pestanya Programa/Incluir librería es selecciona Añadir bilblioteca.ZIP.

Si connecteu el sensor a un Arduino el projecte a descarregar és sketch_distancia_por_IR_VL53L0X_tiempo.ino, o bé podeu copiar el codi de sota a l’IDE d’Arduino. Les dades que subministrarà el monitor sèrie seran dues columnes amb el temps en segons i la distància en mil·límetres.

//Realizar medidas de distancia por ecos de IR con el sensor VL53L0X en Arduino Uno
//Obtención de los valores por el puerto serie del ordenador
//Los datos se pueden visualizar en el monitor serie del IDE de Arduino 
//y con el programa para ordenador RealTerm, https://sourceforge.net/projects/realterm/

//Conexiones: GND a Gnd, Vcc a +5V, SCL a A5 y SDA a A4

#include "Adafruit_VL53L0X.h" //Se carga la libreria del sensor
 Adafruit_VL53L0X lox = Adafruit_VL53L0X();

float tiempo; // Se define el tiempo como numero con decimales
float tiempoSegundos; // Se define el tiempo en segundos como número con decimales
 
void setup() 
{
  Serial.begin(9600);
  tiempo = millis(); //mide el tiempo en milisegundos desde que se pone en marcha Arduino
  
  // Iniciar sensor
  Serial.println("VL53L0X test");
  if (!lox.begin()) {
    Serial.println(F("Error al iniciar VL53L0X"));
    while(1);
  }
}
 
void loop() 
{
  tiempo = millis(); //Actualiza el tiempo actual
tiempoSegundos = tiempo/1000; //cambia los milisegundos a segundos
Serial.print(tiempoSegundos,3); //Escribe el tiempo en segundos con tres decimales
Serial.print("; ");
//Serial.print("s"); //Añade s, de segundos, al valor numérico. Mejor no ponerlo si se quieren tratar después los datos


  VL53L0X_RangingMeasurementData_t measure;
    
  //Serial.print("Leyendo sensor... ");
  lox.rangingTest(&measure, false); // si se pasa true como parametro, muestra por puerto serie datos de debug
 
  if (measure.RangeStatus != 4)
  {
    //Serial.print("Distancia (mm): ");
   Serial.println(measure.RangeMilliMeter);
  } 
  else
  {
    Serial.println("  Fuera de rango ");
  }
  
  delay(50); 
}

Si connecteu el sensor a un esp32, com és el Wemos D1 R32, que disposa de wifi i bluetooth, podeu descarregar sketch_distancia_por_IR_VL53L0X_tiempo_BT.ino, o bé copiar el codi de sota. Les dades que subministrarà el monitor sèrie bluetooth seran dues columnes amb el temps en segons i la distància en mil·límetres.

//Medidas de distancia por ecos de Infrarrojos con el sensor VL53L0X en Wemos D1 R32 (esp32)
//Se ha de seleccionar la placa DOIT ESP32 DEVKIT V1
//Obtención de los valores por el puerto serie del ordenador y por BT (BlueTooth)
//Los datos se pueden visualizar en el monitor serie del IDE de Arduino 
//y con el programa para ordenador RealTerm, https://sourceforge.net/projects/realterm/
//Los datos también se pueden visualizar en el teléfono móvil o la tableta 
//gracias a la app Serial Bluetooth Terminal para Android
//https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=ca
// o a la app HM10 Bluetooth Serial Lite para iOS
//https://apps.apple.com/us/app/hm10-bluetooth-serial-lite/id1030454675

//Conexiones: GND a Gnd, Vcc a +3,3 ó 5 V, SCL a SCL y SDA a SDA

#include "Adafruit_VL53L0X.h" //Se carga la libreria del sensor
 Adafruit_VL53L0X lox = Adafruit_VL53L0X();

#include "BluetoothSerial.h" //Se carga la libreria del Bluetooth
BluetoothSerial SerialBT; 

float tiempo; // Se define el tiempo como numero con decimales
float tiempoSegundos; // Se define el tiempo en segundos como número con decimales
 
void setup() 
{
  Serial.begin(9600);
  SerialBT.begin("DistanciasIR"); //Se inicia el Bluetooth con el nombre DistanciasIR
 
  tiempo = millis(); //mide el tiempo en milisegundos desde que se pone en marcha Arduino
  
  // Iniciar sensor
  Serial.println("VL53L0X test");
  if (!lox.begin()) {
    Serial.println(F("Error al iniciar VL53L0X"));
    while(1);
  }
}

void loop() 
{
  tiempo = millis(); //Actualiza el tiempo actual
tiempoSegundos = tiempo/1000; //cambia los milisegundos a segundos

Serial.print(tiempoSegundos,3); //Escribe el tiempo en segundos con tres decimales
Serial.print("; "); //separa los valores de tiempo y distancia con un punto y coma
//Serial.print("s"); //Añade s, de segundos, al valor numérico. Mejor no ponerlo si se quieren tratar después los datos
SerialBT.print(tiempoSegundos,3); //Escribe el tiempo en segundos con tres decimales por BT
SerialBT.print("; ");

  VL53L0X_RangingMeasurementData_t measure;
    
  //Serial.print("Leyendo sensor... ");
  lox.rangingTest(&measure, false); // si se pasa true como parametro, muestra por puerto serie datos de debug
 
  if (measure.RangeStatus != 4)
  {
    //Serial.print("Distancia (mm): ");
   Serial.println(measure.RangeMilliMeter); //Escribe la distancia en milímetros
   SerialBT.println(measure.RangeMilliMeter); //Escribe la distancia en milímetros por BT
  } 
  else
  {
    Serial.println("  Fuera de rango ");
    SerialBT.println("  Fuera de rango ");
  }
  
  delay(50); 
}

La mesura de la distància

Les dades se poden visualitzar en el monitor sèrie de l’IDE d’Arduino i amb el programa per ordinador RealTerm. Si la placa que s’utilitza disposa de bluetooth també es poden visualitzar en el telèfon mòbil o la tauleta gràcies a l’app Serial Bluetooth Terminal per Android.

En la captura de pantalla del costat es veuen les dades que apareixen en el Serial Bluetooth Terminal. En la primera columna apareixen els valors del temps en segons (amb tres decimals), i en la segona la distància a l’objecte en mil·límetres.

El número de decimals del temps els he definit en afegir un 3 a la línia de codi: Serial.print(tiempoSegundos,3); o SerialBT.print(tiempoSegundos,3);. Si es vol canviar el número de decimals no hi ha més que canviar el 3.

En el projecte també he definit la velocitat de pressa de dades molt ràpida (20 per segon) pensant en que pot convenir el sensor per mesurar la distància amb la que s’apropa o allunya un objecte (una pilota, un cotxet, etc.) i per això he ficat una espera de 50 ms (delay(50);). Si es desitja que el sensor faci mesures cada més temps l’únic que s’ha de fer és canviar el 50 per un altre número, per exemple 1000 per a que faci la mesura cada segon.

Són molts els experiments que es poden realitzar gràcies a un sensor de distància com aquest. En una entrada anterior us proposava l’estudi de la pèrdua d’energia en el bot a terra d’una pilota ((Aparicio i Lozano, 2002 (protocol alumnat, material professorat)), però poden ser d’altres com Caiguda lliure i velocitat límit (protocol alumnat, material professorat) on es planteja l’estudi de diferents tipus de paracaigudes.

Per cert, aquests protocols estan amagats en una antiga web del CDEC. Ara mateix en la web actual tenen tots els protocols agrupats amb el nom de Recull històric. Per exemple, d’aquí podeu descarregar els Protocols TIC de Física.


Hi ha un comentari

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.