8MHzのArduino PRO MINIで赤外線リモコンを作ってみる その1

概要

自宅のシャワートイレのリモコンがちゃんと動かなくなった。どうやら、リモコンの基板に乗ってるR社製4ビットマイコンのポートまたは内部プルアップが不安定になり、キーマトリックスのスキャンがうまくいかなくなった模様。去年はタクトスイッチが1つ壊れて修理したのだが、今回は無理そうである。20年も使うとこんなもんかな。リモコンがないとまったく機能しない機種なので、取り急ぎ手持ちのパーツで代替品を作ることにした。

リモコンから出力されるコマンドデータは解析済なので、3.3V、8MHz動作のArduino PRO MINI (The Simple)を使って、赤外線リモコンを作ることにした。以前、WROOM-02を使った赤外線リモコンを作っており、IrLEDを駆動するための回路などを検討したり、HTTPリクエストで赤外線データを出力するなどした。今回は、ちょっと前に使った16キーの静電容量タッチパッドでは大きすぎるので、キースイッチを4つ並べただけのベタなリモコンにする予定。

3.3V版のArduino PRO MINIについて

Arduino PRO MINI
Arduino PRO MINI 3.3V, 8MHz、部品面
Arduino PRO MINI
Arduino PRO MINI. The Simple. 裏面

5V 16MHz動作のPRO MINIとの違いは、基板上の電圧レギュレータと水晶発振器、そして裏面のマーキングだけに見える(もしかしたら、自前でサインペンを使ってマークを書いたかもしれない)。現在(2017年8月)のところ、中国からの送料込みで300円もしないようである。
このモジュール (The Simple) を使う上での注意点は、SparcFun社が公開しているArduino PRO MINIの回路図とは電源周りやLEDの直列抵抗値が異なっていることと、SparcFun製とは部品面右側のシリアル接続用端子の並びが違う(裏返しになっている)こと。特に、The Simpleに載っている電圧レギュレータのスペックがわからないから、RAW端子に電圧を与えるときは、MIC5205のつもりで使わない方がよさそうである。

ところで、入手したPRO MINIに周波数や電源のマークがない場合、以下のような方法で見分けることができる。

  • 動作電圧
    ほかに何も接続しない状態でRAWに+5Vを与える。VCCの電圧が+3.3Vならば+3.3V版、+4.6~4.8Vならば+5V版。つまり、基板上の電圧レギュレータの出力で見分ける。今のところRAWに+5Vを与えて異常が生じたものはないが、基板上で回路が短絡していたりデバイスが壊れたりしているとマズいことになるので注意が必要。
  • 周波数
    水晶発振子(上の部品面の写真のD2端子の側にある、0.6 × 3mmほどの銀色の直方体)の表面をよく見ると、16MHz版には”Aℓ”、8MHz版には”80″といった刻印がある。接写して拡大しないと分からないが。
    あるいは、USB-シリアル変換器を介してPCに接続し、Arduino IDEのツールメニューで、「ボード」としてArduino Pro or Pro Mini を選んでおき、「プロセッサ」としてATmega328(5V, 16MHz)を選んでおく。そして、

    といったスケッチをコンパイルしてボードに書き込む。基板上のLEDは、16MHz版なら1秒周期で点滅するが、8MHz版なら2秒周期になる。ふつうに使うときには、「プロセッサ」を ATmega328(3.3V, 8MHz)  としてからコンパイルする。
  • スケッチの書込みには、別途USB-シリアル変換デバイスの接続が必要で、うちではAE-FT231Xをミニブレッドボードに載せて使っている。FT231Xのシリアル側信号レベルは+3.3Vなので、そのまま接続しても問題ない。

    AE-FT231X
    ミニブレッドボードに載せたAE-FT231X

リモコンとして使うときにはUSB-シリアルは不要なので、プログラミング時のみ、TXD, RXD, DTRおよびGNDをジャンパワイヤで接続して使っている。

PRO MINIの電源周りから部品を撤去

Arduino PRO MINIの基板には+3.3V出力の定電圧レギュレータ(と思われるIC) が載っているが、これを外してしまうことにした。

Arduino PRO MINI
Arduino PRO MINI, LDO周辺

中央の“S2PE”と印字されているICが定電圧レギュレータで、その隣の“SL”と印字されているはショットキバリアダイオードだろう。”RAW”端子のすぐ上にある “4” と書いてあるデバイスは抵抗かと思ったけどLDOを保護するためのポリスイッチ(リセッタブルヒューズ)だろうか。これは RAWと“SL”の間に接続されている。先に書いたように、このあたりはSparcFun社の回路図と違う。

この“S2PE”のスペックがはっきりわかればいいのだが、しょうしょう検索したくらいでは何者なのかが分からなかった。ドロップアウト電圧も消費電流も分からないので、電源のプランが立てられない。また、RAW端子は使わないことにしてVCC端子に+3.3Vを与えるような場合でも、レギュレータのVOUTは内部の抵抗を介してGNDに接続されているはずなので、いくらか電流が流れることになる。

“S2PE”の左隣りは、上からコンデンサ、PON(PowerON)-LED、LED用の直列抵抗(1KΩ)と思われる。この直列抵抗を外してしまうことで、LEDのVFを1.8Vとすると約1.2mA(@VCC=3.0V)ほど節約できるはず(当然LEDは点灯しない)。

Arduino PRO MINI
Arduino PRO MINI

外しました。取り去るだけなので、対象の部材の上にハンダごてをあてて、ピンセットでじんわり押してやると外れた。当然ながら、関係ないところを短絡したり、パターンをひどく傷つけないよう気をつける必要があったが。

電圧レギュレータの撤去とPON-LEDの不点灯化によって、基板上でスタンバイ時(スリープ時)に電流を食いそうなものはATmega328Pだけになった。SLEEP_MODE_PWR_DOWNでスリープすれば、マイコン単体の消費電流は10μA未満になるらしいのだが、微弱な電流を測定できる仕掛けがない。まあ、リモコン回路全体に定常的に100μA流れるとしても、電池の容量が1000mAhで電圧さえ維持できれば、単純に考えて10,000時間 = 約416日間稼働することになる(と、期待している)。

構成

赤外線リモコンは以下のように構成することにした。

  • 電源
    単4のNiMH充電池3本を直列につなぐ。想定する電源電圧範囲は3.9V~3.0Vとなる。直列2本の方がいいのだが、マイコンを正確な8MHz(外部クロック)で動かすためなのでしょうがない。
    マイコンも含めた回路には、この電源を直結する(定電圧レギュレータ無し)。
  • マイコン
    余計なものを外した8MHz版のArduino PRO MINI (The Simple)を使う。素のATmega328Pを使って組むよりも、VCC-GND間にパスコン(10μFと0.1μF)も入っていて、リセット回路/スイッチ、D13につながったLEDなどが載っているから楽だし、たぶん安く上がる。
  • キーマトリックス
    4キーなので4つのIOポートにそれぞれタクトスイッチをぶら下げてもいいのだけど、せっかくなので2×2のキーマトリックスとする。いずれかのキーを押せば、マイコンの割込み要因になるようなワイヤードOR回路もつける。割込みはスリープ状態からの復帰要因として使う。
  • IrLED駆動回路
    IrLEDは直列に2本つなぐ。2本にするのは向きを変えて照射できる範囲を広げるため。
    IrLEDに与える38KHz(デューティー1:3)の波形は、ATmega328Pのタイマー1を使ったPWM出力で作成する。
    IrLEDの直列抵抗値は安定時の電源電圧3.6Vを基準に算出するが、最大/最小電圧時のパラメータも得ておく。
  • プログラム
    リモコンというのは24時間のうち、長くても10秒間程度しかアクティブになる必要がない。なので基本的にはスリープ状態 (SLEEP_MODE_PWR_DOWN) に置く。キーマトリックス部から発生するHレベルの信号でスリープから復帰し、キースキャン結果に応じた信号をIrLEDから送出する。そしてスリープ状態に戻る。
  • その他
    電池構成について
    ATmega328Pのデータシート (32.3. Speed Grades) によれば、電源電圧は+1.8V~+5.5Vと広いが、安定動作のために必要な最小電圧はクロック周波数ごとに決まっており、8MHz動作ならば+2.7V以上は与えておきたい。アルカリ乾電池を終了電圧の0.9Vまで使い切るつもりなら3本でちょうどいいのだが、開始電圧が1.6×3 = 4.8VなのでIrLED駆動用のトランジスタ回路の抵抗値を大きくする必要があり、電圧が下がったときに大した電流が流れなくなってしまう。今回は定電圧レギュレータを使わない前提で考えたので、NiMH×3に落ち着いた。クロックについて
    ATmega内部のRCオシレータを使うことも考えたが、電源電圧の経時変化に応じて周波数も変動してしまってPWM出力に影響しそうなのでやめた。
    PRO MINIの水晶発振子を4MHzに変えれば1.8V以上で安定動作するので、乾電池または充電池2本(3.2~1.8Vまたは2.6~2.0V)で済むのだが、The Simpleの水晶発振子が小さすぎて交換は無理。

IrLEDの駆動回路

前回作ったIrLEDの駆動回路と同様に、IrLEDは秋月電子で10本100円で売っていたOSI5LA5113Aという製品を使うことにした。データシートはこちら。仕様では、VF=1.35V @ 100mAとなっているが、実測では1.25V @ 50mAだったのでこの数字を用いてパラメータを決めることにした。

前は比較的離れた位置から操作するエアコンやテレビをターゲットにしたので60mA以上流したのだけど、今回は受信機までの距離も近いので、LEDに流す電流は50mAとする。もっと控えめな電流にしてPRO MINIのI/Oピンから直接駆動することも考えたのだが、VCC=3VのATmega328PのI/Oピンから20mA流そうとすると、Hレベルの電圧が2.2Vまで降下してしまう (データシートの I/O Pin Output Voltage vs. Source Current を参照) 。なのでVF=1.25VのLEDを直列に2本使うことができない。

LEDのトランジスタ駆動回路
LEDのトランジスタ駆動回路

図では電源電圧が+5Vになっているが、今回は直列3本の充電池を直結するので+3.9Vから+3.0Vまで変動することを考慮する必要がある。

電池の安定期間である3.6V時を基準にR1を算出すると、

  •  R1@3.6V :  (3.6 – 1.25×2)(V) ÷ 0.05(A) = 22Ω

R1 = 22Ωとしたとき、電源電圧の最大最小時のIFを求めておくと、

  •  IF@3.9V   :  (3.9 – 1.25×2)(V) ÷ 22(Ω) ≒ 64 mA
  •  IF@3.0V   :  (3.0 – 1.25×2)(V) ÷ 22(Ω) ≒ 23 mA

となり、IrLEDのIFの絶対最大定格を超えることはない。果たして3.0Vまで降下したとき、機能するのかどうか(やってみないと分からない)。

2SC1815GR

こういったスイッチング回路では、トランジスタのコレクタ-エミッタ間電圧(VCE値)をできるだけ小さく抑えて、コレクタ電流(IC)を大きくしたい(つまり、LEDに流れる電流をIFの計算結果に近づけたい)。そのためにはhFE値でベース電流を計算するのではなく、IB を大きめにしてトランジスタを飽和させて使う必要がある。トランジスタの特性図にあるIC-VCE曲線の中で、0に近いVCE値を維持したまま Iが直線的に立ち上がっている部分に欲しいIC値が含まれているIB曲線を見つける。今回はIC=50mAとしたいのでIB = 1mA とすることにした。ベース-エミッタ間には0.6Vの電圧が生じるので抵抗R2の値は以下のようになる。

  •  R2@3.9V :  (3.9 – 0.6)(V) ÷ 0.001(A) = 3300Ω
  •  R2@3.0V :  (3.0 – 0.6)(V) ÷ 0.001(A) = 2400Ω

この結果から、R2には最大値の3.3KΩを使うことにした。VCC=3.0V時にはIB = 0.7mAとなるが、IFも下がっているので問題ない。

VCEを無視した計算の上では、LEDを点灯させたときに最大で64mAの電流が流れることになる。点滅させる波形のデューティー比が小さい(オン時間が短い)方が、消費電流の面から有利になるのは間違いない。

回路と試作

以下のような、シンプルな回路になった。

A_PRO_MINI_IR_KEYPAD2

都合のよい大きさのブレッドボードを別の回路に使っていたので、長いブレッドボード上で試作してみた。

A_PRO_MINI_IR_KEYPAD2の試作

ちょっと間が抜けているがしょうがない。左側の4色のスイッチは、秋月で買った「タクトスイッチ(大)」という商品。プログラミングを行う時点では、AMS1117-3.3で作った+3.3Vを供給し、USB-シリアル変換用のAE-FT231Xと接続している。

写真の上の方に見えている、単4アルカリ×2を電源としてトイレに持ち込んで試してみたが、ちゃんと意図通りに動作した(受光部に近づける必要はあったが)。電源電圧は+2.9V程度だったので、かろうじて/運良く動いたといったところだろう。NiMH × 3をつないだとき、リモコンの効きが悪くなったと感じたら、電池の充電時期(1本で1V強)になったということになる。

AMS1117

余談になるが、定電圧レギュレータのAMS1117-3.3に安定化コンデンサと外部電源供給時に点灯するLEDを載せた小さなモジュールをしばらく前にamazonで買った。5個入りで175円と思っていたら、5個連結されていた。1つ折り取って、AE-FT231Xを載せたミニブレッドボードの片隅に載せ、USBの+5Vから3.3Vを得てプログラミング時に使っている。なお、このモジュールの電源をFT231Xに接続する必要はない。

きょうのまとめ

  • はなしが長くなってきたので、今回はブレッドボード上の試作が動作しました、というところまで。
  • キーマトリックスのスキャン、スリープからの復帰、PWMによる波形の発生、およびスリープ時の消費電流の最小化などについては、スケッチと共に次回以降に掲載する予定。
  • 最終的には、コンパクトで実用的な姿に仕上げたいところなのだけど、それが一番の難関かもしれない。
  • シャワートイレ用のリモコンなのでテストがちょっと面倒なのだけど、うまく動くと何より気持ちいい。

実際に作った話はこちらになります。回路構成等も変更してしまいましたが。