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

システム開発エンジニアの西田五郎が運営しております。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技術

執筆者:

関連記事

Raspberry PiでIoT(温度・湿度・気圧データ編 その4)アラートメール送信

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

感染症対策のためのIoT技術(その6)M5StickC PIR Hat(AS312搭載)人感センサー

感染症対策のためのIoT技術について書いています。今回は人感センサーを使ってみました。使ったのは M5StickC に直接接続して使うタイプで比較的簡単に使うことが出来ます。スイッチサイエンスさんの販 …

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

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

温度センサADT7410(その2)Arduinoでの利用

温度センサADT7410の2回目です。前回はI2C通信の簡単な概要とADT7410モジュールをRaspbery Piに接続してアドレスの確認まで行いました。今回はArduinoでADT7410を使って …

Arduino IDEのWindows10でのインストール(2020/05/04版)

現時点でのArduino IDEのWindows10でのインストール方法についてです。 Arduinoでの開発を始めるための最初の難関というほどでもないかもしれないですが、開発環境であるArduino …