はじめに
Arduinoを使って、超音波センサーで物体との距離を測定し、その距離に応じてモーターの速度を調整するシステム を作ってみます。
今回のシステムでは、
- 基本はゆっくり前進
- 対象物が遠ざかると加速
- 対象物が3cm以下に近づくと最低速度でゆっくり移動
- 逆回転はせず、一定方向に進むだけ
という動作を行います。
シンプルな構成ですが、超音波センサーとモーター制御の組み合わせを学ぶのにちょうどいいプロジェクトです。
Arduinoを使った自律的な動作の基礎を身につけることができます。
使うもの
モーター(GeekServo 9G Motor-Red)
小型で軽量なDCモーターです。PWM制御が可能なので、Arduinoを使って速度を調整できます。
小型ロボットやモーション制御のプロジェクトに最適です。
モータードライバ(TOSHIBA TA2911217K)
Arduinoの出力だけではモーターを直接駆動できないため、このモータードライバを使います。
PWM信号を使ってモーターの速度をコントロールし、回転方向の制御も可能です。
モータードライバのピン配置は以下の通りです。
ピン番号 | 記号 | 説明 |
---|---|---|
1 | GND | グランド(ArduinoのGNDに接続) |
2 | OUT1 | モーター接続端子(GeekServoの赤) |
3 | NC | 未使用 |
4 | Vref | PWM制御用端子(ArduinoのPWM信号を入力) |
5 | IN1 | モーターの回転方向制御(Arduinoのデジタル信号) |
6 | IN2 | モーターの回転方向制御(Arduinoのデジタル信号) |
7 | VCC | 電源供給端子(Arduinoの5Vに接続) |
8 | Vs | モーター駆動用電源端子(Arduinoの5Vに接続) |
9 | NC | 未使用 |
10 | OUT2 | モーター接続端子(GeekServoの黒) |
超音波センサー(HC-SR04)
超音波を使って前方の障害物までの距離を測るセンサーです。
今回のプロジェクトでは、前方の物体との距離を測定し、その距離に応じてモーターの速度を調整します。
Arduino(Unoなど)
Arduino Uno を使用します。Arduinoは簡単にセンサーやモーターを制御できるので、こうしたプロジェクトには最適です。
配線(PIN配置)
Arduinoと各コンポーネントの接続は以下の通りです。
Arduino | 接続先 | 説明 |
---|---|---|
7 | モータードライバ IN1 | モーターの回転方向制御 |
8 | モータードライバ IN2 | モーターの回転方向制御 |
9 | モータードライバ VREF | PWM(速度制御) |
4 | 超音波センサー Trig | 距離測定のトリガー信号 |
10 | 超音波センサー Echo | 反射波を受信 |
GND | 各デバイス GND | 共通のグラウンド接続 |
5V | モータードライバ、超音波センサー | 電源供給 |
Arduinoのコード
以下のコードをArduinoに書き込めば、距離に応じてモーターの速度が変化するようになります。
#define IN1 7 // IN1 ピン
#define IN2 8 // IN2 ピン
#define VREF 9 // Vref(PWM制御)
const int trigPin = 4; // Trig ピン
const int echoPin = 10; // Echo ピン
const float targetDistance = 10.0; // 目標距離 (cm)
const int minSpeed = 50; // 最低速度 (0-255)
const int maxSpeed = 200; // 最高速度 (0-255)
void setup() {
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(VREF, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// 初期状態で前進
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
float getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return (duration * 0.0343) / 2; // cm に変換
}
void loop() {
float distance = getDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
int speed;
if (distance < 3.0) {
// 3cm未満なら最小速度(停止はしない)
speed = minSpeed;
}
else {
// 3cm以上なら、遠ざかるほど加速(最大20cm程度まで考慮)
speed = map(constrain(distance, 3, 20), 3, 20, minSpeed, maxSpeed);
}
// 速度適用(前進のみ)
analogWrite(VREF, speed);
Serial.print("Speed: ");
Serial.println(speed);
delay(100);
}
動作の仕組み
- 超音波センサーで前方の物体との距離を測定
- 目標距離(10cm)と比較
- 距離が遠いと加速、近いと減速
- 3cm以下になったら最小速度で前進
- 逆回転はせず、常に前進方向のみ
シンプルなロジックですが、「追従する」 という動作をしっかり実現できます。
おわりに
Arduinoとモーター制御、超音波センサーを組み合わせることで、距離に応じた速度調整ができる追従システムを作ることができました。
今回の制御ではPID制御などは使っていませんが、より滑らかに制御したい場合は導入を検討してもいいでしょう。
また、カメラや他のセンサーを組み合わせることで、より高度な自律ロボットの開発にも応用できます。
Arduinoを使ったモーター制御の基礎として、ぜひ試してみてください。
ここまで読んでいただきありがとうございました。
スクールの紹介
最後に宣伝をさせてください。
技術で未来を切り拓く―あなたの夢を現実にするプログラミングスクール
Webデザインやプログラミングで成功を目指している方々にとって、このオンラインスクールは夢を叶えるための最適な場所です。皆さんのキャリアを次の段階へと引き上げるためにデザインされたこのスクールは、一人ひとりの成功を心から願い、それを実現するための全てを提供しています。ここでは、このスクールの魅力について詳しくご紹介します。
◆圧倒的な費用対効果
このオンラインプログラミングスクールは、Web系教育において最高の費用対効果を提供しています。多くの高額スクールが存在する中で、ここではリーズナブルな価格で、質の高い教材、無限のサポート、そして実際に市場で求められるスキルの習得機会を提供しています。
◆現役フリーランスの講師陣
講師たちは全員、現役のフリーランスプロフェッショナルです。市場で活躍している講師から直接、最新のトレンドや実践的なスキルを学べるのは、このスクールの大きな特徴です。
◆柔軟な学習コース
固定のコースがなく、学習者の興味やニーズに応じて自由に学習できます。進路変更も自由で、最低契約期間は1ヶ月という柔軟性を持っています。自分のペースで、自分に合った学習が可能です。
◆無制限の添削とサポート
理解できるまで、そして満足するまで、無制限に添削と質問への回答を提供しています。進路相談や技術面以外の相談にも対応しており、全面的にサポートします。
◆社長から学べる貴重な機会
デザイナー、プログラマー、ディレクター、マーケターとして豊富な経験を持つ社長から直接学べるのも、このスクールの特別な点です。他のスクールでは得られない、貴重な機会です。
◆実績作りへの徹底的なサポート
就職、転職、フリーランスとして成功するためには、高品質な実績が必要です。生徒の作品レベルを最大限に高め、市場で求められる実績を作り上げることに力を入れています。案件を取得できない生徒には、直接案件を提供することもあります。
◆メッセージからの約束
高額な授業料を支払わせて結果を出せないスクールとは違い、物理的なサポートは提供できないかもしれませんが、継続的な努力を通じて最高の結果を出せるようにサポートします。一緒に不正なスクールを撲滅し、あなたの夢を実現しましょう。
このプログラミングスクールは、Webデザインやプログラミングでの成功を目指す方々に必要な全てを備えています。今こそ、このコミュニティに参加し、あなたのキャリアを加速させる時です。
詳しくはこちら↓