산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노로 VL6180X와 서보 모터를 이용한 라이다(LIDAR) 시스템 구축

부품 및 소모품

부품비고수량
아두이노 우노1
SparkFun ToF 거리 센서 - VL6180VL53L0X는 장거리, VL6180X는 단거리용. 여기선 VL6180X 사용1
서보 모터1

앱 및 온라인 서비스

프로젝트 소개

라이다(LiDAR)에 대한 몇 가지 사항

LIDAR(Light Detection and Ranging)는 빛으로 타겟을 조명하여 거리를 측정하는 광학 원격 감지 시스템입니다. 라이다 기술은 로봇공학에서 환경 인식과 물체 분류에 사용됩니다. 지형의 2D 고도 지도, 지면까지의 고정밀 거리, 접근 속도 제공으로 로봇 및 유인 차량의 안전한 착륙을 고정밀로 가능하게 합니다.

라이다는 레이저 빔으로 타겟을 조명하는 송신기와, 송신 빔과 본질적으로 동축인 빛 성분을 감지할 수 있는 수신기로 구성됩니다. 수신 센서는 빛이 타겟에 도달하고 돌아오는 데 필요한 시간을 기반으로 거리를 계산합니다. 거울이 있는 기계적 장치가 빛 빔을 쓸어 평면 또는 3차원(회전 끄덕임 거울 사용)으로 필요한 장면을 커버합니다.

펄스 레이저를 사용하고 경과 시간을 직접 측정하는 방식으로 비행 시간을 측정할 수 있습니다. 피코초를 분해할 수 있는 전자장치가 필요하므로 매우 비쌉니다. 다른 방법은 반사광의 위상 변화를 측정하는 것입니다.

위상 변화 측정에 콜리메이티드 적외선 레이저를 사용합니다. 입사광 파장보다 거친 표면에서는 확산 반사가 발생합니다. 물체에 대해 적외선 빛의 성분이 송신 빔과 거의 평행하게 돌아옵니다.

센서는 송신 신호와 반사 신호 사이의 위상 변화를 측정합니다. 그림은 이 기술로 거리를 측정하는 방법을 보여줍니다. 변조 신호의 파장은 다음 방정식을 따릅니다:

c = f ∙ τ

여기서 c는 빛의 속도, f는 변조 주파수, τ는 알려진 변조 파장입니다.

방출된 빛이 이동한 총 거리 D':

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

A는 측정된 거리, B는 위상 측정 장치부터의 거리입니다. 빔 스플리터와 타겟 사이의 필요 거리 D는:

D = τ * θ / 4π

여기서 θ는 송신 및 반사 광선 사이의 전자적으로 측정된 위상 차이입니다.

수신 신호 진폭의 제곱에 반비례하는 범위가 센서 정확도에 직접 영향을 미침을 보일 수 있습니다.

(출처: https://home.roboticlab.eu/en/examples/sensor/lidar)

졸업 작품으로 자율 주행 차량의 주변 2D 지도가 필요하여 라이다를 선택했습니다. 소나처럼 초음파를 튕기는 것과 달리 '감지 콘'이 매우 좁아 빠르고 정확합니다.

VL6180x나 VL53L0x는 STMicroelectronics의 광학 센서입니다. VL53L0x가 훨씬 정밀하고 선형성 문제나 '이중 영상'(물체가 아주 멀리 있는지 아주 가까운지 알 수 없는 문제)이 없습니다.

이 ToF(비행 시간) 센서는 사실 우리 휴대폰에서 카메라 초점 조절에 사용됩니다.

회로도

아두이노로 VL6180X와 서보 모터를 이용한 라이다(LIDAR) 시스템 구축

Adafruit 라이브러리 설치

아두이노로 VL6180X와 서보 모터를 이용한 라이다(LIDAR) 시스템 구축

아두이노 코드

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

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

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

void loop() {
  for (pos = 0; pos <= 180; pos += 0.5) {
    myservo.write(pos);
    uint8_t range = vl.readRange();
    Serial.println(String(range) + "p" + String(pos * Pi / 180) + "p" + String(pos));
    delay(10);
  }
  /* 왕복 스캔 주석 처리됨
  for (pos = 180; pos >= 0; pos -= 0.5) {
    myservo.write(pos);
    uint8_t range = vl.readRange();
    Serial.println(String(range) + "p" + String(pos * Pi / 180) + "p" + String(pos));
    delay(10);
  }
  */
  myservo.write(0);
  delay(2000);
}

Processing 코드 (좋은 레이더 인터페이스가 필요하면 다른 레이더 프로젝트 참조) 실행 전 아두이노 포트 번호(예: "COM 3")를 변경하세요.

import processing.serial.*;
Serial myPort;
String val;
int range, i = 0;
float pos;

void setup() {
  size(550, 500);
  String portName = "COMx"; // x=아두이노 포트 번호
  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"); // 'p'로 구분된 수신 데이터 분할
      if (nums.length == 3) {
        range = int(nums[0]);           // 문자열을 정수로 변환
        pos = float(nums[1]);
        i = int(nums[2]);
        if (i == 180) { background(255); }
      }
    }
  }
  translate(25, -50);
  line(250, 500, 250 - 2 * (range * cos(pos)), 500 - 2 * (range * sin(pos)));
}
아두이노로 VL6180X와 서보 모터를 이용한 라이다(LIDAR) 시스템 구축

센서 속도는 10Hz로 제한되고, 고속에서 서보 응답이 좋지 않습니다. 고속 라이다를 만들려면 피드백 시스템이 있는 스테퍼 모터나 DC 모터를 사용하세요. 연속 회전을 위해 슬립 링 사용(Adafruit 슬립 링).

질문과 제안 환영합니다!

코드

아두이노 코드

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

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

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

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

Processing 코드

import processing.serial.*;
Serial myPort;
String val;
int range, i = 0;
float pos;

void setup() {
  size(550, 500);
  frameRate(36);
  String portName = "COMx"; // x=아두이노 포트 번호
  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) {
        range = int(nums[0]);
        pos = float(nums[1]);
        i = int(nums[2]);
        if (i == 180) { background(255); }
      }
    }
  }
  translate(25, -50);
  line(250, 500, 250 - 2 * (range * cos(pos)), 500 - 2 * (range * sin(pos)));
}

제조공정

  1. 가스 랜턴: 진화, 디자인, 현대 제조 공정
  2. 레이저 포인터: 설계, 제조, 안전성 개요
  3. 손전등: 탄생부터 현대 혁신까지
  4. 만화경: 브루스터의 과학에서 현대 디자인까지
  5. 반도체 레이저: 현대 기술을 위한 정밀 광원
  6. 사진술의 예술과 과학: 다게레오타입에서 현대 필름까지
  7. 교통신호: 공학, 역사, 미래 혁신
  8. 불에서 필라멘트로: 현대 전구 진화와 생산
  9. 광섬유: 기술, 생산 및 미래
  10. Kodiak 3D LiDAR: 고궤도 임무를 위한 정밀 우주 탑재 거리 측정