S11059-02DTの動作コード紹介とレビュー
こんにちは、くろべこです。
今回は浜松ホトニクス製のデジタルカラーセンサ【S11059-02DT】を紹介していきますよ。
このカラーセンサはRGB(赤緑青)とIR(赤外線)のそれぞれに感度を持ち検出結果を16bit(0~65535)のデジタル値で出力することができます。
また、通信インターフェースはI2C採用しています。
本記事では動作レビューという事で、ライブラリ不使用でコードを書いていきます。マイコンはArduino-nanoを使用したいと思いますね。
S11059-02DTの概要説明
デジタルカラーセンサS11059-02DTは冒頭に説明した4色の波長に対してフォトダイオードを順番に切り替え、測定を行います。
感度はHighとLowの1bitで設定できます。Lowに対してHighは10倍の感度を持っています。
また、RGB,IRごとに受光感度特性が異なります。下記グラフは各色の相対受光感度になります。
なので、検出したカラーデータをフルカラーLEDに反映する時などは各色のゲイン調整が必要かもしれませんね。
測定モードとしては【マニュアルモード】と【固定時間モード】の2種類があります。
固定時間モードでは一定間隔で計測データを更新しますが、積分時間の設定をあまり長くすることができません。
一方のマニュアルモードでは測定ごとにスリープする単一測定になります。本記事ではマニュアル測定での動作確認を行います。
マニュアル測定の利点は
- 積分時間が長く設定可能
- 積分時間の×定数倍を設定可能
という事で、光が弱い場合など一回の積分時間では感度が弱い場合ではマニュアル測定の方が効果的に測定環境を設定可能になります。
スペック
推奨動作条件
レジスタマップ
コード作成
今回は秋月さんから購入したピンヘッダー付きのデバイスを使用します。
(アマゾンにもケーブル付きの物がりました)
*Vcc-GNDには0.1uFが付いているようです。
そして、デジタルカラーセンサの設定値については以下の通りです。
- I2Cアドレス:0x2A
- 測定モード:マニュアル
- 積分時間:87.5us
- 倍数:1500
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
//ライブラリ&定数定義 #include "Wire.h" #define ADDRESS 0x2A #define CTRL 0x00 #define tMSB 0x01 #define tLSB 0x02 #define dLSB 0x03 //積分時間 00:87.5us, 01:1.4ms, 10:22.4ms, 11:179.2ms const uint8_t Tint=0; const uint16_t N=1500; //変数定義 uint8_t i=0;//カウンタ uint8_t buff[8];//8bit×8バッファ uint16_t datar, datag, datab, datair;//16bitデータ void setup() { Serial.begin(9600); Wire.begin();//I2Cマスター接続 //マニュアル積分時間倍数設定 GAIN(N); } void GAIN(uint16_t N){ Wire.beginTransmission(ADDRESS); Wire.write(CTRL);//コントロールバイトCALL Wire.write(0b11100100); Wire.endTransmission(false); Wire.beginTransmission(ADDRESS); Wire.write(tMSB);//積分時間上位 Wire.write(N>>8); Wire.endTransmission(false); Wire.beginTransmission(ADDRESS); Wire.write(tLSB);//積分時間下位 Wire.write(N); Wire.endTransmission(); } void WRITE(uint8_t Tint){ uint8_t val; //I2C書き込み Wire.beginTransmission(ADDRESS); Wire.write(CTRL);//コントロールバイトCALL Wire.write(0b10000100|Tint); Wire.endTransmission(false); Wire.beginTransmission(ADDRESS); Wire.write(CTRL);//コントロールバイトCALL Wire.write(0b00000100|Tint);//ADC動作開始,wakeUp Wire.endTransmission(); switch(Tint){ case 0: val=1; break; case 1: val=3; break; case 2: val=45; break; case 3: val=360; break; } Serial.print("待機時間:");Serial.println(N*val); delay(N*val);//積分時間以上の待機時間 } void loop() { WRITE(Tint); //I2C読み取り Wire.beginTransmission(ADDRESS); Wire.write(dLSB); Wire.endTransmission(false); //データサイズ要求 Wire.requestFrom(ADDRESS,8);//デバイスから8byte要求 //データ読み取り&データ処理(結合) for(i=0;i<7;i++){ buff[i] = Wire.read(); } datar = buff[0]<<8 | buff[1];//上位下位結合16bit(赤) datag = buff[2]<<8 | buff[3];//上位下位結合16bit(赤) datab = buff[4]<<8 | buff[5];//上位下位結合16bit(赤) datair = buff[6]<<8 | buff[7];//上位下位結合16bit(赤) Serial.print("RED:");Serial.println(datar); Serial.print("GREEN:");Serial.println(datag); Serial.print("BLUE:");Serial.println(datab); Serial.print("IR:");Serial.println(datair); Serial.println(""); Wire.endTransmission(); } |
動作確認
動作確認には青のフィルムを張り付けたLEDライトを使用します。
シリアルモニタで出力データを確認してみます。
ご覧の通り青の波長が一番大きくなっています。緑の波長も結構藩のしていますね。ちなみに波長の関係は以下の通りになります。
赤(615nm) > 緑(530nm) > 青(460nm)
おわりに
という事で、今回は浜松ホトニクス製のデジタルカラーセンサ(S11059-02DT)の紹介と動作レビューを行ってきました。
実際に安定した測定を行うには周りからの照明の入り込みを避けて、測定環境を一定に保つ必要があると思いましたね。例えば、箱の中に測定物とLED照明を入れて測定するとか。
時間があればここら辺の測定環境の定量化を行って、カラーセンサの値をフルカラーLEDに転写してみようと思います。ゲイン調整が必要な感じがするのでボリュームを各色に追加する必要がありそうですが、、、
今回は、ここで失礼します。
ではでは~
コメント