中華製、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オフセットが加算されているようだが、正確だ!
