超音波センサーで距離を測る方法!LEDを使った応用例も紹介します #14 【Arduino UNO R4】
今回は、Arduinoで超音波センサーを使って距離を測る方法についてご紹介します。
超音波センサーは触らずに物体との距離を測ることができます。
応用すれば、「物体が一定の距離まで来たら停止する」という動きをロボットにさせることもできます。
ぜひこれを機に、超音波センサーの使い方をマスターしましょう!
はじめに
この記事では、Arduino UNOで超音波センサーを使って距離を測定する方法についてご紹介しています。
下記の注意事項をお読みいただいた上で、ぜひお楽しみください。
Youtube動画
超音波センサーの使い方をとLEDとの応用例について、動画で解説しています。短い動画ですので、サクッとご覧いただけます。
必要なもの
1. マイコンボード
本記事では、Arduino UNO R4 Wi-Fiを使います。
2. 電子部品
以下の電子部品を使います。
超音波センサー(HC-SR04)
LED(赤×2 黄色×3 緑×3)*
抵抗(0.25W)** × 9
ジャンパーワイヤー 適量
ブレッドボード(大と小)
*ELEGOO Arduino用電子LearningキットE3に付属
**必ずLEDに合わせて、適切に抵抗値を選んでください。
超音波センサーとは?
超音波センサーは、超音波を使って物体までの距離を測るセンサーです。
片方から超音波を発生させ、もう片方で反射して帰ってくる超音波を検知し、それにかかった時間を測ります。
計測した時間は往復にかかった時間なので、物体に到達するまでの時間はその半分。それに音速の340m/sをかけることで、物体までの距離が分かる、という仕組みです。
超音波センサーを動かすための回路
回路図
Arduino UNOで使う場合の配線図はこんな感じです。
Vccは+5Vに、GndはGNDに接続します。
超音波センサーのTrigピンとEchoピンはそれぞれ、ArduinoのI/Oピンに繋ぐのですが、今回は例えば、7ピン、8ピンに繋いでみました。
配線の様子
超音波センサーをブレッドボードに挿すときは慎重に。ピンを折らないように気を付けてください。
超音波センサーの制御方法
センサーのTrigピンにHIGHを出力すると、超音波が発生します。この時、パルス幅は10usにします。
超音波が発生すると、echoピンがHIGHに上がります。そして超音波が反射して返ってきたことを感知した時、echoピンはLOWになります。
このHIGHになってからLOWになるまでのパルス幅をプログラムで計測することで、往復するのにかかった時間を求めます。
往復する時間が分かれば、あとはそれを2で割った値に音速を掛けることで距離が求まります。
超音波で距離を測るプログラム
ソースコードが👇になります。注意事項をよくお読みいただき、ご使用ください。
//当Webサイトに掲載された内容によって生じた損害・損失の一切の責任を負いません。
//当webサイトの免責事項に同意いただける場合に限り、プログラムをご利用いただけます。
//定数の定義
#define TEMP 27.5 //℃
//測定周期(200ms以上)
#define MEASURE_CYCLE 200 //ms
//ピン
#define TRIG_PIN 7
#define ECHO_PIN 8
//変数
double sound_speed = 331.5 + 0.61 * TEMP; //m/sec
double echo_duration = 0; //音波が返ってくるまでの時間
double distance = 0; //対象までの距離
void setup() {
//ピン設定
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
//初期化
digitalWrite(TRIG_PIN, LOW);
//digitalWrite(ECHO_PIN, LOW);
//シリアル通信
Serial.begin(9600);
delay(1000);
while(!Serial);
//パラメーター確認
Serial.print("音速:");
Serial.print(sound_speed);
Serial.println(" m/s");
}
void loop() {
//超音波を射出
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
//計算
echo_duration = pulseIn(ECHO_PIN, HIGH); //us
distance = (echo_duration * 0.000001 / 2) * sound_speed * 100; //cm換算
//シリアルモニタに表示
Serial.print("距離:");
Serial.print(distance, 2); //小数点以下2桁を表示
Serial.println(" cm");
delay(MEASURE_CYCLE); //測定間隔
}
動作確認①
図のように、箱を20cmあたりに置くと、シリアルモニタにはおよそ20cmが表示されています。
そこから10cmのあたりまで動かすと、それに応じてシリアルモニターの距離も変化していきます。(多少ばらつきます)
超音波センサーとLEDの応用例
では応用として、距離に応じてLEDを光らせる回路を作ってみます。
回路は簡単で、必要な数だけLEDをArduinoのIOポートに繋ぐだけです。今回は緑が3個、黄色が3個、赤が2個の合計8個を繋ぎました。
LEDの抵抗は赤と黄色が10kΩ、緑は100kΩを使いましたが、必ず使用するLEDに合わせて計算し、適切に選んでください。
また、超音波センサーを繋いでいるピンが変更されていることにも気を付けてください。
一方でプログラムはどうするのかというと、物体までの距離が数値で分かっているので、
例えば
17.5~20cmの間なら1つ目のLEDを点灯し、
15cm~17.5cmの間だったら2つ目のLEDまでを点灯
12.5cm~15cmの間だったら3つ目のLEDまでを点灯、
という風に、if else文で距離の条件をそれぞれ書いていけば、距離に応じてLEDを光らせることができます。
ソースコードが👇になります。注意事項をよくお読みいただき、ご使用ください。
//当Webサイトに掲載された内容によって生じた損害・損失の一切の責任を負いません。
//当webサイトの免責事項に同意いただける場合に限り、プログラムをご利用いただけます。
//定数の定義
#define TEMP 27.5 //℃
//測定周期(200ms以上)
#define MEASURE_CYCLE 200 //ms
//ピン
#define TRIG_PIN 11
#define ECHO_PIN 13
//変数
double sound_speed = 331.5 + 0.61 * TEMP; //m/sec
double echo_duration = 0; //音波が返ってくるまでの時間
double distance = 0; //対象までの距離
void setup() {
//ピン設定
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
//初期化
digitalWrite(TRIG_PIN, LOW);
//digitalWrite(ECHO_PIN, LOW);
//シリアル通信
Serial.begin(9600);
delay(1000);
while(!Serial);
//パラメーター確認
Serial.print("音速:");
Serial.print(sound_speed);
Serial.println(" m/s");
}
void loop() {
//超音波を射出
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
//計算
echo_duration = pulseIn(ECHO_PIN, HIGH); //us
distance = (echo_duration * 0.000001 / 2) * sound_speed * 100; //cm換算
ledOff(); //LED初期化
ledOn(distance); //距離に応じてLED点灯
//シリアルモニタに表示
Serial.print("距離:");
Serial.print(distance, 2); //小数点以下2桁を表示
Serial.println(" cm");
delay(MEASURE_CYCLE); //測定間隔
}
void ledOn(double ref_distance){
if(ref_distance <2.5){
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 2.5 && ref_distance < 5.0){
digitalWrite(1, LOW);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 5.0 && ref_distance < 7.5){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 7.5 && ref_distance < 10.0){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 10.0 && ref_distance < 12.5){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 12.5 && ref_distance < 15.0){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 15.0 && ref_distance < 17.5){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
else if(ref_distance >= 17.5 && ref_distance < 20.0){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}else{
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
}
void ledOff(){
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
動作確認②
超音波センサーに近づけば近づくほど、図のように点灯するLEDが増えていきます。
おわりに
いかがだったでしょうか。
今回は、超音波センサーを使って物体との距離を測る方法についてご紹介しました。
またLEDと組み合わせる応用例も簡単にですが、解説しました。そこまで難しくないので、ぜひ挑戦してみてください。
もしこの記事がお役に立てたら、"スキ"や"サポート"をいただけると励みになります!
最後まで読んでいただき、ありがとうございました。