本文へスキップ
robotips

最終プロジェクト:障害物をよけるロボット

ロードマップで学んだことが、ここで一つになります。距離を測るセンサー、判断するマイコン、電力を送るドライバー、そして2つのモーターです。まず画面で動くところを見て、そのあと実際に作ってみましょう。

Lab 01で動くところを見る

Lab 01では同じタイプのロボットを組み立ててテストします。注意:TB6612FNGではなくL298Nを使い、ピンも違います(TRIGはD9、ECHOはD10)。そのため、コードは下のものとは別です。

Lab 01を開く

必要なもの

価格は載せていません。お店や国によって変わるからです。「2輪ロボット」のキットには、シャーシ、モーター、車輪、電池ホルダーが最初から入っているものが多いです。

数量パーツ用途
1Arduino Uno(または互換ボード)とUSBケーブル頭脳です。コードを実行します。
1TB6612FNGドライバー(またはL298N)モーターに電力を送ります。
2車輪付きのTTギアモーターロボットを動かします。左右に1つずつです。
1キャスター後ろ側を支えます。
1アクリル製シャーシ全部を載せる土台です。
1HC-SR04センサー前にあるものまでの距離を測ります。
1スイッチ付き単3電池4本ホルダー(6 V)モーターだけに電力を送ります。
1USBモバイルバッテリーモーターとは別に、Arduinoに電力を送ります。
1ミニブレッドボードとジャンパーワイヤーはんだ付けなしで接続するためです。

配線

接続元接続先理由
HC-SR04 VCC / GNDArduino 5V / GNDセンサーに電力を送ります。
HC-SR04 TrigArduino ピン7Arduinoが測定を指示します。
HC-SR04 EchoArduino ピン8センサーがエコーの時間を返します。
TB6612FNG VCCArduino 5Vドライバーのロジック用です。
TB6612FNG VM電池ホルダーの+モーターの電力です。
TB6612FNG GNDArduinoのGNDと電池ホルダーの−共通のGND:これがないと信号が伝わりません。
AIN1, AIN2, PWMAピン2、4、5左モーターの向きと速さです。
BIN1, BIN2, PWMBピン10、11、6右モーターの向きと速さです。
STBYピン12HIGHにするとドライバーが動きます。
AO1 / AO2 と BO1 / BO2左モーターと右モーター各モーターへの電力出力です。

コード

ロボット用スケッチ(Arduino IDE)
// 障害物をよけるロボット:Arduino Uno + TB6612FNG + HC-SR04
const int TRIG = 7, ECHO = 8;
const int AIN1 = 2, AIN2 = 4, PWMA = 5;    // 左モーター
const int BIN1 = 10, BIN2 = 11, PWMB = 6;  // 右モーター
const int STBY = 12;                       // ドライバーのスタンバイ

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  int pins[] = {AIN1, AIN2, PWMA, BIN1, BIN2, PWMB, STBY};
  for (int p : pins) pinMode(p, OUTPUT);
  digitalWrite(STBY, HIGH);  // ドライバーをスタンバイから起こす
  Serial.begin(9600);
}

long distanceCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);  // 10 µsのパルス:「測って」
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 30000);  // エコーを最大30 ms待つ
  if (us == 0) return 400;               // エコーなし:前は空いている
  return us / 58;                        // µs / 58 = cm
}

// speedは-255(後退)から255(前進)
void motor(int in1, int in2, int pwm, int speed) {
  digitalWrite(in1, speed > 0);
  digitalWrite(in2, speed < 0);
  analogWrite(pwm, abs(speed));
}

void drive(int left, int right) {
  motor(AIN1, AIN2, PWMA, left);
  motor(BIN1, BIN2, PWMB, right);
}

void loop() {
  long d = distanceCm();
  Serial.println(d);
  if (d < 20) {
    drive(-150, -150);  // 後退する
    delay(300);
    drive(150, -150);   // その場で回る
    delay(350);
  } else {
    drive(180, 180);    // 前進する
  }
  delay(50);
}
  • distanceCm()は、HC-SR04のLabと同じことをします。10 µsのパルスを送り、エコーを待って、58で割ります。
  • motor()はドライバーのHブリッジを使います。向きごとに1本のピンを使い、速さはPWMで決めます。
  • モーターが逆に回るときは、コードを変えずに、ドライバー側でそのモーターの2本のケーブルを入れ替えてください。

うまく動かないとき

モーターが動き出すとArduinoが再起動する
モーターとArduinoが同じ電池を使っています。ArduinoはUSBから、モーターは電池ホルダーから電力を取ってください。
モーターが動かない
STBYがHIGHか、電池ホルダーのスイッチが入っているか、GNDがつながっているかを確認してください。
センサーの値がいつも0か400になる
TrigとEchoが入れ替わっているか、センサーが柔らかいものや斜めの面を向いているのかもしれません。
ロボットがぐるぐる回る
片方のモーターのほうが速いのです。drive()で、速いほうの速度を少し下げてください。
前に進むはずが後ろに進む
ドライバー側で、そのモーターの2本のケーブルを入れ替えてください。

電池をつなぐ前に、安全のセクションを確認してください。 安全とよくある不具合を見る.