PINは電源+-とTrigとEchoの4つ
TrigをHIGHからLOWに変化させると測定用の音波が出力される。
Echoに音波の往復に掛かった時間と同じだけHIGHが出力される。
●プログラムコード
/* HC-SR04モジュール設定 */
#define SONIC_TRIG 7
#define SONIC_ECHO 6
void initUltraSonic() {
pinMode(SONIC_TRIG, OUTPUT);
pinMode(SONIC_ECHO, INPUT);
}
/*
* 超音波距離測定
* 音速340m/s@室温20度固定
* 測定可能距離:2cm〜400cm
* 失敗時:0
*/
double measureUltraSonic() {
// Trigに10マイクロ秒 HIGH出力
digitalWrite(SONIC_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(SONIC_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(SONIC_TRIG, LOW);
// EchoがHIGHからLOWになる時間(マイクロ秒)を取得
// TIMEOUT : 測定距離 × 往復 × 1cm当たりの音波の時間(マイクロ秒) + Trigの時間
// 23920μ : 400cm * 2 * 29.4 + 400
double duration = pulseIn(SONIC_ECHO, HIGH, 23920);
// 往復時間と音速から距離算出
// 距離 = 時間 / 2 * 29.4
return duration / 58.8;
}
/*
* 距離測定
*/
double measureRange() {
double wk_range = 0, wk;
int count = 0;
for(int i = 0; i < 10; i++) {
if (i > 0) delay(60); // MaxRepeat 60ms
wk = measureUltraSonic();
if (wk) {
wk_range += wk;
count++;
if (count > 2) break;
}
}
if (count == 0) {
return 0;
}
return wk_range / count;
}
void setup() {
// 距離測定初期化
initUltraSonic();
Serial.begin(115200);
}
void loop() {
double wk_range = measureRange();
if (!wk_range) {
Serial.println(F(" 測定失敗"));
} else {
Serial.print(wk_range);
Serial.println(F(" cm"));
}
Serial.flush();
delay(500);
}
※9/2 複数回呼び出しのdelayが60msではなく、60μsになっていたので修正
0 件のコメント:
コメントを投稿