Ichigojamで簡易照度計を作る

#始めに

ある日ふと照度計を作ってみようとなり、検討を開始しました。調べてみると、作るのにIchigoJamが向いているということがわかり、眠っていたIchigoJamで作ってみました。何か工作の参考になればと思い、その過程を公開します。

#参考サイト

[フォトトランジスタ　データシート](http://akizukidenshi.com/download/NJL7502L.pdf)

[照度計　参考回路](http://middleriver.chagasi.com/electronics/lux.html)

[ボクにもわかるIchigoJam用I2Cキャラクタ液晶LCDの接続方法](https://bokunimo.net/ichigojam/lcd_v1.html)

[IchigoJam BASIC](https://ichigojam.net/IchigoJam.html)

[LPC1114 データシート](http://akizukidenshi.com/download/ds/nxp/LPC111X.pdf)

#目次

- 回路の検討
- 回路の作成
- ソフトの検討
- プログラム

#回路の検討

　照度計のメインとなる部品は、光センサーです。調べてみると[NJL7502L](http://akizukidenshi.com/catalog/g/gI-02325/)というフォトトランジスタの作例が多いので、これを使用することにしました。見てくれはLEDそっくりなのですが、ダイオードでなくトランジスタです。レンジが1lux～10万luxと幅が広いのが特徴です。薄暗い室内が数から数十luxで、晴天の屋外が10万lux程度となるため、これぐらいのレンジが必要です。[データシート](http://akizukidenshi.com/download/NJL7502L.pdf)を見てみると、入力光の強さにほぼ比例して電流を流します。よって、電流も最大1倍から10万倍流れることになります。
　NJL7502Lでの測定回路を示します。今回は簡単な抵抗器でのIV変換を行います。
![shoudokei_genri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/6b7973e2-d46f-923c-6651-eca568a0966b.png)
NJL7502Lに測定抵抗として直列抵抗を接続して、その測定抵抗に流れる電流によって生じる電圧を測定することで、電流値を測定します。このとき、10万倍の電流を測定するためには、測定抵抗値を変更して、測定レンジを変更する必要があります。例えばレンジその１であれば1-100 lux、レンジ2では100-1000lux。つまり、測定回路は、測定抵抗を動的に切り替える機能が必要となります。
　ここでアナログスイッチなどの部品が増えるのが嫌だなー、と調べていると、[このようなページ](http://middleriver.chagasi.com/electronics/lux.html)に行き当たりました。ここでは、GPIOの3値状態機能(VCC/GND/Hi-Z)をうまく使っていました。抵抗の切り替えには、抵抗のグランド側をGPIOに接続し、GNDとHi-Zを切り替えることで可能となります。なるほど、GPIOって、スイッチですもんね。
　そこで、複数ピンGPIOがあり、電圧測定に使うADコンバータが付属しており、簡単にプログラミングができるものを検討してみると、IchigoJamがいいのではということになりました。(arduinoという選択肢もあったのですが、今回は見送りました）IchigoJamは、外に出ているピンは、INとOUTの信号になっていますが、中身はGPIOであり、OUTの命令に-1を入力するとHi-Zとなります。

　工作にあたりもう１つ条件があります。ディスプレイ無しで動作させたい。照度計なので、いろいろな場所に持ち込んで測定したいと考えました。電源はIchigoJamならモバイルバッテリで十分すぎるくらい動いてくれるのですが、ディスプレイも持ち運ぶわけにはいきません。そこで、[AQM0802](http://akizukidenshi.com/catalog/g/gP-06669/)という8列×2行のキャラクタLCDを取り付けることにしました。I2Cのインターフェースで動作します。IchigoJamはI2Cのインターフェース持っているので、果たしてIchigoJamで動かすことができるかと調べると、[このページ](https://bokunimo.net/ichigojam/lcd_v1.html)でばっちり表示ルーチンを公開してくれていました。素晴らしい。ということで、全条件をクリアしているIchigoJamを使うことにしました。

#回路の作成
稚拙ながら、接続図を作成しました。
![shoudokei_kairo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/a20d1102-ef38-66f0-8807-9d1481b9d367.png)
　左のNJL7502Lが接続している部分が測定部で、100,1k,10,100kΩの抵抗を切り替えて使用します。IN2はADC(2)に接続します。
真ん中はAQM0802の接続図で、電源、GNDとI2CのSCL,SDAに接続します。I2Cは2線ながらバス接続のため、出力値Hi-Zと0という変わった出力(オープンドレイン)のため、プルアップ抵抗が必要となります。
 右端の10kΩは、IchigoJamの電源オン動作モードのためのプルアップになります。

　これくらいの回路であれば、ブレッドボード上で組めば、そんなに時間かからずに動作すると思います。ユニバーサル基板に作る場合は、亀の子基板にするとコンパクトになると思います。
![IMG_20200301_113806.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/de0b137f-5771-f336-cf01-616040fe25e9.jpeg)

#ソフトの検討
　ソフトでは、直列抵抗を選択しながら、ADコンバータの数値を照度のlux値に変換し、AQM0802に表示をします。

###lux値変換

　データシートにあるI-luxグラフから、変換式を抽出してみました。グラフを拡大印刷して、数値を読み取り、エクセルでフィッティング。以下の式を得ました。

![lum-curr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/244a8e34-b43d-a72d-34f0-dafc0d16c67b.png)

```math
I_u = 0.372lux - 0.0447 …(1)
```
ただし、$I_u$ : NJL7052Lの光電流(uA)
　　　　$lux$ : 入射光の照度(lux)

電流値から照度を出したいので

```math
lux = (I_u + 0.0447)/0.372…(2)
```
$V_u = I_u R$ より、$I_u = \frac{V_u}{R}$ を代入して

```math
lux = (\frac{V_u}{R} + 0.0447)/0.372…(3)
```
ここでADコンバータ仕様、3.3Vで1024階調ということと、rail to railで取れていると仮定することで、$adc$をADコンバータの読み取り値とすると、

```math
V_u = \frac{adc}{1024} * 3.3 * 10^{6}
\\= 3222 * adc…(4)
```

(4)式を(3)式に代入して

```math
lux = (\frac{3222*adc}{R} + 0.0447)/0.372
```

```math
lux = 9853.221*\frac{adc}{R} + 0.136…(5)
```

抵抗値を実測すると、
100  = 98.3Ω
1k   = 985Ω
10k  = 9780Ω
100k = 97600Ω
これらを(5)式に代入すると、

```math
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の値が振り切ったり、振り切る寸前だった場合は、その抵抗で測定するには明るすぎることになるので、１つ抵抗値を小さなものに変更します。振り切ってない場合は、その値が測定値です。測定終了します。
(3)抵抗値を小さなものにした場合は(2)に戻って測定します。
(4)一番小さな抵抗値で振り切った場合はもう測定できないので、振り切った値を測定値とします。
これで自動で測定抵抗を選択します。

###AQM0802表示

AQM0802に表示するルーチンは、[このサイト](https://bokunimo.net/ichigojam/lcd_v1.html)の表示ルーチンをお借りいたしました。ありがとうございます。後に示す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でもこれくらいのものはできるということで、楽しんでいただけたらと思います。