レッスン78:VL53L0Xからの距離をLCDに表示する | Arduinoステップバイステップコース
このガイドでは、VL53L0XタイムオブフライトセンサーとI2Cモジュール付き16x2 LCDディスプレイを使用して、精密なレーザー距離計を構築する方法を説明します。このプロジェクトは、作品に正確な非接触距離測定を追加したいメーカーに最適です。VL53L0Xはレーザーを使用して距離を測定するため、超音波センサーが苦手とする用途、例えばタンクの充填レベルを測定したり、コンベアベルト上の物体の正確な位置を検出したりする場合に理想的です。このプロジェクトを活用できる実用的な方法をいくつか紹介します:
- 自動ペットフーダー: 容器内のフードレベルを測定し、補充をトリガーしたり通知を送信します。
- スマートゴミ箱: ゴミ箱の満杯度を検出し、空にする必要があるときに警告します。
- DIY高さゲージ: 小さな物体や子供の成長を追跡するための精密な測定ツールを作成します。
- 駐車アシスタント: ガレージや狭いスペースでの正確な駐車を支援するセンサーシステムを構築します。
- ロボティクス: ロボットで障害物を検出したり、ナビゲーションのために壁までの距離を測定したりします。
必要なハードウェア
- Arduinoボード(例:Uno)
- VL53L0Xレーザー距離センサー
- I2Cモジュール付きLCD 1602ディスプレイ
- ジャンパーワイヤー
配線ガイド
このプロジェクトの配線は、LCDとセンサーの両方が同じ2本のワイヤーで通信できるI2Cプロトコルのおかげで簡単です。VL53L0Xセンサーには5V電源が必要で、Arduinoの5Vピンから直接供給されます。センサーに安定した電源を確保するために、追加のピンが2番目のVCCとして使用されます。(ビデオの00:27で)
以下が接続図です:

接続は次のとおりです:
- VL53L0X VCC -> Arduino 5V および Pin 13(Pin 13はデジタル出力として設定され、追加の電力安定性を提供します)。
- VL53L0X GND -> Arduino GND。
- VL53L0X SCL -> Arduino SCL (A5)。
- VL53L0X SDA -> Arduino SDA (A4)。
- LCD I2C VCC -> Arduino 5V。
- LCD I2C GND -> Arduino GND。
- LCD I2C SCL -> Arduino SCL (A5)。
- LCD I2C SDA -> Arduino SDA (A4)。
異なるArduinoモデルを使用している場合、I2Cピンが別の場所にある可能性があります。SDAおよびSCLピンは、ボード上に直接ラベル表示されていることがよくあります。(ビデオの02:42で)
コードの説明
コードは設定が簡単になるように設計されています。ユーザーが設定できる主要部分はスケッチの最上部にあります。(ビデオの04:18で)
まず、追加の電源ピン用の定数を定義します。これはセンサーにクリーンな5V電源を供給するために使用されます。
const int vcc2 = 13; // VL53L0Xセンサー用の追加VCCピン
次に、LCDライブラリのインスタンスを作成し、そのI2Cアドレスを定義します。このアドレスは、ビデオで示されているようにI2Cスキャナースケッチを実行することで見つけることができます。(ビデオの03:26で)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // 16文字2行表示用にLCDアドレスを0x3Fに設定
最後に、測定単位を制御する変数があります。この値を変更して、距離をミリメートルまたはセンチメートルで表示できます。
const int type = 1; // 1に設定するとミリメートル、2に設定するとセンチメートル
setup()関数では、追加のVCCピンが出力として設定され、センサーに電源を供給するためにHIGHに設定されます。その後、LCDが初期化されます。
loop()関数のメインロジックは、センサーから距離を読み取り、LCDをクリアし、値と単位を表示します。typeが2に設定されている場合、距離はミリメートルからセンチメートルの浮動小数点値に変換され、より正確な読み取りが可能になります。(ビデオの06:47で)
ライブプロジェクトデモンストレーション
デモンストレーションでは、センサーが定規に対してテストされ、その精度が検証されます。ビデオでは、センサーがわずか数ミリメートルの偏差で非常に正確な読み取りを提供することが示されています。(ビデオの08:32で)
センサーには連続測定モードで約1.2メートルの最大範囲があることに注意することが重要です。ターゲットが範囲外の場合、ディスプレイには8190の値が表示されます。(ビデオの09:53で)
もう一つの重要な観察点は、このセンサーが反射率の高い表面では不正確な測定値を示すことがあるということです。光沢のある物体に向けると大きな誤差が生じることがありますが、つや消しの表面に向けると正確な結果が得られます。(動画の10:42時点)
このコードは、配線を変更することなく、異なるVL53L0Xモジュールのバリエーションや、2004モデルなどの大型LCDとも互換性があります。(動画の11:30時点)
ビデオチャプター
- [00:05] VL53L0XとLCDプロジェクトの紹介
- [00:27] VL53L0XとLCDの配線図
- [02:51] 実際のArduinoボードでの詳細な配線
- [03:26] I2Cアドレスのスキャン
- [04:18] コードの説明と設定
- [08:32] 距離測定のライブデモンストレーション
- [09:53] センサーの測定範囲と限界のテスト
- [10:42] 異なる表面での精度
- [11:30] 異なるセンサーモジュールと大型LCDでのテスト
画像
/*
* Lesson 76-1: Using One single VL6180 Laser Distance Sensor with Arduino
* Adafruit code modified for this tutorial
* by Ahmad Shamshiri at 22:22 on
* March 10-11, 2021 in Ajax, ON, Canada
Please watch video instruction of this code: https://youtu.be/_H9D0czQpSI
View code for using two or more VL6180X sensors: https://robojax.com/course1/lecture76
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
If you found this tutorial helpful, please support me so I can continue creating
content like this.
or make a donation using PayPal http://robojax.com/L/?id=64
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. *
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h>
#include "Adafruit_VL6180X.h"
Adafruit_VL6180X vl = Adafruit_VL6180X();
void setup() {
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop() {
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.print(range);
Serial.println("mm");
}
// if(range <=76)
// {
// //do something
// }
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(50);
}
必要かもしれないもの
-
アマゾンAmazonでVL53L0Xを購入するamzn.to
-
イーベイeBayからVL53l0xを購入するebay.us
リソースと参考文献
-
外部Arduinoライブラリ(GitHub)github.com
-
外部eBayからVL53l0xを購入するebay.us
-
外部VL53L0X データシート(PDF)st.com
ファイル📁
フリッツィングファイル
-
Adafruit VL6180X Time of Flight Distance SensorFritzing part for the Adafruit VL6180X Time of Flight distance sensor. This sensor measures absolute distance up to 100mm and ambient light, communicating via I2C. Includes the sensor breakout board and pin connections for use in Fritzing projects.
Adafruit VL6180X Time of Flight Distance Sensor-1.fzpz0.02 MB