リモコン計画

先週日曜日、ついに完成した!と思ったんだけど電池駆動すると動かないという謎に苦しんだ。電源電圧が落ちるとどうやら内蔵発振の周波数が下がるらしい。
内蔵発振の周波数が変わると影響を受けるのは当たり前なんだけど、38kHzのPWMとリーダコード、ビットコード(という名前なのかは知らないけど)の時間のどっちが重要かというと、リモコンみたいなものにすごい急峻な良いフィルタを用意しているとも思えないし、リーダコードとかのほうが重要なのでしょう、と妄想。
買ったリモコンキットのソースコードでは、HI-TECH Cコンパイラを使ってて、待ち時間は__delay_us()というのを使ってた。38kHzのPWMには何を使っているのかいまだに理解していない。で、__delay_usというのは、pic.hによるとこうなっている。

// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

で、ソースコードを探したら、こうなっていた。

#define _XTAL_FREQ 4000000

デフォルト周波数は4MHzらしいから、単純に割り算して決めているみたい。所望の時間を得るには、クロックが下がると長めになっているはずだから、嘘ついてクロックがちょっと速いことにしてみようということで、

#define _XTAL_FREQ 4008000

これで動くようになった。

電池のもちの検討。Wikipediaをみる。
乾電池 - Wikipedia
単三電池はマンガンで1000mAhぐらい、アルカリで2000mAhぐらいらしい。結局、割り込みで起きるのは今の回路構成では実現できないから、あきらめることにして、31kHzで動かして常にスキャンし続けることにした。消費電流は16uAなので、1000mAh/16uA=62500h=2604day=7year。乾電池は7年ももたないから十分と思われる。実際は、ボタンを押したときに赤外線を光らせる電流があるから、1日に何回押したらどう、みたいな計算ができるんだろうけど、まあいいや。

完成!年内に終わった!
けど、指向性が強いみたいでちゃんとテレビにむけないと効きが悪いなぁ。

本当は回路図を書いて公開しようと思ってたんだけど、キー部分ってすごい書くのがめんどくさいし、誰も見てないだろうし、書かないことにした。そのかわり、どのピンをどんな機能にしたかはこうなっている。

RA0-RA5 キー入力、外付け22kΩプルアップ。
RA6-RA7 Open
RB0 Open 将来何かの割り込みピンに使いたい。
RB1-RB5 キー出力。普段は入力で内蔵プルアップ
RB6-RB7 ICSP
RC0 Open
RC1 Ir LED
RC2-RC7 Open 将来何かの拡張に使いたい。UARTもあるし。
RE3 ICSP

キースキャンに関わるピンは、普段はすべて入力ピンでプルアップされている。スキャンするときは、RB1-5のどれかひとつをLow出力にする。で、RAを読んでHighなら押されていない、Lowなら押されている、という判定。2ボタンを同時押ししても、出力ピンは1個だけだから問題無しという設計。RBの内蔵プルアップは出力ピンにすると自動的にオフになるから便利。