Arduino×超音波センサー(HC-SR04)で障害物検知ロボットを自作する方法【回路+コード完全解説】
「超音波センサーって難しそう…」「ロボットを自作するなんて自分には無理かも」
そう思っているあなた、実はArduinoと超音波センサー(HC-SR04)を組み合わせれば、初心者でも障害物を検知して自動で避けるロボットが作れます!
今回は回路の組み方からArduinoのコードまで、一気に解説していきます。「電子工作ってよくわからない」という方でもざっくりとした流れがつかめるはずです。ぜひ最後まで読んでみてください 🤖
この記事で作るもの・対象読者

対象読者: Arduinoを触り始めた初〜中級者の方。LEDやボタンは動かしたことあるけど、センサーやモーターは初めて、という方にちょうどいい内容です。
完成イメージ: 超音波センサーで前方の障害物との距離をリアルタイムに測定し、一定距離以内に近づいたらモーターを制御して自動で向きを変える「障害物検知ロボット」です。
用意するもの:
- Arduino UNO(互換機でもOK)
- 超音波センサー HC-SR04
- DCモータードライバー L298N
- DCモーター × 2(タイヤ付きシャーシキット)
- ジャンパーワイヤー・ブレッドボード
- モバイルバッテリーまたは単3電池ボックス(6V程度)
HC-SR04の仕組みをざっくり理解しよう
まず超音波センサーの動きを頭に入れておきましょう。イメージとしては「コウモリのエコーロケーション」と同じです。
HC-SR04は2本の「目」を持っています。
- Trig(トリガー)ピン: 超音波を発射する
- Echo(エコー)ピン: 跳ね返ってきた超音波を受け取る
発射してから返ってくるまでの時間を測れば、距離が計算できます。音速は約340m/s(0℃付近で331m/s)なので、こんな計算式になります。
距離(cm) = 往復時間(マイクロ秒) × 音速(0.0343cm/μs) ÷ 2
÷2しているのは、音が「行って帰ってくる」往復分だからです。ここ、よく忘れがちなのでしっかり覚えておきましょう!
回路の組み方【HC-SR04とArduinoの配線】
まずはセンサー単体で距離測定ができるかテストする回路から始めます。
HC-SR04 → Arduino UNO の配線:
- VCC → 5V
- GND → GND
- Trig → デジタルピン 9
- Echo → デジタルピン 10
L298Nモータードライバーはあとで追加しますが、まずはこのシンプルな配線でセンサーが正しく動くか確認をしておきましょう。動作確認をしてから次のステップへ進む、これが電子工作の鉄則です ✅
STEP1:距離測定スケッチを書いてみよう
まず距離をシリアルモニターに表示するだけのスケッチです。ポイントを先にまとめると:
pulseIn()関数でEchoピンのHIGHパルス時間(マイクロ秒)を取得- 取得した時間を計算式に当てはめて距離(cm)に変換
- シリアルモニターで確認しながらデバッグ
// HC-SR04 距離測定スケッチ
const int trigPin = 9; // Trigピンをデジタル9に接続
const int echoPin = 10; // Echoピンをデジタル10に接続
void setup() {
pinMode(trigPin, OUTPUT); // Trigは出力(超音波を発射)
pinMode(echoPin, INPUT); // Echoは入力(受け取り)
Serial.begin(9600); // シリアルモニター開始
}
void loop() {
// Trigピンをいったんローにして安定させる
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// 10マイクロ秒HIGHにして超音波を発射
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Echoピンがハイになっている時間(往復時間)を取得
long duration = pulseIn(echoPin, HIGH);
// 距離を計算(音速0.0343cm/μs ÷ 2)
float distance = duration * 0.0343 / 2;
Serial.print("距離: ");
Serial.print(distance);
Serial.println(" cm");
delay(200); // 0.2秒ごとに計測
}
これを書き込んで、シリアルモニター(ボーレート:9600)を開いてみてください。手をかざすと距離の数字が変わるはずです。ここまで動いたら、センサーは正常に動いています 🎉
STEP2:L298Nモータードライバーを追加して動かす
次にモータードライバー(L298N)を追加します。L298Nは「Arduinoからの小さな信号」を「モーターを動かせる大きな電力」に変換する役割を担います。
L298N → Arduino UNO の追加配線:
- ENA → デジタルピン 5(PWM対応ピン)
- IN1 → デジタルピン 2
- IN2 → デジタルピン 3
- ENB → デジタルピン 6(PWM対応ピン)
- IN3 → デジタルピン 4
- IN4 → デジタルピン 7
- GND → ArduinoのGNDと共通GND
- モーター電源(6〜12V)→ L298Nの+12V端子と電源GND
⚠️ 注意: ArduinoとL298NのGNDは必ず共通にしてください。これを忘れると正しく動作しません。初心者がよくハマるポイントです!
STEP3:障害物検知ロボットの完成スケッチ
距離測定とモーター制御を合体させた完成版コードです。障害物が20cm以内に来たら後退→右折して回避する動作をします。
// 障害物検知ロボット 完成スケッチ
// --- 超音波センサーピン設定 ---
const int trigPin = 9;
const int echoPin = 10;
// --- モータードライバー(L298N)ピン設定 ---
const int ENA = 5; // 左モーター速度(PWM)
const int IN1 = 2; // 左モーター方向1
const int IN2 = 3; // 左モーター方向2
const int ENB = 6; // 右モーター速度(PWM)
const int IN3 = 4; // 右モーター方向1
const int IN4 = 7; // 右モーター方向2
const int SPEED = 150; // モーター速度(0〜255)
const int AVOID_DISTANCE = 20; // 障害物回避する距離(cm)
void setup() {
// センサーピン設定
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// モーターピン設定
pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
Serial.begin(9600);
}
// --- 距離測定関数 ---
float getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.0343 / 2;
}
// --- モーター制御関数 ---
void moveForward() {
// 左右モーターを前進方向に回す
analogWrite(ENA, SPEED); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
analogWrite(ENB, SPEED); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void moveBackward() {
// 左右モーターを後退方向に回す
analogWrite(ENA, SPEED); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
analogWrite(ENB, SPEED); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void turnRight() {
// 左モーターのみ前進→右に旋回
analogWrite(ENA, SPEED); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
analogWrite(ENB, 0); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void stopMotors() {
analogWrite(ENA, 0); analogWrite(ENB, 0);
}
void loop() {
float distance = getDistance();
Serial.print("距離: ");
Serial.print(distance);
Serial.println(" cm");
if (distance > 0 && distance < AVOID_DISTANCE) {
// 障害物が近い → 後退してから右折
Serial.println("障害物検知!回避します");
moveBackward();
delay(500);
turnRight();
delay(600);
} else {
// 障害物なし → 前進
moveForward();
}
delay(100);
}
ここが重要です。このコードの動作をまとめると:
- ✅ 距離 > 20cm:前進し続ける
- ✅ 距離 ≤ 20cm:後退500ms → 右折600ms → 再び前進
- ✅ シリアルモニターで距離と状態をリアルタイム確認できる
動かない・おかしい場合のチェックリスト
うまく動かないときは、以下を順番に確認してみてください。
- ☐ 距離が0または変な値になる: EchoピンとTrigピンが逆になっていないか確認
- ☐ モーターが全く動かない: L298NとArduinoのGNDが共通になっているか確認
- ☐ 片方のモーターしか動かない: ENAまたはENBのPWM配線を確認
- ☐ ロボットが逆方向に進む: IN1/IN2またはIN3/IN4の配線を入れ替える
- ☐ 距離は測れるがモーターが弱い: モーター用電源の電圧が足りていない可能性あり(4.5V以上推奨)
「センサーだけ」「モーターだけ」と部品を分けてひとつずつ確認するのが電子工作デバッグの基本です。一度に全部試すと、どこが原因かわからなくなるんですよね。
応用アイデア:もっと賢いロボットにする
基本の動作ができたら、こんな改造も面白いですよ 😊
- サーボモーターでセンサーを左右に振る: センサーを左右に回転させて「どちらに障害物が少ないか」を判断してから回避する
- 距離によって速度を変える: 遠いときは速く、近づくにつれてゆっくりにする(analogWriteの値を距離に応じて変化させる)
- ブザーを追加する: 障害物を検知したときにアラート音を鳴らす
- 複数センサーを搭載する: 前後左右にセンサーを増やして、より精度の高い回避ができる
まとめ
今回はArduinoと超音波センサー(HC-SR04)を使って、障害物を自動で検知して回避するロボットを作る方法を解説しました。
ポイントをおさらいすると:
- HC-SR04はTrigで超音波を発射、Echoで往復時間を受け取る
pulseIn()関数で時間を取得し、計算式で距離(cm)に変換する- L298Nモータードライバーを使えばArduinoでDCモーターを制御できる
- センサーとモーターを組み合わせれば障害物検知ロボットが完成する
「むずかしそう」が「できた!」に変わる瞬間、ぜひ体験してみてください。最初は距離をシリアルモニターに表示するだけでも十分です。一歩ずつ動作確認しながら進めれば、必ず完成します 💪
ぜひ自分なりにカスタマイズして、オリジナルロボットを作ってみてくださいね!
こちらも読まれています
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





