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