Poor man LIDAR motor bipolar

          Un LIDAR es un dispositivo que permite determinar la distancia desde un emisor láser a un objeto o superficie utilizando un haz láser pulsado. La distancia al objeto se determina midiendo el tiempo de retraso entre la emisión del pulso y su detección a través de la señal reflejada. Esto permite generar modelos bi o tridimensionales del entorno.

          Este proyecto es un LIDAR bidimensional, es decir, mapea la dirección y la distancia de los objetos circundantes en un solo plano y que es útil para por ejemplo el control autónomo de robot. 

          El rayo laser ha de girar 360 grados de forma continua para ese mapeo del entorno, lo cual conlleva el problema de los cable que unen al sensor LASER (que está girando) con el resto de circuito de control.

          Esto puede resolverse de dos forma.
                   -Mantener estático el sensor LASER con el resto de circuitos y enviar el rayo a través de un espejo superior e inclinado 45 grados y que es el que realmente gira.
                   -Usar un dispositivo llamado SLIP RING. Consta de una parte fija con cables  a circuitos de control y otra superior con los mismos cables  y que pueden girar sin enredarse.

          Uso el segundo método, pero como habitualmente eso implica dos estructuras (motor y circuitos) y requiere una impresora 3D que no tengo por falta de espacio. Así, en vez de usar un sistema adyacente he probado uno sobrepuesto. Motor abajo pasando su eje a través del SLIP RING.
          El sensor VL53L1X integra un laser infrarrojo de 940nm que mide el tiempo de reflexión independientemente de las caracteristicas fisicas de los materiales reflejados (color, forma, textura y reflexibilidad). Sí es cierto que funciona mejor con luz ambiente baja o en oscuridad. La distancia mínima que mide es de 4cm y máxima de 400cm y resolución de 1mm. Tiene tres modos: Long(400mm en oscuridad), Medium(300mm en oscuridad) y Short(130mm, el más inmune a interferencias de luz ambiente).
El elemento clave del montaje es el
SLIP RING.

Por un lado tiene cuatro cables (pueden ser más) que están fijos y que van al Arduino Nano (foto de mas a la izquierda)

En el otro lado los cable pueden girar y van al sensor laser.

Dos cables de alimentación y otros dos para el I2C 
          El motor es bipolar 14HK0402 de cuatro hilos es pequeño y de bajo consumo aunque puede usarse cualquier otro. En este caso, el trimmer del controlador A4988 debe ajustarse a unos 100mA.

          El sensor Hall por medio de un imán puesto en la rueda de giro superior y a través del pin D5 hace que el programa en Processing borre los datos tras cada giro completo.
He recortado un disco de circuito impreso para acoplar al motor y sujetar el Sip Ring para que no gire en su parte inferior.

Los componentes. ESP8266, motor bipolar con controladora A4988, módulo Hall, SIP RING y sensor laser VL53L1X.

Rueda superior rescatada de no se donde. El eje que la une al motor es un tornillo de métrica M4.

Y sí, la tabla es secuestrada de la cocina. 

//Programa ESP8266
//LIDAR con motor bipolar y driver A4988
//Sensor radar VL53L1X
//www.jopapa.me   2024

#include <Wire.h>
#include "SparkFun_VL53L1X.h"

SFEVL53L1X distanceSensor;
const int stepPin = D8;
const int Hall = D5; 
int flag=0;
int sHall;
int distance;
float angulo=0;
int stepDelay=2000;

void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("VL53L1X Qwiic Test");
  if (distanceSensor.begin() != 0) {   //Begin retorna 0 con buen init
    Serial.println("Fallo del sensor");
    while (1);}
  Serial.println("Sensor online");
  distanceSensor.setDistanceModeShort();
  //distanceSensor.setDistanceModeLong();
  pinMode(stepPin, OUTPUT);
}

void loop() {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(stepDelay);

  flag++;  //Solo mitad de medidas de distancia para acelerar el motor
  if (flag==2){
    distanceSensor.startRanging(); //Write configuration bytes to initiate measurement
    while (!distanceSensor.checkForDataReady()){ delay(1); }
    distance = distanceSensor.getDistance();
    flag=0;}
    distanceSensor.clearInterrupt();
    distanceSensor.stopRanging(); 

    sHall=digitalRead(Hall); 
    if (sHall != 0){  //detecta el paso por el imán
      Serial.print(angulo);
      Serial.print(",");
      Serial.print(distance/10);
      Serial.println(","); 
      angulo = angulo+0.9;
      }
    else{
      angulo=0;
    }
}


//Sketch en Processing
//LIDAR con motor bipolar y driver A4988
//Sensor radar VL53L1X
//www.jopapa.me   2024

import processing.serial.*;

Serial myPort; // Objeto para el puerto serial

void setup() {
  size(1200, 1200);
  background(255, 255, 255);
  // Cambia el nombre del puerto serial según tu configuración
  myPort = new Serial(this, "COM6", 9600);
}


void draw() {
  while (myPort.available() > 0) {
    String data = myPort.readStringUntil('\n');
    if (data != null) {
      // Divide los datos en ángulo y distancia
      String[] values = split(data, ',');
      if (values.length > 2) {
        float angle = float(values[0]);
        if(angle==0)  background(255, 255, 255); //Limpia pantalla
        float distance = float(values[1]);
        // Llama a la función para graficar en el círculo
        plotOnCircle(angle, distance);
      }
    }
  }
}

void plotOnCircle(float angle, float distance) {
  stroke (0); //Color del punto (negro)
  strokeWeight (2);  //Tamaño del punto
  // Convierte ángulo a radianes
  float radians = radians(angle);

  // Calcula coordenadas x, y en el círculo
  float x = width / 2 + cos(radians) * distance;
  float y = height / 2 + sin(radians) * distance;

  // Dibuja un punto en las coordenadas calculadas
  point(x, y);
}
Menu