Well, this was a productive night:  I’ve been working with the Taos TCS3414, which is a light and RGB color sensor.  It’s a tiny little guy, about 2.5 x 3.5 mm I would guess, and shown above is mounted on breakout boards.  I just had a breakthrough night with it, getting it to correctly return values from the sensors, so I thought I’d share my preliminary code for the benefit of all.

Update: better code here!

Helpful tips:

  • The TCS3414 is I2C, whereas the TCS3404 uses the similar SMBus.  The Atmega 328 can do both, but I2C is easier for reasons of both hardware and libraries, so get the TCS3414.
  • I2C is on analog pins 4 and 5, not digital pins 4 and 5.
  • It’s a 3.3V device, so make sure you power it via the 3V output on the Arduino, not the 5V output.  It draws 9ma max, so the 50ma capacity via Arduino is plenty.
  • Similarly, you’ll need to level shift 5V bidirectionally to 3V from the Arduino to the sensor, so google logic level converters.  I used a pair of NTE491 MOSFETs.

Here’s what my hardware looks like (note, my breakout board pins aren’t the same layout as the sensor):

That all being said, here’s my (working concept only) code!:

// 6 June 2012

#include

int ledPin = 13; // LED connected to digital pin 13

byte receivedVal = 0x00;

unsigned int clearLow = 0;
unsigned int clearHigh = 0;

void setup()
{
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);

// join i2c bus (address optional for master)
Wire.begin();

Serial.begin(9600);
Serial.write("Serial started" "\n");

digitalWrite(ledPin, HIGH); // set the LED on

Wire.beginTransmission(0x39);
Wire.write(0x80);
Wire.write(0x03); // Turn the device on and enable ADC
Wire.endTransmission();

Wire.beginTransmission(0x39); // Request confirmation
Wire.requestFrom(0x39,1);
receivedVal = Wire.read();
Wire.endTransmission();

if (receivedVal == 0x03) {
Serial.write("ADC Started" "\n");
}
else {
Serial.write("Connect to sensor failed with code: ");
Serial.println(receivedVal, DEC);
}

delay(50); // wait for a moment to allow ADC to initialize
digitalWrite(ledPin, LOW); // set the LED off
}

void loop() {
Wire.beginTransmission(0x39);
Wire.write(0xB8);
Wire.endTransmission();

Wire.beginTransmission(0x39); // Request confirmation
Wire.requestFrom(0x39,2);
clearLow = Wire.read();
clearHigh = Wire.read();
Wire.endTransmission();

clearHigh = (clearHigh * 256) + clearLow;

Serial.println(clearHigh, DEC);

delay(500);
}

If you’ve done it right, it should start spitting out meaningless numbers, that decrease when you hold your hand over the sensor!  More to come on this topic soon!

Leave a Reply

Your email address will not be published. Required fields are marked *