(解決策を3回の移動平均に変更しました。2016/10/6)
今回の誤動作は、サーボモーターとは無関係でした。原因は、電源電圧の不安定さ。常に5Vが流れてくる訳ではなく、ちょくちょく、4.5Vとかのことがあります。センサーに利用しているフォトトランジスタは、入力電圧によって戻ってくる値が変わるので、この電圧の変化によって不安定な結果を返していました。
Arduinoで、電圧の変化とフォトトランジスタの値の変化を確認するスケッチを作成して確認したところ、次のような状況でした。
以上から、移動平均を行うことで、極端な値の変化を抑制することができそうでした。そこで、3回の移動平均を求めて、その値で回転の判定を行ったところ、2日間連続で動かしても、誤動作は発生しませんでした。
3個分のint型の配列を用意して、インデックスを表すint型の変数も用意します。インデックスを変化させて、一番古い値の場所に、新しいセンサー値を記録して、配列の平均を求めれば、移動平均が求まります。
-
- -
モーターの電源は他からとった方が安全なので、以下はやった方がより良いので、情報は残しておきます。
サーボモーター(SG90)をArduinoの5Vに接続すると、時々電力不足になるようで、センサーが誤動作することがあります。プログラム側でセンサーが0の値や突発的な変化を無視することで殆ど誤動作はなくせましたが、完全ではありませんでした。より安定して動かすには、サーボモーターの電源はArduino以外から取った方がよさそうです。
SG90用には以下のものを検討しています。動作電圧が4.8-5.0Vなので、USBの電源がちょうどよいです。普通の5Vのアダプターでもいいのですが、いざという時、USBならPCからも電源もらえるかもなので。
以上2つで、ブレッドボードに5Vの電源を用意して、サーボモーターを接続すればよさそうです。
Arduinoは消費電力が少ないので、電池駆動でも長持ちしそうな気がします。充電池2つを以下で昇圧すれば動きそうです。
ちなみに、今はArduinoの電源用に以下のACアダプターを使っています。
ACアダプターの電源を、Arduino用とモーター用で分ければ1つのACアダプターで済みそうな気もしていますが、今のところその知識がないので、一先ず上記で一旦やっつけようと思います。