SSブログ

ATtiny13A で AEHA リモコン [Arduino]

NEC形式、SIRC(SONY)形式とやってきたので、家製協(AEHA)形式のリモコンもATtiny13Aでつくってみました。

ターゲットはPanasonicのシーリングライト「HHPFZ4380E6」です。
hhpfz4380e6.jpg

次のスケッチで照明をつけたり、消したりすることができるのですが、照明の真下で50cmほどの距離でないと反応してくれませんでした。
まともに使うには出力を増強しないといけません。

// PWMで38kHzをつくる赤外線リモコン(AEHA形式) (ATtiny13A (1.2MHz)版)
#include <util/delay_basic.h>    // _delay_loop_2() を使うため
#include "wiring_private.h"      // sbi(), cbi() を使うため

void setup() {    // OC0B (Arduino的には1番ピン(PB1)) を 38kHz PWM 出力にする。 
  DDRB |= B00000010;
  TCCR0A = (0<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00); 
  TCCR0B = (1<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
  OCR0A = 31;  // (( 1.2MHz / 38kHz ) / 1(分周) ) - 1 = 30.6
  OCR0B = 11;  // duty比を1/3にする ( 1.2MHz / 38kHz ) / 3 = 10.5
  TIMSK0 = 0;  // タイマー割り込みの不許可 (Arduinoの時間系関数と競合するのでつぶす)
}

void loop() {
  uint8_t panaLight[5];                // Panasonicの照明リモコンのデータ格納用配列
  panaLightIrCode( 2, 4, panaLight );  // ch2, 4(全灯) のデータ作成
  sendIrAEHA1M2Hz( panaLight, 40 );    // 5byte(40bits)送信
  delayDeciseconds1M2Hz( 50 );         // 5秒のdelay
  panaLightIrCode( 2, 7, panaLight );  // ch2, 7(消灯) のデータ作成
  sendIrAEHA1M2Hz( panaLight, 40 );    // 5byte(40bits)送信
  delayDeciseconds1M2Hz( 50 );         // 5秒のdelay
}

void sendIrAEHA1M2Hz( uint8_t *d, uint16_t len ) {
    // AEHA形式の時間単位(T)は、425 (350-500) usec
    //    1 MHzだと 425 CPU cycles 必要
    //   1.2MHzだと 425 x 1.2 = 510 CPU cycles 必要
    // delay_basic.h の _delay_loop_2() では 1ループで 4 CPU cycles 消費できる
    //   425 x 1.2 / 4 = 127.5 ループすればいい
  sbi(TCCR0A, COM0B1);  _delay_loop_2( 1020 );  // リーダ ON  (8T)
  cbi(TCCR0A, COM0B1);  _delay_loop_2(  510 );  // リーダ OFF (4T)
  
  for(uint16_t i=0; i<len; i++) {
    sbi(TCCR0A, COM0B1);  _delay_loop_2( 127 );                                   // データ ON  (1T)
    cbi(TCCR0A, COM0B1);  _delay_loop_2( ( d[i/8] >> (i%8) ) % 2 ? 382 : 127 );   // データ OFF (0:1T/1:3T)
  }
  
  sbi(TCCR0A, COM0B1);  _delay_loop_2( 127 );                // トレーラ ON  (1T)
  cbi(TCCR0A, COM0B1);  _delay_loop_2( 37342 - 382 * len );  // トレーラ OFF (130ms-12T-1T-約3T*bits) (計 130ms)
}

void delayDeciseconds1M2Hz( uint16_t ds ) {    // 1.2MHz動作時 0.1sec単位のdelay
  while( ds-- )  _delay_loop_2( 30000 );           // 1MHzなら 25000
}

void panaLightIrCode( uint16_t ch, uint16_t cmd, uint8_t *d ) {
    // ch:1-3, cmd:2-7 (2明 3暗 4全灯 5お好み 6常夜灯 7消灯)
  d[0] = 0x2c;  d[1] = 0x52;  d[2] = 0x09;   // カスタムコード他固定部分
  d[3] = cmd + (ch << 3) + 0x20;             // データ部分
  d[4] = d[2] ^ d[3];                        // データチェック用XOR
}

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。