こんばんは!
今回は「超音波センサ」というものを使って簡単な距離計を作っていきます。
使用するもの
・Arduinoメインボード(https://amzn.to/2vkPIUH)
・USBケーブル(https://amzn.to/2UHhntl)
・ブレッドボード(https://amzn.to/38eNi8u)
・ジャンパワイヤ (https://amzn.to/39uBU8T)
・超音波センサHC-SR04(https://amzn.to/2FuIwYP)
超音波センサについて
超音波センサとは人間の耳には聞こえない高周波の音を出し、物に当たって反射してくるまでの時間によって距離を測定するものです。
超音波距離センサではデジタル信号のHIGHとLOWの切り替えにより、発信側と受信側の時間差を読み取ることができます。
図で表すとこんなイメージです。
そして距離をL[m]、音の時差をΔT[s]、音速をC(331+0.6*t)[m/s]とすると超音波センサの式は
L = C*ΔT/2[m]
のようになります。
今回は簡単に計算するために室温20[℃]、音速を343[m/s]として計算すると
L = 171.5*ΔT[m]
となります。今回はこの数字を使っていきます。
今回使用する超音波センサはHC-SR04です。
HC-SR04は4本のピンがあり左からVcc(5V)、Trig(送信側ピン)、Echo(受信側ピン)、Gnd(グラウンド)となっています。測定距離範囲は2㎝~4mです。
手順
まずハード側をやっていきます。
ArduinoのグラウンドピンをHC-SR04のグラウンドピンに、Arduinoの5VピンをHC-SR04のVccピンに、ArduinoのD10ピンをHC-SR04のTrigピンにArduinoのD11ピンをHC-SR04のEchoピンに接続します。
今回はハード側はこれで完成です。
次にプログラムを書いていきます。
Arduino IDEを開いて次のコードを書き込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #define TRG 10 #define ECH 11 #define HIGHTIME 10 void setup() { Serial.begin(9600); pinMode(TRG, OUTPUT); pinMode(ECH, INPUT); } void loop() { int diff; float dis; digitalWrite(TRG, HIGH); delayMicroseconds(HIGHTIME); digitalWrite(TRG, LOW); diff = pulseIn(ECH, HIGH); dis = (float)diff * 0.01715; Serial.print(dis); Serial.println("cm"); delay(1000); } |
コードの説明をしていきます。まず最初に
#define TRG 10
#define ECH 11
でArduinoのD10ピン、D11ピンがHC-SR04のTrigピン、Echoピンと接続していると定義しています。
次の行の
HIGHTIMEというのはTrigピンがHIGHになってからOFFになるまでの時間です。ここでは10マイクロ秒に設定するため
HIGHTIME = 10としています。
setup()関数に入っていきます。
Serial.begin(9600)
はシリアルモニタを起動するコードです。
pinMode(TRG, OUTPUT)
pinMode(ECH, INPUT)
でTrigピンを出力に、Echoピンを入力に設定しています。
loop()関数に入っていきます。まず、
int diff
float dis
を定義します。
diffは音の時差です。
disは超音波センサで計測された距離です。
次に
digitalWrite(TRG, HIGH);
delayMicroseconds(HIGHTIME);
digitalWrite(TRG, LOW);
により、10マイクロ秒の超音波を発信します。
そして、
diff = pulseIn(ECH, HIGH);
ですが、pulseIn関数によってECHピンに入力されるパルスを検出します。
今回ではパルスの種類をHIGHに指定したのでpulseIn関数はEchoピンがHIGHになると同時に時間の計測をはじめ、LOWに戻ったらそこまでの時間をマイクロ秒単位で返します。
超音波センサではTrigピンがHIGHになったときにEchoピンもHIGHになるため、デジタル信号がTrigから出力されてからEchoピンに入力されるまでの時間を読み取れるということになります。
dis = (float)diff * 0.01715;
は前述した超音波センサの式の通りですね。
ちなみにdiffの単位がμsなので171.5[m/s] = 0.01715[cm/μs]に単位を変更しています。
最後に
Serial.print(dis);
Serial.println("cm");
でシリアルモニタに計測した距離を表示します。
最後の行の
delay(1000)は次のloopまでの待機時間です。
この値を短くするほど早いサイクルで距離を測ることができます。
このコードを書き込んで、トランプの箱を壁にして距離を測ってみる。
見づらい写真ですが10センチの距離をとっています。
シリアルモニタを見てみると…
大体10センチくらいでちゃんと測れてますね。
壁の位置を動かしていくと…
ちゃんと数値も変化していますね。
まとめ
今回は超音波センサを使って距離を測定することができました。。
2㎝~400㎝まで測定できるようなので超音波センサは様々なものに使えそうな気がします。
今回はこれで終わります。
ではまた!
追記:NewPingというライブラリを使用するともっと簡単にコードが書けるのでそちらも記事にしました。