🌏

電子工作 その22(ToF式距離センサー:VL53L0Xの使い方)

2024/02/16に公開

こんにちは、Ideagearの鈴木陽介です。

前回は、アナログ出力の赤外線測距センサー(GP2Y0A02YK0F)を試しました。
https://zenn.dev/suzuky/articles/6dc6034ec8dc21

ただ、これだと送信部と受信部の目ん玉がやや大きいため、デジペに内蔵するなど、小型化には不利です。

とういうことで、デジタル出力も試したいという観点と、別の赤外線センサーも扱っておきたいという観点から、今回は、共立プロダクツ製のToF式距離センサー(VL53L0X)を試してみました。

はじめに

距離センサーや測距センサーで調べると、ToFという単語がよく出てきます。

ToFは「Time of Flight」の略ですが、何の飛行時間かというと、赤外線レーザーの光が対象物に当たり、それが返ってくるまでの時間で、それを計測することで対象物までの距離を検出します。


ともかく、前回は赤外線式の測距センサーを扱うのは初めてだったため、サイズは意識せずに文献の多さだけでアナログ出力の「GP2Y0A02YK」を選びました。そこで、今回は、デジタル出力で、小型でかつ文献も多いセンサーということで、共立プロダクツ製のToF式距離センサー「VL53L0X」を選び、共立エレショップの下記リンクから発注しました。
https://eleshop.jp/shop/g/g402721/

参考記事

https://blog.hrendoh.com/how-to-use-vl53l0x-with-esp32-arduino/

配線

ブレッドボード図は上記参考記事をご覧ください。

共立プロダクツ製のVL53L0Xは配線が6本ありますが、I2Cの4本だけ(XSHUTとGPIO1は未使用)で使用可能です。

Arduino Uno VL53L0X
5V 1番ピン / 赤色 / VDD
SCL 2番ピン / 黄色 / SCL
SDA 3番ピン / 白色 / SDA
GND 4番ピン / 黒色 / GND
- 5番ピン / 茶色 / XSHUT
- 6番ピン / 橙色 / GPIO1

ライブラリー

スケッチ > ライブラリーをインクルード > ライブラリーを管理 > ライブラリマネージャ
から、「VL53L0X by Pololu」というライブラリー(最新Ver:1.3.1)をインクルードしてください。

ライブラリマネージャの検索窓で、「VL53L0X」と入力すると、「Adafruit_VL53L0X by adafruit」をはじめ、他の「VL53L0X」が数多く出てきます。お目当ての「VL53L0X by Pololu」は、かなり下の方にスクロールしないと出てこないのでご注意ください。

実際、私も間違えて別のをインクルードしてしまいました(笑)。

ソースコード

今回は動作テストが目的ですので、スケッチはサンプルスケッチをそのまま使いましょう。

ファイル > スケッチ例 > VL53LOX > Continuous / Single

サンプルスケッチは、「Continuous」と「Single」の2つ用意されています。
どちらも試しましたが、正直、単なる動作テストレベルでは違いがわかりませんでした(笑)。

念のために、「Continuous」のスケッチをそのまま記載します。

/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

  // Start continuous back-to-back mode (take readings as
  // fast as possible).  To use continuous timed mode
  // instead, provide a desired inter-measurement period in
  // ms (e.g. sensor.startContinuous(100)).
  sensor.startContinuous();
}

void loop()
{
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();
}

動作テスト

Arduino IDEのシリアルモニタ(前半)とシリアルプロッタ(後半)の両方で値を確認しました。
https://twitter.com/Ideaport_Suzuky/status/1758318671628489195

特に、シリアルプロッタで見ると顕著ですが、対象物を検出していない時の値が細かくブレています。

原因は不明ですし、気持ちの良い出力ではありませんが、ブレている時間が短いことと、検出中のブレは無さそうなので、たとえハード的に解決できなくても、ソフト上で工夫(一瞬ではなく、一定時間連続して検出したら反応させるなど)すれば何とかなると勝手に思っています(笑)。

細かなことは、実際にデジペに組み込む時に考えることにします。

まとめ

いかがでしたでしょうか?

今回のVL53L0Xも前回のGP2Y0A02YK0Fと同じく、所感としては使えそうと感じましたが、同時に、これも最終的にはぬいぐるみの中に実装して、実際に屋外で使用してみないと判断できませんね。

また、今回は「XSHUT」と「GPIO0」の2つのピンは配線しませんでしたが、下記記事を見る限りでは、XSHUTを使うことで、センサーをスタンバイ状態にできたりと、より実用的な使い方もできそうです。
https://www.note.suzakugiken.jp/?p=173

では、次回は赤外線測距センサーを実際にデジペに組みこんでテストしてみたいと思います。

それではまた!

Discussion