こんにちは、nomuraです。
今回はToFの動作確認を行います。
前回は受光回路が動作することを確認しました。
今回は壁センサとは別に搭載した測距センサの動作確認を行います。
使用しているのはストロベリーリナックスさんで購入したVL53L0Xモジュールです。このセンサは赤外線帯域の光を出力し、戻ってくるまでの時間を計って距離を求めることができます。これを3つ、正面・左前方45度・右前方45度にそれぞれ向けて搭載しました。
組み立て中にToF1が2階のマイコンと干渉することがわかったため、前方のものだけ高さを低くしています。前方と斜め経路の複数区間検出ができることを期待しているのですが、はたして?
VL53L0Xは内部レジスタや設定データの意味が非公開なので、メーカーから提供されているソースコードを使って動かす必要があります。個人的にはArduino向けのコードが使いやすかったので、こちらを改造して使用しています。
ところでこのVL53L0XはI2C通信で制御するのですが、複数使用するためにはIDを変更しながらXSHUTピンを使ってモジュールを一つずつ起動していく必要があるトリッキーな仕様になっています。今回は次のような手順で起動しました。
HAL_GPIO_WritePin(TOF2_SHUT_GPIO_Port, TOF2_SHUT_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(TOF3_SHUT_GPIO_Port, TOF3_SHUT_Pin, GPIO_PIN_RESET); HAL_Delay(100); //デバイスをシャットダウンして少しだけ待つ #if 1 //ToF1はXSHUTが未結線なので、電源を切って全部切断するまで初期化に失敗する! VL53L0X_setI2cHandle( i2c_handle ); VL53L0X_init( 1 ); //ToF1 init VL53L0X_setAddress(ADDRESS_1ST,1); //デバイスへToF1用アドレスを設定 #endif XSHUT_INIT( TOF2_SHUT_Pin ); //ToF2のシャットダウン解除 HAL_Delay(300); //起動するまでちょっと待つ VL53L0X_setAddress(ADDRESS_DEFAULT,0); //アドレスをデフォルト向けにする VL53L0X_init( 1 ); //ToF2 init VL53L0X_setAddress(ADDRESS_2ND,1); //デバイスへToF2用のアドレスを設定 XSHUT_INIT( TOF3_SHUT_Pin ); //ToF3のシャットダウン解除 HAL_Delay(300); //起動するまでちょっと待つ VL53L0X_setAddress(ADDRESS_DEFAULT,0); //アドレスをデフォルト向けにする VL53L0X_init( 1 ); //ToF3 init VL53L0X_setAddress(ADDRESS_3RD,1); //デバイスへToF3用のアドレスを設定
少し失敗したのが、ToF1にシャットダウンピンをつけなかったことです。JTAGでデバッグする場合には電源を切らないのでIDが変わったままになり大変面倒…。作り直しする場合は面倒がらずに付けようと思います。
さて、それではどのぐらいの距離が計測できるか迷路に置いて確認してみましょう!まずは前方の最大距離から。
前方の値が変化するのは壁から28cm離れた場所までで、これ以上離れても値が変化しなくなりました。最大で2m弱まで計測できるセンサーなので、これは目論見が外れて悲しい結果になりました。値と物差しの比較では、前後5mm程度ふらつくぐらいで、十分使えそうに思いました。
距離が短い原因としては、おそらくビーム幅が広がって床に反応するようになったというのが可能性として高いです。
近距離もどうか計測してみました。
壁面から8mmまでは近づけてもそれらしい値が出ることを確認しました。この距離でも光の往復時間が計れるって凄いですねぇ…。続いて斜め探査用の距離も確認してみました。こちらは全面より2.5mm高い位置に取り付けてあります。
位置をずらしたりしてみたものの、結果は34cmあたりで反射してしまう結果になりました。2.5mm分高さが上がって距離が延びたのでは??と思います。ならば!というわけで、壁を2枚重ねた上に乗せた計測結果がこちらになります。
50cmまで届くようになりました!
うーん、ここまでやっても向こうまで届かない、苦労して積んだのに、うまみが無くてマズいですね…。高さを上げれば前面でも50cm先が見えるということはわかりましたが、困った結果になりました。再設計カナ…?
結果にはモヤモヤしましたが、とりあえずToFの動作確認もできたので今回はここまで。
次回はモータを回してみましょう。