小ネタ~AVRでの赤外線リモコン送信機
MEDIO write:
もちろん今日も仕事をしてきました...威張ることではありませんが。(--;
気を晴らすのに、ほんの少し趣味ネタを書きます。結構リファラに多い「AVR 赤外線リモコン 送信」関係です。
国内で一般的に使われる赤外線リモコンはNECフォーマットと言われる信号を出しています。といっても、最近の押しボタンスイッチが大量にあるデジタル家電系はそれを拡張した信号を出しています。
このNECフォーマットの信号の中身は、旧NECエレ、現ルネサスエレクトロニクスのHPに資料を見つけることが出来ます。
長短のある信号を、38KHzでon-off(変調)し出力しているだけです。専用ICがあるのですが、一般的に買えず(ハードオフの\105リモコンジャンクをばらせば、結構当たりますが)困った方がいるのでしょうか。と。
リモコン無しジャンクで買ったBOSEのiPodDockを解析する最中に赤外線リモコンの送信プログラムを作っていたので、その方法を書いてみます。
まず、変調の38kHz。8MHzの内蔵RC発振器で動くAVRだと、割り込みが105クロック毎になってしまいます。ソフトで何とかしようというには重いので、動いている最中はずっと出たままにしてしまいました。
具体的にはTimer0を高速PWMモードにし、OC0Bを反転出力設定、OCR0Aは209、OCR0Bは139に設定します。
// timer0: Highspeed PWM for 38kHz duty 1/3 Output:OC0B=Pin9
TCCR0A = 0b00110011; // Compare Match B output mode is REVERSE
TCCR0B = 0b00001001; // Prescale 1/1
TCNT0 = 0;
OCR0A = 209; // interrupt interval 560uS
OCR0B = 139; // Duty 1/3
この設定でTimer0は0~210までを繰り返しカウントします。=26.25uS≒38,095Hzです。
またOCR0Bが139で反転出力設定のOC0Bは140~210カウントの間だけOnになるのでDutyは1/3となります。
次は実際の信号処理ですが、先ほどのNECフォーマットの資料を見ていると、各On-Off信号のタイミングにある規則が見つかります。それは
「8MHzのクロックで4500カウント分、562.5uSのタイミングの整数倍に(だいたい)なっている」という点。
つまり、562.5uS間隔でタイマー割り込み、送信処理をすれば良いのです。
こちらもこんな感じで。
// timer1: CTC with interrupt
TCCR1A = 0b00000000; // CTC with interrupt
TCCR1B = 0b00001001; // Prescale 1/1 = 0.125uS
TCNT1 = 0;
OCR1A = 4499; // iR signal resolution = 562.5uS
TIMSK = _BV(OCIE1A);
ビット送信の処理アルゴリズムはプログラマのセンスが問われる部分ですよね。(^^;
こちらは後ほど。
| 固定リンク | 0
「趣味」カテゴリの記事
- ラズベリーのパイが無ければ…バナナのパイを食べてみる(2023.01.29)
- ラズベリーのパイが無いのでパインを食してみた(2023.01.28)
- ラズベリーのパイが無ければパインを食べればいいじゃない(2022.12.19)
- Beagle Bone Black(Green)のOSをビルドしてみる(Debian Bullseye)(2022.11.17)
- 現時点でのRaspberry PiのBluetooth Audio状況(2022.10.22)
「電子回路」カテゴリの記事
- ラズベリーのパイが無ければ…バナナのパイを食べてみる(2023.01.29)
- ラズベリーのパイが無いのでパインを食してみた(2023.01.28)
- ラズベリーのパイが無ければパインを食べればいいじゃない(2022.12.19)
- Beagle Bone Black(Green)のOSをビルドしてみる(Debian Bullseye)(2022.11.17)
- 現時点でのRaspberry PiのBluetooth Audio状況(2022.10.22)
コメント