赤外線リモコン送信

今回のターゲットであるYAMAZENの扇風機はコード1を5回、コード2を3回送信しているようなので、とりあえず解析データをその通りに送ると問題なく動いた。搬送波は38kHzの30%デューティでないとうまくいかなかったが、ソニーの機材をコントロールすることも考えて、少し周期を縮めてみた。最初は赤外線LEDの保護のために出力にかませていたコンデンサのために動作が安定せず苦労した。
Nationalのエアコンは解析が面倒なので、信号パターンをそのまま送信してみた。これで、とりあえず、実験は成功で、エアコンと扇風機が見事に連動して動いた。

// 赤外線リモコン送信プログラム by K Fujio 2012
// 搬送波は16ビットタイマ0で作成し、
// 解析通りに16ビットタイマ1でカウントして、オンオフしている。
#include <mes2.h>
#include <h8/reg3067.h>
static unsigned short yzrotate[] ={
3443, 819, 3382, 818, 1269, 2928, 3386, 818,
3452, 748, 1326, 2871, 3384, 820, 1268, 2930,
1272, 2930, 1271, 2929, 1271, 2929, 1271, 19822,
//
3381, 820, 3381, 820, 1271, 2929, 3380, 820,
3381, 820, 1191, 2986, 3328, 826, 1263, 2932,
1269, 2932, 1270, 2932, 1269, 2932, 1269, 19820,
0 };
static unsigned short yzpower[] ={
3439, 826, 3374, 827, 1265, 2925, 3384, 827,
3374, 827, 1263, 2926, 1272, 2932, 1268, 2932,
1268, 2933, 1268, 2929, 1271, 2933, 3381, 17708,
//
3385, 819, 3382, 819, 1265, 2931, 3385, 818,
3382, 818, 1269, 2928, 1272, 2928, 1272, 2928,
1273, 2928, 1272, 2928, 1272, 2928, 3385, 17707,
0 };
static unsigned short ntpower[] ={
8897,  8450,  2276,  6396,  2405,  6334,  2345,  2026,  2405,
6335,  2343,  6396,  2406,  6335,  2344,  6396,  2406,  6335,  2344,
6396,  2406,  6335,  2343,  2026,  2406,  6334,  2345,  6397,  2405,
6335,  2343,  6396,  2407,  6334,  2343,  6397,  2406,  6335,  2343,
6397,  2406,  1965,  2405,  1965,  2404,  1966,  2404,  1966,  2404,
1966,  2404,  6336,  2405,  6334,  2345,  6396,  2406,  1965,  2405,
1966,  2404,  1966,  2404,  1966,  2404,  1966,  8960,  8451,  2275,
6398,  2343,  6397,  2343,  2026,  2406,  6335,  2405,  6335,  2344,
6397,  2405,  6334,  2344,  6397,  2405,  6335,  2343,  6397,  2344,
2025,  2407,  6335,  2406,  6334,  2344,  6397,  2406,  6335,  2343,
6397,  2406,  6334,  2343,  6396,  2344,  6398,  2405,  1964,  2406,
1966,  2405,  1965,  2405,  1965,  2405,  1966,  2405,  6335,  2343,
6398,  2404,  6335,  2344,  2027,  2405,  1965,  2405,  1966,  2404,
1966,  2405,  1965,  8961,  8450,  2338, 34678,  9026,  8451,  2275,
2027,  2405,  1966,  2404,  6335,  2343,  2027,  2406,  6334,  2343,
6397,  2406,  6335,  2343,  6396,  2406,  1965,  2405,  1965,  2405,
6335,  2405,  1965,  2406,  6335,  2405,  6335,  2343,  6397,  2406,
6334,  2343,  2026,  2407,  6334,  2344,  6398,  2405,  1964,  2406,
6334,  2344,  6397,  2343,  2026,  2407,  1965,  2405,  1966,  2405,
6334,  2344,  6397,  2406,  1964,  2406,  6335,  2406,  6336,  2342,
2026,  2407,  1965,  8962,  8451,  2337,  1966,  2405,  1965,  2406,
6334,  2406,  1964,  2406,  6335,  2343,  6396,  2343,  6397,  2406,
6335,  2343,  2026,  2407,  1965,  2406,  6335,  2342,  2026,  2406,
6336,  2405,  6335,  2343,  6397,  2343,  6397,  2406,  1965,  2406,
6334,  2344,  6397,  2405,  1965,  2406,  6335,  2406,  6335,  2343,
2026,  2407,  1965,  2405,  1965,  2406,  6334,  2406,  6335,  2343,
2027,  2406,  6335,  2406,  6334,  2344,  2026,  2407,  1965,  8961,
8451,  2337, 0, 0
};
static unsigned short nttimer[] ={
9025,  8452,  2336,  6336,  2344,  6396,  2406,  6334,  2344,
6397,  2404,  1966,  2405,  1967,  2403,  1968,  2403,  1967,  2403,
6336,  2344,  6395,  2405,  6335,  2343,  6397,  2405,  1966,  2405,
1967,  2403,  1968,  2403,  1967,  2403,  1968,  2402,  1967,  2401,
1968,  2402,  1969,  2402,  6335,  2345,  2026,  2405,  1967,  2404,
1967,  2403,  1967,  2402,  1968,  2402,  1968,  2403,  1968,  2402,
6334,  2405,  1965,  2405,  1967,  2403,  1967,  8958,  8452,  2337,
6334,  2346,  6396,  2405,  6336,  2344,  6396,  2405,  1966,  2405,
1968,  2402,  1969,  2401,  1968,  2402,  6335,  2345,  6397,  2404,
6336,  2344,  6394,  2406,  1966,  2404,  1968,  2403,  1968,  2401,
1969,  2402,  1968,  2401,  1969,  2401,  1969,  2402,  1968,  2402,
6335,  2406,  1965,  2405,  1967,  2403,  1968,  2403,  1968,  2402,
1968,  2403,  1968,  2402,  1968,  2402,  6335,  2345,  2026,  2404,
1967,  2403,  1968,  8958,  8452,  2337,  6336,  2344,  6396,  2405,
6336,  2344,  6397,  2404,  1965,  2404,  1967,  2402,  1969,  2402,
1968,  2402,  6335,  2345,  6396,  2344,  6396,  2345,  6396,  2344,
2027,  2404,  1967,  2403,  1968,  2402,  1969,  2402,  1968,  2402,
1968,  2402,  1969,  2402,  1968,  2402,  6335,  2406,  1965,  2406,
1966,  2402,  1968,  2403,  1968,  2402,  1968,  2403,  1968,  2402,
1967,  2402,  6336,  2343,  2027,  2405,  1967,  2404,  1966,  8959,
8451,  2337, 0, 0
};
// IR pulse on 16 bit timer 0
// IR signal count on 16 bit timer 1
// pulse width is very critical
#define STATEA (265-1-1)
#define STATEB (85-1)
// IR control for Yamazen Fan
int yzctrl(unsigned short int *irdata){
unsigned short int i,j;
TSTR &= 0xfe; // stop 0
PADDR=0x04;
PADR=0x00;
TSNC = 0xf8;
TISRA = 0x88;
TCR0 = 0x80 | 0x20 | 0x01; // GRA clear and x2
GRA0 = STATEA;
GRB0 = STATEB;
TIOR0 = 0x88 | 0x10 | 0x02; // GRB 0 GRA 1
TMDR = 0x98 | 0x01; // PWM mode
TSTR &= 0xfd; //stop 1
TSNC = 0xf8;
TCR1 = 0x80 | 0x00 | 0x03; // no clear and x8
TIOR1 = 0x88;
TOLR=0xc0;
int_disable();
TSTR |= 0x02; //start 1
for(j=0; j<5; j++) {
for(i=0; i<24; i++) {
TSTR |= 0x01; // start 0
TCNT1=0; while(TCNT1 < irdata[i]){}
TSTR &= 0xfe; // stop 0
PADR=0x00;
i++;
TCNT1=0; while(TCNT1 < irdata[i]){}
}
}
for(j=0; j<3; j++) {
for(i=24; i<48; i++) {
TSTR |= 0x01; // start 0
TCNT1=0; while(TCNT1 < irdata[i]){}
TSTR &= 0xfe; // stop 0
PADR=0x00;
i++;
TCNT1=0; while(TCNT1 < irdata[i]){}
}
}
int_enable();
TSTR &= 0xfd; // stop 1
return i;
}
// IR control for National air conditioner
// simple copy send
int ntctrl(unsigned short int *irdata){
unsigned short int i,j;
TSTR &= 0xfe; // stop 0
PADDR=0x04;
PADR=0x00;
TSNC = 0xf8;
TISRA = 0x88;
TCR0 = 0x80 | 0x20 | 0x01; // GRA clear and x2
GRA0 = STATEA;
GRB0 = STATEB;
TIOR0 = 0x88 | 0x10 | 0x02; // GRB 0 GRA 1
TMDR = 0x98 | 0x01; // PWM mode
TSTR &= 0xfd; //stop 1
TSNC = 0xf8;
TCR1 = 0x80 | 0x00 | 0x03; // no clear and x8
TIOR1 = 0x88;
TOLR=0xc0;
int_disable();
TSTR |= 0x02; //start 1
i=0;
while(irdata[i] > 0) {
TSTR |= 0x01; // start 0
TCNT1=0; while(TCNT1 < irdata[i]){}
TSTR &= 0xfe; // stop 0
PADR=0x00;
i++;
TCNT1=0; while(TCNT1 < irdata[i]){}
i++;
}
int_enable();
TSTR &= 0xfd; // stop 1
return i;
}
int main(){
printf("NT POWER %d\r", ntctrl(ntpower));
sleep(1000);
printf("NT TIMER %d\r", ntctrl(nttimer));
sleep(1000);
printf("YZ POWER %d\r", yzctrl(yzpower));
sleep(1000);
printf("YZ ROTATE %d\r", yzctrl(yzrotate));
sleep(1000);
}
MCU
スポンサーリンク
デビアンな生活

コメント