以前に赤外線を使って距離を測る回路を作成しました。今回は赤外線以外に超音波を使って距離を測る回路を作成します。
超音波は人には聞こえない音であり、蝙蝠やイルカなどの生物が障害物を避けるために発しています。赤外線で距離を測るのと同様に超音波も物体に対して音を出し、反射して受信するまでの時間をもとに距離を測定します。
超音波センサとは
超音波センサとは、センサから超音波を発して物体から反射してくるまでの時間をもとに距離を計測するセンサです。超音波センサには通常は超音波としてパルス波を発する送信する端子と反射してきた超音波を受信する端子があります。音の速度は一定であるので、音波を使うことによって容易に距離が求められるのです。
HC-SR04
今回使う超音波センサはHC-SR04です。
データシート(下表)を見ると供給電圧は直流の5Vですので、Arduinoの5Vで問題なさそうです。流れる電流も15mAと大きくないのでトランジスタなどを使用する必要もありません。
測定範囲は2cm ~ 400cmですので、範囲外を検知するようにプログラムの記述が必要そうです。また、送信する超音波(パルス波)は10μs周期となっています。
Vcc端子には電源をつなぎ、GND端子にはGNDをつなぎます。Trig端子は超音波を発する信号を送る端子ですので、デジタルピンにつなぎます。Echo端子は反射した超音波を受信する端子ですので、こちらもデジタルピンにつないでおきます。
超音波センサを使って距離を測定する
超音波センサを使って計測した距離をシリアル通信で表示する回路を作成します。計測範囲外の場合は『 被写体との距離が適切ではありません。 』と表示するとともにLEDを点灯させます。
作成した回路
作成した回路は下図をご覧ください。
使用した装置及び部品は下表をご覧ください。
Arduino | マイコン搭載の小型コンピュータ |
ブレッドボード | 抵抗・ジャンパー線などを使って回路を作る基板 |
ジャンパー線 | 電気を中継する線 |
LED | 順方向に電圧を加えると発光する半導体 |
抵抗510Ω | 電圧を下げる端子 |
超音波センサ(HC-SR04) | 超音波の反射を使って距離を計測するセンサ |
プログラムコード
プログラムコードは以下の通りです。
/*Arduinoのピン*/
const uint8_t TRIGER_PIN = 6;
const uint8_t ECHO_PIN = 7;
const uint8_t LED_PIN = 13;
/*音速定義*/
const double SPEED_OF_SOUND = 340.0;
/*超音波センサの計測範囲定義*/
const int MIN_RANGE = 2;
const int MAX_RANGE = 400;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
/* ピンの状態設定 */
pinMode(TRIGER_PIN,OUTPUT);
pinMode(ECHO_PIN,INPUT);
pinMode(LED_PIN,OUTPUT);
/* 初期状態 */
digitalWrite(TRIGER_PIN,LOW);
digitalWrite(LED_PIN,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
unsigned long roundTripTime;//超音波の往復時間
double distance;//距離
//パルスを10μs送信
digitalWrite(TRIGER_PIN,HIGH);
delayMicroseconds(10);
digitalWrite(TRIGER_PIN,LOW);
//ECHO側でパルス(μs)の受信を検知(High→Lowになった時間を計測)
roundTripTime = pulseIn(ECHO_PIN,HIGH);
//距離を算出
distance = (SPEED_OF_SOUND*((double)100/1000000))*(roundTripTime/2);
//計測可能範囲内かどうか
if(distance <= MIN_RANGE || distance >= MAX_RANGE)
{
Serial.println("被写体との距離が適切ではありません。");
digitalWrite(LED_PIN,HIGH);
}
else
{
Serial.print("距離:");
Serial.print(distance);
Serial.println("cm");
digitalWrite(LED_PIN,LOW);
}
delay(500);
}
トリガー端子を10μsだけHIGHにしてパルス波を送信しています。
//パルスを10μs送信
digitalWrite(TRIGER_PIN,HIGH);
delayMicroseconds(10);
digitalWrite(TRIGER_PIN,LOW);
エコー端子がHIGHになった時間を算出して距離を求めています。公式は、距離 = 音速 × 時間/2となります。時間/2としているのは、エコーがLOW→HIGHになるまでの時間が超音波の送信時間と受信時間の合計値となっており、必要な時間は反射時間だけですので2で割っています。また音速の単位をcm/μsに変換しています。
//ECHO側でパルス(μs)の受信を検知(High→Lowになった時間を計測)
roundTripTime = pulseIn(ECHO_PIN,HIGH);
//距離を算出
distance = (SPEED_OF_SOUND*((double)100/1000000))*(roundTripTime/2);
結果を表示した後にエコー端子をLOWにしています。
Serial.print("距離:");
Serial.print(distance);
Serial.println("cm");
digitalWrite(LED_PIN,LOW);
実行結果
実行結果は以下の図をご覧ください。
測定範囲外の場合は以下の動画のようにLEDが点灯します。
まとめ
今回は超音波センサを使って距離を計測しました。以前は赤外線を使って距離を計測しましたが、赤外線のデメリットとしては周りにリモコンなど赤外線を発する製品があると干渉を受けやすい点があります。超音波センサは赤外線を使わないので関係ありません。
一方で回りに超音波を使う製品があると超音波センサは干渉を受けるデメリットがあります。
どちらのセンサを使うかは、使用する環境下には赤外線が多くあるか、超音波が多くあるかなどを気にして決めるといいかと思います。