検索コード

レッスン78:VL53L0Xからの距離をLCDに表示する | Arduinoステップバイステップコース

レッスン78:VL53L0Xからの距離をLCDに表示する | Arduinoステップバイステップコース

このガイドでは、VL53L0XタイムオブフライトセンサーとI2Cモジュール付き16x2 LCDディスプレイを使用して、精密なレーザー距離計を構築する方法を説明します。このプロジェクトは、作品に正確な非接触距離測定を追加したいメーカーに最適です。VL53L0Xはレーザーを使用して距離を測定するため、超音波センサーが苦手とする用途、例えばタンクの充填レベルを測定したり、コンベアベルト上の物体の正確な位置を検出したりする場合に理想的です。

このプロジェクトを活用できる実用的な方法をいくつか紹介します:

  • 自動ペットフーダー: 容器内のフードレベルを測定し、補充をトリガーしたり通知を送信します。
  • スマートゴミ箱: ゴミ箱の満杯度を検出し、空にする必要があるときに警告します。
  • DIY高さゲージ: 小さな物体や子供の成長を追跡するための精密な測定ツールを作成します。
  • 駐車アシスタント: ガレージや狭いスペースでの正確な駐車を支援するセンサーシステムを構築します。
  • ロボティクス: ロボットで障害物を検出したり、ナビゲーションのために壁までの距離を測定したりします。
VL53L0x_pin_round_module

必要なハードウェア

  • Arduinoボード(例:Uno)
  • VL53L0Xレーザー距離センサー
  • I2Cモジュール付きLCD 1602ディスプレイ
  • ジャンパーワイヤー

配線ガイド

このプロジェクトの配線は、LCDとセンサーの両方が同じ2本のワイヤーで通信できるI2Cプロトコルのおかげで簡単です。VL53L0Xセンサーには5V電源が必要で、Arduinoの5Vピンから直接供給されます。センサーに安定した電源を確保するために、追加のピンが2番目のVCCとして使用されます。(ビデオの00:27で)

VL53L0X_LCD1602_wiring-3
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-4

以下が接続図です:

Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)

接続は次のとおりです:

  • 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をクリアし、値と単位を表示します。type2に設定されている場合、距離はミリメートルからセンチメートルの浮動小数点値に変換され、より正確な読み取りが可能になります。(ビデオの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でのテスト

画像

VL53L0X 200cm range sensor-black
VL53L0X 200cm range sensor-black
VL53L0X 200cm range sensor-blue
VL53L0X 200cm range sensor-blue
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)
Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)
VL53L0x_pin_module
VL53L0x_pin_module
VL53L0x_pin_round_module
VL53L0x_pin_round_module
VL53L0X_LCD1602_wiring-4
VL53L0X_LCD1602_wiring-4
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-3
VL53L0X_LCD1602_wiring-3
641-Lesson 78: Using a VL53L0X Laser Distance Sensor with an LCD1602 or LCD2004 Display and Arduino
言語: C++
/*
* 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);
}

必要かもしれないもの

リソースと参考文献

ファイル📁

フリッツィングファイル

  • Adafruit VL6180X Time of Flight Distance Sensor
    Fritzing 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.fzpz 0.02 MB