M5Stackで始めるセンサ・インターフェーシング (1) 次世代距離センサVL53L1X

 ESP32マイコンを内蔵したM5Stackにはいろいろなモデルがあります。ここではBasicモデルを利用します。マイコン以外に、320 x 240 TFTカラーLCDディスプレイ、マイクロSDメモリのスロット、スピーカ/アンプ、電池を内蔵しています。USB Type-Cケーブルが付属していて、電源の供給と、PCとの通信に使われます。

 M5Stackで使われているマイコンESP32は32ビットで、Arduino UNOの8ビット・マイコンATMega328に比べると、高速に演算ができます。例えば、スイッチサイエンスでは、Arduinou UNOは3,240 円で、M5Stack Basicは4050円なので、少し高価ですが、LCDディスプレイやWi-Fi機能を含むことを考慮するとコスト・パフォーマンスは高いです。

 8ビット・マイコンで実数の演算は大変時間がかかります。メモリも必要です。ESP32は浮動小数点演算を内蔵し、クロックは160もしくは240MHzと高速なので、実数の演算速度は高速に実行されます。

 M5Stackは、いくつかの開発ツールがありますが、ここでは、Arduino IDEを利用します。インストールはメーカのサイト「M5Core クイックスタート - Arduino Win」に、日本語で詳しく掲載されています。ESP32なので、「ESP32入門 通信機能が標準搭載されたマイコン・ボード (1) 準備」にも同様のインストール方法が解説してあります。

 ボードマネージャで検索欄に「esp32」と入れ、esp32 bye Espressif Systems version 1.0.2をインストールします。


 ライブラリ管理からライブラリマネージャを起動し、検索欄に「m5stack」と入れ、M5Stack by M5Stack version  0.2.5をインストールします。

 ボードマネージャでM5Stack-Core-ESP32を選びます。シリアルポートは、画面に出たCOM番号を選びます。

ToFという測定方法が主流に

 Arduino UNOの利用が始まった時代、シャープの赤外線を使った距離センサを利用する事例が多く紹介されました。反射してきた光の強度が距離に比例しているという原理で距離を測ります。

 超音波センサはロボットの目のような感じでアピールできるので、電子工作ではよく使われています。ToF(Time of Flight)のセンサですが、比較的ゆっくりした動きに対応します。

 より正確に距離を測るために、日光の当たる場所でも実用になる光を使ったToF方式が実用になっています。

<左からVL53L0X、TFmini、LIDAR-Lite v3HP>

ToF方式のセンサ

 このWebサイトで扱ったことのあるToF方式のセンサです。

型名 VL6180X VL53L0X VL53L1X RFD77402 TFmini LIDAR-Lite v3HP
測定距離[m] 0.6 2 4 2 12 40
記事 ラズパイ  ラズパイ Arduino Arduino MKR ZERO Spresense Arduino Arduino

M5StackでVL53L1Xライブラリを利用

 上記のToF方式 距離センサの中でも新しいVL53L1Xは最長4m、分解能1mmと優れた性能をもち、大変小型です。製造元のSTMicroelectronicsはすべてのレジスタの仕様を公開していませんが、APIとサンプル・プログラムはダウンロードできます。ブレークアウト・ボードを作成している会社は、そのライブラリをそのまま利用しArduinoで利用しやすいようにAPIを追加したり、全面的にArduino用のライブラリに書き換えた会社など対応は様々です。

 ここでは、X-NUCLEO-53L1A1ボードを利用し、Pololuのライブラリを利用します。インターフェースはI2Cです。

 ライブラリ管理からVL53L1Xで検索して出てくる「VL53L1X by Pololu」をインストールします。

 スケッチ例->VL53L1X->Continousを選択して、コンパイル、実行します。机の上から天井までの距離を表示しています。

M5StackのLCDに結果を表示

 上記のスケッチにLCDの表示を追加します。
 最初に、ヘッダ・ファイル#include <M5Stack.h>を追加します。
 16行目 setup()内でM5.begin();と初期化します。LCDの原点は左上隅です。
 36、37行目 x=10、y=10の位置にStartと表示します。
 44~48行目 loop()内では、x=100、y=100の位置に、センサの読み取った距離を表示します。46行は前回表示した文字を消します。

/*
This example shows how to take simple range measurements with the VL53L1X. The
range readings are in units of mm.
*/
#include <Wire.h>
#include <VL53L1X.h>
#include <M5Stack.h>

VL53L1X sensor;

void setup()
{
Serial.begin(9600);
Wire.begin();
Wire.setClock(400000); // use 400 kHz I2C
M5.begin();
sensor.setTimeout(500);
if (!sensor.init())
{
Serial.println("Failed to detect and initialize sensor!");
while (1);
}

// Use long distance mode and allow up to 50000 us (50 ms) for a measurement.
// You can change these settings to adjust the performance of the sensor, but
// the minimum timing budget is 20 ms for short distance mode and 33 ms for
// medium and long distance modes. See the VL53L1X datasheet for more
// information on range and timing limits.
sensor.setDistanceMode(VL53L1X::Long);
sensor.setMeasurementTimingBudget(50000);
// Start continuous readings at a rate of one measurement every 50 ms (the
// inter-measurement period). This period should be at least as long as the
// timing budget.
sensor.startContinuous(50);

M5.Lcd.setCursor(10, 10);
M5.Lcd.print("Start");
}

void loop()
{
Serial.print(sensor.read());
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
M5.Lcd.setCursor(100, 100);
delay(100);
M5.Lcd.print(" ");
M5.Lcd.setCursor(100, 100);
M5.Lcd.print(sensor.read());
Serial.println();
}

 実行中の様子です。I2Cバスはピンヘッダにも出ていますが、Groveのコネクタが1組あるので、そこにセンサをつないでいます。

 LCD表示の解説は、こちらのページにあります。基本的な機能のライブラリです。

そのまま持ち運びができる

 USBケーブルを抜いても動作を続けます。小容量のバッテリが内蔵されています。箱に入っていますから、Arduino UNOのように裸で持ち運んで、断線するようなことも少ないので便利です。

 M5Stackの電源は赤色の電源スイッチを二度押しすると切れます。

前へ

はじめてのMKR ZERO (10) ディジタル温湿度センサSHT35を利用

次へ

ESP32活用① ESP32とブラウザでお話しする(1)ESP32開発用のESP32-DevkitC開発ボード