超音波測距モジュールを動かそう①

Arduino

以前、自分のPCストレージ環境をクラウドメインに変更したのですが、その際、ファイルがいろいろと消えてしまったらしく、過去に試作したものたちのドキュメントがまだらに失われてしまいました。😭
なので、やり直しにはなるのですが、過去に試行したことを書き溜めていこうと思います。

それでは、”何から手を付けようか?”と迷うわけですが、今回は超音波測距モジュールをArduinoで動かしてみます。


超音波測距モジュールはSeed Studioの「SEN136B5B」を使って、これをArduino UNO R3につなげて動かしてみたいと思います。


以下にサンプルスケッチのリンク先を張っておきます。
Ping Ultrasonic Range Finder
サンプルスケッチのページには接続構成の記載もあるので、参考にして配線をします。
5VとGND、あと信号ラインの3本をつなげるだけなので楽勝です!
配線後の実物がこちら↓


次にスケッチ(プログラム)です。
最初は、サンプルスケッチをそのままIDEの新規スケッチに貼り付けて動作確認するのが良いと思います。

そのあと、若干アレンジを加えていきます。
SEN136B5Bの測定可能範囲は3cm~4mとなっていますので、範囲外は”Out of Range”と表示させたいと思います。
※なお、スケッチの動作確認はしていますが、流用する場合は自己責任でお願いします。

/*******************************************************************************
超音波測距センサ(SEN136B5B)の動作テスト用プログラム

++++++ note ++++++
・超音波測距センサの動作テスト用プログラム
・SEN136B5B
・SEN136B5Bの測定可能範囲3cm~4mに合わせて制限を設けます。
・UsonicMeasurRead 関数の戻り値を文字列型(String)にすることで、
 数値と "Out of Range" の両方を返せるようになります。
・測定可能範囲を 3cm〜4m に設定する場合、パルス往復時間 t(マイクロ秒)の閾値は
 次のようになります。
 音速(約340m/s = 0.034cm/μs)を基準に計算すると、1cm 往復するのにかかる時間は
 約29μsです。
  3cm の往復時間: 3cm × 29μs/cm × 2 = 174μs
  4m(400cm)の往復時間: 400cm × 29μs/cm × 2 = 23,200μs
 この時間範囲(174 ≤ t ≤ 23200)を条件式に反映したスケッチです。

*******************************************************************************/

#define pingPin  7       // センサー接続のピン番号

//  電源起動時とリセットの時だけのみ処理される関数(初期化と設定処理)
void setup() {
  Serial.begin(9600) ;   // 9600bpsでシリアル通信のポートを開きます
}
//  繰り返し実行される処理の関数(メインの処理)
void loop() {
     String result ;
     
     result = UsonicMeasurRead(pingPin) ;    // センサーから距離を調べる
      Serial.println(result) ;               // 結果を表示
     delay(1000) ;                           // 1s後に繰り返す
}
// 超音波センサーから距離を得る処理
// pin=センサーに接続しているピン番号
// 距離をcmで返す(測定可能範囲3cm~4mに合わせて制限を設ける)
String UsonicMeasurRead(int pin)
{
     long t ;
     String ans ;
     
     // 超音波センサーに5usのパルスを出力する
     pinMode(pin, OUTPUT) ;                  // ピンを出力モードにする
     digitalWrite(pin, LOW) ;
     delayMicroseconds(2) ;
     digitalWrite(pin, HIGH) ;
     delayMicroseconds(5) ;
     digitalWrite(pin, LOW) ;
     // センサーからの反射パルスを受信する(最大25,000usでタイムアウト設定)
     pinMode(pin, INPUT) ;                   // ピンを入力モードにする
     t = pulseIn(pin, HIGH, 25000) ;         // パルス幅の時間を測る

     // 3cm(174us) 〜 4m(23200us) の範囲内かチェック
     if (t >= 174 && t <= 23200) {
          int cm = (t / 29) / 2 ;            // 往復なので2で割る
          ans = String(cm) + "cm" ;
     } else {
          ans = "Out of Range" ;
     }
     
     return ans ;
}

動作確認はIDEのシリアルモニタで確認します。
部屋の中でモジュールの向きをいろいろ変えると、数値が変わっていきます。
”まぁ、そのくらいの距離かな~?”と感覚的には合うので、一応ちゃんと動作しているな、ということにします。(ごめんね、いい加減で😉)

実際、過去にSEN136B5Bの実測結果を集計したことがありますが、あんまり精度を期待するほどではありません。”大体このくらいの距離なのね”と見るのが良いと思います。
なので、厳密に距離を測るという使い方よりも”これくらいまで近づいたらアラームを出す”とか、大雑把な制御に用いるのが良いと思います。


コメント

タイトルとURLをコピーしました