おびやまロボット研究所 ~マイコン電子工作と自作ドローン~

おびやまロボット研究所 ~マイコン電子工作と自作ドローン~

RC信号の監視



こんな感じでFUTABAの受信機から信号を8ピンPIC12F675に入力.
CIMG2725.JPG

FUTABAのRC送信機の電源OFF,受信機の出力なしの場合.
オシロの上が受信機の信号,下がPICマイコンの監視結果でLレベル.
CIMG2721.JPG

RC送信機の電源ON,受信機の出力ありの場合.
オシロの上が受信機の信号,下がPICマイコンの監視結果でHレベルの変化.
CIMG2722.JPG

別メーカ(JR)のRC送受信機でも実験.
送信機の電源OFFでも,どういうわけか受信機は不安定な出力.でもPICマイコンでは正常な受信がないとしてLレベルを出力.
CIMG2726.JPG

プログラムについて,Hレベルのパルス幅とLレベルのパルス幅をそれぞれ監視し,正常なパルス幅でHとLレベルが5回以上繰り返して検出された時にRC受信したと判断しています.

FUTABAのRC受信機の信号監視の動画
JRのRC受信機の信号監視の動画

プログラムは以下の通り,開発環境はMPLABとHITEC-Cを使いました.


// RC送受信機による強制制御のためのRC受信機の信号検出プログラム
// RC受信機の信号をPICのGPXに入力,GPYから受信信号の有無を示すデジタル値を出力 
#include "pic.h"
#include "delay.h"
#include "delay.c"

__CONFIG(INTIO & WDTDIS & BORDIS & MCLRDIS);


main(){
// initialize
unsigned long pwL, pwH; // Hレベル,Lレベルのパルス幅
unsigned int cntL, cntH; // 正常なパルス幅の信号のカウント回数
OSCCAL=_READ_OSCCAL_DATA();
GPIO=0x00;
ANSEL=0x00;
CMCON=0x07;
TRIS1=1; // GPIO1を入力に指定,スイッチ入力
TRIS2=0; // GPIO2を出力指定,=0:RC信号なし,=1:RC信号あり
GPIO2=0; // GPIO2初期値=0V
pwL=pwH=0; // 0で初期化
cntL=cntH=0; // 0で初期化

while (1){
// Hレベルのパルス幅カウント
if (GPIO1==1)pwH++;
else if (pwH !=0 ){
if ( pwH>3 && pwH<15) cntH=(cntH<5)? cntH+1: 5; else cntH=0; // 0.3-1.8ms範囲か?
pwH=0;
}

// Lレベルのパルス幅カウント
if (GPIO1==0)pwL++;
else if (pwL !=0 ){
if ( pwL>50 && pwL<100) cntL=(cntL<5)? cntL+1: 5; else cntL=0; // 10-20ms範囲か?
pwL=0;
}

// 正常な信号が5回以上連続している時GPIO2に信号の有無を出力
if (cntH==5 && cntL==5) GPIO2=1; else GPIO2=0;

DelayUs(50); // 50uS単位の時間カウントとする.<- 実測では100us位?

}
}

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: