M5StackGrayでM5Stack_COLOR_UNIT(カラーセンサ)の動作テスト

2021.7.9 Coskx Lab  

1 はじめに

M5Stack GrayにM5Stack_COLOR_UNIT(カラーセンサ)を接続して周囲の色を測定します。

M5Stack_COLOR_UNITはカラーセンサTCS3472を使用していて,M5StackのGrovePortA(I2C)接続専用として販売されています。
TCS3472はセンサ正面の色をRGBに分解して,それぞれを値で取得します。

2 使用環境

3 接続

付属のケーブルで,M5StackのPortA(赤いポート)にM5Stack_COLOR_UNITをつなげます。
M5StackのPortAの電源ラインには5Vが供給されていますが,SCL,SDAの信号線は3.3Vで通信しています。(M5Stackの信号は3.3Vです。M5Stack_COLOR_UNITは内部で5V電源から3.3Vを作って,信号を3.3Vにしています。)
注意 PortAのソケットの形が同じだからといって,M5Stack_COLOR_UNITを5V系のマイコンに接続して使うことはできません。
Groveシステムは接続は簡単なのですが,信号の電圧という落とし穴があります。





この画像では,カラーセンサが背景の青色を掲出しています。LCDに青い矩形が表示されています。

PortAにはM5Stackの5V,GND,SDA,SCLが引き出されているだけなので,PortA経由ではなく直接5V,GND,SDA,SCLにつないでも,OKです。(3.5Vにつながないように気を付けてください。)



4 準備

TCS3472はI2CでCPUとデータをやり取りしますが,そのためのライブラリが必要です。
https://github.com/adafruit/Adafruit_TCS34725
から
Adafruit_TCS34725.h
Adafruit_TCS34725.cpp
の2つをダウンロードし,作成中の.inoと同じフォルダに入れておきます。


5 テストプログラム

https://github.com/m5stack/M5Stack/tree/master/examples/Unit/COLOR_TCS3472
を参考にさせていただきました。

  動作テスト用プログラム本体(センサは常時稼働)

//COLOR_TCS3472Test01.ino//

/*
    Description: Use COLOR Unit to read C, R, G, B values and serial print output.
    Please install library before compiling:  
    Adafruit TCS34725: https://github.com/adafruit/Adafruit_TCS34725
*/

#include <Wire.h>
#include <M5Stack.h>
#include "Adafruit_TCS34725.h"

// set to false if using a common cathode LED
#define commonAnode true

// our RGB -> eye-recognized gamma color
byte gammatable[256];

static uint16_t color16(uint16_t r, uint16_t g, uint16_t b) {
  uint16_t _color;
  _color = (uint16_t)(r & 0xF8) << 8;
  _color |= (uint16_t)(g & 0xFC) << 3;
  _color |= (uint16_t)(b & 0xF8) >> 3;
  return _color;
}

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

void setup() {
  delay(100);
  M5.begin(true, false, false);
  M5.Power.begin();
  M5.Lcd.setTextSize(2); //高さ16 26文字/行
  while(!tcs.begin()){
    M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
    M5.Lcd.setCursor(0, 60);
    M5.Lcd.print("Sensor not found");     
    delay(1000);
  }
  M5.Lcd.clear();
  M5.Lcd.setCursor(0, 10);
  M5.Lcd.print("Color Sensor Test");
  tcs.setIntegrationTime(TCS34725_INTEGRATIONTIME_154MS);
  tcs.setGain(TCS34725_GAIN_4X);
}

void loop() {
  uint16_t clear, red, green, blue;
  delay(60);  // takes 50ms to read   
  tcs.getRawData(&red, &amp;green, &amp;amp;blue, &amp;amp;amp;clear);

  // Figure out some basic hex code for visualization
  uint32_t sum = clear;
  int r, g, b;
  r = red*256/sum;
  g = green*256/sum;
  b = blue*256/sum;

  M5.Lcd.setCursor(0, 26);
  M5.Lcd.printf("Clear: %3d\n", clear);
  M5.Lcd.printf("Red  : %3d (%3d)\n", red, r);
  M5.Lcd.printf("Green: %3d (%3d)\n", green, g);
  M5.Lcd.printf("Blue : %3d (%3d)\n", blue, b);

  uint16_t boxcolor = color16((int)r, (int)g, (int)b);
  M5.Lcd.fillRect(60, 150, 200, 60, boxcolor); //x,y,w,h
}

6 まとめ

センサを手にもって,周囲に向けたところ,色を検出している様子が確認できました。