概要
10月の初め頃に「タッチパネル付TFT液晶モジュールを使ってみる」というのを書いてから早くも一ヶ月が過ぎてしまったのだけど、このTFTモジュールに対象に応じた操作ボタンを表示することで、1台で複数の家電製品に対応した赤外線リモコンの試作ができた。
とりあえず、HDD録画機能付きのテレビ、LEDシーリング照明、そしてエアコンに対応してみた。いずれもうちの居間で使っている製品なので、一つで済めばテーブルの上も片付くはず。そのうちAVアンプやブルーレイプレーヤーなんかにも対応できるだろう。
以前に書いたのと同様に、タッチパネルの制御は自前のコードで行い、TFT液晶への描画はAdafruit社のライブラリ ( Adafruit_ILI9341 および Adafruit_GFX、リンク先はいずれもGitHub) を用いた。ボタンの描画や操作性に関する部分、そして赤外線信号の作成や送出部分はすべて自前で、ソースコード全体で1000行程度になった。Arduinoのスケッチとしてはちょっと長くなったので、何回かに分けて掲載ることにする。
もっとも、Adafruit_GFXのデフォルトフォント(glcdfont) に関する記事で触れた PROGMEM を利用することで、SRAMの使用量は1Kバイト以内に収まっている。
今回は、ハードウェアの説明、操作用の画面、試作段階での動作を記録した動画を掲載。
ハードウェア
8MHzの発振子が載ったArduino PRO MINIから、オンボードのPON LEDと定電圧レギュレータを外したものを中心としている。これはTFTモジュールを試したときとほとんど同じ回路だが、3.0V出力の定電圧レギュレータと赤外線送出用のトランジスタおよびIrLEDを追加した。IrLEDは、OSI5LA5113Aという製品でデータシートはこちら。
TFTモジュールとのSPI接続やTFTモジュールのバックライト制御回路については前回と同様。
電源について
電源はニッケル水素充電池を直列に3本使うことにした。使用開始時は4.1V程度が期待できるが、最後は3.3V程度になるだろう。4.1Vと3.3VとではTFTモジュールのバックライトが消費する電流が大きく変わるので、+3.0Vの定電圧レギュレータ (MCP1702-3002E) を使うことにした。データシートはこちら。
選定にあたっては以下の3点を満たしているICを探した。
- 3.0V出力時に200mA以上流せること。
TFTモジュールとマイコンがアクティブなとき40mA程度だが、赤外線信号を送出するときに+100mAとして考えた。 - 150mA負荷時のドロップアウトが0.3V程度であること。
電池側が+3.3Vになっても回路に+3.0V供給できるように。 - 静止時電流が微少であること。
使わない時間の方が長いから、電池をもたせるためには重要だろう。
IrLEDは6.5μ秒間程度の発光を連続的に行うため発光時のピーク電流は測定できていないが、TFTモジュールやマイコンをアクティブにし、タッチパネルからの読出しも連続的に行う条件で、回路のGNDと電池のマイナス端子の間にテスターをはさんで測定したときの消費電流は40mA弱だった。そして、TFTモジュールのバックライトをオフにし、すべてをスリープさせたときの電流は20μA程度まだ落ちた。その状態でも、タッチパネルによるスリープからの復帰が可能になっている。
追記
上の測定を行った時点では、ATmega328Pのウォッチドッグ動作を許可したままだった。メインループに入る前に wdt_disable(); を追加したところ、スリープ時の消費電流はテスター読みで 10μAとなった。以前、+3.3V電源で試したときには約5μAほどの効果があったが、動作電圧が低いためか今回は10μAの効果があったことになる。全体として、ちょっと少なすぎる気もしているのだが、あくまでテスターの読み取り値ということで。
また、IrLEDを発光させる際にはTFTモジュールのバックライトを消灯するようにした。これにより、消費電流は最大でも100mA程度と考えることができる。操作時の見た目としても、画面が一瞬暗転することでタップ操作によって信号が送信されたことが確認できる。
IrLEDの駆動回路
駆動回路やPRO MINIとの接続も以前赤外線リモコンを作ったときと同様の構成にした。抵抗値の決め方などについてはこちらの記事を参照。ATmega328PのTC1のPWM機能を使ったリモコン用の発光方法についてはこちらの記事を参照。
今回は電源電圧が+3.0Vであることと、対象の家電との距離(というよりも角度)がさまざまであることから、スイッチング用トランジスタ(2SC1815)のコレクタ電流ICを100mAに近づけるため、IrLEDの直列抵抗R3 を5Ωとしベース抵抗を510Ωとした。計算上のベース電流は4~5mAとなるため、2SC1815ではVCEが大きくなってしまうが、直列につないだ2本のLEDが発光しなくなるほどではないだろう。
写真では、電源としてモバイルバッテリを利用しているが、NiMH×3でも動作を確認している。前に作ったシャワートイレ用のリモコンでは定電圧レギュレータを入れなかったので適当な電源は使えなかったが、今回の構成ではこういったものも利用できる。
操作パネル
機能選択用のメニューパネル
マイコンをリセットすると機能を選択するためのメニューパネルを表示する。
メニューパネルにはスケッチ内に用意した各操作パネルを選択するほかに、一定時間操作がないときにマイコンやTFTモジュールをスリープさせ、バックライトも消してしまう ecoモードをオン/オフするためのボタンも用意した。スリープ状態からの復帰(表示も当然復帰)は、画面のどこかをタップすればよい。ecoモードでのスリープ中の消費電流は、実測で20μA(ウォッチドッグ動作禁止により10μA)だった。
各項目ボタンをタップすると、以下の操作パネルに表示が切り替わる。いずれの操作パネルにも、緑色の”MENU”ボタンを配置しMENUパネルを表示できるようにした。
TV1パネル
オーソドックスな12個のチャンネルボタンと、チャンネル上下、音量上下ボタンを配置した。左上の赤い四角が電源ボタン、下にある4色の四角が地デジ操作用で、○と×は対話的な選択操作に対する「決定」と「戻る」。
このパネル(またはTV2パネル)でBSを選択している場合、12個のチャンネルボタンはBS1~12までに相当する信号を送出し、DTBのときは地上波の1~12となる。
なお、”DTB”とはDigital Terrestrial Television Broadcastingの略で地デジのこと。漢字に相当する図形を描画しようかと思ったが、面倒なのでglcdfontをそのまま使うことにした。”EPG”は電子番組表のこと。
TV2パネル
チャンネルボタンの代わりに、メニュー操作用の矢印キーに重点をおいてみた。黄色い”d”はデータ放送用で、”disp”は画面表示に対応する。
矢印やボリューム、チャンネルの各ボタンはリピート動作する。
HDDパネル
録画番組を見るときに使いそうな機能を集めた。”LIST”は録画リストの表示用で”INFO”は「番組説明」。
例えばHDDに録画した内容を見ている最中に”MENU”でもって他のパネルに切り替えたとしても、赤外線信号の送出は行わないので再生が止まることはない。
LIGHTパネル
天井に取り付けてあるLEDシーリングライトの点灯/消灯や色あい、明るさの変更機能を入れた。”COMM”というのは「ふだん使っている明るさと色あい」を選択するためのもので、実際のリモコンの「普段」ボタンに相当する。”COMM”の両側の”<<“と”>>”は明るさの調整用。
“ALL”は全灯。”Cool”は青系、”Warm”は電球色系への段階的な切換を行うためのボタンで、押したままにするとリピート状態となって、キーボードのリピートと同じように連続して信号を送出する。
なお、”ON”ボタンは「普段」と同じ信号を送出する。
AIRCONパネル
温度や風量、方向を変更するためのボタンをタップすると、液晶上にそれらを反映させるようにした。他のパネルではボタンに対応するデータを送出すればよかったが、エアコン用リモコンの特殊なところだろう。
“COOL”, “HEAT”, “DRY”は、冷房、暖房、除湿に対応する。いずれかのボタンをタップすると、マイコン側に保持している各種状態(運転状態、運転種別、温度、風量、風向など)とともに電源オン用のコマンドデータを送出する。実のところ、温度や風量を変更するときも、電源オン時と同様にすべての状態をもつデータを送出する。
今回の実装では、運転状態がoffのときは温度や風量を変更しても赤外線信号を送出しないようにした。なので、あらかじめ温度や風量を決めてから運転を開始することもできる。
そういえば、左右風向の幅を示す図形は、CP437のキャラクタコード0xb0を使っており、その上に0xb1をおいて風向を表している。ちょっと前にglcdfontのかつての問題点にふれたのは、このコードが使いたかったからで、今回のスケッチにも tft.cp437(true); という1行を書いている。
リモコン操作の動画
動作説明用や、描画の速度やタップに対する反応などを見るために動画にしてみた。
説明は動画中の字幕を参照。ただ、フルスクリーンで見ないとモアレがひどいかもしれない。スケッチや内部構造についてはおいおい書いていきます。
きょうはここまで。
追記として、動画をよくみたところエアコンの左右風向を変化させたとき、左端に余計なラインが残ってしまうことが判ったので、スケッチを変更した。