超音波距離センサーとはいったいどのようなものでしょうか?
「HC-SR04」超音波距離センサーは、40kHz(人の耳では聞こえない超高音)の音を片方の超音波スピーカーから出力し、その反射された音をもう片方の超音波マイクで受信する仕組みになっているのだそうです。超音波を出力してから物体に反射して、受信するまでの時間を計測することで距離を計測することができます。
「音速」音の速さは、秒速≒340m。(約1,225km/h)「高速」光の速さは、秒速≒30万km。(時速表記はやめときます/h、とてつもなく速い)
時速270kmで走る新幹線ひかり号は、秒速で表すと 式 270000m/h÷3600秒 = 75m/秒(超大型台風の最大瞬間風速)
※今回は、音速の計算に温度は考慮せずに音速=340m/秒で計算してみます。高速=∞m/秒(無視で)
花火や雷(カミナリ)がピカっと光ってドッカァ~ン(ゴロゴロ)と音が聞こえるまでのタイムラグを計測すれば、光源(花火の爆発地点)からの距離が分かるというものです。
ちなみにピカっと光ってからちょうど3秒後にドッカァ~ンと聞こえたとしましょう。音速340m/秒✖3秒=1020m ⇒1kmとちょっとのところが爆発地点となります。という訳で「HC-SR04」超音波距離センサーにご登場願います。
超音波距離センサー(HC-SR04)を使って、距離を測れる「超音波電子スケール」を作ってみましょう。
では、電子工作教室をはじめます。
- 超音波距離センサー(HC-SR04): 1個
- LED 赤:2個
- LED 青:2個(緑なども可)
- LED 黄:1個(オレンジなども可)
- 抵抗 330Ω:5個
- やや長いジャンパー線: 2本程
- 短いジャンパー線: 8本程
- Arduino UNO本体: 1個
- ブレッドボード: 1個
- USBケーブル 1本(PC⇔Arduino接続用)
- パソコン 1台(ArduinoIDEインストール済)
ブレッドボードに各パーツをつなぎArduinoと結線して回路を組んでください。
超音波センサー(HC-SR04)の端子は4本
Vcc – 電源入力 → Arduino POWER 5V
Trig – トリガー 超音波出力信号 → Arduino DIGITAL 7番ピン
Echo – エコー 超音波入力信号 → Arduino DIGITAL 6番ピン
GND – グランド → Arduino DIGITAL GND
5cm以内になるとLED1(赤)が点灯 10cm以内になるとLED2(赤)が点灯 15cm以内になるとLED3(青or緑)が点灯 20cm以内になるとLED4(青or緑)が点灯 それ以上の場合はLED5(黄)が点灯
となるようにコードを書きます。
#define echoPin 6 // Echo Pin は6ピンに接続 #define trigPin 7 // Trigger Pin は7ピンに接続 double Duration = 0; //受信した間隔 double Distance = 0; //距離 int led1 = 13; //13番ピンにLEDを接続 int led2 = 12; //12番ピンにLEDを接続 int led3 = 11; //11番ピンにLEDを接続 int led4 = 10; //10番ピンにLEDを接続 int led5 = 9; //9番ピンにLEDを接続 void setup() { Serial.begin( 9600 ); //シリアル通信を開始 pinMode( echoPin, INPUT ); pinMode( trigPin, OUTPUT ); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite( trigPin, HIGH ); //超音波を出力 delayMicroseconds( 10 ); // digitalWrite( trigPin, LOW ); Duration = pulseIn( echoPin, HIGH ); //センサからの入力 if (Duration > 0) { Duration = Duration / 2; //往復距離を半分にする Distance = Duration * 340 * 100 / 1000000; // 音速を340m/sに設定 Serial.print("Distance:"); Serial.print(Distance); Serial.println(" cm"); if (Distance < 5) {//5cm以内になるとLED1が点灯 digitalWrite(led1, HIGH); delay(100); digitalWrite(led1, LOW); } else if (Distance < 10) { //10cm以内になるとLED2が点灯 digitalWrite(led2, HIGH); delay(100); digitalWrite(led2, LOW); } else if (Distance < 15) { //15cm以内になるとLED3が点灯 digitalWrite(led3, HIGH); delay(100); digitalWrite(led3, LOW); } else if (Distance < 20) { //20cm以内になるとLED4が点灯 digitalWrite(led4, HIGH); delay(100); digitalWrite(led4, LOW); } else { //それ以上の場合はLED5が点灯 digitalWrite(led5, HIGH); delay(100); digitalWrite(led5, LOW); } } }
「音速」は空気中を伝わる音の波の速さですから、
公式「331.5 + 0.6 t (m/sec) tは摂氏温度」
※今回は、音速の計測に温度は考慮せずに音速=340m/秒で計算します。
ソースコードでは、始めに下記3行で超音波を10マイクロ秒だけ出力させます。
digitalWrite( 2, HIGH ); //超音波を出力
delayMicroseconds( 10 );
digitalWrite( 2, LOW );
次に返ってくる超音波を受信する為に、次のpulseInという関数で発信された超音波をキャッチします。
Duration = pulseIn( 3, HIGH ); //センサーからの入力 pulseIn関数はHIGHにした瞬間から時間の計測を始め、指定したピンに入力されるパルスがLOW=オフになるまでの時間を計測してシリアルモニタに表示します。