1) まずはタイプを決める(おすすめ)
- ✅ 2輪差動ローバー … 作りやすい・学びやすい(おすすめ)
- 4輪/キャタピラ … 段差に強い
- ロボットアーム … 物体操作に特化
- 二足/人型 … 超上級(制御が難しい)
以下は「2輪ローバー」の具体例です。
2) 必要な部品(例)
- マイコン:Arduino Uno か Nano
- モータードライバ:TB6612FNG(効率◎/L298Nより低発熱)
- DCギヤドモータ×2(TTモータ 6V~9V)+ホイール×2、キャスタ車輪×1
- 距離センサ:HC-SR04(超音波)
- 電源:18650×2(7.4V)+スイッチ *Arduino用に5V 降圧モジュールあると安定
(または6V~9V電池+ArduinoのVIN) - ジャンパ線、ブレッドボード、シャーシ
3) 配線(TB6612FNG+Arduino)
電源系
- VM → モータ用バッテリ+(6–12V)
- VCC → Arduino 5V
- GND → Arduino GND(必ず共通GNDに)
制御ピン(例)
- STBY → 5V(有効化)
- PWMA → D5(PWM)/AIN1 → D7/AIN2 → D8(左モータ)
- PWMB → D6(PWM)/BIN1 → D9/BIN2 → D10(右モータ)
超音波 HC-SR04
- VCC → 5V、GND → GND
- Trig → D3、Echo → D2
4) サンプルコード(障害物回避・そのまま書き込んでOK)
// 2輪ローバー 障害物回避(Arduino UNO)
// Driver: TB6612FNG / Sensor: HC-SR04
// 左モータ(A側)
const int AIN1 = 7;
const int AIN2 = 8;
const int PWMA = 5; // PWM
// 右モータ(B側)
const int BIN1 = 9;
const int BIN2 = 10;
const int PWMB = 6; // PWM
// 超音波
const int TRIG = 3;
const int ECHO = 2;
// 速度(0-255)
const int SPD_FWD = 160;
const int SPD_TURN = 150;
const int SPD_BACK = 150;
// 閾値
const int OBST_CM = 20;
long readDistanceCm() {
// 超音波測距
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long dur = pulseIn(ECHO, HIGH, 30000UL); // 30msタイムアウト
if (dur == 0) return 400; // 計測失敗=遠い扱い
long cm = dur * 0.034 / 2;
return cm;
}
void setMotorRaw(int in1, int in2, int pwmPin, int spd) {
if (spd < 0) { // 後退
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(pwmPin, constrain(-spd, 0, 255));
} else { // 前進/停止
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(pwmPin, constrain(spd, 0, 255));
}
}
// 左右速度(-255~255)
void drive(int left, int right) {
setMotorRaw(AIN1, AIN2, PWMA, left);
setMotorRaw(BIN1, BIN2, PWMB, right);
}
void stopAll() { drive(0, 0); }
void setup() {
pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMA, OUTPUT);
pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(PWMB, OUTPUT);
pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT);
// 乱数初期化(浮遊ピンから)
randomSeed(analogRead(A0));
stopAll();
}
void loop() {
long d = readDistanceCm();
if (d < OBST_CM) {
// 障害物あり:停止→後退→ランダム旋回
stopAll(); delay(100);
drive(-SPD_BACK, -SPD_BACK); delay(300);
stopAll(); delay(50);
bool turnLeft = random(0, 2) == 0;
if (turnLeft) {
drive(-SPD_TURN, SPD_TURN); // 左旋回
} else {
drive(SPD_TURN, -SPD_TURN); // 右旋回
}
delay(300);
stopAll(); delay(50);
} else {
// 前進
drive(SPD_FWD, SPD_FWD);
}
delay(20);
}
5) 動作チェック手順(短縮版)
- 片輪ずつ回るか確認(片方のPWMだけ
analogWriteして正逆転をチェック) - 両輪前進→後退→旋回が正しいか
- 超音波の距離が変化するか(手を近づけて
OBST_CM未満で回避するか)
6) よくあるハマりどころ
- GND共通忘れ:Arduinoとモータ電源のGNDは必ず共通
- 電圧不足:モータとロジックは分離電源が安定(降圧5VでArduino)
- 配線逆:AIN1/AIN2, BIN1/BIN2が逆だと回転方向が反転(コード側で符号を入れ替えてもOK)
- 超音波の誤計測:屋外/柔らかい物体は反射弱い→閾値を上げる/IRセンサ併用
7) 発展(やりたい順に追加)
- ライン追従:IRセンサ(TCRT5000)を2~5個
- エンコーダ:速度/距離のフィードバック制御(PID)
- IMU:姿勢安定(MPU-6050/9250)
- Raspberry Pi + ROS2:カメラ搭載、自己位置推定/SLAM、スマホから操作
- ロボットアーム:サーボ(MG996R等)+グリッパでピック&プレース
- 通信:ESP32でWi-Fi/BLEリモコン、Web UI 操作
必要なら、配線図の簡易図やライン追従/Bluetooth操作の追加コードもこのまま出せます。どの方向(カメラ/アーム/ROS2 など)に伸ばしたいかだけ教えてくれたら、そのルートに最適化した設計とコードを用意するよ。
