※ 基板中央付近の2個のパッド(JP1とJP2)は忘れずジャンパ線で接続してください(接続を忘れると、赤外線受信モジュールが動作せず、学習ができなくなります)
回路図での記号 | 型番 | 説明 | 入手先 |
U1 | ATTINY85 | AVRマイコン(DIP 8pin) | DigiKey |
RPM7138-R | RPM7138-R | 赤外線受信モジュール | DigiKey |
IR-LED | OSIR5113A | 5mm赤外線LED | 秋月 |
SW1 | FSM4JH | タクティルスイッチ | DigiKey |
SP1 | PKM13EPYH4000-A0 | ピエゾブザー | DigiKey |
R1 | 10kΩ | 抵抗 | 秋月 |
R2 | 20Ω | 抵抗 | 秋月 |
No. | 操作名 | コマンド | 説明 |
1 | 送信 | 短押し×[メモリ番号]回 | [メモリ番号]は1~6。単純に短押しすると、押した回数に応じて学習済みのメモリの内容を赤外線送信する(つまりシングルクリックでメモリ1の内容を出力、ダブルクリックでメモリ2の内容を出力...という動作をする)。 |
2* | 学習(モードA) | 長押し×2回+赤外線受信 | 赤外線信号を学習する。記憶先は直前に No.1 で送信したメモリ番号。 |
3* | 学習(モードB) | 長押し×3回+赤外線受信 | 赤外線信号を学習する。記憶先は直前に No.1 で送信したメモリ番号。No.2との違いは、No.3で学習した場合、送信時に同じ信号を約40[ms]間隔で2回繰り返して送信する点。 |
4* | 消費メモリ確認 | 短押し×7回 | 学習済みの信号が消費しているメモリ(EEPROM)量に応じてBEEPを鳴らす。対象は直前に No.1 で送信したメモリ番号。BEEP1回が32バイト。 |
5 | メモリ残量確認 | 短押し×8回 | 全メモリ(EEPROM)残量に応じてBEEPを鳴らす。BEEP1回が32バイト。 |
6* | 固定モード | 短押し×9回 | 固定モードに移行。固定モードでは短押しした瞬間に赤外線が送信される(通常モードでは短押しから赤外線の送信までにタイムラグがあるが、それが解消する)。固定モードにすると、直前に送信した1種類の信号しか送信できなくなる。固定モードは長押しで解除される。 |
7* | メモリ削除 | 短押し×11回 | 学習した赤外線信号を消去する。対象は直前に No.1 で送信したメモリ番号。 |
8 | 完全初期化 | 短押し×12回 | メモリを完全に消去して初期状態に戻す。 |
1回 | ピ | 学習予告 |
2回 | ピピ | 起動音(電池を入れた時) |
3回 | ピピピ | 固定モード開始 |
4回 | ピピピピ | 固定モード解除 |
1回 | ピー | 学習スタンバイ(モードA)/学習成功(モードA) |
2回 | ピーピー | 学習スタンバイ(モードB)/学習成功(モードB) |
4回 | ピーピーピーピー | メモリ削除成功 |
5回 | ピーピーピーピーピー | 完全初期化成功 |
1回 | ブ | 学習前に送信しようとした |
2回 | ブブ | ノイズを受信したため学習中断 |
3回 | ブブブ | 受信した赤外線信号が長すぎるため学習中断 |
4回 | ブブブブ | メモリ不足のため学習中断/メモリ削除失敗 |
そのうちファームウェアの解説も書きたい。ファームウェアは AVR-GCC でスクラッチから書いたもので、結構頑張っている。頑張った点は (1)EEPROM が512 バイトしかないので、学習した信号を生のままでなく少し圧縮して保存している。(2)各種フォーマット(家製協、NEC、ソニー、その他外国製の謎のリモコン)に対応するため、アルゴリズムを工夫して、可能な限りビット列として解釈するが、イレギュラーな信号は生のまま記録する方式にしている。受信した信号の解釈のためにパルスの平均時間を求めたりもしている。(3)RAM も512 バイトしかないので、RAM 上でリアルタイムに処理する学習データは、1~2バイトの可変長フォーマットで処理している(それでもエアコン等の長すぎる信号は RAM に入りきらない)。(4)EEPROM 用の超簡易な独自ファイルシステムを実装してデータを保存している。
12秒間操作しない状態が続くと、赤外線受光モジュールの電源が切られ、マイコンは省電力モードになる(省電力モードからはボタンを押すと回復する)。省電力モード中の消費電流は、実測で2μA以下なので、電池は入れたままでもそれほど消耗しない。...はずだったのだが、なぜか電池が1~2日で消耗してしまう現象が発生した。その状態で電池を外して、一個ずつ電圧を測定してみると、正負が逆になる電池が出てくる。何かおかしい。
また、これも電源電圧と関係しているような気がするが、やはり数日放置するとボタンを押しても反応しなくなる(電池を入れ直すと直ることもある)。
考えられる原因としては、100円LEDライトの動作確認用電池をそのまま使っているのが問題なのかもしれない。または赤外線LEDに大電流を流しているのが問題かも。あるいはウォッチドッグタイマーが発動した時にうまく再起動できていないのかもしれない。リセットピンがオープンのままなのがまずいのかも。
いまだに現象の再現性が確認できないので、電源電圧を測定する実験を開始。新品の電池を入れて、10分おきに別のマイコンのADコンバータで電源電圧を測定して、電源電圧の急低下が発生する条件を探ってみる。
自作記事。まず回路図、操作方法、部品表を書こう。
自分はもう何百回となく学習操作を繰り返しているので無意識にやってしまっているが、赤外線受光モジュールで学習する時には、周囲の明るさ、距離、インバータ式蛍光灯の影響、押す時間などいくつかコツがあるので、忘れずにどこかに書いておかないと。ローム社の製品カタログが、これまでの学習時の感覚と一致していて納得の内容。実際マルツでロームのモジュール RPM7138-R を買って試してみたら、ノイズにも強いし、電池の電圧がかなり下がっても正しく学習できる。ロームのモジュールすごい。
コマンド体系を試行錯誤中。1キーで送信、学習、削除、メモリ残量確認などのコマンドを指定するのはどうするのがベストか。ようやくよさそうな方法が固まりつつあるので、確定していいかな。ただどうやっても完全にマニュアルなしで操作するのは無理そう。
手元にあるリモコンで試してみると、ほとんどがうまく学習できた。ただ実家の日立のエアコンだけはおかしい。学習後に赤外線を出すとハングアップしてしまうようで、8秒後にウォッチドッグタイマで再起動しているようだ(BEEP 音でわかる)。特定の信号でだけハングアップするというのはちょっと奇妙な現象。おかしくなった状態で EEPROM を avrdude で吸い出して、原因を突き止めることにする。
原因判明。この日立のエアコンは赤外線信号が長く、記録できる長さを超えていた。その時の処理がおかしかったので修正。AVR ATTiny85 の RAM 容量の制約で最大 352 ビットしか記録できない。ここまで長い信号を使うリモコンはあまりないと思うが、こればかりはどうしようもない。