ATtiny13A で AEHA リモコン [Arduino]
NEC形式、SIRC(SONY)形式とやってきたので、家製協(AEHA)形式のリモコンもATtiny13Aでつくってみました。
ターゲットはPanasonicのシーリングライト「HHPFZ4380E6」です。
次のスケッチで照明をつけたり、消したりすることができるのですが、照明の真下で50cmほどの距離でないと反応してくれませんでした。
まともに使うには出力を増強しないといけません。
ターゲットはPanasonicのシーリングライト「HHPFZ4380E6」です。
次のスケッチで照明をつけたり、消したりすることができるのですが、照明の真下で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
}