STM32CUBEMX ベースの TOF モジュール VL53l0x を駆動----3. 複数の VL53L0X を駆動
概要
この章では、距離測定のために複数の VL53L0X センサーを同時に駆動する方法を説明します。複数のセンサー間の通信と制御を効果的に管理して、正確な距離測定を同時に行えるようにする方法について説明します。この章を学習すると、複数の VL53L0X センサーを活用して、より包括的な環境認識機能をアプリケーションに提供する方法を理解できるようになります。
現在 ST コースを受講中です。サンプルが必要な場合は、グループに参加して申請してください: 615061293。
ビデオ教育
https://www.bilibili.com/video/BV1wN4y1X7aw/
STM32CUBEMX に基づくドライブ TOF モジュール VL53l0x(3) ---- 複数の VL53L0X をドライブ
サンプルアプリケーション
https://www.wjx.top/vm/OhcKxJk.aspx#
ソースコードのダウンロード
https://download.csdn.net/download/qq_24312945/88332775
デバイスアドレスを変更する
VL53L0X は通信に I²C バスを使用します。デフォルトでは、VL53L0X の 7 ビット アドレスは 0x29 です。ただし、アドレスの競合を回避し、複数のセンサーが同じ I2C バスを共有できるようにするために、ユーザーはカスタム 7 ビット アドレスをレジスタ I2C_SLAVE_DEVICE_ADDRESS (レジスタ アドレス 0x8A) に書き込むことでセンサーのアドレスを変更できます。
修正版は以下の通りです。
// Public Methods //
void VL53L0X_setAddress(uint8_t add,uint8_t new_addr)
{
VL53L0X_WriteByte(add,I2C_SLAVE_DEVICE_ADDRESS, new_addr & 0x7F);
}
VL53L0X.h ファイルには、VL53L0X センサーの関連定義と構成が含まれています。
VL53L0X.h ファイルでは、それぞれ異なるセンサーを表す 2 つのデバイスのアドレス定数を定義できます。たとえば、次を使用してアドレス定数を定義できます。
#define VL53L0X_DEFAULT_I2C_ADDR1 0x29 ///< The fixed I2C addres
#define VL53L0X_DEFAULT_I2C_ADDR2 0x30 ///< The fixed I2C addres
上の例は、異なるセンサーを表す 2 つのデバイス アドレス定数の定義を示しています。実際に使用するセンサーの数と構成のニーズに基づいて、デバイス アドレス定数の定義を増減できます。
コードでは、これらのデバイス アドレス定数を使用して、さまざまなセンサーのアドレスを指定できます。たとえば、最初のセンサーのアドレスを使用する場合は、VL53L0X_DEFAULT_I2C_ADDR1 を使用してそのアドレスを表すことができます。これらのアドレス定数は、センサーの物理的な接続と構成にマッピングする必要があることに注意してください。適切な通信と動作を保証するために、必ず正しいアドレス定数を適切なセンサーに割り当ててください。
アドレス定数を定義するときは、VL53L0X センサーのデータシートと関連ドキュメントを参照して、センサーのアドレスと構成の詳細を確認することをお勧めします。
ここでのアドレス値は、実際のニーズとハードウェアの接続条件に基づいて選択され、各デバイスが確実に一意のアドレスを持つことが非常に重要です。定義されたデバイス アドレス定数を使用することで、複数の VL53L0X センサーを簡単に管理および操作できます。各センサーに一意のデバイス アドレス定数を割り当てることで、コード内でこれらの定数を使用して、各センサーに対応するアドレスを指定できます。このようにして、さまざまなセンサーを簡単に区別し、各センサーを通信して操作するために適切なコマンドと設定を送信することができます。定義されたデバイス アドレス定数を使用すると、各センサーのアドレスを手動で追跡して設定する必要がなく、複数のセンサーを簡単に管理および操作できます。これにより、特に複数の VL53L0X センサーを同時に使用する必要があるアプリケーションに利便性と柔軟性が提供されます。
VL53L0Xの設定
対応するデモボードのピン配置は以下の通りです。
以下のコードでは、複数の VL53L0X センサーを初期化および構成するプロセスが示されています。各センサーは異なるピンを介してマザーボードに接続されており、GPIO ピンのレベルを制御することによって、対応するセンサーが動作用に選択されます。
コードの詳細な説明は次のとおりです。
- まず、GPIO ピンのレベルを制御して、対応するピンを RESET 状態に設定し、対応するセンサーの初期化の準備をします。具体的には、各センサーは 2 つの GPIO ピン (チップ セレクト) を制御することによって RESET 状態に設定されます。
- 次に、GPIO ピンのレベルを制御することにより、対応するピンが SET 状態に設定され、動作する対応するセンサーが選択されます。各センサーについて、2 つの GPIO ピン (チップ セレクト) を制御してセンサーを SET 状態に設定します。
- 安定したピン状態の切り替えを保証するために、センサーが切り替わるたびに遅延が追加されます。この遅延の長さは、実際のニーズに応じて調整できます。
各センサーに対して次の操作を実行します:
a. VL53L0X_Init 関数を使用してセンサーのアドレスをパラメーターとして渡し、センサーを初期化します。
b. VL53L0X_setAddress 関数を使用してセンサー アドレスを変更し、ソース アドレスとして VL53L0X_DEFAULT_I2C_ADDR2 を使用します。
コードを通じて、複数の VL53L0X センサーを初期化および構成でき、必要に応じて異なるセンサーを選択して動作させることができます。上記のコード例は参照のみを目的としており、独自のハードウェア接続とニーズに応じて変更および調整する必要があることに注意してください。センサーの初期化、構成、操作の詳細については、VL53L0X センサーのマニュアルとデータシートを必ず参照してください。
/* USER CODE BEGIN 2 */
// 启动第一个VL53L0X传感器并关闭第二个VL53L0X传感器
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
// 等待200ms以确保第一个VL53L0X传感器启动完成
HAL_Delay(200);
// 使用默认地址初始化第一个VL53L0X传感器
if (!VL53L0X_Init(VL53L0X_DEFAULT_I2C_ADDR1, true))
{
printf("Failed to detect and initialize sensor!");
while (1) {
} // 如果初始化失败,则无限循环
}
// 修改第一个VL53L0X的I2C地址,以便我们可以与第二个VL53L0X传感器通信
VL53L0X_setAddress(VL53L0X_DEFAULT_I2C_ADDR1, VL53L0X_DEFAULT_I2C_ADDR2);
// 启动第二个VL53L0X传感器
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
HAL_Delay(200); // 等待200ms以确保第二个VL53L0X传感器启动完成
// 使用之前的默认地址初始化第二个VL53L0X传感器
if (!VL53L0X_Init(VL53L0X_DEFAULT_I2C_ADDR1, true))
{
printf("Failed to detect and initialize sensor!");
while (1) {
} // 如果初始化失败,则无限循环
}
/* USER CODE END 2 */
メインプログラム
コードでは、メイン プログラムのループで 2 つの VL53L0X センサーのデータを読み取る方法が示されています。コードの詳細な説明は次のとおりです。
- メインプログラムの while ループでは、まず VL53L0X_readRangeSingleMillimeters 関数を使用して VL53L0X センサー 2 (デバイスアドレスは VL53L0X_DEFAULT_I2C_ADDR2) から距離データを読み取り、次に printf 関数を使用して距離値を出力します。
- その後、0.5 秒待ちます。
- 次に、VL53L0X_readRangeSingleMillimeters 関数を使用して VL53L0X センサー 1 (デバイスアドレスは VL53L0X_DEFAULT_I2C_ADDR1) から距離データを読み取り、printf 関数を使用して距離値を出力します。
- その後、0.5 秒待ちます。
コード例は参照のみを目的としており、実際のハードウェア構成、VL53L0X ライブラリ、およびアプリケーションの要件に応じて変更および調整する必要があることに注意してください。データの読み取りと解釈の詳細については、VL53L0X センサーのドキュメントとデータシートを必ず参照してください。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// 从第二个VL53L0X传感器读取距离值(单位:毫米)
L = VL53L0X_readRangeSingleMillimeters(VL53L0X_DEFAULT_I2C_ADDR2);
printf("L=%d", L); // 打印从第二个VL53L0X传感器读取的距离值
HAL_Delay(500); // 延迟500ms(0.5秒)
// 从第一个VL53L0X传感器读取距离值(单位:毫米)
R = VL53L0X_readRangeSingleMillimeters(VL53L0X_DEFAULT_I2C_ADDR1);
printf("R=%d", R); // 打印从第一个VL53L0X传感器读取的距离值
HAL_Delay(500); // 延迟500ms(0.5秒)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
試験結果
テスト距離の結果を以下に示します。