Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Sistema LIDAR com Arduino, VL6180X e Motor Servo

Componentes e Materiais

Componente Quantidade Observações
Arduino UNO 1
Sensor ToF Range Finder VL6180X (SparkFun) 1 VL53L0X para longo alcance e VL6180X para curto alcance. Aqui usei VL6180X
Motor Servo 1

Software e Serviços Online

Sobre o Projeto

Algumas Coisas Sobre LIDAR

LIDAR (Light Detection and Ranging - Detecção e Medição de Distância por Luz) é um sistema de sensoriamento remoto óptico que pode medir a distância de um alvo iluminando-o com luz. A tecnologia LIDAR é usada em robótica para percepção do ambiente e classificação de objetos. A capacidade da tecnologia LIDAR de fornecer mapas de elevação 2D do terreno, distância de alta precisão ao solo e velocidade de aproximação pode permitir pouso seguro de veículos robóticos e tripulados com alto grau de precisão.

O LIDAR consiste em um transmissor que ilumina um alvo com um feixe laser, e um receptor capaz de detectar o componente de luz que é essencialmente coaxial com o feixe transmitido. Sensores receptores calculam uma distância baseada no tempo necessário para a luz atingir o alvo e retornar. Um mecanismo mecânico com espelho varre o feixe de luz para cobrir a cena requerida em um plano ou até em três dimensões, usando um espelho rotativo acenante.

Uma forma de medir o tempo de voo do feixe de luz é usar laser pulsado e medir o tempo decorrido diretamente. Eletrônicos capazes de resolver picossegundos são necessários em tais dispositivos e eles são, portanto, muito caros. Outro método é medir o deslocamento de fase da luz refletida.

Laser infravermelho colimado é usado para medição de deslocamento de fase. Para superfícies com rugosidade maior que o comprimento de onda da luz incidente, ocorrerá reflexão difusa. O componente da luz infravermelha retornará quase paralelo ao feixe transmitido para objetos.

O sensor mede o deslocamento de fase entre os sinais transmitido e refletido. A figura mostra como esta técnica pode ser usada para medir distância. O comprimento de onda do sinal modulador obedece à equação:

c = f · τ

onde c é a velocidade da luz, f a frequência moduladora e τ o comprimento de onda modulador conhecido.

A distância total D' percorrida pela luz emitida é:

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

onde A é a distância medida. B é a distância da unidade de medição de fase. A distância requerida D, entre o divisor de feixe e o alvo, é portanto dada por:

D = τ · θ / 4π

onde θ é a diferença de fase medida eletronicamente entre os feixes de luz transmitido e refletido.

Pode-se mostrar que o alcance é inversamente proporcional ao quadrado da amplitude do sinal recebido, afetando diretamente a precisão do sensor.

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

Como parte do meu projeto de final de curso, preciso do mapa 2D do entorno para meu veículo autônomo, então escolhi LIDAR porque é tão rápido e preciso. Diferente de sonares que refletem ondas ultrassônicas, o 'cone' de sensoriamento é muito estreito.

VL6180X ou VL53L0X é um sensor óptico da STMicroelectronics. O VL53L0X é muito mais preciso e não tem problemas de linearidade ou 'imagem dupla' onde não se sabe se um objeto está muito longe ou muito perto.

Este sensor de tempo de voo é usado em nossos telefones móveis para ajustar o foco da câmera.

Diagrama do Circuito

Construa um Sistema LIDAR com Arduino, VL6180X e Motor Servo

Instalar Biblioteca Adafruit

Construa um Sistema LIDAR com Arduino, VL6180X e Motor Servo

Código Arduino

#include <Wire.h>
#include "Adafruit_VL6180X.h"
#include <Servo.h>

Adafruit_VL6180X vl = Adafruit_VL6180X();
Servo meuServo;
float pos = 0;
const float Pi = 3.14159;

void setup() {
  meuServo.attach(9);
  Serial.begin(115200);
  while (!Serial) { delay(1); }
  if (!vl.begin()) { while (1); }
}

void loop() {
  for (pos = 0; pos <= 180; pos += 0.5) {
    meuServo.write(pos);
    uint8_t alcance = vl.readRange();
    Serial.println(String(alcance) + "p" + String(pos * Pi / 180) + "p" + String(pos));
    delay(10);
  }
  /*
  for (pos = 180; pos >= 0; pos -= 0.5) {
    meuServo.write(pos);
    uint8_t alcance = vl.readRange();
    Serial.println(String(alcance) + "p" + String(pos * Pi / 180) + "p" + String(pos));
    delay(10);
  }
  */
  meuServo.write(0);
  delay(2000);
}

Código Processing (consulte outro projeto de radar se precisar de interface melhor) - altere o número da porta Arduino (ex: "COM3") antes de executar.

import processing.serial.*;

Serial myPort;
String val;
int alcance, i = 0;
float pos;

void setup() {
  size(550, 500);
  String portName = "COMx"; // x = número da porta do seu 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"); // separa dados recebidos por 'p'
      if (nums.length == 3) {
        alcance = int(nums[0]); // conversão string para inteiro
        pos = float(nums[1]);
        i = int(nums[2]);
        if (i == 180) { background(255); }
      }
    }
  }
  translate(25, -50);
  line(250, 500, 250 - 2 * (alcance * cos(pos)), 500 - 2 * (alcance * sin(pos)));
}
Construa um Sistema LIDAR com Arduino, VL6180X e Motor Servo

A velocidade do sensor é limitada a 10Hz e a resposta do servo é ruim em velocidades maiores. Se alguém planeja fazer LIDAR de alta velocidade, use motor de passo ou motores DC com sistema de feedback. Use anéis coletores para rotação contínua (link).

Dúvidas e sugestões são bem-vindas!

Código

Código Arduino

#include <Wire.h>
#include "Adafruit_VL6180X.h"
#include <Servo.h>

Adafruit_VL6180X vl = Adafruit_VL6180X();
Servo meuServo;
float pos = 0;
const float Pi = 3.14159;

void setup() {
  meuServo.attach(9);
  Serial.begin(115200);
  while (!Serial) { delay(1); }
  if (!vl.begin()) { while (1); }
}

void loop() {
  for (pos = 0; pos <= 180; pos += 0.5) {
    meuServo.write(pos);
    uint8_t alcance = vl.readRange();
    Serial.println(String(alcance) + "p" + String(pos * Pi / 180) + "p" + String(pos));
    delay(10);
  }
  meuServo.write(0);
  delay(1000);
}

Código Processing

import processing.serial.*;

Serial myPort;
String val;
int alcance, i = 0;
float pos;

void setup() {
  size(550, 500);
  frameRate(36);
  String portName = "COMx"; // x = número da porta do seu 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");
      if (nums.length == 3) {
        alcance = int(nums[0]);
        pos = float(nums[1]);
        i = int(nums[2]);
        if (i == 180) { background(255); }
      }
    }
  }
  translate(25, -50);
  line(250, 500, 250 - 2 * (alcance * cos(pos)), 500 - 2 * (alcance * sin(pos)));
}

Processo de manufatura

  1. Lanternas a Gás: Evolução, Design e Fabricação Moderna
  2. Ponteiro Laser: Design, Fabricação e Visão Geral de Segurança
  3. Lanterna: Da Invenção à Inovação Moderna
  4. O Caleidoscópio: Da Ciência de Brewster ao Design Moderno
  5. Lasers de Semicondutor: Geração de Luz de Precisão para Tecnologia Moderna
  6. A Arte e Ciência dos Processos Fotográficos: Dos Daguerreótipos ao Filme Moderno
  7. Semáforos: Engenharia, História e Inovações Futuras
  8. Do Fogo ao Filamento: Evolução e Produção da Lâmpada Incandescente Moderna
  9. Fibra Óptica: Tecnologia, Produção e Futuro
  10. Kodiak 3D LiDAR: Rastreamento Espacial de Precisão para Missões de Alta Órbita