Lesson 22

🚗 動くロボットカー!
障害物を自動で避けよう

DCモーター2個+超音波センサーを組み合わせて、自分で考えて走る自律ロボットカーを作ろう!障害物を見つけたら自動で回避する「頭脳」を作るよ!

⏱ 90分 🤖 Arduino 🚗 DCモーター×2 📡 超音波 🏆 総合作品
🚗

今日の目標

🏆 Chapter 5 総合作品 ② — DCモーター(Lesson 17)+超音波センサー(Lesson 13)を組み合わせた自律ロボット!
🚗
左右2つのモーターで走行・旋回できる
📡
超音波センサーで障害物を検知できる
🧠
障害物回避アルゴリズムを実装できる
🔗
センサー入力→判断→モーター制御の流れを理解する

必要なもの

🔵

Arduino Uno

マイコンボード本体

⚙️

L298Nモータードライバー

2チャンネルで左右モーターを制御

🌀

DCモーター×2+タイヤ

左右の車輪を別々に制御

📡

HC-SR04超音波センサー

前方の障害物との距離を計測

🔋

外部電源 6〜9V

モーター2個を動かす電力が必要

🚗

ロボットカーシャーシ

2WDシャーシキット(車体フレーム)

しくみを学ぼう

🚗 左右モーターで方向を制御

動き 左モーター 右モーター
⬆️ 前進正転正転
⬇️ 後退逆転逆転
↩️ 左ターン停止 or 逆転正転
↪️ 右ターン正転停止 or 逆転
⏹ 停止停止停止

🧠 障害物回避アルゴリズム

🔄 loop() スタート
📡 超音波で距離を測る
❓ 距離 < 20cm?
YES(近い)
⏹ 停止
⬇️ 少し後退
↪️ 右ターン
NO(遠い)
⬆️ 前進
🔄 繰り返し

📡 HC-SR04おさらい(Lesson 13)

digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long dur = pulseIn(ECHO, HIGH);
float dist = dur * 0.034 / 2;

Arduinoコード

robot_car.ino
// ── ピン定義 ──
// 超音波センサー
const int TRIG = 9, ECHO = 10;

// 左モーター(L298N チャンネルA)
const int ENA = 3, IN1 = 4, IN2 = 5;

// 右モーター(L298N チャンネルB)
const int ENB = 6, IN3 = 7, IN4 = 8;

const int SPEED       = 180;  // 通常スピード (0〜255)
const int AVOID_DIST  = 20;   // 障害物判定距離 (cm)

void setup() {
  pinMode(TRIG, OUTPUT); pinMode(ECHO, 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(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long dur = pulseIn(ECHO, HIGH);
  return dur * 0.034 / 2.0;
}

// ── モーター制御関数 ──
void moveForward(int spd) {
  analogWrite(ENA, spd); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  analogWrite(ENB, spd); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void moveBackward(int spd) {
  analogWrite(ENA, spd); digitalWrite(IN1, LOW);  digitalWrite(IN2, HIGH);
  analogWrite(ENB, spd); digitalWrite(IN3, LOW);  digitalWrite(IN4, HIGH);
}
void turnRight(int spd) {
  analogWrite(ENA, spd); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  analogWrite(ENB, 0);   // 右モーター停止
}
void stopAll() {
  analogWrite(ENA, 0); analogWrite(ENB, 0);
}

void loop() {
  float dist = getDistance();
  Serial.print("Distance: "); Serial.println(dist);

  if (dist < AVOID_DIST && dist > 0) {
    // 障害物発見!回避行動
    stopAll();         delay(200);
    moveBackward(SPEED); delay(400);
    turnRight(SPEED);   delay(500);
    stopAll();         delay(100);
  } else {
    // 安全!前進
    moveForward(SPEED);
  }
}
📦
関数で整理
moveForward()・moveBackward()・turnRight()などの関数にまとめることで、loop()のコードが読みやすくなります。
delay()で動作時間を決める
後退400ms・旋回500msのように、delay()で動く時間を調整します。値を変えることで回り方を変えられます。
⚠️
dist > 0 の条件
HC-SR04が範囲外(400cm以上・壁なし)のとき0を返すことがあります。0cmと誤判定しないよう「dist > 0」も条件に入れます。
🎛
AVOID_DISTで感度調整
20cmを大きくすると早めに回避、小さくすると障害物に近づいてから回避します。スピードも同様に定数で調整可能!

配線図

Arduino Uno D3 D4 D5 D6 D7 D8 D9 D10 5V GND L298N モータードライバー ENA IN1 IN2 ENB IN3 IN4 Vin GND L+ L− R+ R− HC-SR04 超音波センサー VCC TRIG ECHO GND 左モーター 🌀 右モーター 🌀 外部電源 6〜9V ENA/ENB IN1〜IN4 TRIG ECHO 左モーター 右モーター 外部電源
💡 L298Nの2チャンネル
L298Nには左右2つのモーター出力があります。チャンネルAが左モーター(ENA/IN1/IN2)、チャンネルBが右モーター(ENB/IN3/IN4)です。

チェックリスト

チャレンジクイズ!

🚗 ロボットカーシミュレーター

ロボットカーの動きをシミュレートしよう!障害物の距離を変えて動作を確認できるよ。

⬆️ 前進中
80
cm
前方距離
✅ 安全
左モーター
⬆️
PWM: 180
右モーター
⬆️
PWM: 180
80cm
手動でテスト
float dist = getDistance(); // → 80 cm
if (dist < 20 && dist > 0) {
  stopAll(); moveBackward(); turnRight();
  // → 前進
} else {
  moveForward(180); // ⬆️ 前進
}

まとめ

🚗
2モーターで方向制御
左右の速度差で
前進・後退・旋回
📦
関数で整理
moveForward()等に
まとめて読みやすく
🧠
回避アルゴリズム
距離判定→停止→
後退→ターン→前進
🏆
自律ロボット完成!
センサー入力を使った
自律制御の基礎習得
🌤️
次のレッスン
Lesson 23: 気象ステーションを作ろう!
温度・湿度・明るさをまとめて計測・LCD表示する本格的な気象観測ステーションを作ろう!