最終プロジェクト:障害物をよけるロボット
ロードマップで学んだことが、ここで一つになります。距離を測るセンサー、判断するマイコン、電力を送るドライバー、そして2つのモーターです。まず画面で動くところを見て、そのあと実際に作ってみましょう。
Lab 01で動くところを見る
Lab 01では同じタイプのロボットを組み立ててテストします。注意:TB6612FNGではなくL298Nを使い、ピンも違います(TRIGはD9、ECHOはD10)。そのため、コードは下のものとは別です。
Lab 01を開く必要なもの
価格は載せていません。お店や国によって変わるからです。「2輪ロボット」のキットには、シャーシ、モーター、車輪、電池ホルダーが最初から入っているものが多いです。
| 数量 | パーツ | 用途 |
|---|---|---|
| 1 | Arduino Uno(または互換ボード)とUSBケーブル | 頭脳です。コードを実行します。 |
| 1 | TB6612FNGドライバー(またはL298N) | モーターに電力を送ります。 |
| 2 | 車輪付きのTTギアモーター | ロボットを動かします。左右に1つずつです。 |
| 1 | キャスター | 後ろ側を支えます。 |
| 1 | アクリル製シャーシ | 全部を載せる土台です。 |
| 1 | HC-SR04センサー | 前にあるものまでの距離を測ります。 |
| 1 | スイッチ付き単3電池4本ホルダー(6 V) | モーターだけに電力を送ります。 |
| 1 | USBモバイルバッテリー | モーターとは別に、Arduinoに電力を送ります。 |
| 1 | ミニブレッドボードとジャンパーワイヤー | はんだ付けなしで接続するためです。 |
配線
| 接続元 | 接続先 | 理由 |
|---|---|---|
| HC-SR04 VCC / GND | Arduino 5V / GND | センサーに電力を送ります。 |
| HC-SR04 Trig | Arduino ピン7 | Arduinoが測定を指示します。 |
| HC-SR04 Echo | Arduino ピン8 | センサーがエコーの時間を返します。 |
| TB6612FNG VCC | Arduino 5V | ドライバーのロジック用です。 |
| TB6612FNG VM | 電池ホルダーの+ | モーターの電力です。 |
| TB6612FNG GND | ArduinoのGNDと電池ホルダーの− | 共通のGND:これがないと信号が伝わりません。 |
| AIN1, AIN2, PWMA | ピン2、4、5 | 左モーターの向きと速さです。 |
| BIN1, BIN2, PWMB | ピン10、11、6 | 右モーターの向きと速さです。 |
| STBY | ピン12 | HIGHにするとドライバーが動きます。 |
| AO1 / AO2 と BO1 / BO2 | 左モーターと右モーター | 各モーターへの電力出力です。 |
コード
// 障害物をよけるロボット: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本のケーブルを入れ替えてください。
電池をつなぐ前に、安全のセクションを確認してください。 安全とよくある不具合を見る.