1.はじめに
製造現場では、センサーを使って「ワークがあるか、ないか」を確認したい場面があります。
例えば
- 治具にワークがセットされているか確認する
- 搬送ライン上をワークが通過したことを検出する
- 部品箱に部品が残っているか確認する
- 設備の所定位置に対象物があるか確認する
といった用途です。
実際の設備では、光電センサーや近接センサーなどが広く使われていますが、今回はM5Stack Core2に距離センサーを接続し、対象物までの距離からワークの有無を判定してみます。
本記事では、実用的なワーク検出システムを作ることを目的としていません。M5Stackと身近なセンサーを使って、 「現場のデータを取って、簡単な判定に使ってみる」 ことを目的とします。
2.今回行うこと
今回は、距離センサーで対象物までの距離を測定し、その値をM5Stack Core2のLCDに表示します。さらに、あらかじめ設定した距離を「しきい値」として、測定距離がしきい値より近い場合を**「ワークあり」、遠い場合を「ワークなし」**と判定します。
全体の流れは次のようになります。
距離センサー
↓
対象物までの距離を測定
↓
M5Stack Core2のLCDに距離を表示
↓
しきい値と比較
↓
「ワークあり/なし」を表示
前回は、温湿度センサーから取得した値を「表示する」「保存する」という処理を行いました。今回はさらに一歩進めて、測定した値を使って状態を判定する処理を体験します。
3.使用する機器
今回使用する主な機器を表1に示します。
| 機器 | 用途 |
|---|---|
| M5Stack Core2 | 距離データの取得・表示・判定 |
| Unit ToF(VL53L0X) | 対象物までの距離測定 |
| GROVEケーブル | M5Stack Core2とセンサーの接続 |
| USB Type-Cケーブル | PCとの接続・電源供給 |
| パソコン | プログラムの作成・書き込み |
距離センサーには、M5Stackの Unit ToF(VL53L0X) を使用します。
ToF(Time of Flight)方式の距離センサーは、光を対象物に照射し、反射光を利用して対象物までの距離を測定します。
GROVEケーブルで接続できるため、ブレッドボードなどを使わずに作成できます。
4.使用するライブラリのインストール
今回使用するUnit ToFをプログラムから扱うため、次のライブラリを追加します。
| ライブラリ | バージョン | 用途 |
|---|---|---|
| M5UnitUnifiedTOF | 0.2.1 | Unit ToF(VL53L0X)から距離を取得するためのライブラリ |
第1回と同じように、Arduino IDEの**「ライブラリマネージャ」**を開きます。
検索欄に M5UnitUnifiedTOF と入力し、検索結果から バージョン0.2.1 を選択して「インストール」をクリックします。第1回でインストールした M5UnitUnified 0.5.5 は、そのまま使用します。
インストールが完了したら、Arduino IDEに次のプログラムを入力します。
#include <M5Unified.h>
#include <Wire.h>
#include <M5UnitUnified.h>
#include <M5UnitUnifiedTOF.h>
m5::unit::UnitUnified Units;
m5::unit::UnitToF tof;
// ワーク有無を判定する距離 [mm]
const int16_t THRESHOLD_MM = 150;
void setup() {
auto cfg = M5.config();
M5.begin(cfg);
M5.Display.setTextSize(2);
M5.Display.setTextColor(WHITE, BLACK);
M5.Display.fillScreen(BLACK);
// Core2 PORT.A
// SDA = 32, SCL = 33
Wire.begin(32, 33, 400000);
Units.add(tof, Wire);
if (!Units.begin()) {
M5.Display.println("ToF sensor error");
while (true) {
delay(1000);
}
}
}
void loop() {
M5.update();
Units.update();
// 新しい測定値が得られるまで待つ
if (!tof.updated()) {
return;
}
// 測定値が有効か確認
if (!tof.valid()) {
M5.Display.fillScreen(BLACK);
M5.Display.setCursor(10, 30);
M5.Display.println("Range error");
return;
}
// 距離をmm単位で取得
int16_t distance = tof.range();
// しきい値より近ければワークあり
bool workDetected = distance < THRESHOLD_MM;
// 画面表示
M5.Display.fillScreen(BLACK);
M5.Display.setCursor(0, 30);
M5.Display.printf("Distance\n%d mm\n\n", distance);
M5.Display.printf(
"Threshold: %d mm\n\n",
THRESHOLD_MM
);
M5.Display.setTextSize(3);
if (workDetected) {
M5.Display.println("WORK DETECTED");
} else {
M5.Display.println("NO WORK");
}
M5.Display.setTextSize(2);
delay(100);
}
5.距離センサーの接続
M5Stack Core2のGROVEポートにUnit ToFを接続します。
接続するときは、M5Stack Core2の電源を切った状態で行います。接続後、USB Type-Cケーブルを使ってM5Stack Core2とパソコンを接続します。距離センサーの前に手や箱などを置き、対象物との距離を変えられるようにしておきます。
6.スケッチの書き込み
今回のスケッチでは、次の処理を一つのプログラムで行います。
- M5Stack Core2とUnit ToFを初期化する
- Unit ToFから対象物までの距離を取得する
- 測定した距離をLCDに表示する
- 測定距離をしきい値と比較する
- 「ワークあり/なし」の判定結果をLCDに表示する
最初からプログラムをすべて理解する必要はありません。まずは、実際に動作確認したスケッチを書き込み、距離の変化と判定結果が連動することを確認します。
Arduino IDEでボードに M5Core2、ポートに使用するCore2のCOMポートが選択されていることを確認し、「書き込み」ボタンをクリックします。
7.距離とワークの有無を確認する
プログラムが起動すると、Unit ToFで測定した対象物までの距離、判定に使用するしきい値、ワークの有無がLCDに表示されます。
今回のスケッチでは、しきい値を 150 mm に設定しています。
- 測定距離が150 mm未満 → ワークあり
- 測定距離が150 mm以上 → ワークなし
センサーの前に手を置き、前後に動かしてみます。手を近づけると距離の値が小さくなり、遠ざけると値が大きくなることを確認します。
150 mmより近い場合は WORK DETECTED、150 mm以上の場合は NO WORK と表示されます。
図3 ワークなしの判定例
ここでは、単に距離を測るだけではなく、**「測定値を条件と比較して、状態を判定する」**ところまでを一つのスケッチで確認します。
測定距離について
Unit ToFで表示される距離は、定規などで測った実際の距離と多少異なる場合があります。また、対象物の表面状態、色、角度などによっても測定値が変化することがあります。今回の実習では、距離を精密に測定することではなく、センサーから得られた距離の変化を利用して、ワークの有無を判定することを目的とします。実際にワーク検出へ利用する場合には、実際の設置状態で測定値を確認し、その結果に応じてしきい値を設定することが重要です。
8.スケッチのポイントを確認する
今回のスケッチでは、判定距離を次のように設定しています。
const int16_t THRESHOLD_MM = 150;
Unit ToFから取得した距離と、この値を比較してワークの有無を判定します。
bool workDetected = distance < THRESHOLD_MM;
これは、**「測定距離がTHRESHOLD_MMより小さければ、ワークありとする」**という処理です。
また、Unit ToFから距離を取得する部分では、次のように range() を使用しています。
int16_t distance = tof.range();
今回使用する動作確認済みスケッチでは、センサーから新しい測定値が得られるたびに、距離表示とワーク有無の判定を更新します。
9.しきい値を変更してみる
次に、プログラム中のしきい値を変更して、判定結果がどのように変わるか確認します。
const int16_t THRESHOLD_MM = 150;
を、例えば
const int16_t THRESHOLD_MM = 200;
に変更し、もう一度M5Stack Core2に書き込みます。
今度は、200 mmを境に「WORK DETECTED」と「NO WORK」が切り替わることを確認します。
このようにプログラム中の数値を少し変更して動作を確認することで、測定値と判定条件の関係を理解しやすくなります。
10.測定値がしきい値付近にある場合
実際の距離測定では、測定値が完全に一定になるとは限りません。
例えば
148 mm
151 mm
149 mm
152 mm
のように、測定値がわずかに変動する場合があります。
しきい値を150mmに設定していると、「ワークあり」と「ワークなし」が頻繁に切り替わる可能性があります。
安定した判定を行うためには
- 複数回測定して平均値を使う
- 「ワークあり」と「ワークなし」で異なるしきい値を設ける
- 一定時間以上同じ状態が続いた場合に判定を確定する
などの工夫が考えられます。
今回は入門として、1つのしきい値を使った単純な判定を行っています。
11.工場における活用方法
今回の仕組みは簡易的なものですが、製造現場でのセンサー活用を考える入口になります。
例えば
- ジグへのワークセット確認
- 搬送ライン上のワーク通過確認
- 部品箱内の残量確認
- 設備内の部品位置確認
- 作業者が対象物を置いたことの検出
などへの応用が考えられます。
重要なのは、単に距離を測定することではなく、「測定した値を使って、設備やワークの状態を判断する」 という考え方です。
12.実際の設備で使用する場合の注意
今回使用するM5Stack Core2と距離センサーは、センサー計測や判定処理を体験するための簡易的な構成です。
実際の生産設備でワーク検出を行う場合には、対象物の材質、表面状態、色、形状、検出距離、周囲光、振動、汚れなどによって測定結果が変化する可能性があります。
また、設備の制御や安全に関係する用途では、用途に適した産業用センサーや安全機器を使用する必要があります。
今回の装置は、実際の設備に組み込むことを目的としたものではなく、センサーによる距離測定としきい値判定の考え方を試すためのもの として使用します。
13.今回のまとめ
今回は、M5Stack Core2と距離センサーを使って、 距離測定 → LCD表示 → しきい値との比較 → ワーク有無の判定 という処理を試しました。
前回の温湿度測定では、取得したデータを「表示する」「保存する」ところまで行いました。今回は、取得したデータに対して条件を設定し、「測定値から状態を判定する」 ところまで進みました。このような単純なしきい値判定でも、製造現場ではさまざまな用途に応用できます。次回は非接触温度センサーを使用して、「M5Stackで設備の温度を非接触で記録してみる」 ことに挑戦します。設備や対象物に触れることなく温度を測定し、その値を画面に表示するとともにCSV形式で記録してみます。
注意事項
今回製作する装置は、M5Stackと市販センサーを利用した学習・簡易検証用の装置です。
生産設備の制御、品質保証、安全装置など、誤検出が事故や損害につながる用途には、そのまま使用しないでください。実際の設備への適用では、用途に応じた産業用センサーや制御機器を選定し、十分な検証を行ってください。


