2019年10月31日木曜日

カルマンフィルタ積むまでもない時のローパスフィルタ

最近HX711をつんだ重量計を買ってM5stackでつかっていたのですよ。
アマゾンとか売ってる安いやつね。Arduinoライブラリでは引数に(10)とか入れて10回積算値を入れてたりするのだけれども、それだと応答性が悪い。応答性は計り取り(製薬やお料理)に重要で、速度が求められる。ということで、普通はこの積算回数と応答性のトレードオフになるんだけど、少しだけ賢い方法を紹介。

具体的な処理は以下の通り

  float w=ここで重量だとかを入力;
  static float oldV=0;  //平均値となる出力を入れる変数
  const float minRate=0.01; //重さの変動がないときはIIR係数0.01にする
               (小さい程積算回数が増えたのと等価になる)
  const float maxRate=0.999;//重さの変動が大きい時はIIR係数を1未満で大きな数にする(あまり弄る必要はなし)
  const float  threshWeight=5; //この変動量ぐらいが「大きい」「小さい」の閾値
  //////////実質的な処理は以下2行/////////////
  float rate = minRate+  min( fabs(w-oldV)/threshWeight ,1.0f)*(maxRate-minRate);
  oldV=w*rate+oldV*(1-rate);


重量計だとかは雑に考えると角がかけた階段状に出力値が変化すると考えられる、
そんなときはカルマンフィルタが王道だけど、とりあえずやっつけで実装したいときは上の実装で十分な応答性と精度が得られる。

rateがカルマンゲインに相当してるんだけど、この解説サイトの説明で言えば「予測不確かさ」と「観測不確かさ」がこの系には存在して、そのうち「予測」不確かさの割合をrateに入れるのが良いとされています。

過去の平均値と現在の入力値の差が予測不確かさに比例すると考えると上のの(w-oldV)は予測不確かさに比例した何かです。本来予測不確かさに対してカルマンゲインは定数である観測不確かさaをつかって、rate=x/(a+x)のような形になるんですが、上ではy=ax+bの形に近似してる事になります。

ここで、真面目に観測誤差とは何かとか考えてもいいんだけど、ぶっちゃけ必要な精度にあわせてminRateを小さくしていって、あとは変動が「大きい」時に高速化するためにthreshWeightを調整すると考えて勘で調整しても十分気持ちよく動いてくれる。



2019年10月4日金曜日

中華デジタルタイマーリレーの設定方法

先日買った、中華デジタルリレー設定方法の日本語訳が解りにくかったので、翻訳。

https://ja.aliexpress.com/item/33014830389.html?spm=a2g0s.9042311.0.0.463e4c4dOuik6D

モード設定をしてしまえば、電源復帰後そのモードで動きます。

トリガー入力はフォトカプラで絶縁されてるので、Gnd_tとSignalにそれなりの電圧をいれないとトリガー入力されません。3~24V とかいてありますが、5Vぐらいはいるっぽい。


SETを長押しして、設定モードに入る。UP/Downでモード切り替えができます。
モード切替後、SETを押してON/OFF(LED上ではCL/OPで表示)の時間を設定します。(SET=決定キー)
秒数入力モードの時以外に、再びSET長押しで、設定モードからぬけて通常動作します


モード一覧
P1.1: トリガーの立ち上がり/立ち下がりエッジ両方で[On時間]だけリレーをOn
P1.2:ONトリガになるたびに「On時間」だけ、リレーをON。トリガーONのままでも指定時間になったらOFFになる、立ち上がりトリガーが途中で立ったら指定秒数を再びセットする。(連打すればずっとON)
P1.3: トリガがONになるたびに「On時間」だけ、リレーをON 。P1.2と違いもう一回立ち上がりエッジがくると、中断してOFFになる
P1.4:トリガは無視、電源ON後一定時間のみONになる。 (車載装置などの遅延電源ON回路用途)
P2.1:立ち上がりエッジの後[Off時間]まってから[On時間]の間だけ、リレーOn。カウント中の入力は無視。(トリガーHiのままだと、Offのまま。一度LowにしてからHiにしないとカウントしない)
P2.2: P2.1と同じだけど、トリガーが入力されるたび秒数リセット
P3.1:トリガーでOn/OffループをLoop回まわす。 も一回トリガー入力があると、Loopを中断
P3.2:トリガーなしでOn/OffループをLoop回す(電源いれたら自動点滅する時に便利)
P-4: トリガーHiの間はリレーOn,トリガーLowになっても、[On時間]の間はOnを保持


時間入力モード:
設定で、OnやOff表示の後に自動で時間入力モードになる。stopボタンで小数点位置を決定できる。0.1秒単位と1秒単位がある。小数点が三つ表示されるのは「分」入力モード。


Stopモード:
Stopを一回おすと、タイマーは動くけど、リレーは動かさないコールドRUNモードになる。もう一回おすと復帰する

Stop長押しで、C-p,O-dモードが切り替えできるC-pは5分後にLED消灯, O-dモードは常にLED表示ON   (使うのか?この機能?)