Arduinoで赤外線リモコン

Chanさんの「赤外線リモコン制御モジュール」
http://elm-chan.org/fsw/irctrl/00index.html
をArduinoのライブラリにしてみました。

ライブラリとして2つのファイルを配置してください。
Counter1とTimer2を使うのでArduino標準のPWMがいくつか使えなくなっているはずです。

サンプルスケッチ IrCtrlTest.pde

#include <Debounce.h>
#include <IrCtrl.h>

int PIN_LED      = 13;
int PIN_IR_IN    =  8; // PB0 ICP1 Counter1
int PIN_IR_OUT   =  3; // PD3 OC2B Timer2
int PIN_BUTTON_1 =  2;
Debounce button1 = Debounce(20, PIN_BUTTON_1);

void setup()
{
 Serial.begin(115200);
 pinMode(PIN_LED, OUTPUT);
 pinMode(PIN_BUTTON_1, INPUT);
 digitalWrite(PIN_BUTTON_1, HIGH); // pull-up

 pinMode(PIN_IR_OUT, OUTPUT);
 pinMode(PIN_IR_IN,  INPUT);
 digitalWrite(PIN_IR_IN, HIGH); // pull-up
 IR_initialize();

 Serial.println("IR remote control test program");
}

void loop()
{
 // digitalWrite(PIN_LED, !digitalRead(PIN_IR));

 ir_recv_loop();

 if(button1.update() && !button1.read()){
   if (IR_xmit(AEHA, (uint8_t*)"\xAA\x5A\x8F\x12\x14\xF1", 6*8)){
     Serial.println("OK AQUOS VOLUME UP");
   }
 }
}

void ir_recv_loop(void)
{
 if(IrCtrl.state!=IR_RECVED){
   return;
 }

 uint8_t d, i, l;
 uint16_t a;

 l = IrCtrl.len;
 switch (IrCtrl.fmt) {	/* Which frame arrived? */
#if IR_USE_NEC
 case NEC:	/* NEC format data frame */
   if (l == 32) {	/* Only 32-bit frame is valid */
     Serial.print("N ");
     Serial.print(IrCtrl.buff[0], HEX); Serial.print(" ");
     Serial.print(IrCtrl.buff[1], HEX); Serial.print(" ");
     Serial.print(IrCtrl.buff[2], HEX); Serial.print(" ");
     Serial.print(IrCtrl.buff[3], HEX); Serial.println();
   }
   break;
 case NEC|REPT:	/* NEC repeat frame */
   Serial.println("N repeat");
   break;
#endif
#if IR_USE_AEHA
 case AEHA:		/* AEHA format data frame */
   if ((l >= 48) && (l % 8 == 0)) {	/* Only multiple of 8 bit frame is valid */
     Serial.print("A");
     l /= 8;
     for (i = 0; i < l; i++){
       Serial.print(" ");
       Serial.print(IrCtrl.buff[i], HEX); 
     }
     Serial.println();
   }
   break;
 case AEHA|REPT:	/* AEHA format repeat frame */
   Serial.println("A repeat");
   break;
#endif
#if IR_USE_SONY
 case SONY:
   d = IrCtrl.buff[0];
   a = ((uint16_t)IrCtrl.buff[2] << 9) + ((uint16_t)IrCtrl.buff[1] << 1) + ((d & 0x80) ? 1 : 0);
   d &= 0x7F;
   switch (l) {	/* Only 12, 15 or 20 bit frames are valid */
   case 12:
     //xprintf(PSTR("S12 %u %u\n"), d, a & 0x1F);
     Serial.print("S12 ");
     Serial.print(d, HEX);        Serial.print(" ");
     Serial.print(a & 0x1F, HEX); Serial.println();
     break;
   case 15:
     //xprintf(PSTR("S15 %u %u\n"), d, a & 0xFF);
     Serial.print("S15 ");
     Serial.print(d, HEX);        Serial.print(" ");
     Serial.print(a & 0xFF, HEX); Serial.println();
     break;
   case 20:
     //xprintf(PSTR("S20 %u %u\n"), d, a & 0x1FFF);
     Serial.print("S20 ");
     Serial.print(d, HEX);        Serial.print(" ");
     Serial.print(a & 0x1FFF, HEX); Serial.println();
     break;
   }
   break;
#endif
 }
 IrCtrl.state = IR_IDLE;		/* Ready to receive next frame */
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年07月24日 21:48
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。
添付ファイル