Arduino nanoで超音波センサー(HC-SR04)を使ってみた。
- 2017/09/24
- 10:24
Arduino nanoで超音波センサー(HC-SR04)を使ってみた。
こんにちはRoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
今回はYahoo!ショッピングで送料無料で250円で見つけたので買ってみました。
型式HC-SR04 (メーカーが書いてないので互換品でしょうか)
主要な仕様
電源電圧 5V
待機電流 2mA未満
信号出力 0~5V
センサ角度 15度以下
測定可能距離 2~400cm
分解能 0.3cm

ピン配置(写真の左から)
Vcc 電源+5V
Trig トリガー信号(Arduinoからトリガー信号を受ける。)
Echo エコー信号(Arduinoにエクー信号を返す)
Gnd グランド
センサーの原理
下の図のように、Arduinoから10μsのパルスをTrigピンに与えると、センサーからは計測対象に8回ほど超音波を発します。
超音波は計測対象にぶつかると反射して戻ってきます。センサーはこの時間を計ることで距離を計測しています。
センサーからはパルス幅としてArduinoにデータを送ります。

計測値はこのパルス幅に対して次のような式で計算されます。
距離(cm) = パルス幅×1/2×340×100×1/1000000 = パルス幅 / 58.8
超音波センサーとArduinoの接続
Arduinoの5VピンをセンサーのVccピンに接続
ArduinoのGndピンをセンサーのGndピンに接続
ArduinoのD8をTrigピンに接続
ArduinoのD9をEchoピンに接続


Arduinoのスケッチ

#define echo 9 // Echo Pin
#define trig 8 // Trig Pin
double Duration = 0; //受信した間隔
double Distance = 0; //距離
void setup() {
Serial.begin(9600);
pinMode(echo,INPUT);
pinMode(trig,OUTPUT);
}
void loop() {
digitalWrite(trig,HIGH); //超音波を出力
delayMicroseconds(10); //10μsパルスを出す
digitalWrite(trig,LOW);
Duration = pulseIn(echo,HIGH); //センサからパルス間隔を取得
if (Duration > 0) {
Distance = Duration/58.8; // パルス間隔から距離を計算
Serial.print(Distance);
Serial.println(" cm");
}
delay(500);
}
これでコンパイルしてArduinoに送信しましょう。
動作確認
シリアルモニターを起動すると、データを受信していることがわかります。
超音波センサーの前にものを置くとおおよそその距離を計測しているようです。

Echo信号をオシロスコープで見てみると距離に応じてパルス幅が変化していることがわかります。
実際に物差しで計ってみると実際の距離が8cmのところ若干小さな値となっていました。


計算式では音速を340m/sとしていますが、理論的には温度のパラメータも入っています。
音速=331.5 + 0.6 x温度 なので340は14℃の時です。結構涼しい。
仮に25℃だったとすると音速は346.5m/sです。
この場合
距離(cm) = パルス幅×1/2×346.5×100×1/1000000 = パルス幅 / 57.7
この方が現実的な気がします。
実際にスケッチに入れてみると良好な結果が出ました。

本当は温度も計測しながら計算したいところですが、ロボットで使う分にはそこまで正確ではなくても良いと思います。
そのうちにロボットにつけて距離を計測しながら動かしたいと思います。
それでは今回はこの辺で失礼します!ありがとうございました。
スポンサードリンク