Arduino UNOとモーターシールドで作る人追従ロボット
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Adafruit モーターシールド | 1 |
| SG90 マイクロサーボ | 1 |
| IRセンサー(赤外線透過型) | 2 |
| 超音波センサー HC-SR04 | 1 |
| DCギアードモーター + ホイール | 4 |
| ジャンパーワイヤー | 1式 |
| 9V電池 | 1 |
| ロッカースイッチ (SPST) | 1 |
使用ソフトウェア
- Arduino IDE
プロジェクト概要
パンデミック中の自宅学習プロジェクトとして、「人を追従するロボット(Human Following Bot)」を製作しました。2つのIRセンサーで左右の障害物を検知して方向制御し、超音波センサーで前方距離を測って前進/後退/停止を判断します。サーボモーターに超音波センサーを搭載し、首を振って広範囲をスキャンします。段ボールシャーシで手軽に組める入門向けロボットです。
製作手順
- 段ボールに4輪モーターを取り付けてシャーシを作る
- 前面左右にIRセンサーを配置(左右検知用)
- サーボを車体中央に固定、超音波センサーをサーボホーンに取り付け
- Arduinoとモーターシールドを搭載
- 回路図に従って配線
- スケッチを書き込み、IRセンサーの感度を調整
- 9V電池とスイッチを接続して完成
動作ロジック
- 両IRセンサー反応 + 距離10-30cm: 前進
- 左IRのみ反応: 右旋回(左モーター前進、右モーター後退)
- 右IRのみ反応: 左旋回
- 両IR反応なし: 停止
- 距離 5-10cm: 停止
- 距離 5cm未満: 後退
サーボは起動時に0°→180°→0°のスイープ動作で初期化し、その後は中央(90°)固定で前方を監視します。
ソースコード
// www.YouTube.com/Electronics is Fun
#include <Servo.h>
#include <AFMotor.h>
#define LEFT A0
#define ECHOPIN A1
#define TRIGPIN A2
#define RIGHT A3
AF_DCMotor Motor1(1, MOTOR12_1KHZ);
AF_DCMotor Motor2(2, MOTOR12_1KHZ);
AF_DCMotor Motor3(3, MOTOR34_1KHZ);
AF_DCMotor Motor4(4, MOTOR34_1KHZ);
Servo myservo;
int pos = 0;
long time;
void setup() {
Serial.begin(9600);
myservo.attach(10);
// サーボ初期化スイープ
for (pos = 90; pos <= 180; pos += 1) { myservo.write(pos); delay(15); }
for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); }
for (pos = 0; pos <= 90; pos += 1) { myservo.write(pos); delay(15); }
pinMode(RIGHT, INPUT);
pinMode(LEFT, INPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
}
void loop() {
unsigned int distance = read_cm();
int Right_Value = digitalRead(RIGHT);
int Left_Value = digitalRead(LEFT);
Serial.print("R= "); Serial.print(Right_Value);
Serial.print(" L= "); Serial.print(Left_Value);
Serial.print(" D= "); Serial.println(distance);
if ((Right_Value == 1) && (distance >= 10 && distance <= 30) && (Left_Value == 1)) {
forward();
} else if ((Right_Value == 0) && (Left_Value == 1)) {
turnRight();
} else if ((Right_Value == 1) && (Left_Value == 0)) {
turnLeft();
} else if ((Right_Value == 1) && (Left_Value == 1)) {
stop();
} else if (distance > 5 && distance < 10) {
stop();
} else if (distance < 5) {
backward();
}
delay(50);
}
long read_cm() {
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
time = pulseIn(ECHOPIN, HIGH);
return time / 29 / 2;
}
void forward() {
Motor1.setSpeed(120); Motor1.run(FORWARD);
Motor2.setSpeed(120); Motor2.run(FORWARD);
Motor3.setSpeed(120); Motor3.run(FORWARD);
Motor4.setSpeed(120); Motor4.run(FORWARD);
}
void backward() {
Motor1.setSpeed(120); Motor1.run(BACKWARD);
Motor2.setSpeed(120); Motor2.run(BACKWARD);
Motor3.setSpeed(120); Motor3.run(BACKWARD);
Motor4.setSpeed(120); Motor4.run(BACKWARD);
}
void turnRight() {
Motor1.setSpeed(200); Motor1.run(FORWARD);
Motor2.setSpeed(200); Motor2.run(FORWARD);
Motor3.setSpeed(100); Motor3.run(BACKWARD);
Motor4.setSpeed(100); Motor4.run(BACKWARD);
}
void turnLeft() {
Motor1.setSpeed(100); Motor1.run(BACKWARD);
Motor2.setSpeed(100); Motor2.run(BACKWARD);
Motor3.setSpeed(200); Motor3.run(FORWARD);
Motor4.setSpeed(200); Motor4.run(FORWARD);
}
void stop() {
Motor1.setSpeed(0); Motor1.run(RELEASE);
Motor2.setSpeed(0); Motor2.run(RELEASE);
Motor3.setSpeed(0); Motor3.run(RELEASE);
Motor4.setSpeed(0); Motor4.run(RELEASE);
}
回路図

改良のヒント
- IRセンサーの感度調整が鍵。ポテンショメーター付きモジュールなら微調整可能
- 超音波センサーをサーボでスイープさせ、広角スキャンするように拡張可能
- 電源をリチウムイオンバッテリーにすると長時間駆動化できる
- モーターシールドの電流容量に注意。ストール電流が大きいモーターは外部ドライバー推奨
製造プロセス
- Raspoulette:太陽光発電自律コープドアシステムのプロトタイプ
- シンプルPiロボット - Raspberry Piで2WD自律ローバーを構築
- Arduino UNOとMAX7219で作るUFOアタックゲーム – レトロなドットマトリクスシューティング
- Arduino Unoベースの人間検知レスキューロボット:センサー統合ステップバイステップ
- 3D RGB アルドゥクロック:Bluetooth対応LED時計(RTC内蔵)
- Arduino用バイポーラステッピングモーターライブラリ – 産業グレードの制御機能
- 川の健康を見守る:Arduinoベース水質監視システム「MyRiver」
- DIYギター高速ピック&ストンプペダル - 3Dプリントモーター駆動ピックの自作
- リニアモーター理解:電気エネルギーから精密直線運動へ
- サーボモーターの仕組みと重要性
- 可変リラクタンスモーター:種類、動作原理、応用