TCS34725をライブラリ無しで使用してみる
こんにちは、くろべこです。
今回はTCS34725(I2Cカラーセンサセンサ)をライブラリ無しで使用してみます。
TCS34725のレジスタ構成やI2Cコマンドについては以前、データシートの日本語化を行ったのでそちらの参照をお願いします。
ライブラリ不使用という事で使用するライブラリは標準のI2Cライブラリ<Wire.h>のみです。
では早速始めましょ~
プログラム構成(割り込みなし。通常測定)
TCS34725は各色(RGBC)16bitの測定値を格納するレジスタを持っています。
そして、AD変換器は積分時間やゲインの設定が可能になります。また、割り込み機能も有しており透明色(光の強度)の上下限閾値を持たせて割り込みAD変換を行うことが可能となっています。
まずは割り込みなしの基本的な測定を行うために、下記フローチャートでプログラムの構成を行いたいと思います。内容は、単純で【積分時間設定】⇒【ゲイン設定】⇒【AD変換有効】⇒【RGB読み取り】⇒【RGB上下レジスタ統合】です。
実際のプログラムです。
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 |
/* * RGBC Timing Register(0x01) Control Register (0x0F) * 0xFF cycle 1 2.4ms 0x00 1×gain * 0xF6 cycle 10 24ms 0x01 4×gain * 0xD5 cycle 42 101ms 0x10 16×gain * 0xC0 cycle 64 156ms 0x11 60×gain * 0x00 cycle 256 700ms */ #include <Wire.h> const int ADDRESS=0x29;//TCS34725アドレス uint8_t id;//ID Register値 uint8_t ATIME=0x00;//積分時間×256cycle(700ms) uint8_t AGAIN=0x10;//ゲイン×60 uint8_t ENABLE=0b00000011;//割り込み✕,待機✕,ADC〇,電源ON〇 uint8_t CRGB[8];//RGBC ADC値各2byteずつ格納 uint8_t i=0; uint16_t Clear, Red, Green, Blue; void setup() { Serial.begin(115200); Wire.begin();//I2Cマスター初期化 Wire.beginTransmission(ADDRESS); Wire.write(0b10000000|0x12);//Register指定コマンド+ID Register Wire.endTransmission(false);//コネクション維持 Wire.requestFrom(ADDRESS, 1);//スレーブアドレスに1バイト読み取り要求 while(Wire.available()){ id = Wire.read(); } Serial.print("TCS34725固有ID:"); Serial.println(id,HEX);//TCS34725固有ID //積分時間 Wire.beginTransmission(ADDRESS); Wire.write(0b10000000|0x01);//Register指定コマンド+RGBC Timing Register Wire.write(ATIME);//×256cycle指定 Wire.endTransmission(); //ゲイン Wire.beginTransmission(ADDRESS); Wire.write(0b10000000|0x0F);//Register指定コマンド+Control Register Wire.write(AGAIN);//4×gain指定 Wire.endTransmission(); //ADC,電源ON Wire.beginTransmission(ADDRESS); Wire.write(0b10000000|0x00);//Register指定コマンド+Enable Register Wire.write(ENABLE);//ADC開始,電源オン Wire.endTransmission(); //ウォームアップ2.4ms delay(3); } void loop() { //ADC読み取り Wire.beginTransmission(ADDRESS); Wire.write(0b10100000|0x14);//Register指定コマンド(インクリメント)+ADC Channel Register Wire.endTransmission(false);//コネクション維持 Wire.requestFrom(ADDRESS, 8);//スレーブアドレスに1バイト読み取り要求 //C(2byte)⇒R(2byte)⇒G(2byte)⇒B(2byte) i=0; while(Wire.available()){ CRGB[i]=Wire.read(); i++; } //色統合 Clear = CRGB[0]|CRGB[1]<<8; Red = CRGB[2]|CRGB[3]<<8; Green = CRGB[4]|CRGB[5]<<8; Blue = CRGB[6]|CRGB[7]<<8; Serial.print("透明:");Serial.println(Clear); Serial.print("赤:");Serial.println(Red); Serial.print("緑:");Serial.println(Green); Serial.print("青:");Serial.println(Blue); Serial.println(""); delay(800); } |
測定結果
思った以上に感度が良くRGBもはっきり分かれていてGOODです。少なくとも以前使用した浜松ホトニクス製のI2Cカラーセンサ【S11059-02DT】よりはずいぶんと使いやすそうですね。照明用のLEDが付いているのが結構ポイントかもしれません。
今回は通常の定周期での測定をやってみましたが、このセンサでは待機時間の調整も可能です。通常は0~614msですが、WLONGレジスタを有効にすることで7.4secまで待機時間を延長することが可能です。
また、割り込み機能についても紹介したかったのですが、ちょっと私が考えていたものとはちょっとちがう?のか思った動作をしてくれなかったです。私のイメージではIDLE時に光の強度の閾値を超えたら割り込みADCをしてくれるのかなと思ったのですが無反応でした(笑)。これは、次の課題として取っておこうと思います。
トータルでのレビューとしては結構コスパの良いセンサとだと思います。価格的にも1000円くらいで照明LEDもついてくるので、秋月で売っているようなセンサ単体の物よりもお勧めしたい一品でした。
では、今日はこんなところで失礼します!
コメント