ESP-WROOM-02と距離センサー(HC-SR04)でフィルターを使用して測定する – 自由研究

こんばんは、よつばです。

ESP-WROOM-02 (ESP8266)で遊んでいます。今回はセンサーの値にフィルターをかけてみたいと思います。

フィルターとは

特定の成分を取り除く、弱める作用をもつ機能のこと。センサーから取得した値は、ばらつくため、ばらつきを抑えるためにフィルタを使用します。ここではデジタルフィルターを扱います。フィルターには種類がありますが、難しい話は抜きにして、シンプルな1次ローパスフィルタを用います。

1次ローパスフィルターの計算

センサーから取得した値について、今回取得した値と前回取得した値をフィルター係数の割合で使用します。それをセンサー値として入力に使用します。今回フィルター係数を0.9に設定しました。

センサー値 = 今回値 × フィルター係数 + 前回値 × (1 - フィルター係数)

ソースコード

/********************
 * 距離センサーHC-SR04を使用して距離を測定する(フィルターあり)
 ********************/
// 設定
const int TRIG = 4; // Trig出力ピン
const int ECHO = 5; // Echo入力ピン
const double filter = 0.9; // フィルター係数。どれくらいの割合で今回のセンサー値を使用するか

void setup() {
 Serial.begin(9600); // シリアルモニタとの接続レート9600kbps
 pinMode(TRIG, OUTPUT); // 音波出力ピンの設定
 pinMode(ECHO, INPUT); // 音波入力ピンの設定
 digitalWrite(TRIG, LOW); // 初期状態をLOWにセット
}

double prevDistance = 0; // 直前の測定値を保持する
void loop() {
 digitalWrite(TRIG, HIGH); // 音波出力を開始
 delayMicroseconds(10); // 10μ秒間射出
 digitalWrite(TRIG, LOW); // 音波出力を停止

 double time = pulseIn(ECHO, HIGH); // 出力した音波が返って来るまでの時間を取得
 double distance = (time / 1000 / 1000) / 2 * (340 * 100); // 計測時間に音速を掛けて距離を算出
 // time(μ秒)を秒に換算する(÷1,000,000)、片道時間(÷2)、音速(m)をcmに換算する(×100)

 // 1次ローパスフィルター
 distance = distance * filter + prevDistance * (1 - filter);
 prevDistance = distance; // 今回の値を保持
 Serial.print(distance);
 Serial.println(" cm");
 delay(1000);
}

参考文献

  • センサ信号の処理の基礎
    http://www.mech.tohoku-gakuin.ac.jp/rde/contents/sendai/mechatro/archive/RMSeminar_No07_s8.pdf

One Reply to “ESP-WROOM-02と距離センサー(HC-SR04)でフィルターを使用して測定する – 自由研究”

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です