ドローン制御の勉強をしてみようー3回目
前回の2回目
から5か月以上ほったらかし状態でしたが今回はその続きです。
3回目は「プロポ受信機からデータを読み取り」の話です。
今回使用したプロポと受信機はこれ。
【プロポ】FUATBA 10J
【受信機】FUTABA R3008RB
プロポと受信機間の無線通信方式については今回は触れません。なんの疑問もなくプロポで操作したことが受信機に伝達されるものだとします。
ここでは受信機からプロポから送られてきた操作データを Arduino で読み取るのが今回の目的です。
ネットで調べると
あたりの情報によると PWM / PCM / PPM / SBUS 等の複数の読取方式はあるようです。
最新の読取方式としては SBUS を試してみたいところなのですが、SBUS方式で読み取るには電気信号を反転させる回路を作る必要があるので今回はあきらめました。
SBUSでの読み取り関する有益な情報はこちらあたりのサイトは参考になりそうです。
今回は PPM 方式で読み取ることとした。
PPM方式では各チャンネル毎に信号線が必要となり Arduino の入力ピンの数もチャンネル数分だけ必要となります。
今回はプロポの操作モード1で受信機の1~4までの4つのチャンネルを読み取ることにした。
受信機チャンネル1 |
: |
プロポの右の左右レバー |
エルロン(左右) |
受信機チャンネル2 |
: |
プロポの左の上下レバー |
エレベーター(前後) |
受信機チャンネル3 |
: |
プロポの右の上下レバー |
スロットル(上下) |
受信機チャンネル4 |
: |
プロポの左の左右レバー |
ラダー(回転) |
各チャンネルの信号はプロポのレバーの操作量に応じてパルス信号としてハイの長さが 約1000us ~ 約2000us の間で変化する信号として Arduino で読み取ることとなります。
Arduinoの標準ライブラリの pulseIn 関数を使えば簡単にPPM信号のパルス幅のマイクロ秒を取得することができます。
ただし、各チャンネルの信号を順番に読み取っていては時間がかかりすぎるため他のリアルタイム性が求められる処理(姿勢センサやモータの制御等)に影響を及ぼしてしまう恐れがあります。
私がこのことに気づいたのは姿勢センサやモータの制御等の機能をプログラムに組み込んで動かしたときに動作が不安定となり、いろいろ調べたり、考えたりして上記のような影響を受けていたことが解り、後に信号読み取り方法の改善を施すこととなってしまいました。
その方法は、各チャンネルの信号の立ち上がりのタイミングは同時で立下りのタイミングは各チャンネルで異なる(レバーの操作量に応じて変わる)というの信号として扱えるようなのでどれか一つのチャンネルの立ち上がりで割込処理を行いその割込処理内で全チャンネル分を読み取るようにすることにしたのです。最大で2000us(2ms)で全チャンネル分の読み取りができることになります。メインループ内で2msのディレイが発生するのは避けられないようです。SBUS受信の方がCPU処理的には効率的なのかもしれません。(試してないので正確なことは言えませんが…)
こちらのサイトが参考になりました。
具体的なプログラムコードはネットでググればすぐに見つかると思います。