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.

Ascensor con Lego

Pol, Blanca y yo estuvimos el fin de semana pasado construyendo un ascensor con Lego. Obviamente, la mayor complejidad estaba en el mecanismo eléctrico para mover el ascensor entre las distintas plantas y más concretamente para hacerlo bajar.

En el diseño inicial, pusimos la caja del ascensor dentro de un armazón pero la fricción por sus cuatro lados hacía que el motor lo hiciera subir pero no bajar. Para solventarlo, montamos una nueva columna de pisos donde solamente había rozamiento en dos puntos que equivalían al 5% de todo el perímetro de la caja del ascensor. Y funcionó!.

Ascensor eléctrico hecho con Lego

El siguiente pasó será añadirle los botones de los pisos y algún sistema electrónico para poder controlar que el motor se detenga en cada una de las plantas al pulsarlos. Quizás un buen momento para comenzar con un Arduino.