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 使用環境
- Windows 10 64-bit
- Arduino IDE 1.8.13
- M5Stack Gray ESP32-D0WDQ6-V3 (revision 3)
MPU6886 + BMM150 16MB 40MHz
- M5Stack_COLOR_UNIT
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, &green, &amp;blue, &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 まとめ
センサを手にもって,周囲に向けたところ,色を検出している様子が確認できました。