Sensor de color TCS230 problemas

#1
compre este sensor específicamente para detectar color rojo y azul en un pequeño proceso en el que utilizo arduino, el vendedor me paso un código que aquí posteare, pero la verdad no he logrado hacer que funcione de manera correcta con ese código ni con otros varios que he utilizado :unsure: , si alguien pudiera echarme la mano le agradecería mucho.

CÓDIGO PARA ARDUINO:
#include <TimerOne.h>

#define OUT 2
#define S2 4
#define S3 3
#define S0 6
#define S1 5
#define OE 7

#define Filters_R 0
#define Filters_G 1
#define Filters_B 2

int Count[3] = {0};
int G_flag = 1;


void setup()
{
TCS230_init();
Select_Filters(3); //default, no fiter
Timer1.initialize(); // default 1S
Timer1.attachInterrupt(callback);
Serial.begin(19200);
}

void TCS230_init()
{
pinMode(OUT, INPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(OE, OUTPUT);

digitalWrite(S0, LOW); // 2% of Output Frequence
digitalWrite(S1, HIGH);
digitalWrite(OE, LOW);
}

void Select_Filters(int RGB)
{
switch(RGB)
{
case Filters_R: //Red
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
Serial.println("-----select Red color");
break;

case Filters_G: //Green
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
Serial.println("-----select Green color");
break;

case Filters_B: //Blue
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
Serial.println("-----select Blue color");
break;

default: //Clear(no filter)
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
Serial.println("-----no filter");
break;
}
}

void Measure_Count(int RGB ) //For white balance correction
{
int tmp = 0;
while(1)
{
if(digitalRead(OUT) == 1)
{
if(G_flag == 0)
{
Count[RGB] = tmp;
Serial.print("tmp=");
Serial.println(tmp);
break;
}
tmp++;
}
}
}


void callback()
{
G_flag = 0;
}

void loop()
{
Timer1.restart();
for(int i=0; i<3; i++)
{
Select_Filters(i);
Timer1.setPeriod(10000); //set 10ms
Measure_Count(i);
G_flag = 1;
Serial.println(Count);
}
delay(3000);
}
 
#4
entiendes el programa q te han pasado como funciona y para que sirve??

javascript:eek:penreq('http://www.datasheetcatalog.org/datasheets2/10/103569_1.pdf')

ahi tendras informacion de lo que es el sensor en si, el entramado de resistencias que usan en el que tiene tu me gustaria saberlo, de todas formas yo con solo el sensor lo hago, no se si todo lo bien q podria pero lo hago funcionar....

Me gustaria si alguien sabe, como puedo amplificar la supuesta señal puesto q con cable largo se me producen fallos a veces y ceo estar seguro de que es por la longitud pues con cable mas largo aun me fallaba mas, y en el datasheet pone que habria que usar un river o algo para cables de mas de 28cm
 
#5
compre este sensor específicamente para detectar color rojo y azul en un pequeño proceso en el que utilizo arduino, el vendedor me paso un código que aquí posteare, pero la verdad no he logrado hacer que funcione de manera correcta con ese código ni con otros varios que he utilizado :unsure: , si alguien pudiera echarme la mano le agradecería mucho.

CÓDIGO PARA ARDUINO:
#include <TimerOne.h>

#define OUT 2
#define S2 4
#define S3 3
#define S0 6
#define S1 5
#define OE 7

#define Filters_R 0
#define Filters_G 1
#define Filters_B 2

int Count[3] = {0};
int G_flag = 1;


void setup()
{
TCS230_init();
Select_Filters(3); //default, no fiter
Timer1.initialize(); // default 1S
Timer1.attachInterrupt(callback);
Serial.begin(19200);
}

void TCS230_init()
{
pinMode(OUT, INPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(OE, OUTPUT);

digitalWrite(S0, LOW); // 2% of Output Frequence
digitalWrite(S1, HIGH);
digitalWrite(OE, LOW);
}

void Select_Filters(int RGB)
{
switch(RGB)
{
case Filters_R: //Red
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
Serial.println("-----select Red color");
break;

case Filters_G: //Green
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
Serial.println("-----select Green color");
break;

case Filters_B: //Blue
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
Serial.println("-----select Blue color");
break;

default: //Clear(no filter)
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
Serial.println("-----no filter");
break;
}
}

void Measure_Count(int RGB ) //For white balance correction
{
int tmp = 0;
while(1)
{
if(digitalRead(OUT) == 1)
{
if(G_flag == 0)
{
Count[RGB] = tmp;
Serial.print("tmp=");
Serial.println(tmp);
break;
}
tmp++;
}
}
}


void callback()
{
G_flag = 0;
}

void loop()
{
Timer1.restart();
for(int i=0; i<3; i++)
{
Select_Filters(i);
Timer1.setPeriod(10000); //set 10ms
Measure_Count(i);
G_flag = 1;
Serial.println(Count);
}
delay(3000);
}


-Incluye librería timerone.h
-Define que I/O utilizaran las terminales del sensor en arduino
-Define filtros a utilizarse
-Declara enteros que ni idea para que sean (int Count[3] = {0};
int G_flag = 1; )
-Se llama a la función TCS230 en la que se declara como funcionaran las I/O de arduino, se inicia el timer de la lbrería, también la comunicación serial, selección de filtros(no se como demonios lo hacen)
-Ponen a 2% la frecuecia que entregara por lo que dice el datasheet
-Utiliza el switch case para los diferentes casos que son los colores y luego si detecta cierto color imprimirá en serial monitor el color que es
-Se hace un ajuste de blanco pero admito que de ahi en delante no entiendo el código


....soy estudiante NO PROFESIONAL apenas me adentro en este mundo de programación así que por favor no se desesperen :rolleyes:
 
#8
Aprovechando el hilo sobre el sensor de color TCS230, he estado leyendo el datasheet, y creo entender sus funciones, básicamente se trata de leer la frecuencia que proporciona cada filtro ( rojo, verde, azul), por lo que tengo previsto utilizar un contador por interrupción, ahora bien, lo que no logro entender es como convertir la frecuencia leída por cada filtro de color a valores entre 0-255 de cada color?
 
#11
Finalmente he pedido el TCS3414CS que utiliza el bus I2C para la interpretación de colores. Crearé el driver para controlar este chip mediante el compilador CCS version 5.025. Seguramente necesitaré un poco de ayuda.
 
Arriba