見出し画像

超音波センサーで距離を測る方法!LEDを使った応用例も紹介します #14 【Arduino UNO R4】

今回は、Arduinoで超音波センサーを使って距離を測る方法についてご紹介します。

超音波センサーは触らずに物体との距離を測ることができます。

応用すれば、「物体が一定の距離まで来たら停止する」という動きをロボットにさせることもできます。

ぜひこれを機に、超音波センサーの使い方をマスターしましょう!


はじめに

この記事では、Arduino UNOで超音波センサーを使って距離を測定する方法についてご紹介しています。

下記の注意事項をお読みいただいた上で、ぜひお楽しみください。

【 注意 】
当Webサイトに掲載された内容によって生じた損害等の一切の責任を負いません。また生じた問題についてはご自身の責任において解決いただくことをあらかじめご承知おきください。詳しくは下記URLの免責事項をご確認願います。当サイトの免責事項に同意いただける場合に限り、当サイトの内容をご利用いただけます

https://note.com/shingo_shirogane/n/n3d5686bf512b

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と組み合わせる応用例も簡単にですが、解説しました。そこまで難しくないので、ぜひ挑戦してみてください。

もしこの記事がお役に立てたら、"スキ"や"サポート"をいただけると励みになります!

最後まで読んでいただき、ありがとうございました。

いいなと思ったら応援しよう!

みんなの電気・電子回路
今後ともお役に立てるような記事を発信していきます!よろしければサポートいただけると嬉しいです!