- 最終更新日
- 記事公開日
超音波センサーで電動水鉄砲を発射する装置
超音波センサーに反応があると、電動水鉄砲から水が発射される装置を作りました。
背の低い生き物にだけ反応させるため、上・下に2つ超音波センサーを搭載しています。
下のセンサーは常時検知を行っています。
下のセンサーが物体を検知すると、上のセンサーが検知を開始。
上のセンサーで物体を検知しなかった場合のみ、水鉄砲が発射される仕様です。
主要部品
- 電動水鉄砲 ー Amazon
- Arduino Pro mini(3.3V / 8MHz版)ー Amazon
- モータードライバ(DRV8835)ー 秋月電子
- 超音波センサ HC-SR04(3V対応バージョン)ー 秋月電子
- ※センサー取り付けパーツ(トルク蝶番・L字仕切り板・M1.7×10mm精密ネジ)
- セメント抵抗(51Ω)
- 電解コンデンサ(100μ/35V)
- 三端子レギュレーター 3.3V(AZ1117CH-3.3TRG1)ー 秋月電子
- チップコンデンサ(10μF)、チップコンデンサ(22μF)
- モバイルバッテリー
- その他(ユニバーサル基板・スペーサー・XHコネクタ・配線資材・銅箔テープ等)
基板(表)

基板(裏)

全体写真

※超音波センサの固定ブラケットについて
作例では、超音波センサーを固定するために、セリアで購入したL字仕切り板を加工して取り付けています。
しかし、後でアリエクにもっとちゃんとしたものが売ってることを知ったので、こちらをオススメします↓
超音波センサーの動作電圧について
超音波センサー(HC-SR04)は、『3V〜5.5V』に対応しているタイプと『5.5V』にしか対応していないタイプがあります。
どうやら、2020年以降に発売されたHC-SR04は『3V』にも対応しているようです。
今回は、メイン制御を行うマイコンに3.3VのArduino Pro miniを使用しているため、新タイプの3Vに対応した超音波センサー(HC-SR04)を使用しました。
回路図

モバイルバッテリーによる電源供給について
この回路では、電源供給にモバイルバッテリーを使用しています。
ところが、電源にモバイルバッテリーを使用する際は、一つ注意点があります。
それは、モバイルバッテリーに搭載されている『オートパワーオフ機能』です。
オートパワーオフ機能は、電流が出力されていない時間が続くと、電源が自動でオフになってしまう機能です。
オートパワーオフ機能が働く時間は機種によって異なりますが、だいたい30秒〜1分で止まるものが多いです。
オートパワーオフ機能を回避するためには、常にモバイルバッテリーからある程度の電流を出力し続ける必要があります。
「どのくらいの電流量が必要なのか?」は種類によって違いますが、目安としては『100mA』
よって、この回路には「51Ω」の抵抗を取り付けています。
5V ÷ 51Ω = 0.098A = 98mA
常に100mAを捨て続けることになるので、もったいないですが仕方ありません。
なお、発熱するので、発火しないセメント抵抗を使用しています。
過電流対策用のポリスイッチについて
モータードライバーから水鉄砲への配線ラインにある部品は、過電流対策用のポリスイッチ(RXEF050)です。
一度、5Vの電圧を掛けたら、負荷が強すぎたのか?水鉄砲のギアを破損してしまいました。
その対策として入れたのですが、効果があるかは分かりません。
技術解説

超音波センサーとは?
超音波とは、人間には聞こえない高い周波数の音波です。
超音波センサーは、その超音波を利用したセンサー。
今回使用しているHC-SR04は、左右に搭載された発信機(Transmitter)と受信機(Receiver)を使い、超音波が物体に当たって戻ってくるまでの時間を計測することができます。
その戻ってくるまでの時間を元に、プログラム上で距離に換算し、物体が近づいてきたときの検知センサーとして利用します。
また超音波センサーは、真っすぐ飛びます。
検知範囲を狭く直線的な範囲だけに限定したいときに最適です。
モータードライバーとは?
マイコンから出力される信号は、とても小さい電流です。
電動水鉄砲に搭載されているモーターを動かすには、とても大きな電流が必要です。
マイコンの出力信号を直接モーターに繋いでも、動かすことはできません。
そこでモータードライバーを使用します。
モータードライバーは、マイコンの信号をトリガーに、モーターへ大きな電流を供給するための部品です。
(※正転や反転などのモーター制御を行う際にもモータードライバーを用いますが、この装置はモーターの制御は必要ありません)
今回使用したモータードライバーは『DRV8835』
DRV8835は、とりあえず繋げば動いてくれる高性能なモータードライバーです。
値段はちょっと高めですが・・・
プログラム
// 下センサー
int bottomTriggerPin = 2; // Triggerピンに接続
int bottomEchoPin = 3; // Echoピンに接続
long bottomDuration; // 反射時間
long bottomDistance; // 距離
// 上センサー
int topTriggerPin = 4; // Triggerピンに接続
int topEchoPin = 5; // Echoピンに接続
long topDuration; // 反射時間
long topDistance; // 距離
// モーターに信号を送るピン
int motorShotPin = 6;
// -------------------------------------------
// SETUP
// -------------------------------------------
void setup() {
Serial.begin (9600);
pinMode(bottomTriggerPin, OUTPUT);
pinMode(bottomEchoPin, INPUT);
pinMode(topTriggerPin, OUTPUT);
pinMode(topEchoPin, INPUT);
}
// -------------------------------------------
// LOOP
// -------------------------------------------
void loop() {
// まずは下のセンサーだけを使って検知
// クリーンなHIGHパルスを確保するために、事前に短いLOWパルスを送信
digitalWrite(bottomTriggerPin, LOW);
delayMicroseconds(5);
// 10マイクロ秒以上のHIGHパルスを入れると超音波が送信される
digitalWrite(bottomTriggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(bottomTriggerPin, LOW);
// 物体にぶつかり戻ってくるまでの時間を読み取る
pinMode(bottomEchoPin, INPUT);
bottomDuration = pulseIn(bottomEchoPin, HIGH);
// 時間を距離に変換(29.1で割る)
bottomDistance = (bottomDuration/2) / 29.1;
// シリアルモニタに結果を表示
Serial.print("top:");
Serial.print(bottomDistance);
Serial.print("cm");
Serial.print(" ");
// 物体までの距離が10cm以下の場合、上センサーの検知をスタート
if (bottomDistance < 100) {
digitalWrite(topTriggerPin, LOW);
delayMicroseconds(5);
digitalWrite(topTriggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(topTriggerPin, LOW);
pinMode(topEchoPin, INPUT);
topDuration = pulseIn(topEchoPin, HIGH);
topDistance = (topDuration/2) / 29.1;
Serial.print("bottom:");
Serial.print(topDistance);
Serial.print("cm");
Serial.println();
// 上センサーで検知した結果、10cm以内に何もなければ背の低い生き物とみなし、水鉄砲を発射する
if (topDistance > 100) {
// 1秒間水鉄砲を発射
digitalWrite(motorShotPin, HIGH);
Serial.println("Shot!");
delay(1000);
digitalWrite(motorShotPin, LOW);
}
}
delay(250);
}