中華製、VL53L0Xのモジュールを入手したので、距離を測定する実験を行った。
元にしたソースは、Arduino の物で、ほぼ、そのまま利用させてもらった。
ただ、Arduino のソースは、ヘッダーとソースに分かれており、C++の有意義な部分
を使っていないものが多く、その辺りは、C++流に書き換えた。
たとえば・・
・「define」マクロ関数を使っている。
※C++では、define マクロを使って関数を定義するメリットは全く無いので、一般的
に使う必要性が無い。
※実行速度も改善されないし、「型」の検査や、定義を台無しにしてしまう。
・生の「enum」を使っている、C++では、「enum class」を使う事で、冗長な書き方
や不整合を回避できる。
※部分的には、逆に「冗長」になる場合があるが、「型」安全になるので許容する。
・(定義)ヘッダーと、(実装)ソースを分ける必要性が無い。
※Arduino では、ソースとヘッダーに分かれている。
※ヘッダーに全て書けば、管理や、修正などが簡単で、間違いが少ない。
・VL53L0XはI2Cインターフェースで通信を行うが、元のソースは、I2Cの
標準的なAPI(Cの関数)を呼び出して使っている。
※I2Cのインターフェースクラスは、テンプレートで渡す仕組みにしている。
・「参照」渡しが使われていない。
※わざわざ、ポインターにする必要が無い。
I2Cは電源を入れると、4ピンなので、写真のようなコネクターを使っている。
片側は4ピン、片側は2ピンx2となっており、電源、信号接続の違いを吸収できる。
メイン部分では、I2Cを初期化して、LX53L0Xを初期化する。
※R8C/M120ANでは、ソフトウェアー処理でI2Cを実現している。
距離の測定は、「単発」で行い、0.5秒おきに、コンソールに出力する。
・I2C、VL53L0Xの定義
// I2C ポートの定義クラス // P4_B5 (12): SDA typedef device::PORT<device::PORT4, device::bitpos::B5> sda_port; // P1_B7 (13): SCL typedef device::PORT<device::PORT1, device::bitpos::B7> scl_port; typedef device::iica_io<sda_port, scl_port> iica; iica i2c_; typedef chip::VL53L0X<iica> VLX; VLX vlx_(i2c_);
・初期化
// I2C クラスの初期化 { i2c_.start(iica::speed::fast); } // VL53L0X を開始 if(!vlx_.start()) { utils::format("VL53L0X start fail\n"); } else { // 20ms vlx_.set_measurement_timing_budget(200000); }
・メインループ
++itv; if(itv >= 50) { auto len = vlx_.read_range_single_millimeters(); utils::format("Length: %d\n") % len; itv = 0; }
出力される距離には、50mmオフセットが加算されているようだが、正確だ!