Arduinoでラジコンの受信機から4チャンネル分の信号をpulseIn関数で読み取って4個サーボやアンプを動かそうとすると結構難しく、サーボがバタつきます。飛行機を飛ばす場合はピクピクします。ヘリは安定しません。
なぜかというと、pulseIn関数はパルスを待ってる間ほかの仕事ができないからのようです。
4チャンネルを下手に読むと、20ms×4チャンネルくらいの時間がかかり、サーボの信号が途切れたりするっぽいです。昔のRC送受信機だとパルスがズレて出てるので、読む順番を工夫すると、半分の時間で4チャンネル読めます。
2.4GHz帯だとその技が使えません。なぜならば、同時にパルスが出てるので。
例えば、タイマー割り込みを使って数10ms毎に1チャンネルずつ読みに行くと、pulseIn関数の待ちが分散されて、サーボは安定します。でも4チャンネル分読むのに時間がかかり、その分レスポンスが遅れて、操縦が難しくなります。
自律飛行機を作る場合、GPSを読んだりいろいろ処理がかさむので、pulseInを使わないで2.4GHz受信機を読む方法を考えました。
パルスが同時に出ているのを利用して、パルスの一つを使って外部割込みを発生させ、パルスが立ち下がるまでの時間をカウンタを回して調べます。
この方法だと、パルス発生のタイミングで測りに行ってパルスの終わりで終わるので、処理時間は2msほどです。
最初はmicros()で時間を測ったのですが、値が安定しないのでやめました。リファレンスにはmilis()は正常に動作しないとありますが、micros()も怪しいです。
分解能は悪く、カウント値で84-144,中央値115,差は60, ±30でした。分解能が低いですがレスポンスが良いことと数値が安定してることから、pulseInよりはましな感じです。
Arduinoのライブラリに頼らずにポートを直接操作したりすればまだ手はあるんでしょうけど。
みんな困ってないのかなぁ?と思って検索かけても日本語のページでは困ってる人や対処が見つからず、英語のページでは困ってる人を多く見かけたけど対処は見つけられなかった。
Arduinoだけで自律飛行機を自作してる人ってあまりいないのでしょうか?