Medidor de distancia laser para Lego

Pol y yo estamos construyendo un ascensor con Lego y pretendemos ponerle una botonera y que vaya al piso que pulsemos. La tarea no es tan fácil como parece porque vamos a utilizar un Arduino y necesitaremos una unidad de potencia para controlar el motor (un puente dual H L298N), la botonera y un medidor de distancia para saber donde está el ascensor en cada momento.

Podíamos haberlo hecho con sensores en cada piso pero entonces el cableado iba a ser un infierno así que pensamos que un medidor de distancia podría funcionar bien. Nos decantamos por un medidor laser porque el ángulo de salida es más estrecho y así nos evitamos los rebotes típicos en los medidores por ultrasonidos.

Al final, el escogido ha sido el VL53LXX-V2 (llamado «time-of-flight» porque calcula el tiempo de ida y vuelta del haz laser), que incorpora un diminuto emisor y receptor laser con un ángulo de salida de unos 25º. Si lo compras, vas a tener que soldar los terminales tú mismo lo cual no es mayor problema. En mi caso, me llevo un poco de tiempo porque las puntas son muy pequeñas y mi soldador un poco antiguo (25 años al menos).

Medidor Laser Time-of-Flight VL53LXX-V2

Para engancharlo a las piezas de lego, no me compliqué mucho la vida y lo pegué por la parte de los terminales y cable con celo a un doble bloque 4×4.

VL53LXX-V2 para Lego y Arduino

El esquema de conexión es sencillo:

ArduinoVL53LXX-V2
5VVIN (blanco)
GNDGND (lila)
SCLSCL (azul)
SDASDA (verde)

El siguiente paso ha sido preparar el sketch para nuestro Arduino One Rev4. En nuestro caso, para probarlo, hemos enviado la lectura de la distancia al serial monitor. Hemos utilizado la librería «Adafruit_VL53L0X» en la versión 1.2.4.

const int EchoPin = 5;
const int TriggerPin = 6;

void setup() {
  Serial.begin(9600);
  pinMode(TriggerPin, OUTPUT);
  pinMode(EchoPin, INPUT);
}

void loop() {
  int cm = ping(TriggerPin, EchoPin);
  Serial.print("Distancia: ");
  Serial.println(cm);
  delay(1000);
}

int ping(int TriggerPin, int EchoPin) {
  long duration, distanceCm;
  
  digitalWrite(TriggerPin, LOW); 
  delayMicroseconds(4);
  digitalWrite(TriggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TriggerPin, LOW);
  
  duration = pulseIn(EchoPin, HIGH);
  
  distanceCm = duration * 10 / 292/ 2;   //convertimos la distancia a cms
  return distanceCm;
}

El funcionamiento final es impecable. Me ha sorprendido la fiabilidad y precisión que ofrece en la medida de la distancia. Pese a todo, una vez montado dentro del ascensor, pierde un poco de exactitud en la planta baja porque el ángulo se extiende mucho y debe tener algún rebote inesperado, pero nada que al final no se pueda arreglar con una tabla ajustada manualmente.