梵天丸をコントロールするプログラム




プログラム(bon_key.c)


 スタートビットの入力を検知後、0.83[ms]ごとに”1”、”0”を判定し、入力されたキーを判別します。それに応じて梵天丸のモータを動作させます。
 効率の良いコーディングではないので、修正を検討しています。
//******************************************************************************
//*    bon_key  スタートビット検出+リモコンデータ検出                   * 
//*        パソコンのキーボードを押すと梵天丸移動(W↑A←S→Z↓)   *
//******************************************************************************

#include <16f84a.h>             // 使用デバイスの定義情報をインクルードする。
#fuses HS, NOWDT, NOPROTECT     // コンフィグレーションの設定(HSモード,WDTなし,プロテクトなし)
#use delay (clock=8000000)      // 梵天丸の発振子の周波数8MHz 時間待ち関数(delay)の設定
                                   
//-----------------------------------------------------------------------------
//  I/Oポートの定義             
//-----------------------------------------------------------------------------
#byte  RA = 5                   // ポートAのアドレス5番地をRA:文字変数に設定する。
#byte  RB = 6                   // ポートBのアドレス6番地をRB:文字変数に設定する。
#bit start_bit = RA.4           // 赤外線の入力ポートRA4をstart_bit:文字変数に設定する。
//-----------------------------------------------------------------------------
//  メイン関数
//-----------------------------------------------------------------------------
main(){
  byte  flag, cnt, i;           // byte型変数(符号なし8ビット)
  byte  data1, data2, data3, data4, data5, data6, data7, data8, data9;
  byte  rcv;

  set_tris_a(0x10);            // ポートAはRA4のみ入力に設定。(1:Input) 他は出力に設定。(0:Output)
  set_tris_b(0xff);            // ポートBはすべて入力に設定(1:Input)


  data1 = 0x01;                 // 前左 パターン  0000 0001 モータ動作データ
  data2 = 0x03;             // 前進 パターン  0000 0011 リモコンのボタンとdataの番号が対応
  data3 = 0x02;             // 前右 パターン  0000 0010 下位4ビットが
  data4 = 0x09;             // 左転 パターン  0000 1001 (MSB)左逆転 右逆転 左正転 右正転(LSB) 
  data5 = 0x00;             // 停止 パターン  0000 0000 
  data6 = 0x06;             // 右転 パターン  0000 0110
  data7 = 0x04;             // 後左 パターン  0000 0100 
  data8 = 0x0c;             // 後進 パターン  0000 1100
  data9 = 0x08;             // 後右 パターン  0000 1000  

  RA = 0x00;                                    // 電源オン時、モータを停止状態にしておく

  while(1){
  while(start_bit!=0)  {}                       // スタートビット(1:H)が入力されるまで待つ
                flag = 0;
        for (i=1;i<=4;i++)                      // スタートビット検出
                {                               // 100μs×4=400μsのうちに
                delay_us(100);                  // RA4の"L"レベルの回数を検出
                if (input(PIN_A4)==0)
                        flag = flag + 1;
                }
    if (flag >=3)                               // 3回以上検出した場合
                {
                delay_us(830);
                rcv = 0;
                        if (input(PIN_A4)==1)   // RA4の"L"レベルの回数を検出(1bit)
                                {
                                rcv = rcv + 1;  // 検出の場合  rcv値+1
                                }
                                else
                                {                                               
                                rcv = rcv + 0;  // 未検出の場合 rcv値+0
                                }
                        delay_us(830);
                        if (input(PIN_A4)==1)   //2bit
                                {
                                rcv = rcv + 2;          
                                }
                                else
                                {                                               
                                rcv = rcv + 0;
                                }
                        delay_us(830);
                        if (input(PIN_A4)==1)   //3bit  
                                {
                                rcv = rcv + 4;
                                }
                                else                                            
                                {
                                rcv = rcv + 0;
                                }
                        delay_us(830);
                        if (input(PIN_A4)==1)   //4bit
                                {
                                rcv = rcv + 8;
                                }
                                else
                                {                                               
                                rcv = rcv + 0;
                                }
                                delay_us(830);
                        if (input(PIN_A4)==1)   //5bit 
                                {
                                rcv = rcv + 16;          
                                }
                                else
                                {                                               
                                rcv = rcv + 0;           
                                }
                        delay_us(830);
                        if (input(PIN_A4)==1)   //6bit
                                {
                                rcv = rcv + 32;         
                                }
                                else                                            
                                {
                                rcv = rcv + 0;
                                }
                        delay_us(830);
                        if (input(PIN_A4)==1)   //7bit  
                                {
                                rcv = rcv + 64;
                                }
                                else                                            
                                {
                                rcv = rcv + 0;
                                }
                        delay_us(830);
                        if (input(PIN_A4)==1)   //8bit
                                {
                                rcv = rcv + 128;
                                }
                                else                                            
                                {
                                rcv = rcv + 0;
                                }
        }       
    switch(rcv)                                 // キー検出結果
                {
                case 87 : RA = data2;           // キー"W"押す  前進
                break;
                case 65 : RA = data4;           // キー"A"押す  左
                break;
                case 32 : RA = data5;           // キー" "押す  停止
                break;
                case 83 : RA = data6;           // キー"S"押す  右
                break;
                case 90 : RA = data8;           // キー"Z"押す  後進
                break;
                }
        delay_ms(100);                           
   }                                            // 無限ループで繰り返し
}


平成17年6月10日作成