Hi, I've been playing around with a TAOS TCS230 light to frequency converter. My aim is to scan various light sources and determine their RGB value.
I've been through the tutorial on Arduino and the Taos TSL230R Light Sensor: Getting Started | The Roaming Drone which gives you a funky little lux meter. But i need to break down each color sensor and give me the RGB equivelents.
I came across some code on a Japanese site for 0012 which might do exactly what i need but can't get it to compile in 0017. Until i can get it to compile i won't know if it serves my purpose. So any help would be greatly appreciated even if its scrap this code and go back to trying to rework Roaming Drones code
CCP
#include "WConstants.h"
#include "ColorSensor.h"
#define COLOR_SENSOR_MAX_FREQ (600000)
#define COLOR_SENSOR_MIN_FREQ (5)
#define COLOR_SENSOR_MEASURE_TIMEOUT (100000)
#define COLOR_SENSOR_ADJUST_SAMPLES (8)
ColorSensor::ColorSensor(uint8_t pinOUT,uint8_t pinS2,uint8_t pinS3)
{
_pinOUT = pinOUT;
_pinS2 = pinS2;
_pinS3 = pinS3;
_colorReference = ColorSensor::COLOR_REF_RAW;
_rFreq = 0;
_gFreq = 0;
_bFreq = 0;
_rfreqRange.max = COLOR_SENSOR_MAX_FREQ;
_rfreqRange.min = COLOR_SENSOR_MIN_FREQ;
_gfreqRange.max = COLOR_SENSOR_MAX_FREQ;
_gfreqRange.min = COLOR_SENSOR_MIN_FREQ;
_bfreqRange.max = COLOR_SENSOR_MAX_FREQ;
_bfreqRange.min = COLOR_SENSOR_MIN_FREQ;
pinMode(_pinOUT,INPUT);
pinMode(_pinS2, OUTPUT);
pinMode(_pinS3, OUTPUT);
digitalWrite(_pinS2, LOW);
digitalWrite(_pinS3, LOW);
}
ColorSensor::~ColorSensor()
{
}
uint32_t ColorSensor::measureSquareWaveWidth(uint8_t pin)
{
// uint8_t bit = digitalPinToBitMask(pin);
// volatile uint8_t *reg = portInputRegister(digitalPinToPort(pin));
// uint32_t width = 0;
// uint32_t numloops = 0;
// uint32_t maxloops = microsecondsToClockCycles(COLOR_SENSOR_MEASURE_TIMEOUT) / 16;
// stateMask = (*reg & bit);
// while ((*reg & bit) == stateMask)
// if (numloops++ == maxloops)
// return 0;
// while ((*reg & bit) != stateMask)
// width++;
// return clockCyclesToMicroseconds(width * 10 + 16);
uint32_t duration = pulseIn(pin, !digitalRead(pin), COLOR_SENSOR_MEASURE_TIMEOUT);
return (duration ? duration : COLOR_SENSOR_MEASURE_TIMEOUT);
}
void ColorSensor::colorReference(uint8_t cref)
{
_colorReference = cref;
}
void ColorSensor::adjustWhite(void)
{
int i;
uint32_t r_average = 0;
uint32_t g_average = 0;
uint32_t b_average = 0;
for(i=0;i<COLOR_SENSOR_ADJUST_SAMPLES;i++){
measureColor();
r_average += _rFreq;
g_average += _gFreq;
b_average += _bFreq;
}
r_average /= COLOR_SENSOR_ADJUST_SAMPLES;
_rfreqRange.max = (r_average > _rfreqRange.min) ? r_average : _rfreqRange.max;
g_average /= COLOR_SENSOR_ADJUST_SAMPLES;
_gfreqRange.max = (g_average > _gfreqRange.min) ? g_average : _gfreqRange.max;
b_average /= COLOR_SENSOR_ADJUST_SAMPLES;
_bfreqRange.max = (b_average > _bfreqRange.min) ? b_average : _bfreqRange.max;
}
void ColorSensor::adjustBlack(void)
{
int i;
uint32_t r_average = 0;
uint32_t g_average = 0;
uint32_t b_average = 0;
for(i=0;i<COLOR_SENSOR_ADJUST_SAMPLES;i++){
measureColor();
r_average += _rFreq;
g_average += _gFreq;
b_average += _bFreq;
}
r_average /= COLOR_SENSOR_ADJUST_SAMPLES;
_rfreqRange.min = (r_average < _rfreqRange.max) ? r_average : _rfreqRange.min;
g_average /= COLOR_SENSOR_ADJUST_SAMPLES;
_gfreqRange.min = (g_average < _gfreqRange.max) ? g_average : _gfreqRange.min;
b_average /= COLOR_SENSOR_ADJUST_SAMPLES;
_bfreqRange.min = (b_average < _bfreqRange.max) ? b_average : _bfreqRange.min;
}
void ColorSensor::measureColor(void)
{
// measure red freq
digitalWrite(_pinS2, LOW);
digitalWrite(_pinS3, LOW);
_rFreq = 1000000UL / 2UL / ColorSensor::measureSquareWaveWidth(_pinOUT);
// measure blue freq
digitalWrite(_pinS3, HIGH);
_bFreq = 1000000UL / 2UL / ColorSensor::measureSquareWaveWidth(_pinOUT);
// measure green freq
digitalWrite(_pinS2, HIGH);
_gFreq = 1000000UL / 2UL / ColorSensor::measureSquareWaveWidth(_pinOUT);
}
uint32_t ColorSensor::redValue(void)
{
if(_colorReference != ColorSensor::COLOR_REF_RAW){
return ((constrain(_rFreq,_rfreqRange.min,_rfreqRange.max) - _rfreqRange.min) << 10) / (_rfreqRange.max - _rfreqRange.min);
}
return _rFreq;
}
uint32_t ColorSensor::greenValue(void)
{
if(_colorReference != ColorSensor::COLOR_REF_RAW){
return ((constrain(_gFreq,_gfreqRange.min,_gfreqRange.max) - _gfreqRange.min) << 10) / (_gfreqRange.max - _gfreqRange.min);
}
return _gFreq;
}
uint32_t ColorSensor::blueValue(void)
{
if(_colorReference != ColorSensor::COLOR_REF_RAW){
return ((constrain(_bFreq,_bfreqRange.min,_bfreqRange.max) - _bfreqRange.min) << 10) / (_bfreqRange.max - _bfreqRange.min);
}
return _bFreq;
}
H
#ifndef ColorSensor_h
#define ColorSensor_h
#include <inttypes.h>
class ColorSensor
{
uint8_t _pinOUT;
uint8_t _pinS2;
uint8_t _pinS3;
uint8_t _colorReference;
uint32_t _rFreq;
uint32_t _gFreq;
uint32_t _bFreq;
struct _freq_range {
uint32_t min;
uint32_t max;
};
struct _freq_range _rfreqRange;
struct _freq_range _gfreqRange;
struct _freq_range _bfreqRange;
static uint32_t measureSquareWaveWidth(uint8_t pin);
public:
ColorSensor(uint8_t pinOUT,uint8_t pinS2,uint8_t pinS3);
~ColorSensor();
enum {
COLOR_REF_RAW, // 100Hz - 600,000Hz
COLOR_REF_MANUAL, // 0 - 1023
COLOR_REF_WEAK_LIGHT, // 0 - 1023
COLOR_REF_STRONG_LIGHT, // 0 - 1023
COLOR_REF_REFLECTED_LIGHT_NEAR, // 0 - 1023
COLOR_REF_REFLECTED_LIGHT_FAR, // 0 - 1023
};
void colorReference(uint8_t cref);
void adjustWhite(void);
void adjustBlack(void);
void measureColor(void);
uint32_t redValue(void);
uint32_t greenValue(void);
uint32_t blueValue(void);
};
#endif
Error Code
c:/documents and settings/graeme/my documents/arduino-0017/hardware/tools/avr/lib/gcc/../../avr/include/stdlib.h:111: error: expected unqualified-id before 'int'
c:/documents and settings/graeme/my documents/arduino-0017/hardware/tools/avr/lib/gcc/../../avr/include/stdlib.h:111: error: expected `)' before 'int'
c:/documents and settings/graeme/my documents/arduino-0017/hardware/tools/avr/lib/gcc/../../avr/include/stdlib.h:111: error: expected `)' before 'int'