わかめの開発日記

ArduinoやRaspberry Pi で作ったものを紹介します

Arduinoを使って距離を測定する

f:id:wakamelab:20200912175136j:plain

超音波センサーを使った距離の測定方法

こんにちは、wakamelabです。
Arduinoと超音波センサー HC-SR04を使って物体との距離を測定する方法を紹介します。

使用するもの

Arduino UNO 本体:1個
・USBケーブル:1本
・超音波センサー HC-SR04:1個
・ブレッドボード:1個
・ジャンパーワイヤ(オス-オス):6本

超音波とは

超音波とは人間の耳では聞き取ることが出来ない高い音のことを言います。
人間の耳で聞こえないだけであり、物理的な性質は人間の耳で聴くことが出来る可聴音と同じです。
人間の耳で聴きとれる可聴域は一般的に20Hz~20000Hzと言われており、超音波はそれよりも高い音のことを言います。
自然界ではコウモリやイルカが周囲の状況を把握するために使用しています。
私たちの身の回りでは、自動ドアのセンサーや自動で水が出る蛇口のセンサー等に使われており、超音波は非常に身近な存在です。

超音波を使って距離を測定する方法は、放出した超音波が物体に反射して戻ってくる時間を利用しています。
戻ってくるのにかかった時間に音速を掛けることで求めることができます。
図で説明すると、以下のようになります。
f:id:wakamelab:20200907004322p:plain

超音波センサー HC-SR04 について

f:id:wakamelab:20200907003615j:plain

では使用する超音波センサーについて説明します。
このHC-SR04は安価で使用方法も確立されていることから電子工作では非常によく使用されるセンサーです。
このセンサーは 40000Hz の超音波を使用します。
このセンサーの"T"と書かれた方から超音波を放出し、"R"と書かれた方で返ってきた超音波を検出します。
f:id:wakamelab:20200907004606p:plain

ピンアサインは以下のようになっています。
f:id:wakamelab:20200907004659p:plain
VCCピンにArduinoの5V端子、GNDピンにArduinoのGND端子を接続して使用します。
TrigピンへHIGH→LOWのパルスを与えると、超音波センサーから超音波が放出されます。
超音波放出と同時に、EchoピンからHIGHが出力され、超音波が跳ね返って戻ってくるとEchoピンからの出力がLOWとなります。
Echoピンの出力がHIGHからLOWに信号が変化するまでの時間を計測することで、超音波が物体との間を往復するのにかかった時間が分かるので、その時間の半分に音速を掛けることで距離を計測することができるという仕組みになっています。

では実際に距離を測定するプログラムを書いていきたいと思います。

超音波センサーを使った距離測定のプログラム

#define ECHO_TRIG 16
#define ECHO_IN 17

void setup() {
  Serial.begin(115200);
  
  pinMode(ECHO_TRIG, OUTPUT);
  pinMode(ECHO_IN, INPUT);
}

void loop() {

  double distance = 0.0;
  int ret_time = 0;

  digitalWrite(ECHO_TRIG, HIGH);    //超音波出力
  delayMicroseconds(10);
  digitalWrite(ECHO_TRIG, LOW);    //超音波出力停止

  ret_time = pulseIn(ECHO_IN, HIGH);

  distance = ret_time * 0.017;  // unit : cm

  Serial.print("物体との距離は : ");
  Serial.print(distance);
  Serial.println("cm");
  
  delay(1000);
}

ではここからは、プログラムの説明を行います。

#define ECHO_TRIG 16
#define ECHO_IN 17

超音波センサーのTrigピンをArduinoの16番ピン(A2)、Echoピンを17番ピン(A3)に接続しているため、ピンの番号の定義を行っています。

  Serial.begin(115200);

このプログラムでは、シリアル通信を使い温度をPCの画面上に表示します。
これはシリアル通信を始めるための宣言です。
ボーレート115200bpsで通信を行います。
シリアル通信について詳しく知りたい方は、以下の記事を参考にして下さい。
wakamelab.hatenadiary.com

  pinMode(ECHO_TRIG, OUTPUT);
  pinMode(ECHO_IN, INPUT);

Trigピンに接続した16番ピンを出力とすることで超音波を放出するためのトリガーとし、Echoピンに接続した17番ピンを入力に設定することで超音波が返ってきて17番ピンがHIGH→LOWとなるタイミングを知ることが出来ます。

  double distance = 0.0;
  int ret_time = 0;

変数"distance"は距離を計算した結果を格納するために使用し、"ret_time"は超音波が返ってきた時間を格納するために使用しています。
double型というのは、小数点を持つ値を計算することが出来る変数です。
int型は整数しか扱うことが出来ないため、計算結果が小数となった場合、小数点以下は切り捨てられますが、double型では小数点以下の値も切り捨てずに保持することが出来ます。
このように計算結果が整数とならない値を変数に格納するためには、小数点を扱う事が出来るdouble型やfloat型を使用します。

  digitalWrite(ECHO_TRIG, HIGH);    //超音波出力
  delayMicroseconds(10);
  digitalWrite(ECHO_TRIG, LOW);    //超音波出力停止

ECHO_TRIG(16番ピン)にHIGHを出力し、10μsec待ってからECHO_TRIG(16番ピン)をLOWにしています。こうすることで10μsecの間超音波を出し続けることが出来ます。
なぜ10μ秒間なのかというと、HC-SR04の仕様では10μ秒間超音波を放出することで、8個のパルスが放出されます。
8個のパルスがEchoに返ることで、EchoピンはLOWを出力するので、Echoピンが超音波の戻りを正常に検知するために8パルス出力させる必要があるからです。
ちなみにですが、μはマイクロと読みます。1μ秒は1/1000000(百万分の一)秒です。

  ret_time = pulseIn(ECHO_IN, HIGH);

この処理で、超音波を出力してからセンサーに返ってくるまでの時間を計測しています。
pulseIn(pin, value)関数では、引数pinで指定したピンの入力が、引数valueで指定した値(HIGH/LOW)となっている間の時間を返します。
返ってくる時間の単位はμ秒です。
この場合、Trigから超音波が出力され、Echoピンの出力がHIGHになることで時間の計測を開始し、超音波が返ってきてEchoピンの出力がLOWになることで計測を終了し、その間の時間を戻り値として返してくれています。

  distance = ret_time * 0.017;  // unit : cm

超音波が返ってくるまでの時間を距離に変換しています。
計算の根拠について説明します。
音速は15度の空気中での340m/sで計算しています。(1秒間に340m進む)
超音波が返ってくるまでには、超音波センサーから出力→跳ね返って戻ってくるという過程を踏むため、物体に到達するまでにかかった時間は計測した時間の半分でありret_timeを2で割ります。・・・1
ret_timeの単位はμ秒なので、秒に変換するために1000000で割ります。・・・2
1,2の計算で物体到達までの秒数が分かるため、音速の340m/sを掛けます・・・3
最後に、距離をmからcmに直すため、100を掛けます・・・4
1~4の計算を数式に表すと以下のようになります。
f:id:wakamelab:20200909002055p:plain

上記計算式により、計算式ret_time * 0.017で 距離がcm単位で計算できることが分かります。

  Serial.print("物体との距離は : ");
  Serial.print(distance);
  Serial.println("cm");

物体との距離は〇〇cm と表示させるための処理です。
超音波センサーで測定した値をPC上で確認するために行っています。

配線図紹介

プログラムの紹介も終わりましたので、実際に配線しましょう。
配線は以下の配線図の通りです。
f:id:wakamelab:20200912141730p:plain

A2ピンをTrigピン、A3ピンをEchoピンに接続しています。
配線図の表示の関係上、超音波センサーがArduinoの方を向いていますが超音波センサーの向きをArduinoと反対に向けた方が距離測定を行う上ではやりやすいかと思います。

プログラムの実行

接続も完了した所で、プログラムを実行してください。
このようにシリアルモニタ上に出力されれば完成です。
f:id:wakamelab:20200912173044p:plain

超音波センサーを接続したArduinoの前にモノを置いて、それを近づけたり遠ざけたりしてみて下さい。
実際に出力される距離がモノの移動と連動して変化するのではないでしょうか。
これで距離測定の方法の紹介は終了します。

Arduino 超音波距離計製作キットの紹介

当社では、Arduinoを使用した、プログラミング、電子工作初心者向けの学習キットを販売しております。
この記事に記載した温度センサーを使って温度計を作るキットもありますので、ご興味あれば是非購入をお願いします。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/30768809

メルカリ:https://www.mercari.com/jp/u/170119900/