超音波距離センサーを初めて使う人向けに記事を書いてみました。

対象の超音波距離センサーは送信部と受信部が一つになった物で、超音波の反射時間を利用して非接触で対象物までを測距するモジュール。

外部からトリガパルスを入力すると超音波パルス(8波)が送信され、反射時間信号をマイコン(Arduino等)で計算することによって距離を測ることができます。

超音波距離センサー

前述したように超音波送信部から超音波信号を出力し受信部で対象物からの反射波を受け反射波の到達時間と音速から距離を計算で求めるものです。

主な仕様

・測距範囲:2~400cm
(センサー基板正面を中心とした15度の範囲、分解能:0.3cm)
・電源電圧:DC 5.0V
・動作電流:15mA
・動作周波数:40kHz
・トリガ信号:10μS(TTLレベルのパルス波)
・エコー出力信号:反射(往復)時間
・サイズ:45×20×15mm
・型名:HC-SR04
※通電時はGND端子が最初に接続されるようにしてください。

外部サイト(秋月電子)になりますがHC-SR04のデータシートはこちらです。

接続ピン

4本の接続ピンがあり以下の機能です、

  • Vcc:モジュール供給電源ピンで通常は+5.0VDCを加える。
  • GND:グランド線
  • Trig:10usecのパルスを加えることで超音波を送信する。
  • Echo:送信開始から受信までの時間(往復)をHGHレベルのパルスで出力。(HIGHレベルの継続時間を測定)

Arduinoとの接続

  • 電源ピン(VCCとGND)は文字通りArduinoの電源ピンに接続。
  • Echoピン、Trgiピンは両方ともデジタル入出力で使用するのですがデジタルピンのD2~D13は今後接続予定の7セグLED用として予約しておき今回はアナログピン(A4&A5)をデジタルピンとして使用。

距離測定方法

測定時のタイミング図

Trigピン、Echoピンのタイミングと超音波の送信・受信のタイミングを表しているタイミング図を以下に載せました。

測定手順

上記タイミング図に従い測定手順を書いてみます。

  1. Trigピンに10usecのパルスを入力する。
  2. このパルスをトリガーにして超音波モジュールの送信部から40KHz音波が8個のバーストとなって出力される。(バースト生成は超音波モジュール内でされる)
  3. Echoピンに送信開始から受信までの時間に相対するパルスが出力される(HIGHのパルスとして)、このハイレベルの時間から距離を計算する。

注)測定終了後に次の測定を開始するまでに最低でも60msecの間隔を開ける必要があります。

距離計算式

Distance(cm) = Highレベル時間(usec)/ 58

(音速を345m/secとして計算)

計算式の求め方

距離=速度x時間より

Distance(cm)
={34500(cm)/sec x Highレベル時間(usec) }÷2
= (0.0345/2 ) x Highレベル時間(usec)
= Highレベル時間(usec) / 58

注)プログラムでは整数を使うので計算式も実数表現でなく整数表現としてます。

測定プログラム

プログラムリスト

ここまでの説明を生かしベーシックなプログラムを書いてみます、

測定値の加工はせずにそのまま表示するだけの簡単なものです、表示はシリアルモニタに出力します。

スケッチファイル:”SonarDistanceMeasure_Basic_HC-SR04″

 

以下にプログラム全体のリストを載せました。

#define ECHOPIN 18 // Pin to receive echo pulse (A4pin)
#define TRIGPIN 19// Pin to send trigger pulse (A5pin)
void setup(){
Serial.begin(9600);
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
}
void loop(){
digitalWrite(TRIGPIN, LOW);// Set the trigger pin to low for 2uS
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH); // Send a 10uS high to trigger ranging
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);// Send pin low again
int distance = pulseIn(ECHOPIN, HIGH);// Read in times pulse
distance= distance/58;// Calculate distance from time of pulse
Serial.print("Distance:");
Serial.print(distance);
Serial.println(" cm");
delay(60); // Wait 60mS before next ranging
}

プログラムの説明

  1. 測定値の表示はシリアルモニタを使ってます。
    注)シリアルモニタの使い方はこちらのリンク先に詳しい説明があるのでそちらを参照してください。
  2. pulseIn()関数:EchoピンがHighレベルを保持してる時間の測定に使用している関数、第一引数=ピン番号、第二引数=時間測定対象のレベルを指定(=HIGHまたはLOW)

補足)PuleIn()関数

  • このpulseIn()関数は特定のピンに入力された信号のパルス幅(HIGHまたはLOW)を測定するのにはとても便利です。
  • このサイト「Arduinoソフトウェアの内部構造」に詳細が記載されてます。
  • 内部構造的には指定ピンの状態を監視するループを作りそのループ回数から時間に変換するという処理ということです。
  • そのため割り込み処理をどこかで使用すると精度が出なくなるので注意が必要です。