ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
必要な部品と用品
| Arduino UNO | ×1 |
| SG90 マイクロサーボモーター | ×1 |
| HC-SR04 超音波距離センサー | ×1 |
| ロボットシャーシキット(2WD、DCモーター付き) | ×1 |
| ジャンパーワイヤー(汎用) | ×1 |
| Arduino Motor Shield Rev3 | ×1 |
必要な工具と機器
- はんだごて(汎用)
アプリとオンラインサービス
- Arduino IDE
プロジェクトについて
私はマレーシアのマルチメディア大学でメディアアートデザインを専攻する学生です。インタラクションデザインの授業でArduinoコンポーネントの使い方を学び、最終課題として障害物回避ロボットを制作することにしました。各コンポーネントの動作原理を理解しながら製作を進めました。
ステップ1: ロボットシャーシの組み立て
キットにはシャーシ、2つのモーター、2つの車輪、前輪、バッテリーホルダー、ネジ、スイッチ、ジャンパーワイヤーが含まれています。説明書に従って組み立ててください。
ステップ2: コンポーネントのテストとはんだ付け
はんだ付けの前に、両方のDCモーター、Arduinoボード、モーターシールド、サーボモーター、超音波センサーがすべて正常に動作するかテストしてください。その後、両モーターの赤黒ワイヤーをはんだ付けします。
ステップ3: バッテリーとスイッチの配線
バッテリーホルダーの黒いワイヤーを半分に切り、それぞれをスイッチの端子にはんだ付けします。これでスイッチの準備が完了です。
ステップ4: Arduinoとモーターシールドのスタック
Arduinoボードの上にモーターシールドを重ねて装着します。ピンが正しく合うように注意してください。
ステップ5: モーターシールドへのモーター接続
モーターシールドは各モーターに最大600mAの電流を供給できます。DCモーターのワイヤーをモーターシールドのM1(左モーター)とM3(右モーター)コネクタに接続します。ワイヤーが短い場合はジャンパーワイヤーを延長して使用してください。
ステップ6: バッテリースイッチと信号線の接続
バッテリースイッチの赤黒ワイヤーをモーターシールドの電源端子に接続します。次に、5V、GND、アナログピン4、アナログピン5用のジャンパーワイヤーを準備し、色分けしてはんだ付けします(白=5V、黒=GND、茶色=A4、オレンジ=A5)。
ステップ7: ボードの固定
両面テープやホットグルーでArduinoとシールドをシャーシに固定します。
ステップ8: 超音波センサーの接続
準備したジャンパーワイヤーを超音波センサーに接続します:白(5V)→VCC、黒(GND)→GND、茶色(A4)→Echo、オレンジ(A5)→Trig。
ステップ9: サーボモーターの接続
サーボモーターをモーターシールドの「servo_2」スロットに接続します。サーボの種類によってピン配置が異なる場合があるので確認してください。
最終ステップ: プログラムのアップロード
このロボットには3つのライブラリが必要です:
- AFMotorライブラリ(モーターシールド用)
- NewPingライブラリ(超音波センサー用)
- Servoライブラリ(標準搭載)
以下のコードをArduino IDEにコピーしてアップロードしてください。
ソースコード
#include <AFMotor.h>
#include <Servo.h>
#include <NewPing.h>
#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE 1000
#define MAX_SPEED 150
#define COLL_DIST 20
#define TURN_DIST COLL_DIST+10
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
AF_DCMotor leftMotor(3, MOTOR12_8KHZ);
AF_DCMotor rightMotor(1, MOTOR12_8KHZ);
Servo neckControllerServoMotor;
int pos = 0;
int maxDist = 0;
int maxAngle = 0;
int maxRight = 0;
int maxLeft = 0;
int maxFront = 0;
int course = 0;
int curDist = 0;
String motorSet = "";
int speedSet = 0;
void setup() {
neckControllerServoMotor.attach(10);
neckControllerServoMotor.write(90);
delay(2000);
checkPath();
motorSet = "FORWARD";
neckControllerServoMotor.write(90);
moveForward();
}
void loop() {
checkForward();
checkPath();
}
void checkPath() {
int curLeft = 0, curFront = 0, curRight = 0;
neckControllerServoMotor.write(144);
delay(120);
for(pos = 144; pos >= 36; pos-=18) {
neckControllerServoMotor.write(pos);
delay(90);
checkForward();
curDist = readPing();
if (curDist < COLL_DIST) { checkCourse(); break; }
if (curDist < TURN_DIST) { changePath(); }
if (curDist > maxDist) { maxAngle = pos; }
if (pos > 90 && curDist > curLeft) curLeft = curDist;
if (pos == 90 && curDist > curFront) curFront = curDist;
if (pos < 90 && curDist > curRight) curRight = curDist;
}
maxLeft = curLeft; maxRight = curRight; maxFront = curFront;
}
void setCourse() {
if (maxAngle < 90) turnRight();
if (maxAngle > 90) turnLeft();
maxLeft = maxRight = maxFront = 0;
}
void checkCourse() {
moveBackward(); delay(500); moveStop(); setCourse();
}
void changePath() {
if (pos < 90) lookLeft();
if (pos > 90) lookRight();
}
int readPing() {
delay(70);
unsigned int uS = sonar.ping();
return uS / US_ROUNDTRIP_CM;
}
void checkForward() {
if (motorSet=="FORWARD") {
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
}
}
void moveStop() { leftMotor.run(RELEASE); rightMotor.run(RELEASE); }
void moveForward() {
motorSet = "FORWARD";
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) {
leftMotor.setSpeed(speedSet);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void moveBackward() {
motorSet = "BACKWARD";
leftMotor.run(BACKWARD); rightMotor.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) {
leftMotor.setSpeed(speedSet);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void turnRight() {
motorSet = "RIGHT";
leftMotor.run(FORWARD); rightMotor.run(BACKWARD);
delay(400);
motorSet = "FORWARD";
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
}
void turnLeft() {
motorSet = "LEFT";
leftMotor.run(BACKWARD); rightMotor.run(FORWARD);
delay(400);
motorSet = "FORWARD";
leftMotor.run(FORWARD); rightMotor.run(FORWARD);
}
void lookRight() { rightMotor.run(BACKWARD); delay(400); rightMotor.run(FORWARD); }
void lookLeft() { leftMotor.run(BACKWARD); delay(400); leftMotor.run(FORWARD); }
回路図
配線図を参照して正しく接続してください。モーターシールドのピン配置に注意し、超音波センサーのTrig/EchoピンをA5/A4に正しく接続することが重要です。
製造プロセス
- シンプルPiロボット - Raspberry Piで2WD自律ローバーを構築
- Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
- ArduinoとAndroidでRoomba Create 2をリモコン操作 ─ Bluetooth経由のステップバイステップガイド
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
- DIY ハンドジェスチャー制御 Arduino ロボットアーム - ステップバイステップ構築ガイド
- Arduinoロボットアーム「LittleArm」をAndroidアプリでBluetooth制御
- Arduino Nanoで作る「食べさせロボット」:超音波センサーで食べ物検知し口を開閉
- Arduino向けスマート屋内ナビゲーションロボットキット
- サーボモーターの仕組みと重要性
- 精度最大化:ギアヘッドとサーボモータの最適ペアリング