照度計を作り直す

自作の照度計が壊れました。
スライドスイッチをオンにして電源を入れても画面に何も表示されません。
確か、半年ぐらい前に使ったときは正常に動作していましたが、今は何の反応もありません。

そもそも照度計を作ろうと思ったきっかけは、私が小型ガジェットが好物だということ以外に、リビングのソファーで夜に読書をすると暗いなぁ。と感じたことが始まりです。
実際に照度計を自作してみると、夜間のソファーで測った照度は 100 lx 以下でした。
そこで現在はソファーの近くに読書灯を置いて、アレクサ君に指示をすると読書に適した明るさに成るように改善しました。

壊れた照度計

自作照度計の外観です。
中央上に電源のスライドスイッチが見えます。
左側に見える青いタクトスイッチは、液晶画面のバックライト用です。
(液晶画面のバックライトを点灯すると、照度センサに影響があるかと思い、画面が見づらい時だけ一時的に点灯するような作りにしています。)

なお、照度センサ部が曲がって付いているように見えますが、センサ部はダイソーの LED 懐中電灯(現在は販売していない。)から部品を切り取ったため、上側が太くて下側が細いためにこのような見た目になっています。
(言い訳に聞こえますが、初度センサ部の上のラインは水平になっています。)

さて、故障の原因を確認するためにケースを開けます。
ケースは市販品(タカチ製?)を使っています。

内部は御覧のとおりガラガラです。
電池は単3電池を2本使っています。

MCU には内部クロック 8 MHz に設定した ATmega328P に Arduino UNO のブートローダを書き込んで使っています。
(外部クロック不要の 8 MHz 動作のブートローダの書き込み方は、下のリンクをご覧ください。)

ケースを開けてみると、内部の配線は MCU に LCD と照度センサが接続されているだけなので、壊れる要素が見つかりません。
一応、全てのコネクタを抜き差しして電池を新品に入れ替えましたがダメですね。
こんな簡単な回路なので回路図も残していませんし、ユニバーサル基板で組んだ配線を追いかけて修理するのも面倒です。

また、当時は知らなかった(忘れていた)のですが、ブログを始めて単位記号の書き方を調べたら、千を超える大きな数字を3桁ごとに「,」で区切るのは誤りだという事が分かりました。(ISO/JIS の規定です。会計的な決まりごとは調べていません。)
この自作照度計は(当時のスキルとしては)苦労して、明るいところで数字の桁数が増えると見やすいように3桁で「,」で区切る処理を行っていたのですが必要ない機能でした。

それじゃ、新しく作り直しましょう。
前回 I2C スキャナを作るのに余分に買っておいた ATtiny85 が部品箱にあります。
これを使って照度計を小型化します。やってみよう!

製作する照度計の仕様

「夏休みの工作」的な感じで簡単に作りたいので、現在の自作照度計に使っている部品と、部品箱の部品を使い新規に部品を買い足すことはしません。
しかし、現在使っている MCU(ATmega328P)をそのまま使うのでは面白くないので、MCU を ATtiny85 に交換して表示部には小型 OLED(SSD1306 128 X 32)を使います。

使用部品
MCU:ATtiny85
表示装置:SSD1306 128 X 32
照度センサ:AE-TSL25721(秋月電子)
電源:コイン電池(CR2032)
ケース:3D プリンタで自作
基板:余った I2C スキャナ基板を改造
書き込み装置:USBasp
開発環境:Arduino IDE

予備試験

今まで自作ではやってこなかった ATtiny85 と OLED の組み合わせが一発で動くほどのスキルは持ち合わせていないので、一歩一歩進みます。
まずは、使い慣れている Arduino UNO 化した ATmega328P に照度センサと小型 OLED(128 X 32)をつないで動作確認します。
(この器材は後ほども使用する予定があります。)

照度センサと OLED(SSD1306)のスケッチ例を組み合わせて、ブレッドボード上でサクッと動かします。
一発で動作しました。

今回は、後ほど試験をするために2つのセンサを使っています。
(本当は同じセンサが2つあれば良かったのですが、違うセンサを使っています。)
左側が aitendo で購入したM1750-5P(BH1750)です。右側が照度計で使用する秋月電子の AE-TSL25721 です。

表示例です。
2行に分けて2つのセンサの値を表示しています。
上の行が BH1750、下の行が TSL25721 の照度を表示しています。
ほぼ同じ場所の照度を計っていますが、結構な違いがあります。

使用している照度センサ

M1750-5P

M1750-5P は秋葉原の電子部品通販メーカ aitendo さんで購入したセンサ基板で、BH1750 を使ったモジュールです。
(aitendo さんは最近実店舗を再開したみたいですが詳細は不明です。)
BH1750 の性能は
・測定範囲:0 〜 65 535 lx
・精度:1-lux
・16ビットA/D内蔵
・動作電源:3〜5V
・インターフェース:I2C
・I2C アドレス:0x23
・I2C のプルアップ抵抗:あり(4.7 kΩ)

AE-TSL25721

こちらも定番の部品通販出来るメーカの秋月電子さんで購入した TSL25721 を使用したモジュールです。
(秋月電子は直リンク禁止らしいので、リンクはありません。販売コードは 115536 です。)
TSL25721 の性能は
・測定範囲:~ 60 000 lx
・動作電源:2.4 V ~ 5 V
・受光種別:可視光
・インターフェイス:I2C
・I2C アドレス:0x39
・I2C のプルアップ抵抗:あり(10 kΩ)

秋月電子の HP のデータでは精度が記載されていませんでした。

そもそも照度とは

先に進む前に、照度について復習しておきます。(忘れているけど、多分学校で習っているはず。)
ネットで調べてみましょう。

「計量単位令」では、照度とは、「1平方メートルの面が1ルーメンの光束で照らされるときの照度」
ルーメンとは、「1カンデラの光源から1ステラジアン内に放射される光束」
カンデラとは、「放射強度1/683ワット毎ステラジアンで540兆ヘルツの単色光を放射する光源のその放射の方向における光度」
です。

これは深追いすると沼にハマりそうなので、照度とは一定の範囲を一定の明るさが照らす時の明るさを表す量という事にしておきます。(上の「照度とは・・・の照度」では説明になっていない気がするのですが気のせいでしょうか?)

ちなみに、照度を表す単位は「ルクス(lx)」です。人名ではありません。
てっきり「ルクス」氏はフランスの牧師で子供のころから化学現象が大好きで、大人になってからろうそくの明るさを数値化した髭の生えた偉人だと勝手に想像していたのですが、ラテン語で光を表す言葉らしいです。
単位を表す時に人名は大文字ですがそれ以外は小文字で書きます。(スケッチ内での表記を「LX」としていました。間違っていたので後で直そう!)
(単位記号の基礎については、下のリンクをご覧ください。照度(lx)などを追加しておきます。)

まとめ
・ルクス(lx):一定の明るさで照らされた面の明るさの量
・ルーメン(lm):光源の発する光の量

照度の基準

JIS照度基準(JIS Z 9110)によると、生活で良く使う場面での照度はこんな感じです。

電子部品の製造 1500 lx
設計・製図 750 lx
一般的な作業 500 lx
オフィス 400 lx
便所・洗面所 200 lx
廊下 100 lx

ちなみに、
曇りの太陽光 30 000 lx
晴れの太陽光 100 000 lx
ですから、AE-TSL25721 の最大照度が 60 000 lx なので、屋外でも使えるようにするには照度が 1/3 程度になるフィルタが欲しいところです。

ATtiny85 で SSD1306(128×32) を動かす

ATtiny85 で OLED SSD1306 の 128 x 64 ドットを表示する情報は沢山見つかるのですが、横長の 128 x 32 ドットを表示させている例はあまり見ません。
とりあえず、実際に試してみましょう。

まず、基本の再確認ですが各 MCU のユーザが使えるプログラムメモリ量は
ATmega328P:32 kB
ATtiny85:8 kB
思ったよりも少ないですね。Arduino UNO の 1/4 しか容量がありません。

接続はこんな感じでブレッドボード上に作りました。

細かな配線は、プログラマの USBasp とは下の図のように接続します。

I2C の配線は、SDA が Pin5、SCL が Pin7 です。
Pin5 と Pin7 はプログラムにも使いますが、I2C の部品をつないだ状態でもエラーなく書き込みは出来ました。

実際の配線図です。CN1 は USBasp の接続先を、CN2、CN3 は照度センサと OLED のコネクタを表しています。
I2C のデータラインはプルアップ抵抗が必要ですが OLED 基板と照度センサ基板の両方にプルアップ抵抗が内蔵されているので必要ありません。

最初に、照度計の自作スケッチの設定で「ボード」を ATtiny85 に変えてビルドしてみます。
ATmega328P で 61%(18904 B)を使っているスケッチですから、照度センサを2つから1つに減らしてもメモリ不足でエラーになりました。

次に、秋月電子の照度センサ AE-TSL25721 の商品説明ページにあるスケッチ例を試してみます。
「AE_TSL2572_demo.ino」です。
このデモ・スケッチは照度センサをシリアル通信で値を出力するので、プログラム容量は少ないです。
メモリ不足のエラーは出ませんが、ATtiny85 でシリアル通信するにはソフトウエア・シリアルを動かす必要があり配線を変更するのも面倒なので、このスケッチを改造してシリアルで照度計の値を確認するのはやめました。(すでに照度センサの動作確認は済んでいますから。)

とりあえず秋月電子のスケッチ例にあるライブラリ「AE_TSL2572.cpp」が ATtiny85 でもエラーが出ないことが確認できたので、ATtiny85 用の OLED ライブラリを探します。

ATtiny85 用の OLED ライブラリ

最初に見つけた ATtiny85 用の OLED ライブラリは「TinyOzOLED.h」です。
GitHub から落として来て、「Hello World!」的な簡単なスケッチを表示してみます。

あれ?何だか変な文字?が表示されます。
(SSD1306 128×64 に差し替えたら正常に表示されました。)

これじゃあ使えないので SSD1306 128×32 の横長 OLED に対応していると書かれているライブラリを探します。
「Tiny4kOLED-master」が見つかりました。
GitHub だけではなく Arduino CC に Tiny4kOLED のページがありました。
直訳すると「128×32 ピクセル OLED のダブル バッファリングをサポートします。」と書かれています。
また、「メモリ効率が非常に優れています。プロポーショナル フォントをサポートします。」とも書かれています。

このライブラリと用意されているフォントを使います。
標準の 8×16 ドットフォントでは小さくて見ずらいので、大きなフォントを使うために「TinyOLED-Fonts」の「font16x32digits」フォントを使います。

照度計のスケッチは、「Tiny4kOLED-master」のサンプルと秋月電子の「AE_TSL2572_demo.ino」を組み合わせて、フォントを追加したら出来ました。

でも、この時点でプログラム・メモリの使用量は 92%(7538/8192 B)です。
(追加フォントを組み込む前は70%程度の使用容量でした。)
まあ、これ以上の機能は追加する予定はないので大丈夫かな?

減光フィルタの取り付け

この照度計を屋外でも使えるようにするために、照度を2~3分の1にする「減光フィルタ」を取り付ける必要があります。
これには、自作照度計で使っていたダイソーの LED 懐中電灯の部品をそのまま使います。

パソコンの中を探したら、2年ほど前に作った(汚くてお見せ出来ない)照度計のスケッチが見つかりました。
その中では減光フィルタを取り付けた際の補正値は「2.4」になっていました。
どうやってこの値を求めたかは、全然記憶にないので改めて確認します。

減光フィルタの取り付け

照度センサの AE-TSL25721 をダイソーの LED 懐中電灯の部品に取り付けるアダプタを 3D プリンタで作ります。

これを組み合わせて新しい照度計のセンサにします。
組み立てた照度センサと BH1750 を使った照度センサを並べてデータを取ります。
これには、ラジオペンチさんのブログの情報で作った「LED ストロボスコープ」を使いました。
(「LED ストロボスコープ」の組み立て記事は、下のリンクをご覧ください。)

この LED ストロボスコープは、LED を高速に点滅させるだけではなく明るさを調整するモードが付いているので、この機能を使いました。
(写真は、照度計のケース製作後に再現写真を撮りました。実際には定規で高さを同じ(17 cm)にして測定しました。)

2つのセンサで表示された照度をグラフ化します。
(どちらの照度センサが正しいのか、そもそも両方とも信用できるのかという疑問はありますが、作るのは目安程度の照度計なので気にしないことにします。)

このグラフを見るとラジオペンチさんの LED ストロボスコープは、調光の性能もしっかりと直進性が出ていると思います。(グラフの 30% の所で凹みがあるのは、手を抜いて 30% のところの測定を飛ばしたためです。)
このグラフを見た限りでは単純に計算すると補正値は「2.7」から「3.0」の間に入っています。
照度の修正・計算方法はTAOS社の「INTELLIGENT OPTO SENSOR DESIGNER’S
NOTEBOOK」Number 28「Developing a Custom Lux Equation」に出ていますが、良く理解できていません。

2年ほど前に照度計を作った時の補正値は「2.4」でしたが、大きなズレはないようですね。
今回は、照度計の減光フィルタの補正について詳しい事が分かるまでは「2.7」で行ってみます。
事前試験では照度センサの「BH1750」は数値が高く出て、使用している「TSL25721」は低く出ていました。
補正値を「3.0」にすると BH1750 と同じぐらいの値になりますが、「2.7」にすると両者の間で少し低い値になります。

照度センサの AE-TSL25721 の最大照度が 60 000 lx なので、補正値を「2.7」にしても晴天の太陽光の 100 000 lx でも余裕があるはずです。

基板の改造

ATtiny44 で製作した I2C スキャナの基板が余っているので改造しました。
裏の配線の不要な部分をダイソーで購入したケガキ針で削りました。
(I2C スキャナの組み立て記事は、以下のリンクをご覧ください。)

完成した基板はとても小さくなりました。

私は以前作った ATtiny44 用の I2C スキャナ基板が余っていたので、これを改造しましたが新規でユニバーサル基板で作るなら、こんな感じでしょうか?

本来ならば I2C のデータシートでは配線を外部に出す時は下図の様な順番にする決まりがあるようなのですが、10 cm 以内なので気にしないで OLED 基板の順番どおりにしています。

ケースの製作

照度計のケースは今回も Fusion 360 で設計して 3D プリンタで作ります。
前回の自作照度計は市販のケースに単3電池2本を内蔵していたので大きくなりましたが、今回はコイン電池を電源にするので小型化できます。

ケース下部

ケースの下部にコイン電池 CR2032 のケース機能を内蔵します。
さらに、最初は電源スイッチをケース上部に取り付ける設計にしていましたが、配線が最短になるように電源スイッチも下部に取り付けました。

コイン電池の接点にはクリップを使いました。
左側に見える電源スイッチは差し込んだだけですが、しっかりと固定されています。

ケース上部

ケース上部には照度センサと OLED 用の窓を開けます。
さらに、電源スイッチをケース下部に内蔵したので、その分を切り取ります。

なお、最初に作ったケース上部には、基板を入れたらケースが閉まらなかったので、不本意ながら高さを 1 cm 高くする修正を行いました。
(コネクタや IC ソケットなどの高さを低く出来れば、最初のケースに入りそうですが・・・)

組み立て

出来上がった基板と照度センサ、OLED とケースを組み立てます。
組み立てと言っても、キッチリしたサイズで作ったので所定の位置にはめ込むだけで完成です。

動作確認

すでに USBasp を使って Arduino IDE から照度計のスケッチは書き込んであるので、電源スイッチをオンにすると照度を OLED に表示します。
フォントを別データで入れたので、良くある小さなフォントを拡大したものと比較してキレイに表示されています。(自画自賛)

サイズの比較です。
右側は部品を外したケースだけの状態ですが、比較すると縦が半分に横幅が7割程度まで小さくなったので、1/3 程度の大きさに小型化できたと思います。

これで、単機能のガジェット好きには丁度よい照度計が自作出来ました。
上の写真では照度の単位が「Lx」となっていますが、その後正しい「lx」に直しました。

なお、基板に部品を全てつないだ状態で USBasp を使ってプログラムを書き直しましたが、2~3度に1回は失敗します。
繰り返し行えば書き込みは出来るのですが、万全を期するのであればプログラムを書き込む時は I2C の2つの部品を外した方が良さそうです。

ケースを改善

最初に作ったケース上部では部品が入りきらなかったので高さを 10 mm 増やしました。
しかし、良く見るとそこまでの高さは必要なかったようです。(少し余裕があります。)
手に持って照度を計るには、今のままでは厚さがありすぎるので 5 mm 高さを減らしました。
(ケース3兄弟です。)

一番左側が最初に作った低すぎたもの(高さ 15 mm)、右側が改良して高さを増やしたら高すぎたもの(25 mm)です。
新しく作った真ん中のケース(20 mm)に中身を入れ替えます。

真ん中のケースでも部品と基板はちゃんと入りました。
新しい照度計の満足度は90点です。(ケースの厚さが一番左側のように、もう少し薄く出来れば最高なのですが。)

理解できていない所

今回使用した照度センサは秋月電子の AE-TSL25721 です。
これは、「TSL25721」という照度センサを搭載しています。
説明によると「可視光及び赤外光(CH0)と赤外光(CH1)に感度を持つ2種類のフォトダイオードでより人間の目の応答に近い照度測定を実現します。」と書かれていました。

確かに秋月電子ではない他社の「TSL25721」のライブラリは可視光と赤外線などの値を選択して出力することが出来ます。
しかし色々と試してみましたが、こちらのライブラリでは照度の値を得ることが出来ませんでした。

また、秋月電子のライブラリでは今のところ可視光や赤外線などの値を選択して取得することが出来ていません。
照度センサについては、まだ色々と分からないことも多いので、もう少し詳しく理解出来たら記事にします。

コメント