プログラムの説明

リモコンを押すと、押したボタンに応じて「梵天丸」が動くプログラムを作ります。
関数もあまり使わず(使えず?)、変数なども共通化しすぎず(できず?)、プログラミングのセンスがまったく感じられない(?)、流れそのままのプログラムになっています。実力が上れば改善します。

プログラムの流れは

@ スタートビットの検出
A 1ビット目の検出、数値化
B 2ビット目の検出、数値化
C 3ビット目の検出、数値化
D 4ビット目の検出、数値化
E 各ビットの積算
F 積算データによる判定、モータ駆動


@ スタートビットの検出


スタートビットのパルス幅は約2.5msなので500μsごとにサンプリングすると”L”レベルの信号が5回現れます。






スタートビット以外の信号では5回は現れないので、”L”レベルの信号を確認することで,信号A,Bのデータ信号との区別ができます。

while(start_bit!=0) {}        
flag = 0;               
for (i=1;i<=5;i++)          
    {                
    delay_us(500);        
    if (input(PIN_A4)==0)   
    flag = flag + 1;       
    }
// スタートビットが入力されるまで待つ
// フラグの初期化  
// 5回ループする。
//
// 500μsごとのインターバルで
// RA4が”L”レベルなら 
// "L"レベルの回数を加算 


A 1ビット目の検出、数値化


1ビット目のデータが”1”のとき
”L”レベルのパルス幅が約1.3ms

1ビット目のデータが”0”のとき
”L”レベルのパルス幅が約0.8ms


一定間隔でサンプリングすると”L”レベルの信号の表れる回数はデータ"1"のときがデータ"0"のときより多く現れます。この回数の違いで”1”と”0”を検出します。
for (i=1;i<=10;i++)
    {
    delay_us(110);
    if (input(PIN_A4)==0)
        cnt = cnt + 1;
    else
        cnt = cnt + 0;
    }
if (cnt >=8)
    {
    rcv1 =1;
    delay_us(600);
    }
else
    {
    rcv1 =0;
    }
//1ビット目 10回サンプリング
//
// 110μs間隔
// RA4の"L"レベルのとき
// 検出の場合  cnt値+1
//
// 未検出の場合 cnt値+0
//
// cnt値が8以上の場合
//
// rcv1を1にする。
// 次のデータビット(2ビット目)まで待機
//
// それ以外の場合
//
// rcv1を0にする。


B、C、D
 2、3,4ビット目の検出、数値化


Aの方法で残りのビットも検出します。
1ビット目のデータによってデータ長が異なるので、スタートビットから見たときの2ビット目のスタート時間が変化します。そこで、2ビット目の検出を始めるときの調整が必要です。
下記の図は1ビット目の開始のタイミングは同じですが、2ビット目以降は上の信号に比べ、下の信号が遅れています。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

スタートビット
0
0
0
0
0
0
0
1
0
0
0
0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

スタートビット
1
0
0
0
0
0
0
1
0
0
0
0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




E 各ビットの積算

それぞれのデータに重みをつけ、信号が”1”のとき、重み付けした値を数値化し、信号が”0”のときは”0”として扱うと4ビットのデータを0〜15までの数値で表すことができます。今回は0(0000)〜8(1000)までしか使用しません。

rcv =rcv1 + rcv2 + rcv3 + rcv4;

// 検出データ加算

F 積算データによる判定、モータ駆動


data1 = 0x01; // 前左 パターン 0000 0001 
data2 = 0x03; // 前進 パターン 0000 0011 
data3 = 0x02; // 前右 パターン 0000 0010 
data4 = 0x09; // 左転 パターン 0000 1001 
data5 = 0x00; // 停止 パターン 0000 0000 
data6 = 0x06; // 右転 パターン 0000 0110
data7 = 0x04; // 後左 パターン 0000 0100 
data8 = 0x0c; // 後進 パターン 0000 1100
data9 = 0x08; // 後右 パターン 0000 1000


モータの動作パタンをあらかじめ作成し、そのデータを条件判定で分岐します。データを変数にしてあるのでプログラムでは変数を読み出せばよくなります。
switch(rcv)
{
case 0 : RA = data1;
break;
case 1 : RA = data2;
break;
case 2 : RA = data3;
break;
case 3 : RA = data4;
break;
case 4 : RA = data5;
break;
case 5 : RA = data6;
break;
case 6 : RA = data7;
break;
case 7 : RA = data8;
break;
case 8 : RA = data9;
break;
}
// リモコンデータ検出結果

// リモコンボタン"1" 押す 前左

// リモコンボタン"2"押す 前進

// リモコンボタン"3"押す 前右

// リモコンボタン"4"押す 左転

// リモコンボタン"5"押す 停止

// リモコンボタン"6"押す 右転

// リモコンボタン"7"押す 後左

// リモコンボタン"8"押す 後進

// リモコンボタン"9"押す 後右



サンプリングの回数や[1]〜[9]以外のキーが押された場合の処理など、手直し、見直しする箇所はあります。今後、改善したいと思います。



back
next