Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Arduino LIDAR

Componentes y suministros

Arduino UNO
× 1
Sensor de telémetro SparkFun ToF - VL6180
VL53L0X para largo alcance y VL6180X para corto alcance. aquí usé VL6180X
× 1
servomotor
× 1

Aplicaciones y servicios en línea

Arduino IDE
Procesamiento

Acerca de este proyecto

Algunas cosas sobre LiDAR

LIDAR (Light Detection and Ranging) es un sistema óptico de detección remota que puede medir la distancia de un objetivo iluminándolo con luz. La tecnología LIDAR se está utilizando en robótica para la percepción del entorno y la clasificación de objetos. La capacidad de la tecnología LIDAR para proporcionar mapas de elevación en 2D del terreno, la distancia al suelo de alta precisión y la velocidad de aproximación puede permitir el aterrizaje seguro de vehículos robóticos y tripulados con un alto grado de precisión.

LIDAR consta de un transmisor que ilumina un objetivo con un rayo láser y un receptor capaz de detectar el componente de luz que es esencialmente coaxial con el rayo transmitido. Los sensores del receptor calculan una distancia, basada en el tiempo necesario para que la luz alcance el objetivo y regrese. Un mecanismo mecánico con espejo barre el haz de luz para cubrir la escena requerida en un plano o incluso en tres dimensiones, utilizando un espejo giratorio inclinado.

Una forma de medir el tiempo de vuelo del haz de luz es usar un láser pulsado y luego medir el tiempo transcurrido directamente. En tales dispositivos se requieren dispositivos electrónicos capaces de resolver picosegundos y, por lo tanto, son muy costosos. Otro método es medir el cambio de fase de la luz reflejada.

El láser infrarrojo colimado se utiliza para medir el desplazamiento de fase. En el caso de superficies que tengan una rugosidad mayor que la longitud de onda de la luz incidente, se producirá una reflexión difusa. El componente de la luz infrarroja volverá casi paralelo al haz transmitido para los objetos.

El sensor mide el cambio de fase entre las señales transmitidas y reflejadas. La imagen muestra cómo se puede utilizar esta técnica para medir distancias. La longitud de onda de la señal moduladora obedece a la ecuación:

  c =f ∙ τ  

donde c es la velocidad de la luz yf la frecuencia de modulación y τ la longitud de onda de modulación conocida.

La distancia total D 'cubierta por la luz emitida es:

  D '=B + 2A =B + (θ * τ) / 2π  

donde A es la distancia medida. B es la distancia desde la unidad de medida de fase. La distancia requerida D, entre el divisor de haz y el objetivo, viene dada por

  D =τ * θ / 4π  

donde θ es la diferencia de fase medida electrónicamente entre los haces de luz transmitidos y reflejados.

Se puede demostrar que el rango es inversamente proporcional al cuadrado de la amplitud de la señal recibida, lo que afecta directamente la precisión del sensor.

(copiado de http://home.roboticlab.eu/en/examples/sensor/lidar).

Como parte de mi proyecto de fin de año, necesito el mapa 2D de los alrededores de mi vehículo autónomo, así que elijo LiDAR porque es muy rápido y preciso. A diferencia de los sonares que rebotan ondas ultrasónicas, el "cono" de detección es muy estrecho.

VL6180x o Vl53l0x es un sensor óptico de STMicroelectronics. VL53L0x es mucho más preciso y no tiene problemas de linealidad o "imágenes dobles" en las que no se puede saber si un objeto está muy lejos o muy cerca.

Este sensor de tiempo de vuelo se utiliza en realidad en nuestro teléfono móvil para ajustar el enfoque de la cámara.

Diagrama de circuito

Instalar la biblioteca Adafruit

Código Arduino

  #include  #include "Adafruit_VL6180X.h" #include  Adafruit_VL6180X vl =Adafruit_VL6180X (); Servo myservo; float pos =0; const float Pi =3.14159; configuración vacía () {myservo.attach (9); Serial.begin (115200); while (! Serial) {retraso (1); } if (! vl.begin ()) {while (1); }} bucle vacío () {para (pos =0; pos <=180; pos + =.5) {myservo.write (pos); uint8_t rango =vl.readRange (); Serial.println (Cadena (rango) + "p" + Cadena (pos * Pi / 180) + "p" + Cadena (pos)); retraso (10); } / * para (pos =180; pos> =0; pos - =.5) {myservo.write (pos); uint8_t rango =vl.readRange (); {Serial.println (Cadena (rango) + "p" + Cadena (pos * Pi / 180) + "p" + Cadena (pos)); retraso (10);}} * / myservo.write (0); retraso (2000);}  

Código de procesamiento (consulte otro proyecto de radar si necesita una buena interfaz de radar) cambie el número de puerto de Arduino (por ejemplo, "COM 3") antes de ejecutar.

  import processing.serial. *; Serial myPort; String val; int range, i =0; float pos; void setup () {size (550,500); String portName ="COMx"; // x =su número de puerto arduino myPort =new Serial (this, portName, 115200); background (255);} void draw () {if (myPort.available ()> 0) {val =myPort.readStringUntil ('\ n'); if (val! =null) {String [] nums =split (val, "p"); // dividir los datos recibidos clasificados por 'p' if (nums.length ==3) {rango =int (nums [0 ]); // conversión de cadena a entero pos =float (nums [1]); i =int (números [2]); si (i ==180) {fondo (255); }}}} traducir (25, -50); línea (250,500,250-2 * (rango * cos (pos)), 500-2 * (rango * sin (pos))); }  

La velocidad del sensor está limitada a 10Hz y la respuesta del servo es pobre a mayor velocidad. Si alguien planea hacer LIDAR de alta velocidad, use un motor paso a paso o motores de CC con sistema de retroalimentación. use anillos colectores para rotación continua (https://www.adafruit.com/product/736).

¡Cualquier pregunta, sugerencia es bienvenida!

Código

  • código Arduino
  • código de procesamiento
Código Arduino Arduino
 #include  #include "Adafruit_VL6180X.h" #include  Adafruit_VL6180X vl =Adafruit_VL6180X (); Servo myservo; float pos =0; const float Pi =3.14159; configuración vacía () {myservo.attach (9); Serial.begin (115200); while (! Serial) {retraso (1); } if (! vl.begin ()) {while (1); }} bucle vacío () {para (pos =0; pos <=180; pos + =.5) {myservo.write (pos); uint8_t rango =vl.readRange (); Serial.println (Cadena (rango) + "p" + Cadena (pos * Pi / 180) + "p" + Cadena (pos)); retraso (10); } / * para (pos =180; pos> =0; pos - =.5) {myservo.write (pos); uint8_t rango =vl.readRange (); {Serial.println (Cadena (rango) + "p" + Cadena (pos * Pi / 180) + "p" + Cadena (pos)); retraso (10); }} * / myservo.write (0); retraso (1000);} 
código de procesamiento Procesando
 import processing.serial. *; Serial myPort; String val; int range, i =0; float pos; void setup () {size (550,500); frameRate (36); String portName ="COMx"; // x =su número de puerto arduino myPort =new Serial (this, portName, 115200); fondo (255); } vacío dibujar () {if (myPort.available ()> 0) {val =myPort.readStringUntil ('\ n'); if (val! =null) {String [] nums =split (val, "p"); // dividir los datos recibidos clasificados por 'p' if (nums.length ==3) {rango =int (nums [0 ]); // conversión de cadena a entero pos =float (nums [1]); i =int (números [2]); si (i ==180) {fondo (255); }}}} traducir (25, -50); línea (250,500,250-2 * (rango * cos (pos)), 500-2 * (rango * sin (pos))); } 

Proceso de manufactura

  1. Linterna de gas
  2. Puntero láser
  3. Linterna
  4. Caleidoscopio
  5. Láser semiconductor
  6. Fotografía
  7. Señal de tráfico
  8. Bombilla
  9. Fibra óptica
  10. Luz de mesa interactiva controlada por gestos
  11. LiDAR 3D de Kodiak