Sousu's ARENA

[ DIYに戻る ]
M5Stackで分光方式カラーメーターを作ろう!
2023.01.09
新規作成
2023.01.10
PCモニターの測定例を追加
2023.03.21
回路図誤記訂正(M5Stack側のPIN名においてCLKとSTが逆だった)
Abstract(概要)
カラーメータ外観

M5Stackと分光センサー「C12880MA」の組み合わせで、照明のスペクトル表示や演色評価ができる装置を作ってみました。

Introduction(まえがき・序論)

みなさん、照明は何をお使いですか? リビングの明るい照明、ダイニングの落ち着く照明、仕事用のデスクライトなんてのもあると思います。

私は最近、高演色LEDを使用した照明を入手しまして、デスクライトに使用しています。 使っているのは「エコリカ ECL-LD2EGN-L3A」というものなのですが、これが思いのほか使い勝手がいいんです。 例えば、WEBカメラの映りがはっきりしたり、本などの発色も目に見えて鮮やかになったりします。

(参考): エコリカ 高演色LED
エコリカ 高演色LED

こうなると、ほかの照明も気になってしまい、いろいろ手を出し始めてしまいます。 高演色をうたうものはいろいろあるのですが、いざ入手してみると、なんとなく発色がいいような気がするのもあれば、そうでもないものあるんです。

そこでほしくなるのが、「カラーメーター」とか「演色照度計」とか呼ばれる装置です。 これがあると、演色評価指数が測定できます。よく「Ra90以上」などと書かれているやつですね。

しかし、これらの装置は基本的に業務用で、なかなか素人には手が出ません。

(参考): コニカミノルタ演色照度計 CL-70F
コニカミノルタ演色照度計 CL-70F

それなら作ってしまおう!というのが今回のプロジェクトです。



Materials and Methods(材料および方法)
fig.1:ブロック図(クリックで拡大)
ブロック図


  1. 浜松ホトニクスのミニ分光器「C12880MA」で照明の光を測定します
  2. 分光器から出た信号を初段AMPでバッファ、2段目で0.6倍して、M5StackのADCで読み取ります
  3. M5Stackでスペクトルや演色評価指数などを表示します
  4. USBにはセンサの生データや補正後のスペクトルデータ等が出力されますので、PC側で精密な解析もできます。

分光器回りの回路を紹介します。

fig.2:回路図(クリックで全体表示)
回路図

  1. U1:C12880MA 浜松ホトニクス製ミニ分光器
  2. U2A,U2B: NJU77902 フルスイングCMOSオペアンプ
  3. U3:TJ7660 スイッチトキャパシタ電圧コンバータ(チャージポンプ)
-

回路設計の詳細は後述します。


内部配線はこんな感じです。

内部配線

使用したパーツ:

回路部品は、すべて秋月電子通商で揃えました。

Materials(使用方法)
M5Stack用のプログラムはこちらです
Color Meter using M5Stack(GitHub)

使用法は下記のとおりです

Results(結果)

表示例です

起動画面です。最初にオフセットキャリブレーションをする必要があります

エコリカ ECL-LD2EGN-L3Aスペクトル


こんな風にスペクトルや演色評価数を表示できます。表示しているのは、秋月の太陽光LEDモジュールの例です。優秀!

カラーメータ外観

リビングの蛍光灯です。こんな穴だらけのスペクトル分布で過ごしていたなんて!

蛍光灯スペクトル

応用として、PCモニターの白色を測定してみました。指標としては、RGBのピークが鋭ければ鋭いほど濁りの少ない色表現が可能です。

下の写真の例ですと、LGの27GP950-Bの赤スペクトルが2重になっており、広色域バックライトに使われるKSF赤色蛍光体の特徴が見えていると考えられます。 そういった蛍光体技術があって、高い色再現性が実現されているんですね!

蛍光灯スペクトル
Discussion(考察)
苦労したところなどのメモ書きです

1.光学部分と感度補正値の関係について

このプロジェクトで一番苦労したのが、感度補正値の決め方です。

使用する分光センサー「C12880MA」は、秋月で購入すると「検査成績書」が付いてきて、 これには個体ごとの波長変換係数(センサーピクセル位置と波長の変換式)が分かるのですが、 波長に対する感度特性は分かりません。

C12880MAのデータシートを見ると、分光感度特性(代表例)が記載されているのですが、 これもあくまで代表例ですので、参考にすぎません。 このため、なんとかして感度補正値を決める必要があります。

とはいえ、何も目安がないのでは補正値が正しそうか見当もつきません。 このため、まずデータシートの分光感度特性(代表例)に似たような値が出るように補正値を決めるところから始めました。

さて、使用する分光センサー「C12880MA」には、開口数(立体角)=0.22というスペックがあります。 要は約25°以上の広がりを持った光を入れることで、 代表特性のような分光感度特性になるよ、ということのようです。(図はデータシートより)

C12880MAの入射光の注意絵

試しに、点光源に近い光源を使用して測定した場合、いびつなスペクトルになりました。 また、入射角を変更するとスペクトルが大きく変化してしまうようです。(添付図) こんなデータでキャリブレーションすれば、ななめらかな校正値カーブは得られません。 また、入射角でここまで値が変わるのも放置できません。

ハロゲンランプの光裸特性

かといって、均一な広がりを持った標準光源(光源については後述)を用意するのは難しです。 であるならば、センサーを回転して入射角を変えて測定し、データのほうを合成してしまえばいいのでは?!

というわけで、手回しろくろを使用して、センサーを1度ずつ回転させて測定する治具を作って、標準光源(ハロゲンランプ)の分光特性を確認しました。

ろくろを使用した分光特性確認治具の外観
手回しろくろを使用した分光特性測定治具

1度ピッチでとったデータです。角度によって結構波形が異なるのが分かると思います

ハロゲンランプ1degピッチ分光特性

1度ピッチでとったデータを積み上げ合成すると、こんな感じ。

ハロゲンランプ1degピッチ分光特性の合成

これを、標準光源の色温度から求められる理論値(後述)と比較して・・・

ハロゲンランプ2850K理論値

感度補正値を算出したのがこれ。

ハロゲンランプ1degピッチ分光特性から求めた補正係数で補正したエコリカのスペクトル分布

感度補正値の確からしさを確認したいところですが、ここで算出した感度補正値を使用してハロゲンランプの波形を出しても理論値になるだけです。 そこで、手持ちの「エコリカ ECL-LD2EGN-L3A」を測定してみたのがこれ。 このLED照明はtwitter等にたくさん測定例があるので、代表として使用しました。 補正が効いて、センサー個別の補正によっておおむね良好な(皆さんの測定例と似ている)結果が得られました。

ハロゲンランプ1degピッチ分光特性から求めた補正係数

若干紫外線領域の補正値が上がっているのですが、これはこのセンサーの仕様らしいです。赤外光が強く入ると、紫外線領域にデータが漏れるんだそうです。 ハロゲンランプは赤外光が多いですから、その状態で補正値を算出するとこうなってしまいます。 この問題は、赤外フィルターなどで対策する方法もあるらしいです。

結局今回は、演色評価に影響がない(演算に可視光領域しか使わない)こと、次の工作で赤外線領域が重要なことから、紫外線領域の誤差は無視することにしました。


さて、ここまでの状態で、蛍光灯型LEDなど、広がりのある光源については測定できるようになりました。 しかし、このままではハロゲンランプやLED単体や太陽など、多くの点光源が測定できません。

そこで用意するのは2つの選択です。

市販されている分光器の場合、乳白色のセンサー部があるのが前者で、スリットや光の経路を制限する形になっているのが後者のようです。

まず試してみたのが拡散方式です。使用したのはt=2の乳白色アクリル板です。 光源の位置が正面から大きくずれると誤差が大きくなるようですが、ラフに測定できるので、イチオシです。

次に用意したのは入射角制限スリットタイプです。一見コンパクトでよさそうなんですが、正確な正面が分かりにくく、なかなか光が入ってくれません。

その次も入射角制限用タイプで、光路に長い筒を使用する仕様です。入射角が制限されているので、周波数精度も良好ですが、何せ不格好です。 不格好ですが、正面が分かりやすいので、光源に向けるのは容易で、比較的測定しやすいです。

拡散板、スリット、筒タイプの光学parts

これらを使って、センサー正面で標準光源のスペクトルを測定し、その値をもとに感度補正値を算出すれば出来上がりです。

ハロゲンランプで補正する

最終的には、前述のように1度ずつデータを取ったりする必要はなくなりました。

2.標準光源について

1.で登場した標準光源についてです。

感度補正値を算出するためには、確からしい光源が必要です。 しかし、測定機用のデータ付き光源はもちろん手が出ません。

そこで目を付けたのがハロゲンランプです。

ハロゲンランプから出る光成分はフィラメントの温度に相当する黒体放射スペクトルとほとんど一致します。 つまり、そのスペクトル分布はプランクの法則に従います。

プランクの法則 wikipedia(参考リンク)

なんのことやらですがざっくりいうと、ハロゲンランプはその色温度さえわかれば、スペクトル分布が計算で出せるんです。

黒体放射理論値

そして、ハロゲンランプは、その特性から色温度指定で市販されていることが多く、ねらった色温度のものが手に入りやすいという特徴があります。これを使わない手はありません。

今回は、「パナソニック ミニハロゲン電球 JD110V85WNPE」を使用しました。100型2850Kの製品です。

パナソニック ミニハロゲン電球 JD110V85WNPE

このハロゲンランプを手持ちの分光計i1 DISPLAY PROで確認したところ、2800K~2900Kのあいだのようでした(xy値から算出) 110Vで2850Kの製品ですから、100Vではちょっと低めに出てもいいと思うのですが、まあそんなものなのかもしれません。

余談ですが、JD110V85WNPEの2850KというSPECは、結構あとになってから気づきました。 「こんなことならもっと色温度値がはっきりわかる光源を買うんだった!」 とも思いましたが、i1DISPLAY PROを使用することで値は測定できていたので、まあいいでしょう。 この記事を見た皆さんは、電圧と色温度の対応が分かりやすい製品を買うといいかもしれません。

なにはともあれ、この手のセンサーを使うのに一番問題になるのが、感度補正値の算出だと思います。 少なくとも感度補正値に必要な標準光源に関しては、ハロゲンランプで何とかなるよ、というお話でした。

3.回路のダイナミックレンジ

後述するキャリブレーションの確からしさ確認で極力回路影響を抑えたかったので、 若干オーバースペックな回路にしています。

まず、初段のアンプで高インピーダンスで受けることで、分光計の出力電流を低く抑制する必要があります。 これはデータシートに書いてある注意書きのとおりです。

次に、2段目のアンプにいてです。 分光計は5V系で動作しており、M5StackのADCは3.3V系ですから、過大入力を防ぐ必要があります。 また、M5StackのADC入力は、約2.5V以上のリニアリティーが悪いことがわかっています。 このため、2段目のアンプで0.6倍して、ADCに3V以上入らないようにし、 さらにソフト処理でAD値2500でリミットをかけることで、ADCが良好に動作する約2.2Vまでの入力しか受け付けないようにしています。

このあたりの検証をしっかりしたかったので、レールトゥーレールのOPアンプを負電源回路まで使ってデータを取ったりしています。 実使用としては、グラフのように約2.2V付近までのダイナミックレンジが満たせればよく、より安価な単電源OPアンプ等でも良いと思います。

ADC特性
4.C12880MAの使い方

まず、C12880MAの基本的な制御に関しては、下記の記事及びプログラムを参考/使用させていただきました。

宝石の鑑別のための分光光度計(参考リンク)

特にC12880MAのデータ転送部分はライブラリをそのまま使用させていただいています。 作者の「dangomushi115」さんには、 「複製・改変・再配布・販売等、ご自由にお使いください。また著作権表示等は不要」の旨 ご連絡いただいておりますので、合わせてgithubに公開したのプログラムの中に組み込ませていただきました。 感謝いたします。

上記「宝石の鑑別のための分光光度計」のプロジェクトは、C12880MAの制御の参考になるのはもちろんのこと、 その内容自体がとても興味深い(面白い!)です。分光計ってこんなことできるんだー。って素直に驚きました。 ぜひ、覗いてみてください。


さて、ここからはC12880MAの波形をADから読み取った後の話です。

前述のADCのリニアリティーの話にも関係あるのですが、このセンサーの出力は若干オフセットがかかっていて、 この値を差し引いてから感度補正係数を適用する必要があります。

注意すべきは3点ありました。

結論から言うと、対応は「測定前にオフセット補正値テーブルの算出を実施する必要がある」でした。

まず、最初の電源電圧についてです。

M5Stackの仕様で、USBが接続されているときは、5V端子にUSBの電源電圧が出てきます。 未接続時(内蔵バッテリー動作)は昇圧回路を通って5Vが供給されます。

私は、USB接続でオフセット及び補正値を算出した後、バッテリー動作に切り替えて測定したため、 どうにも結果が思うような値にならず、苦労しました。 これは、前述のように、電源切り替えごとにオフセット補正値を算出することで解決できます。

2個目3個目は、オフセット値はセンサーピクセルごとに違うが、 蓄積時間が変わってもピクセル同士のに差は相関があり、下記のような式で近似できるようでした。

オフセット値=オフセットテーブル[ピクセル番号]+(蓄積時間us)*35/2048+(蓄積時間us)*10/2048*ピクセル番号/288

ここでオフセットテーブル算出は蓄積時間4ns設定で16回平均値をとったものとしました。

この補正値は測定値から逆算したものですから、センサ固有の可能性がありますが、検証はしていません。

蓄積時間とオフセットの関係

オフセットが決まったら、データが取れるわけですが、光の強さがわからないので、どうにかして蓄積時間(GAINに相当)を決める必要があります。

今回は、測定データのMAX値を蓄積時間増やしながらを変えて確認する、いわゆるAGCを導入しました。 最適なGAINで本測定(繰り返し取得&平均化処理)に入るようにしています。

5.スペクトル表示および演色評価数の計算

演色評価数の表示について、やっていることは下記のとおりです。

  1. 試験光源の三刺激値の計算し、CIE1960UCSの色度座標(u,v)を求める
  2. 試験光源u,vと、黒体放射軌跡上の最も近い点を探す。黒体温度T(単位はK)を,相関色温度と呼ぶ。
  3. 相関色温度から、基準の光(試験光源と同じ色温度の、基準となる光)の相対分光分布を計算する
  4. 試料光源および基準光源の光源色を計算する
  5. 試験色の色度座標に対する色順応補正した値を計算する
  6. 以上のパラメータを集めて、演色評価数の計算をする

なんのことやらですが、ざっくり言うと、試験光源と同じ色温度の基準の光を用意して、 試験色(基本8色+7色)の見え方が、試験光源と基準の光で見た場合どれだけ近い色に見えるか計算しています

画面のアップはこんな感じ。表示しているのはエコリカ ECL-LD2EGN-L3Aです

エコリカ ECL-LD2EGN-L3Aスペクトル

まあ、ほとんどJIS Z 8726 1990やCIE13.3の式を起こしただけです。(それを理解するのが大変だったのですが。) 躓いたところをメモしておきます。

解決していない部分は、相関色温度の計算がとても重たいことです。

試験色のxy色座標と黒体放射のxyカーブを比べ、一番近いxy座標の色温度を採用するのですが、カーブと比較する部分が総当たりに近いので、とても重いです。 実際、ほとんどここの計算で時間を食っています。 JIS規格を見るとテーブル参照を使用したりしているようなので、ある程度テーブルで絞り込んでから総当たりするのが早かったのかもしれません。

相関色温度の決め方(イメージ)
6.ケース

3Dプリンタで作りました。材質はPLAです。

M5Stackがピタッと収まる形にできたのがお気に入りポイントです。 オフセットキャリブレーション用の蓋があれば、もっと良かったかな。

ケースの設計


7.犠牲者

今回の犠牲者。君のことは忘れないよ!

壊れた分光計

せっかくだからセンサー部の写真を一枚。3色に見えるけどフィルターなのかな? 壊れた分光計センサー部
8.次に向けて

今回は照明を直接観測しましたが、分光計を使うと、様々なものの性質がわかってしまいます。 なかでも、糖度計なんて面白そうだなと思っています。 できたらいいな。

おたより、感想、作ってみたよ等、お待ちしてます。twitterやtwitchまで。ではまた次の工作で。


[ DIYに戻る ]
inserted by FC2 system