Pathfinder: Arduino UNO障害物回避ロボットキット - 部品と仕様
キット構成部品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | メインコントローラー |
| 超音波距離センサー HC-SR04 | 1 | 障害物検知用 |
| Li-ionバッテリー 1000mAh | 2 | 電源 |
| RGB LED (共通カソード、拡散型) | 1 | 状態表示用 |
| ブザー | 1 | 警告音用 |
| 330Ω 抵抗 | 3 | LED電流制限 |
| USB A-Bケーブル | 1 | 書き込み/給電用 |
| ジャンパワイヤ | 20 | 配線用 |
必要な工具
- Arduino Materia 101 (3Dプリンタ、シャーシ造形用)
- ドライバーセット
使用ソフトウェア
- Arduino IDE
- Autodesk Fusion 360 (シャーシ設計)
プロジェクト概要
概要
Arduino UNOとAdafruit Motor Shieldをベースに、超音波センサーをサーボモーターに搭載して180度スキャンし、障害物を検知して自律回避するロボットです。磁気ブザーとRGB LEDで検知状態とモーター速度を4段階で表示します。
動作仕様
- 所定距離内の障害物を検知
- サーボで左右をスキャンし、より開けた方向へ進路変更
- ブザーとLED色で検知レベルと速度段階を通知
- 完全自律動作 (外部操作不要)
ライブラリとピン定義
#include <AFMotor.h>
#include <Servo.h>
#define BuzzPIN A0
#define TrigPIN A1
#define EchoPIN A2
#define LEDBPIN A3
#define LEDGPIN A4
#define LEDRPIN A5
#define DCMROFF 25 // モーター差補正
動作ロジック (距離による4段階制御)
| 距離 | 動作 | LED色 | ブザー | 速度 |
|---|---|---|---|---|
| < 30cm | 後退→回避旋回 | 赤 | ON | 100 (低速) |
| 30-60cm | 前進 | 青 | OFF | 150 |
| 60-90cm | 前進 | 緑 | OFF | 200 |
| ≥ 90cm | 前進 | 白 (全点灯) | OFF | 250 (最高速) |
回避アルゴリズム
- 障害物検知で停止・後退
- サーボを右(12°)→左(160°)に振って距離測定
- 距離が長い方へ旋回 (同程度なら180°旋回)
- 中央(80°)に戻して前進再開
ソースコード (全文)
#include <AFMotor.h>
#include <Servo.h>
#define BuzzPIN A0
#define TrigPIN A1
#define EchoPIN A2
#define LEDBPIN A3
#define LEDGPIN A4
#define LEDRPIN A5
#define DCMROFF 25
AF_DCMotor M1(1, MOTOR12_64KHZ);
AF_DCMotor M2(2, MOTOR12_64KHZ);
Servo SER1;
int Search() {
float Duration = 0.0, CM = 0.0;
digitalWrite(TrigPIN, LOW); delayMicroseconds(2);
digitalWrite(TrigPIN, HIGH); delayMicroseconds(10);
digitalWrite(TrigPIN, LOW);
Duration = pulseIn(EchoPIN, HIGH);
CM = Duration / 58.8;
return (int)CM;
}
int RightDistance, LeftDistance;
float Distance = 0.00;
void setup() {
pinMode(BuzzPIN, OUTPUT);
pinMode(TrigPIN, OUTPUT);
pinMode(EchoPIN, INPUT);
pinMode(LEDBPIN, OUTPUT);
pinMode(LEDGPIN, OUTPUT);
pinMode(LEDRPIN, OUTPUT);
SER1.attach(10);
}
void loop() {
SER1.write(80); delay(100);
Distance = Search();
if (Distance < 30) {
digitalWrite(BuzzPIN, HIGH);
digitalWrite(LEDBPIN, LOW); digitalWrite(LEDGPIN, LOW); digitalWrite(LEDRPIN, HIGH);
M1.setSpeed(100); M2.setSpeed(100);
ChangePath();
} else if (Distance >= 30 && Distance < 60) {
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, HIGH); digitalWrite(LEDGPIN, LOW); digitalWrite(LEDRPIN, LOW);
M1.setSpeed(150); M2.setSpeed(150);
Forward();
} else if (Distance >= 60 && Distance < 90) {
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, LOW); digitalWrite(LEDGPIN, HIGH); digitalWrite(LEDRPIN, LOW);
M1.setSpeed(200); M2.setSpeed(200);
Forward();
} else {
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, HIGH); digitalWrite(LEDGPIN, HIGH); digitalWrite(LEDRPIN, HIGH);
M1.setSpeed(250); M2.setSpeed(250);
Forward();
}
}
void ChangePath() {
Stop(); Backward(); Stop();
SER1.write(12); delay(500); RightDistance = Search(); delay(500);
SER1.write(160); delay(1000); LeftDistance = Search(); delay(500);
SER1.write(80); delay(500);
CompareDistance();
}
void CompareDistance() {
if (RightDistance > LeftDistance) TurnRight();
else if (LeftDistance > RightDistance) TurnLeft();
else TurnAround();
}
void Forward() { M1.run(FORWARD); M2.run(FORWARD); }
void Backward() { M1.run(BACKWARD); M2.run(BACKWARD); delay(500); }
void TurnRight() { M1.run(BACKWARD); M2.run(FORWARD); M1.setSpeed(100+DCMROFF); delay(300); }
void TurnLeft() { M1.run(FORWARD); M2.run(BACKWARD); M2.setSpeed(100+DCMROFF); delay(300); }
void TurnAround() { M1.run(FORWARD); M2.run(BACKWARD); M2.setSpeed(100+DCMROFF); delay(700); }
void Stop() { M1.run(RELEASE); M2.run(RELEASE); delay(100); }
シャーシと回路図
3Dプリント用シャーシデータと回路図はプロジェクトページで公開予定。
製造プロセス
- 集積回路(IC):現代エレクトロニクスを支える微小強力チップ
- Firebase経由で2台のArduino間を温湿度データで連携するIoTチュートリアル
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- スマートホーム連携向けマルチポジション温度センサーシステム
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- MotionSense: ArduinoとESP8266で作るスマート侵入検知システム
- MOSMusicプロジェクトキット: MOSFET、Arduinoで音楽同期照明制御
- ボール盤の主要構成部品と機能:ベースからモーターまで完全解説
- 内燃機関の主要コンポーネント:構造と機能
- SPICEネットリスト構文マスター:コンポーネント命名、受動・能動素子、電源定義
- マイクロエレクトロニクス:微小化電子技術の科学