Arduino + 色センサー + Processing シリアル通信

バージョン情報
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();
  
}

色センサーのレジスタの情報はこんな感じ。(データシートから抜粋)
register

Enable

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です