バージョン情報
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の反射光を検出してるようで、スマホの液晶の発光は検出できないっぽい。残念。