ST マルチゾーン対応ToF測距センサ VL53L5CX/VL53L7CX

ST のマルチゾーン対応ToF測距センサを使ってみたので、覚え書きとして情報リンクなどをメモしておきました。サンプルアプリケーションの説明などを追加するかも。

VL53L5CX/VL53L7CXは、STのFlightSense製品ファミリを拡充する最新のマルチゾーン対応ToF（Time-of-Flight）測距センサです。メーカーのサイトからの引用で特徴を記載します。各種ドキュメントや開発キットを含む製品情報へのリンクもあります。新製品の VL53L8CX は VL53L5CX に SPI IF を追加したような仕様ですが、そちらについては未調査です。

* [VL53L5CX](https://www.st.com/ja/imaging-and-photonics-solutions/vl53l5cx.html)
* [VL53L7CX](https://www.st.com/ja/imaging-and-photonics-solutions/vl53l7cx.html) (広角90°)
* [VL53L8CX](https://www.st.com/ja/imaging-and-photonics-solutions/vl53l8cx.html) (SPI 対応)

特徴

* 高速かつ正確なマルチゾーン対応測距センサ  
  - 60°x60°の正方形の視野角（FoV）（対角90°）- VL53L7CX の場合。VL53L5CX は対角63°
  - 4x4または8x8の個別ゾーンに対応するマルチゾーン測距出力
  - ホスト･ウェイクアップ用の割り込みプログラム可能な閾値を持つ自律型低消費電力モード
  - 最大400cmの測距 - VL53L5X の場合。VL53L7CX では350cmまで
  - ゾーンごとに複数の対象物の検出･測距が可能
  - 60Hzフレーム･レート対応 - 4x4ゾーンの場合。8x8ゾーンでは15Hz
  - ヒストグラム処理とアルゴリズムによる補正で、カバー･ガラスのクロストークの影響を解消または最小化
  - 対象物の動きの有無と程度を表示するモーション・インジケータ機能（各ゾーン）
* 広いFoVを持つ完全一体型の小型モジュール  
  - エミッタ： 940nmの可視域外レーザVCSELと内蔵アナログ･ドライバ
  - トランスミッタとレシーバの両方にDOEを使用した対角63°の正方形FoV
  - SPADの受光アレイ
  - 低消費電力マイクロコントローラによるファームウェア実行
  - サイズ： 6.4mm x 3.0mm x 1.5mm
* 簡単に実装可能
  - リフロー対応
  - 柔軟な電源オプション： 3.3Vまたは2.8Vの単一電源、あるいは3.3Vまたは2.8V AVDDと1.8V IOVDDの組合せ
  - さまざまなカバー･ガラス素材に対応

VL53L5CX/VL53L7CX の違いは測距範囲の画角にあります。つまり光学系のみの違いでコアは同一であるようです(未確認情報)。デバイスとホストは i2c で通信しますが、内部にマイクロコントローラが使われており初期設定時にホストからファームウェア(VL53L\*CX\_FIRMWARE)、デフォルト設定(VL53L\*CX\_DEFAULT\_CONFIGURATION)、デフォルトクロストーク(VL53L\*CX\_DEFAULT\_XTALK)などの情報を送り込む必要があります。これらについての仕様は公開されていません。VL53L5CX/VL53L7CX で内容は異なるものの、VL53L5CX 用のコードを VL53L7CX に使ってもそれなりに動きます。ST が公開しているソフトウェアはデバイス毎に別になっていても上記のファームウェア関連以外は基本的には同じなようです。設定や条件コンパイルで適応できそうですし、ほとんどのドキュメントも同様です。

センサを使用するための API の詳細はユーザーズマニュアル(UM2884/UM3038)には記載されておらず、サンプルコードを見てねというスタンスのようです。以前のVL53L0Xでもレジスタ仕様は非公開でした。ホスト側のコードはULD(Ultra Lite Driver)モジュールとして提供されていて、ユーザアプリケーションではこれを介してセンサと通信します。基本的な API の他に Detection thresholds (閾値を設定しての物体検出)、Motion indicator (動体検出)、Xtalk (クロストーク校正)のためのプラグインライブラリが用意されています。これらについては製品のユーザーズマニュアルとコードを参照してください。

## ブレークアウトボード

**ST製品**

* [ST VL53L5CX-SATEL](https://www.st.com/ja/evaluation-tools/vl53l5cx-satel.html)
* [ST P-NUCLEO-53L5A1](https://www.st.com/ja/evaluation-tools/p-nucleo-53l5a1.html)
* [ST VL53L7CX-SATEL](https://www.st.com/ja/evaluation-tools/satel-vl53l7cx.html)
* [ST P-NUCLEO-53L7A1](https://www.st.com/ja/evaluation-tools/p-nucleo-53l7a1.html)
* [ST VL53L8CX-SATEL](https://www.st.com/en/evaluation-tools/satel-vl53l8.html)
* [ST P-NUCLEO-53L8A1](https://www.st.com/ja/evaluation-tools/p-nucleo-53l8a1.html)

**ST以外の製品**

* [SparkFun Qwiic ToF Image - VL53L5CX(SEN-18642)](https://www.sparkfun.com/products/18642)
* [SparkFun Qwiic Mini ToF Imager - VL53L5CX(SED-19014)](https://www.sparkfun.com/products/19013)
* [Pololu VL53L5CX Time-of-Flight 8×8-Zone Distance Sensor Carrier](https://www.pololu.com/product/3417)
* [Pimoroni VL53L5CX 8x8 Time of Flight (ToF) Array Sensor Breakout](https://shop.pimoroni.com/products/vl53l5cx-time-of-flight-tof-sensor-breakout?variant=39972903059539)

広角である必要はなくとりあえず使ってみたいというのであれば VL53L5CX を勧めます。これはサンプルやドキュメントが他よりも充実しているためです。私が使用したのは SATEL-VL53L7CX で、ST 社からの直接購入です。DigiKey や Mouser などで 3,000円くらいであります。SATEL-VL53L5CX より少しばかり安かったです。これは2個セットになっていて、SparkFun の VL53L5CX だとひとつでそのくらいしますから割安ですね。

SATEL-VL53L5CX が SparkFun のものと異なるのは、センサの他に AVDD のための電圧レギュレータが搭載されていて IOVDD と別になっていて、これによりIOVDDを1.8Vなどのロジック電圧で使用することができます。利用時には EVK\_PWR\_EN 端子を High にすることで VL53L7CX に AVDD が供給されます。i2c の制御線はプルアップされており、不要時には半田ブリッジを除去します。LPn、INT、I2C_RST はそれぞれプルアップ/ダウンされていて、そのままで動作可能状態になっています。

STの評価キットには NUCLEO の拡張ボードである [X-NULEO-53L5A1](https://www.st.com/ja/evaluation-tools/x-nucleo-53l5a1.html)/[P-NUCLEO-53L5A1](https://www.st.com/ja/evaluation-tools/p-nucleo-53l5a1.html) があります。ST 純正のソフトウェアをフルに使うにはこれを選択するのが良いでしょう。P- のほうは NUCLEO-F401RE とのセットで、VL53L7CX でも同様の製品があります。拡張ボードには VL53L5CX がひとつ搭載されていて SATEL-VL53L5CX を組み合わせて計3個を搭載できます。なお、ST のドキュメント中で Arduino 向けの SATEL-VL53L5CX と NUCLEO ボードのピンアサインと X-NUCLEO のそれは異なっているので注意しましょう。

## ソフトウェア

* [STSW-IMG023 Ultra Lite Driver (ULD) for VL53L5CX multi-zone sensor](https://www.st.com/ja/embedded-software/stsw-img023.html)
* [STSW-IMG036 Ultra lite driver (ULD) API for the VL53L7CX Time-of-Flight 8x8 multizone ranging sensor with 90 degrees FoV](https://www.st.com/ja/embedded-software/stsw-img036.html)

**Arduino(STM32duino)**

* https://github.com/stm32duino/VL53L5CX
* https://github.com/stm32duino/VL53L7CX

上記のコードは STM32 マイコンの Arduino 環境 STM32duino 用のもので、その他のサンプルも基本的には同社の評価ボード STM32 Nucleo F401RE を用いることが想定されています。他の Nucleo ボードでも使えるようですが未確認です。サンプルアプリケーションは VL53L5CX のほうが豊富で、これらも基本的には VL53L7CX でも動きます。

RP2040(Raspberry pi pico)でも動作しましたが、ESP32 では動きませんでした。これはマルチバイトの i2c write(read) が ESP32 では期待通りに動かないようで、センサデバイス初期設定時のファームウェア送り込みに失敗します。下に挙げた Sparkfun のコードなどでは 1バイト毎の write(read) になっていて ESP32 でも動作しました。

**Linux**

* [STSW-IMG025 - Linux driver for VL53L5CX multi-zone sensor](https://www.st.com/ja/embedded-software/stsw-img025.html)
* [STSW-IMG038 - Linux driver for the VL53L7CX Time-of-Flight 8x8 multizone ranging sensor with 90 degrees FoV](https://www.st.com/ja/embedded-software/stsw-img038.html)

Raspberry pi で使用できます。デバイスドライバとULD、サンプルアプリケーションが含まれています。閾値による物体検出、動体検出のサンプルでは割込みピンの接続が必要です。

**STM32Cube**

* [X-CUBE-TOF1 - Time-of-Flight sensors software expansion for STM32Cube](https://www.st.com/ja/ecosystems/x-cube-tof1.html)

**その他**

他に Windows 用の GUI アプリケーションなどがあります。これらは P(X)-NUCLEO 用のものでコンパイル済の NUCLEO 用のソフトウエアも Windows アプリから送り込みます。VL53L7CX 向けに用意されていなくとも VL53L5CX のものが使えたりもします。Windows 側アプリケーションのソースコードは公開されていません。センサを搭載した NUCLEO ボードとは UART で通信されています。

* [STSW-IMG024 - GUI for VL53L5CX expansion boards](https://www.st.com/ja/embedded-software/stsw-img024.html "STSW-IMG024")
* [STSW-IMG035 - VL53L5CXマルチゾーン対応ToF（Time‑of‑Flight）測距センサに基づいたターンキー･ジェスチャ認識ソリューション](https://www.st.com/ja/embedded-software/stsw-img035.html)  
* [STSW-IMG039 - Liquid Level Monitoring Code Example using Time-of-Flight sensors](https://www.st.com/ja/embedded-software/stsw-img039.html)
* [STSW-IMG037 - P-NUCLEO-53L7A1 pack graphical user interface (GUI)](https://www.st.com/ja/embedded-software/stsw-img037.html "STSW-IMG037")

## サードパーティのソフトウェア

[github](https://github.com/) などからいくつか取り上げました。これらは基本的に ST 社の提供しているコードをベースにしています。ほぼ全て VL53L5CX 用となっていますが、そのまま VL53L7CX でも動くようです。できれば前述のデバイス用ファームウェアなどを入れ替えて使うのが良いでしょう。

* [SparkFun Qwiic Time-of-Flight Sensor VL53L5CX Arduino Library](https://github.com/sparkfun/SparkFun_VL53L5CX_Arduino_Library)  
SparkFun が出しているブレークアウトボード[Qwiic ToF Image - VL53L5CX(SEN-18642)](https://www.sparkfun.com/products/18642)および[Qwiic Mini ToF Imager - VL53L5CX(SED-19014)](https://www.sparkfun.com/products/19013)をターゲットにしたもので Arduino 環境用。
* [VL53L5CX CTypes Python Wrapper](https://github.com/pimoroni/vl53l5cx-python)  
Pimoroni による Python IF パッケージ。Raspberry pi 用。
* [VL53L5CX MicroPython and CircuitPython Package](https://github.com/mp-extras/vl53l5cx)  
MicroPython/CircuitPython 用パッケージ
* [Pimoroni Pico Libraries and Examples](https://github.com/pimoroni/pimoroni-pico)  
RP2040 (Raspberry pi pico)用 C/C++ と MicroPython ライブラリ
* [VL53L5CX ROS 2 Driver for Linux](https://github.com/skhbk/vl53l5cx_ros2)  
Raspberry Pi 用の ROS 2 ドライバ
* [3D 8x8 TOF viewer for M5Stack](https://github.com/dankelley2/M5Stack_VL53L5CX_3D_Viewer)  
上記 SparkFun のライブラリを使用した M5Stack でリアルタイム 3D 表示アプリケーション。デフォルトでメッシュ表示(drawMesh)で、コメントアウトを参考にブロック表示(draw3dPoints)に変更もできます。



![TOF-03.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45347/5a30544d-2b23-a676-fed1-00c4dd836a1a.jpeg)

![TOF-01.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45347/c3343e94-a12d-2bbd-ce3b-33be4afe4366.jpeg)

![TOF-02.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45347/e76335a8-240e-2f40-be6d-bd503880b60d.jpeg)