VL53L0Xを使ったR8C(100円マイコンM120AN)による距離測定

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

VL53L0X.hpp

VL53L0X R8C/M120AN サンプル