3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Arduino】超音波距離センサで距離を測ってLEDとブザーで警告する回路を作ってみた

Posted at

こんにちは。前回はArduinoでLEDを点滅させる「Lチカ」に挑戦しました。
👉 【Arduino】ブレッドボードに接続したLEDを点滅させる(Lチカ)

今回はその応用として、HC-SR04超音波センサを使って距離を測定し、距離に応じてLEDとブザーで警告する回路を作ってみました。

イメージとしては、車が障害物に接近することで警告を発するパーキングセンサーのような仕組みを想定しています。

スターターキットのチュートリアルを参考にしつつ、理解を定着させるために自分なりに組み立ててみた内容です。

やりたいこと

  • 距離が30cmより遠い → 青LED点灯(安全)
  • 距離が11〜30cm → 黄LEDが0.5秒周期で点滅(注意)
  • 距離が10cm以下 → 赤LEDとブザーが0.1秒周期で点滅(警告)

使用部品

  • Arduino Uno
  • HC-SR04 超音波距離センサ
  • LED(青・黄・赤)
  • アクティブブザー
  • 抵抗(220Ω × 3)
  • ブレッドボード、ジャンパーワイヤー
    ※各部品の画像は後述の配線写真を参照

回路図・配線写真

  • 回路図(左が超音波距離センサ、右がアクティブブザー)
    スクリーンショット 2025-11-09 123434.png

  • 配線写真(ピント合わせるの難しい...)
    20251109_041506156_iOS.jpg

ソースコード

#include "SR04.h"

// 各ピン番号を定義
#define TRIG_PIN 12       // HC-SR04のトリガー信号
#define ECHO_PIN 11       // HC-SR04のエコー信号
#define BLUE_LED 2        // 青LED
#define YELLOW_LED 3      // 黄LED
#define RED_LED 4         // 赤LED
#define BUZZER_PIN 5      // アクティブブザー

// グローバル変数の宣言
SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN);  // センサのインスタンスを作成
long distance;                         // 測定された距離(cm)

// LEDの点滅制御用のタイマー変数
unsigned long preYellowMillis = 0;  // 黄LEDの前回更新時刻
unsigned long preRedMillis = 0;     // 赤LEDの前回更新時刻
bool yellowState = false;           // 黄LEDの状態(ON/OFF)
bool redState = false;              // 赤LEDとブザーの状態(ON/OFF)

void setup() {
  Serial.begin(9600);  // シリアル通信を開始

  // 各出力ピンを設定
  pinMode(BLUE_LED, OUTPUT);
  pinMode(YELLOW_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
}

void loop() {
  // 距離を測定
  distance = sr04.Distance();

  // シリアルモニタに距離を表示
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  // 現在の時刻を取得(点滅制御用)
  unsigned long currentMillis = millis();

  // 距離が30cmより遠い → 緑LEDを点灯(安全)
  if (distance > 30) {
    digitalWrite(BLUE_LED, HIGH);
    digitalWrite(YELLOW_LED, LOW);
    digitalWrite(RED_LED, LOW);
    digitalWrite(BUZZER_PIN, LOW);
  }
  // 距離が10〜30cm → 黄LEDを0.5秒周期で点滅(注意)
  else if (distance > 10) {
    digitalWrite(BLUE_LED, LOW);
    digitalWrite(RED_LED, LOW);
    digitalWrite(BUZZER_PIN, LOW);

    // 0.5秒経過したら黄LEDの状態を反転
    if (currentMillis - preYellowMillis >= 500) {
      yellowState = !yellowState;
      digitalWrite(YELLOW_LED, yellowState);
      preYellowMillis = currentMillis;
    }
  }
  // 距離が10cm以下 → 赤LEDとブザーを0.1秒周期で点滅(警告)
  else {
    digitalWrite(BLUE_LED, LOW);
    digitalWrite(YELLOW_LED, LOW);

    // 0.1秒経過したら赤LEDとブザーの状態を反転
    if (currentMillis - preRedMillis >= 100) {
      redState = !redState;
      digitalWrite(RED_LED, redState);
      digitalWrite(BUZZER_PIN, redState);
      preRedMillis = currentMillis;
    }
  }

  delay(200);  // 測定の安定化用にdelayする
}

注意点

このコードで使用している SR04.h ライブラリは、Arduino IDEの「ライブラリを管理」からはインストールできませんでした。(見つけきれないだけかもしれませんが・・・)

代わりに、以下の手順でGitHubから手動で導入する必要があります。

  1. SR04ライブラリのGitHubページ にアクセス
  2. 「Code」ボタン → 「Download ZIP」でライブラリをダウンロード
  3. ZIPファイルを解凍
  4. 解凍したフォルダを Arduino のライブラリフォルダ(例:Documents/Arduino/libraries)に配置
  5. Arduino IDEを再起動すると、#include "SR04.h" が使えるようになります

ライブラリが正しく導入されていないと、コンパイル時に「SR04.hが見つかりません」というエラーが出るので注意してください。

工夫したポイント

  • LEDやブザーを点滅させる際に delay() を使わず、代わりに millis() を使って非同期に制御しています。
    delayは指定した時間だけArduinoの処理を完全に止めてしまうため、その間は他の処理(センサの測定や別のLED制御など)ができません。
    そこで、millis を使って「前回の点滅からどれだけ時間が経ったか」を自分で計算し、一定時間が経過したらLEDやブザーの状態を反転させるというロジックを取り入れました。

動作確認

実際に回路を組んで動作確認を行いました。以下の写真は、コップまでの距離ごとにLEDとブザーが正しく反応しているかを確認した様子です。

  • 緑LED点灯(距離31cm以上) → シリアルモニターにも「Distance: 31 cm」と表示されており、境界値が正しく判定されています。
    20251109_032529711_iOS.jpg

  • 黄LED点滅(距離11〜30cm) → メジャーで約15cmを確認。LEDが0.5秒周期で点滅しており、シリアルモニターにも「Distance: 15 cm」と表示されています。
    20251109_032613029_iOS.jpg

  • 赤LED+ブザー点滅(距離10cm以下) → メジャーで約10cmを確認。赤LEDとブザーが0.1秒周期で点滅・鳴動しており、シリアルモニターにも「Distance: 10 cm」と表示されています。
    20251109_032707713_iOS.jpg

いずれの状態でも、距離と表示・出力が一致しており、境界値の判定もバッチリでした。

おわりに

Lチカから始めて、センサやブザーを組み合わせたことで、 「自分で考えて作る」電子工作の楽しさを実感できました。

次はLCD表示やサーボ連動など、さらに応用してみたいです。 初心者の方にも参考になれば嬉しいです!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?