赤外線通信プログラムを作る
赤外線送信プログラムを作ります。
主な仕様
タクトスイッチ6つ
ロータリーエンコーダ1つ
PIC16F1705を使用
液晶は8x2I2C
電源は単4電池2個
それと赤外線LED(940nm)
赤外線送信アルゴリズムは作ったことがある。
省電力機能も実装したことある。
ロータリーエンコーダは使ったことがない。
問題は低消費電力でクロックを抑えつつ、
どこまでロータリーエンコーダのデータの取りこぼしがなくなるか、ですかね。
赤外線送信の設定
まず、受信モジュールの規格を確認するところから始まります。
受信モジュールの対応する光の波長とPWM周期が重要です。
受信モジュールは赤外線が「ON」なら0、OFFなら「1」というわけではありません。
今回使うのは秋月のGP1UXC41QSを予定していますが、この場合
38kHzの波長の信号が受信されると「0」、なければ「1」となります。

「0」、「1」の長さは最小の時間があるのでこれも守ります。600usくらいでしょうか。
赤外線LEDの駆動はPICのIOポートから直接駆動してもいいのですが、
それでは大きな出力が取れません。
トランジスタを使って、だいたい100mAくらいで駆動します。
100mAというとけっこうな値ですので、これで電源電圧が変動しないようにパスコンを入れてやる必要があります。
まあ、電池が元気なうちはいいと思うのですが、寿命が近づいてくると誤動作するかもしれませんので。
パスコンの値は計算で求めます。
38kHzの周波数からトランジスタがOnしている時間Tを求め、電流掛ける時間で、電荷Qを求めます。
そして、Q=CVですから許容電圧降下儼とQを代入するとCが求まります。
電流100mA、動作周波数38kHz、許容電圧降下0.1Vで計算すると
(実際は充電時間を考慮する必要があると思いますが今回はしません)
静電容量13uF以上必要という計算になりました。
使うコンデンサは、リモコンですから小さいほうがいいですね。
今回は表面実装の積層セラミックコンデンサを使おうと思います。
ここで問題になるのが、積層セラミックコンデンサは、両端にかかる電圧によって
静電容量が大きく減少してしまうということです。
例

特性は、BとかX7Rとか、C0Gとか、誘電体の種類によって変わってきますので
データシートを見て確認してください。
また、B特性などでは、温度によっても静電容量が減少しますので、それも考慮にいれます。
あとはPICのPWMを使って38kHzの信号を作り、デューティ比を50%と0%に変えることで0と1を作り出します。
これで信号の0,1はできます。
あとはどうやってデータを送るかですが、信号の0の長さは一定にして、1の長さ、つまりデューティ比0%の長さを
かえることでデータの「1」、「0」を作り出します。この1、0は信号の1、0とは違います。

他にも、これだけではデータの先頭がどこかわかりませんのでReader ON信号を作ったり、
データが正しいかどうかチェックサムまたは、XORビットを入れたりしますが、割愛します。
とりあえず送るのはこれでできます。
I2C接続小型キャラクタLCDモジュール 8x2行
今回はこの液晶を使います。電池駆動で数年もたせたいので、他の選択肢はありません。
そのまま電源ラインに接続するとずっと1mA消費するので、PICのIOポートに電源を接続します。
PICが壊れないよう、電流制限抵抗をお忘れなく。
PIC16F1705
安い、プログラムメモリが多い(8k)、ピンが自由に配置できる、といったメリットのあるPICです。
PICKit2にも対応していますが、デバイスファイルが必要です。探してください。
欠点をあげるとすれば、データEEPROMがないことでしょうか。
ピン数14pinです。28pin必要ならPIC16F1716を使えばいいし、8pinでここまでの機能は必要ないかもしれませんね。
I2Cでの注意点として、信号ラインを手で触るなどして、あるタイミングでノイズがのると、
SSP割り込みが返ってこないことがあります。タイムアウトを設定して、リセットするか何かしてください。
操作しないで20秒くらいしたら、スリープする予定です。
何も設定しないでスリープすると、10uA程度消費します。設定によってはもっと消費するかもしれません。
電力を消費する機能をオフにする以外に、スリープ復帰のとき立ち上がりを遅くすることで
消費電力を下げるモードがあるのでレジスタを設定してください。
あとは部品を注文して、PICのプログラムを実装するのみ・・・。
ロータリーエンコーダがどうなるかな。
完成しました。
ロータリーエンコーダもそんなに高速でサンプルしなくてもよいようで、
PICの動作周波数は4MHzです。
ロータリーエンコーダは24クリック1周のものを使いましたが値を0から255にするには
10周以上回さないといけないのは不便なので、高速に回した場合、1クリック10値が変わるようにしました。
ボタン
再生、停止、次へ、前へ、リピート、ロータリーエンコーダ機能選択 の6ボタン
ロータリーエンコーダ機能
ボリューム、チャンネル選択、スリープまでの時間設定(機能は追加可能)
ロータリーエンコーダ機能選択 ボタンを押すとロータリーエンコーダの機能が切り替わる
コードサイズ 2587ワード(MAX8192ワード)
液晶の電源ピンはPICから供給、リセットピンは電源と共有
Timer0 未使用
Timer1 赤外線送信のON OFF
Timer2 赤外線送信 38kHzの生成 CCP1
Timer4 スリープ、液晶更新タイミングの生成
Timer6 ロータリーエンコーダカウント加速機能タイマー