RC信号の監視
自律ロボットのRCによる強制制御を行う場合,RC受信機の監視が必要です.
ロボットの制御に負担をかけないように,別に8ピンPICを搭載してPICにRC受信機の監視をさせて
受信の有無だけを出力する信号を作りました.
こんな感じでFUTABAの受信機から信号を8ピンPIC12F675に入力.
FUTABAのRC送信機の電源OFF,受信機の出力なしの場合.
オシロの上が受信機の信号,下がPICマイコンの監視結果でLレベル.
RC送信機の電源ON,受信機の出力ありの場合.
オシロの上が受信機の信号,下がPICマイコンの監視結果でHレベルの変化.
別メーカ(JR)のRC送受信機でも実験.
送信機の電源OFFでも,どういうわけか受信機は不安定な出力.
でもPICマイコンでは正常な受信がないとしてLレベルを出力.
プログラムについて,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位? } }
ESP32 Wifi Bluetooth開発ボード |
Arduino Nano Every |
Raspberry Pi pico |
FPGA XILINX Artix-7 |