#始めに
ある日ふと照度計を作ってみようとなり、検討を開始しました。調べてみると、作るのにIchigoJamが向いているということがわかり、眠っていたIchigoJamで作ってみました。何か工作の参考になればと思い、その過程を公開します。
#参考サイト
ボクにもわかるIchigoJam用I2Cキャラクタ液晶LCDの接続方法
#目次
- 回路の検討
- 回路の作成
- ソフトの検討
- プログラム
#回路の検討
照度計のメインとなる部品は、光センサーです。調べてみるとNJL7502Lというフォトトランジスタの作例が多いので、これを使用することにしました。見てくれはLEDそっくりなのですが、ダイオードでなくトランジスタです。レンジが1lux~10万luxと幅が広いのが特徴です。薄暗い室内が数から数十luxで、晴天の屋外が10万lux程度となるため、これぐらいのレンジが必要です。データシートを見てみると、入力光の強さにほぼ比例して電流を流します。よって、電流も最大1倍から10万倍流れることになります。
NJL7502Lでの測定回路を示します。今回は簡単な抵抗器でのIV変換を行います。
NJL7502Lに測定抵抗として直列抵抗を接続して、その測定抵抗に流れる電流によって生じる電圧を測定することで、電流値を測定します。このとき、10万倍の電流を測定するためには、測定抵抗値を変更して、測定レンジを変更する必要があります。例えばレンジその1であれば1-100 lux、レンジ2では100-1000lux。つまり、測定回路は、測定抵抗を動的に切り替える機能が必要となります。
ここでアナログスイッチなどの部品が増えるのが嫌だなー、と調べていると、このようなページに行き当たりました。ここでは、GPIOの3値状態機能(VCC/GND/Hi-Z)をうまく使っていました。抵抗の切り替えには、抵抗のグランド側をGPIOに接続し、GNDとHi-Zを切り替えることで可能となります。なるほど、GPIOって、スイッチですもんね。
そこで、複数ピンGPIOがあり、電圧測定に使うADコンバータが付属しており、簡単にプログラミングができるものを検討してみると、IchigoJamがいいのではということになりました。(arduinoという選択肢もあったのですが、今回は見送りました)IchigoJamは、外に出ているピンは、INとOUTの信号になっていますが、中身はGPIOであり、OUTの命令に-1を入力するとHi-Zとなります。
工作にあたりもう1つ条件があります。ディスプレイ無しで動作させたい。照度計なので、いろいろな場所に持ち込んで測定したいと考えました。電源はIchigoJamならモバイルバッテリで十分すぎるくらい動いてくれるのですが、ディスプレイも持ち運ぶわけにはいきません。そこで、AQM0802という8列×2行のキャラクタLCDを取り付けることにしました。I2Cのインターフェースで動作します。IchigoJamはI2Cのインターフェース持っているので、果たしてIchigoJamで動かすことができるかと調べると、このページでばっちり表示ルーチンを公開してくれていました。素晴らしい。ということで、全条件をクリアしているIchigoJamを使うことにしました。
#回路の作成
稚拙ながら、接続図を作成しました。
左のNJL7502Lが接続している部分が測定部で、100,1k,10,100kΩの抵抗を切り替えて使用します。IN2はADC(2)に接続します。
真ん中はAQM0802の接続図で、電源、GNDとI2CのSCL,SDAに接続します。I2Cは2線ながらバス接続のため、出力値Hi-Zと0という変わった出力(オープンドレイン)のため、プルアップ抵抗が必要となります。
右端の10kΩは、IchigoJamの電源オン動作モードのためのプルアップになります。
これくらいの回路であれば、ブレッドボード上で組めば、そんなに時間かからずに動作すると思います。ユニバーサル基板に作る場合は、亀の子基板にするとコンパクトになると思います。
#ソフトの検討
ソフトでは、直列抵抗を選択しながら、ADコンバータの数値を照度のlux値に変換し、AQM0802に表示をします。
###lux値変換
データシートにあるI-luxグラフから、変換式を抽出してみました。グラフを拡大印刷して、数値を読み取り、エクセルでフィッティング。以下の式を得ました。
I_u = 0.372lux - 0.0447 …(1)
ただし、$I_u$ : NJL7052Lの光電流(uA)
$lux$ : 入射光の照度(lux)
電流値から照度を出したいので
lux = (I_u + 0.0447)/0.372…(2)
$V_u = I_u R$ より、$I_u = \frac{V_u}{R}$ を代入して
lux = (\frac{V_u}{R} + 0.0447)/0.372…(3)
ここでADコンバータ仕様、3.3Vで1024階調ということと、rail to railで取れていると仮定することで、$adc$をADコンバータの読み取り値とすると、
V_u = \frac{adc}{1024} * 3.3 * 10^{6}
\\= 3222 * adc…(4)
(4)式を(3)式に代入して
lux = (\frac{3222*adc}{R} + 0.0447)/0.372
lux = 9853.221*\frac{adc}{R} + 0.136…(5)
抵抗値を実測すると、
100 = 98.3Ω
1k = 985Ω
10k = 9780Ω
100k = 97600Ω
これらを(5)式に代入すると、
lux = 100.2*adc
\\lux = 10.00*adc
\\lux = 1.007*adc
\\lux = 0.1009*adc
(0.136は小さすぎるので切り捨てます)
どれも大体10.0の倍数になります。
そこで係数は10として、これにどの抵抗を選択したかで、倍率を乗じて照度値とします。
###測定抵抗の選択
測定抵抗は4本あり、どれを使うか人がいちいち選択していては不便になります。以下の方法で選択することにしました。
(1) まずは一番大きな抵抗値で測定します。つまり一番暗い場合の測定をします。
(2) その測定でadcの値が振り切ったり、振り切る寸前だった場合は、その抵抗で測定するには明るすぎることになるので、1つ抵抗値を小さなものに変更します。振り切ってない場合は、その値が測定値です。測定終了します。
(3)抵抗値を小さなものにした場合は(2)に戻って測定します。
(4)一番小さな抵抗値で振り切った場合はもう測定できないので、振り切った値を測定値とします。
これで自動で測定抵抗を選択します。
###AQM0802表示
AQM0802に表示するルーチンは、このサイトの表示ルーチンをお借りいたしました。ありがとうございます。後に示すBasicプログラムの中で、400行以降が表示ルーチンとなります。使い方は、初期化として、プログラムの最初で400行をコールして、以降の表示の時には、440行をコールします。すると、IchigoJamの左上8列×2行のキャラクターが転送されます。とても便利です。
#プログラム
以下に照度計のプログラムを示します。ここまで読んでいただいた方は簡単に読めると思います。
10 GOSUB 400
20 OUT 1,0:OUT 2,-1:OUT 3,-1:OUT 4,-1
30 A=ANA(2)*10
40 IF A<9800 THEN A=A/100:GOTO 200
50 OUT 1,-1:OUT 2,0:OUT 3,-1:OUT 4,-1
60 A=ANA(2)*10
70 IF A<9800 THEN A=A/10:GOTO 200
80 OUT 1,-1:OUT 2,-1:OUT 3,0:OUT 4,-1
90 A=ANA(2)*10
100 IF A<9800 THEN GOTO 200
110 OUT 1,-1:OUT 2,-1:OUT 3,-1:OUT 4,0
120 A=ANA(2)*100
200 CLS
210 LC 0,0:?A
220 LC LC 5,1:?"lux"
230 GOSUB 440
240 WAIT 30
250 GOTO 20
400 POKE#700,64,0,2,#C0,57,17,#70,86,#6C,56,12
410 IFI2CW(62,#701,1,#704,5)?"E"
420 WAIT12
430 IFI2CW(62,#701,1,#709,2)?"E"
440 IFI2CW(62,#701,1,#702,1)+I2CW(62,#700,1,#900,8)+I2CW(62,#701,1,#703,1)+I2CW(62,#700,1,#920,8)?"E"
450 RETURN
#最後に
本来ならば、作成後にキャリブレーションを行い、出力を調整しないといけないと思いますが、簡易照度計ということで勘弁してください。計算についてもLPC114のGPIOのオン抵抗も考慮しないといけないのですが、データシートからはわかりませんでした・・・。ただ、16bit整数しか扱えないIchigoJamでもこれくらいのものはできるということで、楽しんでいただけたらと思います。