NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

超音波距離センサーの使い方(HC-SR04)

イメージ 3
超音波距離センサーモジュール(HC-SR04)
 
 超音波距離センサーモジュールHC-SR04を使ってみました
 このセンサーで2~400cmの距離が非接触で測れます!
 因みにイルカはこの原理を使って目隠ししても回りの状況を正確に把握しているそうです!

○イルカの"目
 イルカは濁った見え難い水中で生活して来たため目が退化し視力は0.1程度と言われています。代わりに聴覚が進化し視覚の役割を担っています。
 聴覚で周囲の状況を知る方法をエコーロケーション(反響定位)と言い、イルカはクリック音(30~200kHz)を前方に向けて発し物体からの反響音を聴く事で、対象物の位置・大きさ・材質・形状・移動方向から速度まで知る事が出来ます。
 超音波は物を透過する特徴があるので、イルカは好みの餌はもちろん、人間の健康状態までわかってしまうのだそうです。

1. 音速とは?

 音が物質中を進む速度を音速と言い、単位としてマッハ数(Mach number)が使われます。
 対流圏における音速は大気温度によって図1の様に変化してしまう為、便宜上国際標準大気(対流圏:気圧101,3kpa、気温15℃、気温減率6.5K/km)における音速340m/sがマッハ1として使用されています。
※参考に水中の音速は1,500m/s、ベリリウム固体中の音速は12,890m/sです!
イメージ 2
図1:音速の温度依存性及びその近似式

2. 超音波距離センサーとは?

 超音波の反射を利用して対象物までの距離を測る測距センサーです。
 イルカのエコーロケーションをフルハイビジョンTVだとすると、この超音波センサーはLED1球位の性能差が有りそうです。
 エコーロケーション基礎研究(イルカのソーナー能力の魚群探知機への適用に関する研究)やサイマススコープと言った音を可視化する技術が有るようですが、電子工作で使える様になるのはまだ先の事でしょうか
 
2.1 測定原理
 遠くの山に「ヤッホー!」と叫ぶと「ヤッホー!」と返ってくる様に、音は波の性質を持ち、物体に当たると反射して返って来ます。
 対流圏中の音速は340m/sで有る事から、このヤッホー!」の音が往復するのに掛かった時間(T)を測る事で、物体迄の片道の距離(D)を以下の式で求める事が出来ます。
D(cm) = T(μS) × 1/2(片道) × 340(m/s) × 100(cm/m) × 1/1000000(μS/S)・・・式1

式1を纏めると、
 
片道の距離 D(cm) = 往復の時間 T(μS) ÷ 58.8(cm/μs)・・・式2

 

 式2より「ヤッホー!」と叫んでから戻ってくる迄に掛かった時間をμS単位で測定し、それを58.8で割るだけで対象物迄の距離がcm単位で計算出来ます!
 
2.2 HC-SR04の仕様
 HC-SR04の外観及び端子図は図1、仕様は表1の通りです。
 このモジュールを使えば非接触で2~400cmの距離を3mmの精度で測距する事が出来ます。
イメージ 4
図2:超音波距離センサーモジュール(HC-SR04)外観写真(左表、右裏)及び端子図
※実測寸法(幅・高さ・奥行):45.25×20.35×15.2mm(ピンヘッダは含まず)

 

表1:HC-SR04の仕様(SDSより引用)
項目 内容
電源電圧 5V
待機電流 2mA未満
信号出力 0~5V
センサ角度 15度以下
測定可能距離 2~400cm
分解能 0.3cm
端子間距離 2.54mm
 
2.3 測距の流れ
 HC-SR04に下記(1)~(5)の流れを行う事で1回測距出来ます。
(1)Trig端子を10 us以上Highにする
(2)モジュールが自動的にパルス(40kHzの信号を8回)を送信する
(3)モジュールが測定物から反射したパルス信号を受信する
(4)パルス信号の送信~受信までに掛かった時間分だけEcho端子がHighになる
(5Echo端子がHighになった時間をμS単位で測定し式2から距離を計算する
ビニール袋、クリアファイル、コピー用紙なども距離が測定出来るそうです。

3. 実験!

 実際に「HC-SR04」を使って測距実験をしてみました!
 
3.1 接続
 Trig端子をArduinoUNOのD8、Echo端子をD9にジャンパーピンで接続します。
 Arduino UNOHC-SR04の接続図をFritzingを使って図3の様に書いてみました。
 また、図3の通り実際に繋げた状態を図4に示します。
イメージ 1
図3:ArduinoUNOと測距センサーを繋げ方
 
イメージ 5
図4:実際に繋げた状態

3.2 プログラム
 2.3の「測距の流れ」をプログラムで書くと図5の通りです。
 一つのArduinoで複数のHC-SR04を扱い易い様に関数化してみました
 このプログラムを実行すると0.5秒間隔で図5の様に測定結果がcm単位でシリアルモニタ(図6)上に表示されます。
void setup() {
  Serial.begin( 9600 );
}

void loop() {
  Serial.println( USread(8, 9));
  delay(500);
}

float USread(int Trig, int Echo) {
  int Duration;
  float Distance;
  const unsigned int MAX_DIST = 23200; //400cm(23200μs/pulse)以上は測定範囲外
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  Duration = pulseIn(Echo, HIGH);
  if (Duration > 0) {
    Distance = Duration / 58.8;
  }
  if (Duration > MAX_DIST) {
    return 400;
  } else {
    return Distance;
  }
}
イメージ 1
図5:プログラム例
 
イメージ 8
図6:上記プログラム実行結果

3.3 測定
 「HC-SR04」の基板面を距離0cmとして図7の様に箱をセンサー正面から5cmずつ5~35cm迄離して行きその時の距離を測定しました。
イメージ 6
図7:センサーからケース迄の距離を5~35cmに変化させ、都度300回測定
※室温10℃・・・寒い
3.4 結果
 測定距離を左縦軸に、実際の距離を横軸にし青線で図8の通りグラフ化しました。
 参考に300回測定した各データについて標準偏差を求めた結果を赤線で示します。
 
イメージ 7
図8:測定結果
 
※室温が標準大気温度の15℃より5℃低い為か測定された距離が若干低め(a=0.9662)に出てます。

4. まとめ

 図8測定結果より、標準偏差が最大2.24mm、最小0.25mmでした。
 統計において±2σ(標準偏差の4倍)の範囲に95%のデータが集まる事が分かっており、今回使用したHC-SR04の測定精度は5~35cmの範囲において、調子の悪い時は誤差±4.48mm位で、調子の良い時は±0.5mm位で有る事が分かりました

 400cmは試していませんが5~35cmの範囲においては、距離に比例して誤差が増えることも無く、また誤差も十分に少なかったのでラジコンを自動運転する際の"目"として使えそうです!
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る