ちょうど、仕事で STマイクロの ToF型測距センサ VL53L0Xをつかう機会が
あったので、その報告をば。
昨年ETのときかな?にSTマイクロのブースでみつけて
いいなー、と思っていたデバイスなんで、
ことしのET Westで、これのNUCLEO Packをもらってきたん。
たしかに、応答性がよくて、取り回しも便利。
自分で実装できるパッケージじゃないのと、内部用に2.8Vが必要という
めんどくささ、も我慢できるかなーー、というのはあったんだけど
問題は、I2Cデバイスであるにも関わらず、利用するための
内部のアドレス情報がまーーーったく開示されておらず
STM32のNUCLEO用のサンプルから自分用にポーティングしないとどうしようもない
というイケてないデバイスで、つかうのを躊躇してたんですよね。
今年のETで、STの担当者にこの件、きいてみたら
『これの前のデバイスで、アドレス情報など、サポートにじゃんじゃん質問がきたから
データシートへの記載、やめてるんですよねー』
とか。
それ、あかんやろ(>_<)
で、躊躇してたんだけど、Pololuで、このデバイスボードを発見!
https://www.pololu.com/product/2490
しかも、だいぶ簡素化された状態で、Arduino用のライブラリもgitに上がっているという
なんとまぁ、うれしい状態。
で、これをPSoCでつかいたいので、これをCの形式に変換しなおしてつかってみた。
PSoCもGCCをつかっているので、本来C++が使えるはずなんだけど
現状ではCオンリーなので、しかたない。
ソースはここ。
VL53L0X.C
VL53L0X.H
[<====ソース抜粋====>]
[<==== ここまで ====>]
VL53L0Xの先頭部でI2Cへのアクセス関数部を別名定義してる。
PSoCの場合 PSoC5やPSoC4で、I2Cへのアクセス関数名がそれなりに変化しちゃって
固定してると、結構めんどくさい感じになりやすいので
VL53L0XでつかうI2Cの関数を、指定できるようにしてみた。
ほんとはClassがつかえれば、いいだろうし、Cであっても
関数ポインタつかえばできるのも理解してるけど、
なんとなく可読性がおちちゃうのが気になって、こういうベタなやり方にしてみた。
あと、タイムアウトを判定するために外部で
uint32_t timeout_start_ms ; // 経過時間の観測変数
を減算してやる必要があります。
main.cなどでタイマーを利用してるソースの先頭に
extern uint32_t timeout_start_ms ;
を定義して、1msのタイマーの中で
if ( timeout_start_ms ) timeout_start_ms--;
としてください。
[<====ソースサンプル====>]
[<==== ここまで ====>]
みたいなかんじかな。
標準状態だとサンプルが30ms間隔で行われるので、
それ以上は待ってやったほうが、いい、ってかんじですね。
観測早いし確実なのはいいなぁ。
超音波はつかいにくいし。