コードをコピペして送って。画像がぼやけすぎてるし、スマホで画面を撮ったやつで、スクショですらないし……
あと、線はどうつないだのか、ちゃんと全部説明して。
(この投稿は作成者によって削除されました)
まず明らかな間違いを1つ修正しましょう。あなたが使っているのは VL53L1X_... という ULD API で、VL53L1X_SetDistanceMode() の引数は 1=Short、2=Long だけであり、3 はありません。長距離モードを設定したい場合は、次のように書きます:
status = VL53L1X_SetDistanceMode(dev, 2);
また、5633 は必ずしもセンサーが「固まっている」ことを意味するわけではありません。あなたのコードは距離が 4000 未満かどうかだけを判定していて、RangeStatus を読んでいません。ターゲットがない場合、反射信号が弱すぎる場合、または測定が無効な場合でも、距離レジスタには同様に数値が入ることがあり、その数値をそのまま実際の距離として使うことはできません。
まずはキャリブレーションや再起動といったロジックを追加せず、フレームごとに次の項目をすべて出力することをおすすめします:
CheckForDataReady()の戻り値とdataReadyGetDistance()の戻り値GetRangeStatus()の結果- 生の
dist
RangeStatus==0 のときだけ距離を使用し、0 以外なら無効な測定として扱ってください。また、SetDistanceMode()、StartRanging()、ClearInterrupt() の戻り値は現在すべて捨てられています。まずは項目ごとに出力すれば、引数、I2C 通信、測定状態のどこに問題があるのかをほぼ特定できるはずです。
このコードは問題を必要以上に複雑にしている。VL53L1X は起動後、連続測距を行うのであって、異常値を読むたびに StartRanging() をやり直す必要はないし、ましてや「300回連続で起動してキャリブレーションの終了を補助する」なんていう標準手順も存在しない。まず caliCount と、その長ったらしい再起動ロジックは削除しよう。
現時点で、少なくとも2つの明確な問題がある:
-
ULD の長距離モードは
SetDistanceMode(dev, 2)で、3 ではない。 -
distだけを見てRangeStatusを見ていないので、5633 が有効な測定値なのか無効な結果なのか、コード自身も判別できていない。
もう1点:OLED は dataReady が 1 のときだけ更新される。その後 dataReady がずっと 0 のままだと、画面は当然古い値のまま止まり、「死んだ」ように見える。dataReady と各関数の戻り値も表示すれば、「新しいデータがない」のか「ずっと無効な距離を取得している」のかを区別できる。
最小の流れは、初期化を1回 → 起動を1回 → ready を待つ → RangeStatus と Distance を読む → ClearInterrupt → 次のフレームを待つ、でよいはず。まずこれで動作させてから、フィルタリングやキャリブレーションの話をしよう。
ファームウェアをさらに変更する前に、モジュールを既知の正常なベンチ環境に置くといいでしょう。配線は短くし、約300~500 mm先に固定した白いターゲットを置き、明るい日光を避け、光学系には何も覆いをかけません。センサーに保護フィルムがまだ付いているなら、剥がしてください。
次に、この順番でハードウェアを確認します。
-
センサーIDを読み取ります。VL53L1X ULD APIでは
0xEACCであるはずです。一般的なVL53LXX-V2ボードの刻印からチップを推測しないでください。 -
16ビットレジスタ読み出し中にSDAとSCLをオシロスコープで確認します。レジスタアドレスのバイト順、データのバイト順、ACK、リピーテッドスタート条件を確認してください。初期化の成功は、すべてのマルチバイト転送が正しいことを必ずしも証明しません。
-
センサーがアイドル状態のときだけでなく、レンジング中のモジュールでの電源を確認します。
-
その後で初めてXSHUTを確認します。これらのブレイクアウトボードの多くではすでにプルアップされており、
CheckForDataReady()をポーリングする場合、GPIO1は不要です。
そして、SetDistanceMode(dev, 3)も修正してください。このULD APIでは、Longモードは2です。距離と一緒にRangeStatusを出力してください。そうしないと、意味のない5633が、フリーズしたセンサーとまったく同じに見えることがあります。



