VL53L5CXは、4 × 4または8 × 8ゾーンの測距データを生成できるマルチゾーン測距ToF(Time-of-Flight)センサです。各ゾーンは最大4つのターゲットを検出し、最大4メートルの距離測定が可能です。最大測距周波数は、4 × 4分解能で構成された場合は60Hz、8 × 8分解能で構成された場合は15Hzとなります。このドライバは、カバーガラス使用時のクロストーク補正、低消費電力動作のための物体閾値検出、および動き検出など多くの追加機能をサポートしています。
VL53L5CX用のドライバは2種類あります。ULD APIは、基本的な機能を実現するために必要な3つのファイルのみから構成される、最小限に最適化されたC関数のコレクションです。一方、X-CUBE-TOF1拡張ソフトウェアパッケージには、複数の抽象化レイヤやサンプルアプリケーションが含まれており、X-NUCLEO-53L5A1拡張ボードやVL53L5CS-SATELサテライトボードを使ったプロトタイピングに最適です。X-CUBE-TOF1パッケージは、STM32CubeMXコードコンフィギュレータソフトウェアによく統合されており、UM2853に詳細なスタートアップ手順が記載されています。したがって、この記事ではULD APIに焦点を当て、プロジェクトにドライバを追加するために必要な手作業を説明します。また、最後のセクションでは、上記のアニメーションで示されたサンプルプロジェクトを再現するためのリソースを提供しています。
デバイスの設定
- まだの場合は、STM32CubeIDEプロジェクトを新規に作成します
(File > New > STM32 Project)。MCU/MPUセレクタまたはボードセレクタタブを使用して、ターゲットデバイスを選択します。このチュートリアルでは、NUCLEO-F401RE開発ボードを選択しました。プロジェクト名を付けて、Finishをクリックします。 - Device Configurator Tool(必要に応じて.iocファイルをダブルクリックして起動します)を使用して、VL53L5CXセンサのハードウェアインターフェースを設定します。まず、デバイスのGPIOピンをI2Cインスタンス、外部割り込み信号、およびイネーブル/リセットライン用にピンアウト画面で設定します。今回は、X-NUCLEO-53L5A1拡張ボードのセンターモジュールを使用したため、UM2889の図2に記載されている回路図に基づき設定しました(表1参照)。私の最終的なピン配置は、図1の通りです。
表1. X-NUCLEO-53L5A1拡張ボードのセンターモジュール用GPIO設定表
X-NUCLEO-53L5CX Signal Name | Arduino Pin | NUCLEO-F401RE Pin | Pin Configuration |
---|---|---|---|
I2C_RST_C | D3 | PB3 | GPIO_Output |
LPn_C | D5 | PB4 | GPIO_Output |
PWR_EN_C | A3 | PB0 | GPIO_Output |
INT_C | A2 | PA4 | GPIO_EXTIx |
SCL | D15 | PB8 | I2Cx_SCL |
SDA | D14 | PB9 | I2Cx_SDA |
図1. 表1の信号に対応するピン配置の変化
- 左のComponents Listから、前のステップで設定したSDAとSCLのピンに対応するI2Cペリフェラルを選択します。私のデバイスの場合は、I2C1を選択しました。 Modeパネルで、I2Cの設定のためにドロップダウンリストから「I2C」を選択します。この操作を行うと、ピンアウト画面のSDAとSCLのピンが黄色から緑色に変わることに注意してください。Configurationパネルで、I2C Speed Modeの設定のためドロップダウンリストから「Fast Mode」を選択します。最終的なI2Cの設定は、図2のようになります。
図2. VL53L5CXセンサのI2C設定
- COMPONENTS List から GPIO peripheralを選択し、PWR_EN_CとLPn_C ピンのGPIO出力レベルを 「High」に変更します(図3 参照)。オプションで、設定したピンに対応するユーザーラベルを追加すると、分かりやすくなります。
図3: VL53L5CXセンサのGPIO設定
- NVICタブで、図4に示すように、INT_Cピンに対応するEXTIラインの横にあるボックスにチェックを入れ ます。
図4. VL53L5CXのINT信号に対応する外部割込みを有効にする
- .iocファイルを保存して、プロジェクト用のコードを生成します。
ドライバを追加する
今回もVL53L5CX ULD APIの追加と活用方法について説明します。 X-CUBE-TOF1パッケージを使用したい場合は、UM2853に記載されている手順に従ってください。
- ULD APIをダウンロードし、任意の場所に解凍してください。本稿執筆時点では、バージョン1.3が最新版です。
- STM32CubeIDEで、Project ExplorerのDriversフォルダを右クリックし、Importを選択します。Import Wizardを使用して、GeneralカテゴリからFile Systemを選択します。 Nextをクリックします。
- 「From Directory:」フィールドに ULD ドライバのパスを入力します。
<extraction_location>\en.VL53L5CX_ULD_v1.3.0\VL53L5CX_ULD_driver_1.3.0
.
図5のように、VL53L5CX_ULD_APIディレクトリにあるすべてのリソースを選択します。
Finishをクリックします。
図5. VL53L5CX ULDドライバのインポート
-
Project ExplorerのDrivers/VL53L5CX_ULD_API/incディレクトリを右クリックします。
Add/remove include path…を選択し、OKをクリックします。 -
サンプルのプラットフォームファイルをコピーして、プロジェクトに貼り付けます。
-
コピー
<extraction_location>/en.VL53L5CX_ULD_v1.3.0/VL53L5CX_ULD_driver_1.3.0/CubeIDE_F401RE_Example/Core/Inc/platform.h
をコピーし、Core/Inc
に貼り付けます。 -
コピー
<extraction_location>/en.VL53L5CX_ULD_v1.3.0/VL53L5CX_ULD_driver_1.3.0/CubeIDE_F401RE_Example/Core/Inc/platform.c
をコピーし、Core/Src
に貼り付けます。
ディレクトリ構造に加えられた変更は、以下の図6に示されています。ドライバの使用を開始するには、main.c
ファイルのPrivate includesセクションに#include "vl53l5cx_api.h"
という行を追加してください。これでプロジェクトは正常に構築されます。
図6. プラットフォームファイル
アプリケーション例
冒頭のアニメーションは、8 x 8 NeoPixelマトリックスを使った簡単なアプリケーションの例です。図7にハードウェアのセットアップの静止画を示します。外部5V(2A)電源はNucleo BoardのE5Vに接続され、+5VピンがNeoPixelマトリックスに電力を供給します。PB10ピン(ArduinoヘッダのD6)はNeoPixelの制御信号を供給するため、マトリックスのDINに接続されています。NeoPixel制御信号の生成に関する詳細については、 Controlling NeoPixels with STM32(STM32でNeoPixelを制御する)を参照してください。
図7. アプリケーション写真
Nucleoボードの電源を入れるには、適切なスタートアップ・シーケンスに従わなければなりません!
- JP5がE5Vの位置(ピン2 - 3間)であることを確認してください。
- JP1が取り外されていることを確認してください。
- 外部5V電源を接続し、電源を入れてください。
- LD3がオンになっていることを確認してください。
- ST-LINK USBコネクタ(CN1)にPCを接続してください。
基板を損傷しないようにするため、外部電源を使用する前に、UM1724の6.3項を読むことを強くお勧めします!
このアプリケーションのmain.c
ファイルはGitHub Repositoryで公開されています。なお、printf文は、STM32でprintfを簡単に使うで説明した方法で有効にしています。