Arduinoでラジコンの受信機から多チャンネル信号読み取ってサーボ動かす,その2
前のエントリーはこちら.2.4GHz受信機のパルスの頭が揃ってることを利用して割込みを使って,割込みを利用してパルス幅を読み取る方法を前に書いたのですが,分解能が足りませんでした.そこで,digitalRead()を使うのではなく,ポートを直接アクセスしてオーバーヘッドを無くして分解能をあげられないか試してみました.その様子はこちら↓これだけ見ると,マイクロ秒オーダーのループでカウンタが回って,分解能前より一桁上がったように見えますが,そう簡単には行きませんでした.ループ内の条件判断がクリアされるとループを回る処理時間が変わり,あるチャンネルの操作量を変えると別のチャンネルにも影響してしまい(10-20%くらい?)無視できないほどでした.ループが約1-2マイクロ秒で変わっているようなので,次のスケッチのように8マイクロ秒のディレイを入れました.これで1ループが約10マイクロ秒となりループの時間の誤差が少なくなります.サーボのパルス幅の1-2msを読み取るのに約10マイクロ秒のループが100回程度になるので,分解能も1/100程度になり,サーボの読み取りとしては実用レベルになりました.読み取り部分のスケッチはこちら↓ 割込みの設定とかはしてください.//setup内 attachInterrupt(0,pwRead, RISING); // 2番ピンに受信信号を入れる pinMode(RCV_THR, INPUT); // 受信機スロットル信号監視用 pinMode(RCV_AIL, INPUT); // 受信機エルロン信号監視用 pinMode(RCV_ELE, INPUT); // 受信機エレベータ信号監視用 pinMode(RCV_RUD, INPUT); // 受信機ラダー信号監視用// RC受信void pwRead(){ int cnt=0; cntRd++; if (cntRd