格安超音波センサー、牛乳パック一本分で買ってみました
超音波センサーを160円位で買いました。購入したものの調査と動作を確認する
為に格安マイコンボードと接続してテストをした結果、非常に良好だったので記事
にして見ました。私の様な年金生活者や学生の方々にはこの様に格安でパーツを
提供して頂いている事が大変有難いと思っております。(販売者に感謝)
なお、同種の超音波センサーに関しては既に沢山の方々が記事にされています。
詳しい利用方法等はそちらもご参考になるかと思います。
<超音波センサーの概要>
購入した超音波センサーは「Arduino」対応のもので、次の様なものでした。
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」のコードを解析すると次の様になります。
<テスト内容>
センサーのテストは次の様な内容で、「計測距離に応じてLEDの点灯周期を変更」
する処理を実行させる事にしました。
[目的と結果]
テストの確認目標は次のものでした。
1.購入したものの動作方法の確認
2.および、それが動作する事を確認
3.割り込み処理の対応状況を確認
結果としては、センサーとしての動作はカタログ通りで期待した結果が
得られました。また、割り込み処理に関しても問題無く実装でき、こちらも
期待した結果でした。
[テストでの機器の接続]
[テストコード]
/*
<超音波センサー確認プログラム>
このプログラムの動作には「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