こんばんは、よつばです。
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)でフィルターを使用して測定する – 自由研究”