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

システム開発エンジニアの西田五郎が運営しております。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が気軽に使える場 …

温度管理システム的なものを作ってみる(その2)Arduinoでの温度取得からスマホへ送信

「温度管理システム的なものを作ってみる」の2回目です。前回は全体的な内容についてでした。今回はArduinoでの温度取得とスマホへの送信についてです。Arduinoは、Arduino UNOを使ってい …

Raspberry PiでIoT(温度・湿度・気圧データ編 その3)データ表示とグラフ表示

Raspberry PiでIoT 温度・湿度・気圧データ編の3回目です。前回までで、Raspberry Piから温度、湿度、気圧データをWebサーバへ送信してそのデータを蓄積出来るようになりました。今 …

感染症対策のためのIoT技術(その1)非接触温度センサーでの体温測定

まずはじめに新型コロナウイルス感染症に罹患された皆さまおよび関係者の皆さまにお見舞い申し上げますとともに、一日も早い快復をお祈り申し上げます。 また医療関係者をはじめ、感染症防止・対応の最前線の現場で …

感染症対策のためのIoT技術(その5)障害物回避センサーを利用した非接触スイッチ操作

感染症対策のためのIoT技術について書いています。今回は障害物回避センサーを利用した非接触操作です。つまり、手を触れないで何かのスイッチのオン、オフを切り替える仕組みについてです。内容的にはIoT技術 …