バージョン情報
Arduino IDE 1.0.6 , processing 3.0a9
今回は、Arduinoで使用できるI2C色センサーを使ってみた。
色センサーで検知したRGB値をシリアル通信で送信し、processing側でRGB値を受信し、PC上の図形の色を変化させてみた。
材料
Arduino pro mini 5V
カラーセンサーモジュール:TCS34725
回路
ソースコード
【Arduino】
#include <Wire.h>
#define addr 0x29
void setup() {
Serial.begin(38400);
Wire.begin();
I2C_SET();
}
//100ms毎にカラーセンサーのRGB値を取得してシリアルで送信
void loop() {
I2C_GET();
delay(100);
}
void I2C_GET(void){
int cnt_data = 32;
byte data[cnt_data];
int cnt_out = 0;
byte out_data[4];
//32Byte分の全レジスタ情報取得
cnt_out = Wire.requestFrom(addr, cnt_data);
if(cnt_out >= cnt_data)
{
for(int i = 0; i<cnt_data; i++){
data[i] = Wire.read();
}
}
//RGB値を抜き取り
out_data[0] = data[21];
out_data[1] = data[23];
out_data[2] = data[25];
out_data[3] = data[27];
Serial.print(out_data[0]); Serial.print(",");
Serial.print(out_data[1]); Serial.print(",");
Serial.print(out_data[2]); Serial.print(",");
Serial.println(out_data[3]);
}
void I2C_SET(void){
Wire.beginTransmission(addr);
Wire.write(0x00); //ENABLE レジスタ指定
Wire.write(0x03); //PON = 1, AEN = 1 にセット
Wire.endTransmission();
}
色センサーのレジスタの情報はこんな感じ。(データシートから抜粋)

【processing】
import processing.serial.*;
Serial myPort;
String str_get_data = null;
String buf[];
void setup()
{
size(500, 500);
myPort = new Serial(this, "COM3", 38400);
delay(3000);
}
void draw()
{
str_get_data = myPort.readStringUntil(10);
println(str_get_data);
if (str_get_data != null){
str_get_data = trim(str_get_data); //改行コード取り除き
buf = split(str_get_data,",");
//色を設定
fill(int(buf[1])*10, int(buf[2])*10, int(buf[3])*10);
rect(100 ,100, 300, 300);
}
delay(50);
}
動作確認
5mmぐらいまで近づけると色を検出できた。
各色の感度調整は必要そう。今回は青を強めにしてみた。
失敗編
実は今回の色センサーはスマホの画面の色を取得するのを目的に試してみたのだが、まったくダメだった。今回のセンサはLEDの反射光を検出してるようで、スマホの液晶の発光は検出できないっぽい。残念。






