2012-03-30

ミーネンロイマー リベンジ その9

ミーネンロイマー その9です。
内蔵を組み込んでみました。なんとか入りました。
ミーネン専用の赤外線受信ソフトを作成しました。受信部分はどこかで拾ってきたものです。コードを検出してポートを動かす部分は初心者が書いた羅列になっています、これでもちゃんと動くのでいいでしょ。 ポートはまだまだ余っているので、LEDチカチカとか、機銃の音だしとかできそうです・・・が、それはまた今度という事にして、とりあえずこれで完成とします。

// NEC専用受信器
#include
#define IR_IN   2          // IR Receiver
#define NEC    1
#define BUF_SIZE   (512)
#define DATA 0

Servo servo;  //サーボの名称を設定
void setup()  {
  pinMode( IR_IN , INPUT );
  pinMode(3, OUTPUT);//RF
  pinMode(4, OUTPUT);//RB
  pinMode(5, OUTPUT);//RG
  pinMode(6, OUTPUT);//LF
  pinMode(7, OUTPUT);//LB
  pinMode(8, OUTPUT);//LG
  servo.attach(9);//サーボ割り当て
  Serial.begin(115200);
}

void loop() {
  unsigned long usec, nec_data = 0;
  unsigned int i, n, irOffTime, minTime, aveCnt = 0, aveAdd = 0;
  unsigned int irdata[ BUF_SIZE ], timeunit, leaderH, leaderL,
datalen;
  unsigned int format = 0, hex = 0, sony_data = 0, sony_adrs =
0,  sony_adrs_bit = 0;
  boolean isvalid = true;
  // ● 赤外線を感知するまで待つ
  while( digitalRead( IR_IN ) == HIGH );
  // ● 生データの取得
  for( i=0; i < BUF_SIZE; ) {
    usec = micros();
    while( digitalRead( IR_IN ) == LOW );      // IR信号がONの時間を測定
    irdata[  i] = micros() - usec;
    irdata[++i] = 0;
    usec = micros();
    while( digitalRead( IR_IN ) == HIGH ) {    // IR信号がOFFの時間を測定
      irOffTime = micros() - usec;
      if( irOffTime > 65000 ) goto ir_exit; // 信号途絶なら終了
    }
    irdata[i++] = irOffTime;
  }
  ir_exit:
  // ● 時間単位を調べる
  minTime = irdata[0];      // まず最小値を確認
  for( i=0; irdata[i]; i++) minTime = min( minTime, irdata[i]);
  for( i=0; irdata[i]; i++) {  // 最小値の+50%までを時間単位とする
    if( minTime * 3 / 2 > irdata[i] ) { aveAdd += irdata[i] - minTime;  aveCnt++; }
  }
  timeunit = aveAdd / aveCnt + minTime;
  if( timeunit < 300 ) return;  // 時間単位が短すぎるときは異常と判断
  // ● 時間単位でのデータに変換
  for( i=0; irdata[i]; i++) irdata[i] = ( irdata[i] + timeunit/ 2 ) / timeunit;
  // ● 解析しやすくするためにデータの整理
  leaderH = irdata[0];  // リーダ部Highの長さ
  leaderL = irdata[1];  // リーダ部Low の長さ
  for( i=0;; i+=2) {       // データ解析用にリーダ部とリピートを除去・整理
    irdata[i] = irdata[i+2];  irdata[i+1] = irdata[i+3];
    if( irdata[i+1] > 10 || irdata[i+1] == 0 ) { irdata[i+1] = 0;  datalen = i / 2 + 1;  break;  }
  }
  if((leaderH > 14 || leaderH < 18) && leaderL == 8 ) { format = NEC; }
  // ● フォーマット毎に結果を表示
  switch( format ) {
    case NEC:      // ■ NECフォーマット
      for( n=0; n < datalen - 1; n++) {  // ストップビット手前まで繰り返し
        nec_data |= ( (irdata[n*2+1]==1) ? 0UL : 1UL ) << n;
      }
      if( !isvalid ) break;    // データに不具合があれば以降は表示しない
      Serial.print(  (nec_data >> 24) % 256 ); // コードを表示
//ここから
//停止 F3 243
       if ((  (nec_data >> 24) % 256 ) == 243) {
         digitalWrite(3, LOW);
         digitalWrite(4, LOW);
         digitalWrite(5, LOW);
         digitalWrite(6, LOW);
         digitalWrite(7, LOW);
         digitalWrite(8, LOW);
       }
//前進 F5 245
      if ((  (nec_data >> 24) % 256 )== 245) {
         servo.write(90);
         digitalWrite(3, HIGH);
         digitalWrite(4, LOW);
         digitalWrite(5, HIGH);
         digitalWrite(6, HIGH);
         digitalWrite(7, LOW);
         digitalWrite(8, HIGH);
       }
//後進 F1 241
      if ((  (nec_data >> 24) % 256 ) == 241) {
         servo.write(90);
         digitalWrite(3, LOW);
         digitalWrite(4, HIGH);
         digitalWrite(5, HIGH);
         digitalWrite(6, LOW);
         digitalWrite(7, HIGH);
         digitalWrite(8, HIGH);
       }
//右前方旋回 F6 246
      if ((  (nec_data >> 24) % 256 ) == 246) {
         servo.write(60);
         digitalWrite(3, HIGH);
         digitalWrite(4, LOW);
         digitalWrite(5, LOW);
         digitalWrite(6, HIGH);
         digitalWrite(7, LOW);
         digitalWrite(8, HIGH);
       }
//右後方旋回 EF 239
      if ((  (nec_data >> 24) % 256 ) == 239) {
         servo.write(60);
         digitalWrite(3, LOW);
         digitalWrite(4, HIGH);
         digitalWrite(5, LOW);
         digitalWrite(6, LOW);
         digitalWrite(7, HIGH);
         digitalWrite(8, HIGH);
       }
//左前方旋回 F7 247
      if ((  (nec_data >> 24) % 256 ) == 247) {
         servo.write(120);
         digitalWrite(3, HIGH);
         digitalWrite(4, LOW);
         digitalWrite(5, HIGH);
         digitalWrite(6, HIGH);
         digitalWrite(7, LOW);
         digitalWrite(8, LOW);
       }
//左後方旋回 F0 240
      if ((  (nec_data >> 24) % 256 ) == 240) {
         servo.write(120);
         digitalWrite(3, LOW);
         digitalWrite(4, HIGH);
         digitalWrite(5, HIGH);
         digitalWrite(6, LOW);
         digitalWrite(7, HIGH);
         digitalWrite(8, LOW);
       }
//ここまで
    break;
  }
  Serial.println("");
}

0 件のコメント: