2017年1月30日月曜日

【Tips】Arduino Nanoで測距センサーを使う方法

Arduino Nanoで超音波測距センサーHC-SR04を使ってみようと思います。

超音波測距センサーとは

超音波測距センサーはソナー(Sonor)とも呼ばれる部品です。スピーカーから超音波を飛ばし、物に当たって跳ね返ってきた超音波をマイクで拾うことで距離を測ります。

音は340[m/s]で進むので音を出してから音を拾うまでの時間を計れば音の進んだ距離がわかるという仕組みです。




回路図


回路を次のように接続します。5Vの位置が分かりにくいですが間違えないようにしてください。



ちなみにArduino Nanoのピン名は以下のとおり。




プログラム


// Arduino Nano and HC-SR04 Sonor
// created by aoica
// http://aoica.blogspot.jp
// D12: Trigピン
// D11: Echoピン
int trig = 12;
int echo = 11;
int duration = 0; // 音の往復時間(μs)
float distance = 0.0; // 距離
void setup() {
Serial.begin(9600); // シリアル通信を開始
pinMode(trig, OUTPUT); // trig(D12)ピンを出力に指定
pinMode(echo, INPUT); // echo(D11)ピンを入力に指定
}
void loop() {
// Trigに起動パルスを送る
digitalWrite(trig, LOW);
delayMicroseconds(1);
digitalWrite(trig, HIGH);
delayMicroseconds(11);
digitalWrite(trig, LOW);
// EchoがHIGHの時間をμsで測る
duration = pulseIn(echo, HIGH);
// 往復時間が0より大きいなら表示
if (duration > 0) {
// 距離を計算
distance = 340.0 * (duration/2) * 100 / 1000000;
// 距離をシリアルモニタに表示
Serial.print(distance);
Serial.print("cm\n");
// 音の往復時間を初期化
duration = 0;
}
}

説明


31行目

pulseIn()関数はピンの入力がHIGHかLOWになっている時間を返す関数です。上のプログラムではpulseIn(echo, HIGH)としているので、echo(D11)ピンがHIGHになるとHIGHになっている時間を計測してマイクロ秒で返してくれます。

37行目

この行では距離を計算しています。単位変換を行っているので謎の数字が入っていますが、本質は単純です。




このことを念頭に置いて時間と距離と速さの関係を考えてみます。音速は340 [m/s]で一定なので音の移動時間が判れば、音の移動した距離が分かることになります。



プログラムではduration/2となっていますが、これは距離を半分にするためです。音はスピーカーから出て壁に当たり、マイクに入るという経路を移動しているため、音が移動するのにかかった時間は実際には往復時間となるため半分しているわけです。


動作確認


測った距離を表示するためのディスプレイがArduino Nanoには無いので、今回のプログラムではシリアル通信を使ってコンピュータにデータを送っています。Arduino IDEにはシリアル通信で送られてきたデータを表示するためにシリアルモニタという機能が付いているので使ってみます。Arduino IDEのウィンドウの右上(下の画像の赤丸のところ)をクリックすると、データが表示されると思います。



以上です。訂正等は下のコメント欄へどうぞ。

0 件のコメント:

コメントを投稿