株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

Arduino IoT 感染症対策のIoT技術

感染症対策のためのIoT技術(その3)超音波距離センサーでの距離測定

投稿日:2021年1月29日 更新日:

感染症対策のための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 );
}

以下のように確認出来ました。

28.70cmの場合

106.64cmの場合

212.82cmの場合

実用性としては、オフィスでの座席間、机等の距離測定などには有効かと思います。もちろん、人であればその人との距離も測定出来ます。ただし、距離の対象が人かどうかはこの超音波距離センサーでは判定出来ません。

IoTとしてのシステム化(ソリューション)を考えてみる
距離計単体としては以上で実現出来るとして(もちろん、ブレッドボードでははずれたり、不安定になるのでだめですが)IoTとしてのシステム化(ソリューション)を考えてみます。

例えば、実際に管理したい距離(ソーシャルディスタンス)があるとして、その場所の状態を写真や動画で記録して同時に測定した距離も保存するという場合があるとします。その場合は、例えばRaspberry Piを利用すれば要件を満たすようなシステムが構築出来る場合もあると思います。その場合はサーバー側でもシステムを構築する必要が出てくると思います。

今回はここまでです。

AdSense

AdSense

-Arduino, IoT, 感染症対策のIoT技術

執筆者:

関連記事

Arduino Ethernetシールド(旧製品)を使ってみた

Arduino Ethernetシールド(旧製品)を使ってみました。Arduinoと接続した状態が以下です。おそらく2~3年前ぐらいに買ったものだと思います。どうも自宅以外で有線LANが気軽に使える場 …

Arduino互換機の「びんぼうでいいの(S)」を使ってみた

Arduino互換機のびんぼうでいいの(S)という製品を買ってきて使ってみました。 これは何といってもネーミングにインパクトがあったので買いました。メーカのaitendoのページによると、「お金をかけ …

感染症対策のためのIoT技術(その2)非接触温度センサーをインターネットへ接続する

前回の続きです。前回は非接触温度センサーでの体温測定について書きました。今回はその非接触温度センサーをインターネットへ接続してクラウドに体温データを蓄積して可視化すという内容で書きます。その上で実務的 …

Arduino UnoでSPI通信(その1)Arduino Uno2台で通信

ArduinoでのSPI通信についてです。SPI通信(Serail Peripheral Interface:SPI)はマイコン系と周辺デバイス間の短距離間で利用されている同期型のシリアル通信の一種で …

ESP-WROOM-02でもセンサネットワーク稼働試験

ESP-WROOM-02でもセンサネットワークを稼働してみます。ESP-WROOM-02でもというのは今までRaspberry Piで稼働してきたのでESP-WROOM-02でも稼働してみようというこ …