どうやら、首振り部分の機械的な構造は落ち着いて機能しているようなので、付属のリモコンについて考え始めた。
といっても「PIC16F1823 + Servo Motor + IR RC Module で壊れた扇風機の首振り -リモコン信号の受信テスト-」の続きだ。
扇風機に付属のリモコンでステッピング・モータのコントロールをしたい。
とりあえず、リモコンの信号をPIC12F1822で認識させてみる。
こんな単純なコードになった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
unsigned short InfraredReceive(void){ unsigned short IRbit; unsigned long t; unsigned b; int i; IRbit = 0; i = 0 ; while(1){ while(IRpin == 1); t = 0; while(IRpin == 0){ __delay_us(10); t++ ; } b = 1 << i; if(t >= 100) IRbit = IRbit | b; i++; if (i == 12) break; } return(IRbit); } |
信号のHighの間の時間を計って1ビット毎に取り込む。
Highの継続時間が長ければ1、短ければ0だ。
読み取ったビットの値を記憶させる変数IRbitはもともと0で埋まっているので、1のときだけORを取って該当するビットを1にする。
1にする位置はiでカウントし、1をiの値の分だけ左へビットシフトしたものを用意する。
リモコンの信号は「PIC16F1823 + Servo Motor + IR RC Module で壊れた扇風機の首振り -リモコン信号の受信テスト-」でやったようにちょっと特殊な信号だ。
例えばONボタンを押したときに出る信号は下のようで、
これは、リモコンのカバーを開けて、赤外線LEDの端子に直接オシロスコープ(LHT00SU1※)を当てて取った信号の様子だ。
受信側の赤外線リモコン受信モジュールの出力端子にはサブ・キャリアの成分が除かれた信号が出力される。
これを上のコードで取り込むと、IRbitの値は 0b010000011011 すなわち、0x041B となる。
左右が反転し、右端の0は無視される。
※「LHT00SU1 + PulseView by Zadig of sigrok」
Tweet