今回は「サーボモーター」と「超音波センサー」を組み合わせて使っていこうと思います。
超音波センサーで物体を検知して、それに合わせてサーボモーターを動かしていきます。
ちなみにこの組み合わせはラジコンカーの衝突回避や簡易的なアルコール噴射器に応用したりもできます🧐
今回やりたいこと
下のツイートのような感じで、超音波センサーが物体を検知したら、サーボモーターを動かすといったことをやってみます!
今回使うパーツ
サーボモーター_MS18
サーボモーターは画像のようなパーツで、指定した角度まで回転させることができるモーターです。
基本的にサーボモーターからは「電源」「GND」「制御線」の3本線が出ています。
今回使うサーボモーターは可動範囲が120°のようですが、180°や360°のサーボモーターもありますので、用途に合わせて選んでいく感じになるかと思います。
超音波センサー_HC-SR04
超音波センサーは、超音波を利用して物体との距離を測るセンサーです。
今回使うセンサーには、超音波を発信する部分と受信する部分がついています。この超音波を発信してから、受信するまでの時間から計算することで物体との距離を求めることができます。
サーボモーターと超音波センサーはAmazonで購入しました。
今回の回路図
今回の回路図です。超音波センサーで物体の検知を行って、指定範囲内に物体があれば、サーボモーターを動かすといったものです。
私の使った回路ではちゃんと動作しましたが、一般的にモーターは電流を結構消費するらしく、マイコンから電源を取ると動かないことがあるようです。そのような場合は、モーターの電源をマイコンからではなく、電池など別電源からとるといいです。
No. | 部品 | 数量 |
1 | サーボモーター | 1 |
2 | 超音波センサー_HC-SR04 | 1 |
3 | Arduino UNO | 1 |
4 | ブレッドボード | 1 |
5 | ジャンプワイヤー | 9 |
6 | USBケーブル | 1 |
今回のスケッチ
今回書き込むスケッチでは、超音波センサーで3cm以内に物体を検知したらサーボモーターを動かすといったものです。そのために、まずは超音波センサーから距離を測る方法を確認します。
超音波センサーから距離を求める方法
めっちゃ簡単にですが、超音波センサーの行っていることのイメージ図です。
センサーから発信した超音波が物体に当たり、それが跳ね返ってきて、センサーが返ってきた超音波を受信します。この超音波を発信して受信するまでの時間から、物体との距離を求めます。
まず、超音波は音の1種なので340[m/s](音速)で飛びます。物体までの距離をL[m]とすると、超音波は往復(発信と跳ね返り)で2L[m]飛んだことになります。この時かかる時間は次の式となります。
時間[s] = 2L[m] ÷ 340[m/s]
時間はArduino側で測定できるので、距離を求めるために上記の式を変形すると次のようになります。
L[m] = 時間[s] × 340[m/s] ÷ 2
このことに加えて、超音波センサーの測定はμ秒単位(10の-6乗)で行い、距離はcmとしたいため、最終的な式は以下のようになります。
L[cm] = (時間 / 1000000)[s] × (340 × 100)[cm/s] ÷ 2
書き込むスケッチ
今回のスケッチでは、サーボモーターのライブラリを使います。ArduinoのサーボモーターライブラリはArduinoIDEに標準で入っているので特に追加のインストール等は行わなくてOKです。
//parts_4_servo&ultrasonic
//超音波センサーで物体を検知してサーボモーターを動かす
//https://jcomet.com/
//サーボモーターのライブラリをインクルード
#include <Servo.h>
Servo myservo;
int Servopin = 3; //サーボモーターに使うピンを定義
//超音波センサーに使うピンと変数を定義
#define TrigPin 9 // Trig(発信) Pin定義
#define EchoPin 8 // Echo(受信) Pin定義
float ProDelay = 0; //跳ね返った超音波を受信するまでの時間を格納する変数
float Distance = 0; //計算した距離を格納する変数
void setup() {
myservo.attach(Servopin);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
//超音波センサーが3cm以内に物体を検知したらサーボモーターを動かす
void loop(){
read_distance(); //距離読み取り関数
if(Distance < 3){
myservo.write(0);
delay(1000);
myservo.write(90); //サーボモーターを90°動かす
delay(1000);
}
}
//距離読み取り関数の中身
void read_distance(){
digitalWrite(TrigPin, LOW); //超音波をいったん止める
delayMicroseconds(10); //マイクロ秒単位で待機
digitalWrite(TrigPin, HIGH); //超音波を発信する
delayMicroseconds(10); //マイクロ秒単位で待機
digitalWrite(TrigPin, LOW); //発信を止める
ProDelay = pulseIn(EchoPin, HIGH); //跳ね返ってきた超音波を受信するまでの時間を測定
//距離を求める
if (ProDelay > 0 ){
Distance = ProDelay/1000000*340*100/2; //距離[m]→[cm], 時間[μ秒]→[秒]に変換
}
}
実践結果
冒頭のツイートのような感じで、3cm以内に物体を検知したら、サーボモーターが動き出します🎉
感想
よくラジコンカーの衝突回避に使われているのを見ていたので、前々からやってみたいなと思っていた内容ができてうれしく思いました🤭
あとは、超音波センサーの仕組みを勉強するいい機会になったので非常に有意義でした‼
確かに超音波って音の1種だから、速度は音速の340[m/s]だなーなどなど…🧐
ラジコンカーを作るときにぜひ取り入れてみたいと思います💪
コメント