ラベル VL53L0X の投稿を表示しています。 すべての投稿を表示
ラベル VL53L0X の投稿を表示しています。 すべての投稿を表示

2016年12月9日金曜日

ToF型測距センサ VL53L0Xをつかってみる。

ちょうど、仕事で 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間隔で行われるので、
それ以上は待ってやったほうが、いい、ってかんじですね。
観測早いし確実なのはいいなぁ。

超音波はつかいにくいし。