趣味のマイコンいじり

安価なマイコンを利用して作成したアプリの紹介です。

格安超音波センサー、牛乳パック一本分で買ってみました

格安マイコンボードをAmazonで見ていた時、関連するパーツの紹介が有ったので
超音波センサーを160円位で買いました。購入したものの調査と動作を確認する
為に格安マイコンボードと接続してテストをした結果、非常に良好だったので記事
にして見ました。私の様な年金生活者や学生の方々にはこの様に格安でパーツを
提供して頂いている事が大変有難いと思っております。(販売者に感謝)
なお、同種の超音波センサーに関しては既に沢山の方々が記事にされています。
詳しい利用方法等はそちらもご参考になるかと思います。

<超音波センサーの概要>
 購入した超音波センサーは「Arduino」対応のもので、次の様なものでした。
   イメージ 1

   1.中国製型名 HC-SR04
   2.仕様
         ・電源電圧 5V
         ・待機電流 2mA未満
         ・信号出力 0-5V
         ・センサ角度 15度以下
         ・測定可能距離 2cm-450cm
         ・分解能 0.3cm
          ・端子間隔 2.54mm 5ピン
  3.使い方
    1)トリガ端子を10us以上Highにする。
    2)このセンサモジュールが40kHzのパルスを8回送信して受信する。
    3)受信すると、出力端子がHighになる。
    4)出力端子がHighになっている時間がパルスを送信してから受信
                 するまでの時間。
    5)出力端子がHighになっている時間の半分を音速で割った数値が距離。

関連資料>
  データシートは次のURLから入手可能(ユーザーガイドも有り)
   URL : http://www.datasheet.jp/search.php?sWord=HC-SR04

  サンプルコードとライブラリは次のURLから入手可能
       (上記のユーザーガイドから)
          URL : http://www.elecfreaks.com/store/download/product/Sensor/HC-SR04/HCSR04Ultrasonic_demo.zip

   ショップからのサンプルコードは次のURLから入手可能
         (SWITCH SCIENCE から)
          URL :  https://www.switch-science.com/catalog/1606/


サンプルコードからの解析
 「SWITCH SCIENCE」のコードを解析すると次の様になります。
    イメージ 2

テスト内容
 センサーのテストは次の様な内容で、「計測距離に応じてLEDの点灯周期を変更」
   する処理を実行させる事にしました。

 [目的と結果]
    テストの確認目標は次のものでした。
    1.購入したものの動作方法の確認
    2.および、それが動作する事を確認
    3.割り込み処理の対応状況を確認

  結果としては、センサーとしての動作はカタログ通りで期待した結果が
    得られました。また、割り込み処理に関しても問題無く実装でき、こちらも
    期待した結果でした。

 [テストでの機器の接続]
   イメージ 3

    イメージ 4

 [テストコード]
    /*
     <超音波センサー確認プログラム>
    
     このプログラムの動作には「MsTimer2」のライブラリが必要です。
     こちらからダウンロードして解凍したものをシステムのライブラリに追加して下さい。
      ダウンロード URL : http://playground.arduino.cc/Main/MsTimer2
                     (Timer2.zipをダウンロード)
       解凍後のフォルダの追加先 : C:\Program Files (x86)\arduino\libraries
                     (デホルトでのインストール時)
    */
   
    // シリアルモニターでデバッグする時に有効にする
    //#define DEBUG
   
    // ポート定義
    #define ECOH  11  // エコー信号入力ピン
    #define TRIG  12  // エコー出力トリガーピン
    #define DEFLEDPRD  1000 // デホルトのLED点滅周期 (1000mS)
    #define LEDPRDMIN    50 // LED点滅周期の最小値 (50mS)
    #define TIMCHKPRD    10 // タイマーチェック周期(10mS)
   
    // グローバル変数
    int period ;      // LED点滅周期
    int Duration ;    // 超音波センサーの応答周期
    float Distance ;  // 計測した距離
   
    // 追加ライブラリ
    #include <MsTimer2.h>            // タイマー割り込み用ヘッダファイル
   
    // タイマー割り込み関数
    void flash() {
      // LED点灯状態の変数の割り付けと初期設定
      static boolean output = HIGH;   // 開始時LED点灯をセット
      static int count = 0 ;          // タイマーチェック用カウンター
      // タイマーカウント数のチェック
      count ++ ;
      if*1 > DEFLEDPRD) period = DEFLEDPRD ;
        else period = LEDPRDMIN + (int)(Distance * 5 + 0.5) ; // 距離(cmx10 + 100 をセット)
    #ifdef DEBUG   // デバッグ時、計測距離をホストに返送
        Serial.print(Duration);
        Serial.print(" us ");
        Serial.print(Distance);
        Serial.println(" cm");
    #endif
      } else period = DEFLEDPRD ;   // 応答が無ければデホルト値をセット
      delay(500);
    }

 動作状況の確認はこちらから(Dropboxのリンク)

 

    

*1:count * TIMCHKPRD) > period){
        // LED出力の設定と次の点灯用にデータの反転
        digitalWrite(LED_BUILTIN, output);  // LED点灯データのセット
        output = !output;              // LED点灯用データの反転(次回反映)
        count = 0 ;
      }
    }
   
    // 初期設定
    void setup() {
      // 入出力ピンの割り付け
      pinMode(LED_BUILTIN, OUTPUT);   // LED モニター出力
      pinMode(TRIG, OUTPUT) ;         // 検出開始トリガー出力
      pinMode(ECOH, INPUT) ;          // エコー応答信号入力
    #ifdef DEBUG  // デバッグ時シリアルモニターを有効化
      // デバッグの時、シリアルモニター用初期設定
      Serial.begin(9600) ;
    #endif
      // グローバル変数初期値の設定
      period = DEFLEDPRD ;
      // タイマー割り込み用初期設定
      MsTimer2::set(TIMCHKPRD, flash);  // タイマー割込み関数と周期をセット
      MsTimer2::start();             // タイマー割り込み開始
    }
   
    // the loop function runs over and over again forever
    void loop() {
      // 超音波センサーへ計測開始トリガを出力
      digitalWrite(TRIG,LOW);
      delayMicroseconds(1);
      digitalWrite(TRIG,HIGH);
      delayMicroseconds(11);
      digitalWrite(TRIG,LOW);
      // 超音波センサーよりの応答をチェック
      Duration = pulseIn(ECOH, HIGH, DEFLEDPRD * 1000);
      if (Duration > 0) {   // 応答が有った時
        Distance = Duration / 2;
        Distance = Distance * 340 * 100 / 1000000; // エコー周期より距離の計算
        // LED点滅周期の計算(デホルト値より大きい時はデホルト値にセット)
        if((LEDPRDMIN + (int)(Distance * 5 + 0.5