感染症対策のためのIoT技術について書いています。今回は超音波距離センサーでの距離測定についてです。
新型コロナウイルスによる感染症の対策が始まってから意識する必要が出てきたソーシャルディスタンスという考え方ですが、以下の厚生労働省のページからの引用です。
新型コロナウイルスを想定した「新しい生活様式」の実践例を公表しました
つまり、これがソーシャルディスタンスの目安で「できるだけ2メートルで最低でも1メートル」となっています。この1メートルから2メートルの距離を測定して認識するという目的に超音波距離センサーを使います。
超音波距離センサーについて
超音波距離センサーは、超音波の反射を利用して対象物までの距離を測る測距センサです。今回使用しているのは以下です。超音波センサーとしては定番のHC-SR04です。よく教育用のロボット等で衝突防止の機能で利用されています。その2個のスピーカーの形状が目のようにも見えるセンサーです。

片方の超音波スピーカーから出力し、その反射された音をもう片方の超音波マイクで受信する仕組みです。実際の距離算出には以下の式が基本になります。
距離 = (音速 × 時間) ÷ 2
超音波を出してから対象に反射して受信するまで往復になるので実際の距離はその半分ということになります。また音速は室温によって多少の変化がありますが、今回は比較的短い距離(ソーシャルディスタンス)を対象としているのでこの室温による音速の変化は考えないこととします。(※以下で利用するライブラリがそのような仕様になっています。)
Arduino UNOでのテスト
まずは、Arduino UNOでテストをします。
以下のように接続します。センサーのトリガー、エコーがそれぞれ、Arduino UNOの2番、3番のピンです。ブレッドボードを使っていますがしっかりブレッドボードに接続しないと距離が正確に測定出来ません。

今回利用するのは以下のページのライブラリ化されているプログラムです。
(ROHM DEVICE PLUS)ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!(第2回)(作者:福田和宏様)
このページで公開されているzip形式のライブラリをダウンロードします。
そして、Arduino IDEのメニューから スケッチ =>ライブラリをインクルード」=>「.ZIP形式のライブラリをインストール」を選択し、ダウンロードしたライブラリを選択します。
これで、HCSR04.hファイルをインクルードすれば、HCSR04クラスを利用することが出来ます。次にまた上記のページで公開されている以下のサンプルプログラムで動作確認します。(※そのまま引用です。ありがとうございます。)HCSR04クラスを利用して距離を測定してシリアルモニタに表示します。
#include <HCSR04.h>
const int US_TRIG_PIN = 2;
const int US_ECHO_PIN = 3;
HCSR04 hcsr04( US_TRIG_PIN, US_ECHO_PIN );
void setup()
{
Serial.begin( 9600 );
hcsr04.begin();
}
void loop()
{
float distance;
distance = hcsr04.get_length();
Serial.print( distance );
Serial.println( "cm" );
delay( 500 );
}
ここまでで、超音波距離センサーでの距離の測定が確認出来ました。これを使って今回の本題のソーシャルディスタンスを認識出来るようにM5StickCを使います。
M5StickCに接続する
今度はM5StickCに超音波距離センサーを接続します。接続にはGroveコネクタを使いました。
groveコネクタからトリガーがG33ピンにエコーがG32ピンに接続されています。

この状態で前項のArduino UNOと同じライブラリを使って距離をM5StickCの画面に表示します。
#include <M5StickC.h>
#include <HCSR04.h>
const int US_TRIG_PIN = 33;
const int US_ECHO_PIN = 32;
HCSR04 hcsr04( US_TRIG_PIN, US_ECHO_PIN );
void setup() {
//各初期化
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(3);
M5.Axp.ScreenBreath(10);
//シリアル初期化
Serial.begin(115200);
//センサー初期化
hcsr04.begin();
delay(100);
}
void loop() {
float distance;
distance = hcsr04.get_length();
Serial.print(distance);
Serial.println("cm");
M5.Lcd.fillRect(3,3,150,100,BLACK);
M5.Lcd.setCursor(3,3);
String sval = String(distance);
M5.Lcd.print(sval + "cm");
delay( 500 );
}

写真上に写っている緑色のパーティションまでの距離が11.81cmと表示されています。仕様では、2cm から 400cm(4m)まで計測出来るとなっていますが、3mあたりを超えると不安定になるようです。
ソーシャルディスタンスを意識して計測する
それではこれでソーシャルディスタンスを意識して表示してみます。距離が1m未満の場合は赤い文字で、1mから2m未満の間は黄色い文字で表示してみます。以下がプログラムです。
#include <M5StickC.h>
#include <HCSR04.h>
const int US_TRIG_PIN = 33;
const int US_ECHO_PIN = 32;
HCSR04 hcsr04( US_TRIG_PIN, US_ECHO_PIN );
void setup() {
//M5の各初期化
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(3);
M5.Axp.ScreenBreath(10);
//シリアル初期化
Serial.begin(115200);
//センサー初期化
hcsr04.begin();
delay(100);
}
void loop() {
// put your main code here, to run repeatedly:
float distance;
distance = hcsr04.get_length();
if(distance < 100.0)
{
M5.Lcd.setTextColor(RED);
}
else if(distance < 200.0)
{
M5.Lcd.setTextColor(YELLOW);
}
else
{
M5.Lcd.setTextColor(WHITE);
}
Serial.print(distance);
Serial.println("cm");
M5.Lcd.fillRect(3,3,150,100,BLACK);
M5.Lcd.setCursor(3,3);
String sval = String(distance);
M5.Lcd.print(sval + "cm");
delay( 500 );
}
以下のように確認出来ました。
実用性としては、オフィスでの座席間、机等の距離測定などには有効かと思います。もちろん、人であればその人との距離も測定出来ます。ただし、距離の対象が人かどうかはこの超音波距離センサーでは判定出来ません。
IoTとしてのシステム化(ソリューション)を考えてみる
距離計単体としては以上で実現出来るとして(もちろん、ブレッドボードでははずれたり、不安定になるのでだめですが)IoTとしてのシステム化(ソリューション)を考えてみます。
例えば、実際に管理したい距離(ソーシャルディスタンス)があるとして、その場所の状態を写真や動画で記録して同時に測定した距離も保存するという場合があるとします。その場合は、例えばRaspberry Piを利用すれば要件を満たすようなシステムが構築出来る場合もあると思います。その場合はサーバー側でもシステムを構築する必要が出てくると思います。
今回はここまでです。




