Arduinoでつくる超音波センサーで障害物を避けて走るロボットづくり。その3。完成への道
ロボット作りいよいよ佳境です。金土日と休みを頂きましたので一気に完成させました。作業内容をお伝えしたいと思います。
まずは一段落目として車体の製作についてお伝えします。
車体は以下の材料で製作しました。タミヤの楽しい工作シリーズを主に使用しています。
タミヤ 楽しい工作シリーズ トラック&ホイール
タミヤ 楽しい工作シリーズ ユニバーサルプレート
タミヤ 楽しい工作シリーズ ダブルギアボックス
ただし、ダブルギアボックスには電線をはんだ付けする必要があります。ギア比は選択式ですが一番遅い1/203を選びました。電気系統を乗せるプレートは跳ね上げ式にしました。
次に電気系統について解説します。
以下の材料を用いて製作しました。
Arduino uno
モータードライバー L298N
超音波センサー HC-SR04
ジャンパ線
ブレッドボード
電池 9V
配線は以下のようになります。
超音波センサー (HC-SR04)
VCC -> Arduino 5V
GND -> Arduino GND
Trig -> Arduino デジタルピン 9
Echo -> Arduino デジタルピン 10
モータードライバ (L298N)
IN1 -> Arduino デジタルピン 2
IN2 -> Arduino デジタルピン 3
IN3 -> Arduino デジタルピン 4
IN4 -> Arduino デジタルピン 5
ENA (モーターAのPWM) -> Arduino デジタルピン 6
ENB (モーターBのPWM) -> Arduino デジタルピン 7
VCC -> 電源の+端子
GND -> Arduino GND
プログラムは以下のようになります。
// ピン設定
#define trigPin 9
#define echoPin 10
#define in1 2
#define in2 3
#define in3 4
#define in4 5
#define enA 6
#define enB 7
void setup() {
// ピンのモードを設定
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
Serial.begin(9600); // デバッグ用シリアル通信
}
void loop() {
// 距離を測定
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.println(distance);
if (distance < 20) { // 障害物が20cm以内にある場合
// 回避動作
stopMotors(); // 一旦停止
delay(500);
turnRight(); // 右に回転
delay(500);
} else {
moveForward(); // 前進
}
}
void moveForward() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enA, 200); // モーターAの速度
analogWrite(enB, 200); // モーターBの速度
}
void stopMotors() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void turnRight() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(enA, 200); // モーターAの速度
analogWrite(enB, 200); // モーターBの速度
}
Arduinoやモータドライバ、電池、ブレッドボードは輪ゴムで固定しました。以下の写真が完成図になります。
今後の課題
動くには動いたころロボットですが、課題を多く残しました。以下が課題となります。
①配線が乱雑
②配線が抜けてしまう
③右にしか障害物を避けない。
課題は今後進歩する足掛かりとして重要なものであります。
おわりに。
ロボット作り完成しました。Arduinoでの本格的な工作は初めてでしたが大いに楽しめました。今後はArduinoでの工作を趣味として続けていく所存でありますので、適時経過をアップしていきたいと思います。