000000 ランダム
 HOME | DIARY | PROFILE 【お気に入りブログ登録】 【ログイン】

CPUを作ろう ~計算機教材とマイコンと電子工作~

RC信号の監視

自律ロボットのRCによる強制制御を行う場合,RC受信機の監視が必要です.ロボットの制御に負担をかけないように,別に8ピンPICを搭載してPICに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位?

}
}


Copyright (c) 1997-2018 Rakuten, Inc. All Rights Reserved.