VL6180Xとサーボモーターで作るArduino LIDARシステム
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | 制御用マイコン |
| VL6180X ToF距離センサー (SparkFun等) | 1 | 短距離用。長距離ならVL53L0X推奨 |
| サーボモーター (SG90等) | 1 | センサー水平走査用 |
使用ソフトウェア・サービス
- Arduino IDE
- Processing (可視化用)
プロジェクト概要
LiDAR (Light Detection and Ranging) の基礎
LiDARはレーザー光を照射し、反射光が戻るまでの時間(ToF: Time of Flight)または位相差から距離を測定する光学リモートセンシング技術です。ロボティクスでは環境認識や物体分類に、自動運転では高精度な3Dマップ生成に用いられます。
測定原理
- パルスToF方式: パルスレーザーを照射し、往復時間を直接測定。ピコ秒分解能の電子回路が必要で高コスト。
- 位相差方式: 変調された連続波レーザーを用い、送信波と受信波の位相差θから距離を算出。
D = τ × θ / 4π(τ: 変調波長, c = f·τ)
VL6180X/VL53L0XはSTMicroelectronics製のToFセンサーで、スマートフォンのカメラオートフォーカスにも採用されています。VL53L0Xはより長距離・高精度で、リニアリティ問題や「二重像」問題が少ないです。
回路図
Adafruitライブラリのインストール
Arduinoコード (スキャン&シリアル出力)
#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()) {
Serial.println("VL6180X not found!");
while (1);
}
}
void loop() {
// 0°→180° スキャン (0.5°ステップ)
for (pos = 0; pos <= 180; pos += 0.5) {
myservo.write(pos);
uint8_t range = vl.readRange(); // 距離取得 (mm)
// "距離pラジアン角p度数" 形式で送信
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コード (リアルタイムレーダー表示)
Arduinoのシリアルポート番号(COM3等)を環境に合わせて変更してください。
import processing.serial.*;
Serial myPort;
String val;
int range, i = 0;
float pos;
void setup() {
size(550, 500);
frameRate(36);
String portName = "COM3"; // ★ここに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) {
range = int(nums[0]);
pos = float(nums[1]);
i = int(nums[2]);
if (i == 180) background(255); // 1周ごとに画面クリア
}
}
}
// 極座標→直交座標変換して線描画
translate(25, -50);
line(250, 500,
250 - 2 * (range * cos(pos)),
500 - 2 * (range * sin(pos)));
}
性能と改良ポイント
- スキャン速度: センサー応答10Hz、サーボ応答がボトルネック。0.5°ステップで180°スキャンに約3.6秒かかります。
- 高速化: ステッピングモーターやエンコーダー付きDCモーター、スリップリング(連続回転用)を使用すれば高速・連続スキャンが可能です。
- 長距離化: VL53L0X (最大2m) または VL53L1X (最大4m) への置き換えで測定範囲拡大可能。
- 2D/3Dマッピング: 複数センサーやナッティングミラー、SLAMアルゴリズムと組み合わせで本格的なマッピングが可能。
- データ処理: 生データにフィルタリング(移動平均、外れ値除去)を加えてノイズ低減を推奨。
応用例
- ロボットの障害物検知・回避
- 室内マッピング・SLAM
- 人数カウント・通行量測定
- 駐車場空きスペース検知
- 液面レベル測定
質問・提案歓迎します!
製造プロセス