(2021.9.19 作成)
このページでは写真のカラーセンサーTCS3472について紹介したいと思います。
管理人は数年前に購入し、放置していたのですが暇なので使えるようにしてみたので、紹介記事を書いてた次第です。
ただこのセンサは製造メーカー(AMS)のサイトを見ると既に生産終了となっていますので、新規に購入するのはどうかと思います。逆に言うと安いので割り切って使うのもありだと思います。
まずは簡単に色の表現方法について簡単に説明します。
詳しく知りたい方はWikiなどで色空間について調べてみるのも良いかと思います。また上記AMSのサイトに行くと幾つかアプリケーションノートを見ることができます。英語にはなるのですが、その中のColorimetry Tutorial (DN 20)が比較的わかりやすく、またAMSが書いているので間違いがないかと思います。
さて、簡単にかいつまんで色の表現方法を説明すると、まず人の目にはL,M,Sという3種類の錯体と呼ばれる視細胞があます。そしてそれぞれがおよそR,G,Bの色を担当しています。このように視細胞が3種類なので色は3つのベクトルで表すことができます。またこのため色として存在しうる範囲を色空間と呼び、任意の色はその中での座標値として表現されます。
この空間を構成する3つの単位ベクトルとしてLMS細胞の刺激量を使用するのも一つの表現方法なのですが、一部負の値が出る、一つの軸を明度にしたいなど技術的な数値の取り扱いを改善するためXYZ表色系というものが編み出されました。
XYZ表色系というのは図のような波長-視感度特性(等色関数)を持つ仮想の刺激値であって、計算時には調べたい光のスペクトルにXYZそれぞれの感度特性をかけることによって得られます。そしてこのXYZ表色系というのが表色系の基本になります。またこの場合Y値が明度と一致するように設定されています。
ところでXYZ表色系というのは3軸のベクトルなのでちょっと使いにくいです。このため明るさであるYを切り離しLxyやLa*b*, Lu'v'などと言った色だけを2次元で表す表色系が使用されます。これらの表色系は一長一短がありそれぞれ使われる分野が異なっているというのが実態かと思います。
しかしこれらの表色系であっても2次元なのでもっと簡略化するため色温度という概念が考えられました。これは黒体輻射が赤から青に連続的に変化することからこれを一つの軸にしてしまおうという考えです。ただ2次元の値を1次元に縮退しているため、正確な色表現はできず青っぽい白、赤っぽい白など白色近傍で多く使用されます。ディスプレイの色味でよく使われていますね。
前置きがずいぶん長くなってしまいました。
さてここでTCS34725の各色の感度スペクトルを見てみましょう。このスペクトルが上記XYZ等色関数と一致していれば測定値が他でも使用できる標準的な色座標となるはずです。
そして右が実際のTCS34725の感度スペクトルです。明らかに見てわかる通りXYZ等色関数とは異なるので、TCS34725の検出する値は標準値ではありません。
また赤外線領域に感度があることも特徴です。
一応観測対象のスペクトルが決まっていれば補正してXYZ値を得ることもできるのですが、スペクトルが不明だと正確な変換式を得ることもできません。
ここは誤解しやすいポイントで、例えばAdafruitのソースコードではXYZ表色系への変換式は記載されています。これはAMS社のアプリケーションノート(DN25)に記載されている変換式が使用されているのですが、これはD65光源で照らされたものを測るときに使用できる変換式です。多くのTCS34725基板にはLEDが搭載されているのですが、これはD65光源とは全く異なるスペクトルなので正しい変換ではありません。しかも上記アプリケーションノートはTCS3414という別のデバイス向けのものであって感度特性がそもそも違います。
まじめにやるなら補正された観測器を持ってきて補正を行うべきでしょうが、光源が変わるとそれだけで再補正になります。それなら安価なアレイセンサと安価な回折格子を使用してスペクトルから色座標を計算したほうが確実でしょう。
さらにアプリケーションノート(DN40)では色温度と照度への変換式が載っています。こちらはTCS3472向けの補正値が記載されており、かつ色温度というもともと色座標を正確に決めることができのない表現方法です。よって色温度についてはそれなりに使っていいものだとと思います。
いろいろごちゃごちゃと書きましたが、結局RGBのそれぞれの色成分は出せるが、工業的に再利用できる数値を出すものではありません。しかしホビーユースや単に色を知りたい時には十分使えるデバイスと思います。
HWの接続は簡単です。回路図はこちらにありました。VINに3.3~5V程度をつなぎ、後はLED,I2Cの線をつなぐだけです。基板の3.3Vは何もつながなくていいと思います。基板上にレベル変換用のFETも実装されています。
I2Cでの通信はフォーマットは通常のアクセスです。ただ一点、レジスタアドレスの先頭3バイトに制御コマンドを入れる必要があり、特にMSBビットは必ず1にしないといけないという謎ルールがあります。
データ収集時の調整はアナログゲインと積算時間の2つがあります。データのAD変換/収集は2.4msを1単位として行われ、それを何回繰り返すかで積算時間が決まります。このため最も精度の高くなる調整方法としては
1.積算時間を最短に設定
2.アナログゲインをAD変換がサチらない範囲(~1024)で最大になるように調整
3.積算時間をデータレジスタがサチらない範囲(~65535)で最大になるように調整
となります。
少し触れたのですが赤外領域に感度があります。このためIR=(R+G+B-C)/2としてIR成分を抽出し、R'=R-IRなどとすることでIR成分の影響を減らすことができます。アプリケーションノート(DN40)に記載があります。
途中で面倒になって、いい加減な所でGUIソフトはアップロードしていますが、まぁ動作確認が主目的なので必要な方はこのソフトを参考に改良してみてください。
う~ん。生産終了していて先のないデバイスに頑張って記事を書いてしまいました。何がしたいんだろう?って自分でも思います。
ではでは
まだコメントはありません。