Arduinoでつくる超音波センサーで障害物を避けて走るロボットづくり。 手始め。
Arduinoをつかってロボットを作ろうともがいております。どのようなロボットかというと、超音波センサーで障害物を検知して左右の車輪の速度差で右に曲がり障害物を避けながら走るものです。手始めとして制御系統だけを試作してみました。シャーシや走行部分のメカトロニクスは後日製作いたします。
必要部品
Arduino uno
モータードライバー L298N
超音波センサー HC-SR04
ギヤードモーター DG01D ×2個
ジャンパ線
ブレッドボード
電池 9V
Arduinoへの接続
超音波センサーのvccを5vへ
超音波センサーのGNDをGNDへ
超音波センサーのtrigを9へ
超音波センサーのechoを10へ
モータードライバーのIN1を2へ
モータードライバーのIN2を3へ
モータードライバーのIN3を4へ
モータードライバーのIN4を5Vを5Vへ
モータードライバーのOUT1,2を左モーターへ
モータードライバーのOUT3,4を右モーターへ
Arduinoのプログラム
const int trigPin = 9;
const int echoPin = 10;
const int leftMotorForward = 2;
const int leftMotorBackward = 3;
const int rightMotorForward = 4;
const int rightMotorBackward = 5;
const int leftMotorSpeed = 6;
const int rightMotorSpeed = 7;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(leftMotorForward, OUTPUT);
pinMode(leftMotorBackward, OUTPUT);
pinMode(rightMotorForward, OUTPUT);
pinMode(rightMotorBackward, OUTPUT);
pinMode(leftMotorSpeed, OUTPUT);
pinMode(rightMotorSpeed, 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;
if (distance < 20) {
// 障害物が近い場合、停止して後退
stopMotors();
delay(500);
moveBackward();
delay(500);
turnRight();
delay(500);
} else {
// 障害物がない場合、前進
moveForward();
}
}
void moveForward() {
analogWrite(leftMotorSpeed, 255);
analogWrite(rightMotorSpeed, 255);
digitalWrite(leftMotorForward, HIGH);
digitalWrite(leftMotorBackward, LOW);
digitalWrite(rightMotorForward, HIGH);
digitalWrite(rightMotorBackward, LOW);
}
void moveBackward() {
analogWrite(leftMotorSpeed, 255);
analogWrite(rightMotorSpeed, 255);
digitalWrite(leftMotorForward, LOW);
digitalWrite(leftMotorBackward, HIGH);
digitalWrite(rightMotorForward, LOW);
digitalWrite(rightMotorBackward, HIGH);
}
void stopMotors() {
digitalWrite(leftMotorForward, LOW);
digitalWrite(leftMotorBackward, LOW);
digitalWrite(rightMotorForward, LOW);
digitalWrite(rightMotorBackward, LOW);
}
void turnRight() {
analogWrite(leftMotorSpeed, 255);
analogWrite(rightMotorSpeed, 255);
digitalWrite(leftMotorForward, HIGH);
digitalWrite(leftMotorBackward, LOW);
digitalWrite(rightMotorForward, LOW);
digitalWrite(rightMotorBackward, HIGH);
}
動作状況
最後に動画をご覧ください。
まとめ
今回の試作で目的とするロボットが製作できると確信しました。今後走行装置やセンサステーなどを作り完成を目指します。ただしいつできるかはわかりません。予定は未定です。
この記事が気に入ったらサポートをしてみませんか?