ロボットの作り方

1) まずはタイプを決める(おすすめ)

  • 2輪差動ローバー … 作りやすい・学びやすい(おすすめ)
  • 4輪/キャタピラ … 段差に強い
  • ロボットアーム … 物体操作に特化
  • 二足/人型 … 超上級(制御が難しい)

以下は「2輪ローバー」の具体例です。


2) 必要な部品(例)

  • マイコン:Arduino UnoNano
  • モータードライバ: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) 動作チェック手順(短縮版)

  1. 片輪ずつ回るか確認(片方のPWMだけanalogWriteして正逆転をチェック)
  2. 両輪前進→後退→旋回が正しいか
  3. 超音波の距離が変化するか(手を近づけて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 など)に伸ばしたいかだけ教えてくれたら、そのルートに最適化した設計とコードを用意するよ。