■暫定仕様でした■
前バージョンは「とりあえず動けばいいや」で、各軸どれかがボリュームでセットした値を超えたら2段階の明るさでランプを明滅させる、という安易な仕様でした。これだと一度、例えば閾値ギリギリの信号で点滅が始まるとその後に強い衝撃が来ても無視されてしまいます。幸い、滅多にそういうケースはないのですが、可能性としては排除できません。
■改良版■
まず、加速度を各軸ごとの値ではなくスカラー値として処理します。各軸値自乗の総和の平方根ですね(sqrt(x*x + y*y + z*z))。スカラー値はセンサーの向きが変わっても一定のはずなので、起動時に値を保持しておけば、あとは初期スカラー値と瞬間のスカラー値の差をとれば、どの方向であれ掛かった加速度の大きさがわかります。なお、255を超える値を自乗した時に整数だとオーバーフローしてしまうので、floatに直しています。それと、少し簡略版ですが、加速度の最大値でランプのピークの明るさを決めるようにしました。ピークかどうかを検出するのは、一定の時間ごとにサンプルした今回の値が前回の値よりも下がったら前回がピークだった、ということになります。本当ならそのピーク値が前回のピーク値より上かどうかを調べれば、大きな山から下っていくところに出来た小さなピークを誤認することがなくなるのですが、今回は「ドン!」という比較的単純な衝撃の検出なのでそこまで凝ったことはしませんでしたm(_ _)m
この辺は本当にこり始めるとキリがないですし、味付けというか装置の賢さを感じる要素だったりするんですが…とりあえず週末までに何か考えます。
なお、ハードウェアには一切手を加えていません。
■結果■
以下2点の問題が解決しました。- 水平に置いて起動した後、傾けて置いても点滅しっぱなしにならない。
- 大きな衝撃を与えた場合にきっちり強くランプが点灯する。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。