LusoRobótica - Robótica em Português
Software => Software e Programação => Tópico iniciado por: amando96 em 29 de Março de 2010, 02:25
-
Boas, meti um TCS2300 a falar com o arduino, consigo ver diferencas em cores, mas só vejo neste formato pela porta COM:
serial communication initialized
red: 2247
blue: 1997
green: 2367
clear: 789
*apontado para o vazio, mas não é bem vazio pois um candeiro aceso ou apagado afecta imenso os resultados*
quanto menos cor houver, maior é o numero apresentado, e o que eu queria fazer, mas está difícil, era calcular o numero menor, vendo assim a cor mais abundante, e fazer uma acção qualquer relacionada com essa cor, acender um LED RGB, mostrar num LCD... etc
O código é este:
#include <TCS230.h>
/*
This sketch uses the TCS230 light sensor and outputs its data to the
computer. It assumes the use of John Sarik's TCS230-to-Arduino
mounting board. Sending it X characters over the serial port will
cause it to return X readings back through the serial port.
*/
TCS230 sensor;
int switchPin = 11;
char buffer;
void setup()
{
Serial.begin(9600);
sensor.initialize();
Serial.println("serial communication initialized");
pinMode(switchPin, INPUT);
}
void loop()
{
if (Serial.available()) //if the switch is high
{
buffer = Serial.read();
Serial.print("red: ");
Serial.println(sensor.readRed());
Serial.print("blue: ");
Serial.println(sensor.readBlue());
Serial.print("green: ");
Serial.println(sensor.readGreen());
Serial.print("clear: ");
Serial.println(sensor.readClear());
Serial.print("\n\n");
//while (digitalRead(switchPin)); //wait until switch is released
}
}
Já tentei usar o min(); mas não me deixa por lá (readRed, readBlue)...
em anexo vai a lib...
Obrigado,
cumps.
-
1-Não percebi a utilidade daquele buffer :s
2-Tens aqui uma função que fiz assim um pouco à pressa mas retorna-te o menor dos 3, é claro que isso bem feito era colocar os valores num vector e depois ir percorrendo o vector pelo menor mas neste caso isto serve:
uint8_t minRGB(int r, int g, int b){
//1=R;2=G;3=B
uint8_t menor=0;
if(r<g && r<b){
menor=1;
}
if(g<r && g<b){
menor=2;
}
if(b<r && b<g){
menor=3;
}
return menor;
}
-
E essa parte vai exactamente onde? :o
estive a mexer lá pelo outro código, e não deixa...
-
Algo deste género:
uint8_t minRGB(int r, int g, int b){
//1=R;2=G;3=B
uint8_t menor=0;
if(r<g && r<b){
menor=1;
}
if(g<r && g<b){
menor=2;
}
if(b<r && b<g){
menor=3;
}
return menor;
}
void setup()
{
}
void loop()
{
}
-
Com esse aí ^^ dava sempre 0, pela porta com :'(
depois fiz este:
//Red
if(sensor.readRed() < sensor.readBlue() && sensor.readRed() < sensor.readGreen()){
digitalWrite(Rled, HIGH);
} else{
digitalWrite(Rled, LOW);
}
//Green
if(sensor.readGreen() < sensor.readRed() && sensor.readGreen() < sensor.readBlue()){
digitalWrite(Gled, HIGH);
} else{
digitalWrite(Gled, LOW);
}
// Blue
if(sensor.readBlue() < sensor.readRed() && sensor.readBlue() < sensor.readRed()){
digitalWrite(Bled, HIGH);
} else{
digitalWrite(Bled, LOW);
}
ele funciona, mas só com a parte do vermelho... ???
numa sala o mais escuro possível, todos os leds estão apagados, aponto um red led para o sensor, e acende o red led ligado ao arduino, se apontar um led azul, acende o led azul do arduino, mas muito ''dim'', e o verde ligado ao arduino pisca... ele está a dizer pela porta com:
rgbGreen:
red: 651
blue: 417
green: 162
clear: 106
rgbBlue:
red: 4182
blue: 186
green: 521
clear: 138
rgbRed:
red: 884
blue: 4651
green: 9541
clear: 821
rgb, seguido da cor é a cor do led que aponto para o sensor.
será que o ''clear'' está a baralhar, mesmo sem estar nas ''if statements'' ?
-
Deves fazer primeiro a leitura do sensor e alocar cada leitura de cada cor a uma variavel, assim estás a fazer a leitura do valor do sensor durante o if, e isso não é nada bom pois os valores vão variar durante a execução do if.
int ValRed=sensor.readRed();
int ValBlue=sensor.readBlue();
int ValGreen=sensor.readGreen();
//Red
if(ValRed < ValBlue && ValRed < ValGreen){
digitalWrite(Rled, HIGH);
} else{
digitalWrite(Rled, LOW);
}
//Green
if(ValGreen < ValRed && ValGreen < ValBlue){
digitalWrite(Gled, HIGH);
} else{
digitalWrite(Gled, LOW);
}
// Blue
if(ValBlue < ValRed && ValBlue < ValGreen){ //erro aqui, estavas a comparar as duas vezes com o valor de vermelho
digitalWrite(Bled, HIGH);
} else{
digitalWrite(Bled, LOW);
}
-
Muito melhores resultados :D
obrigado :)
o led verde e azul continuam muito dim...
se não descobrir porque meto um transistor a amplificar o sinal...
-
É mais facil condicionar os valores lidos em software do que adicionar hardware, isso deve-se dever ao facto de que os sensores de diferentes cores não têm todos a mesma sensibilidade, no teu caso, o vermelho deve ser o mais sensivel, coisa que até é normal..
Agora, porque razão é que um led ligado a um pino que fica com 5v fica "dim" como dizes é que é estranho, mete um delay de 1 segundo em cada if e vê se já fica com mais intensidade se não deves ter uma resistência muito grande nesses leds, ou o mais certo, estás a fazer pwm sem saberes pois o valor que o sensor de cor lê está sempre a oscilar o que faz com que o if mude muitas vezes de true para false.
-
A resistencia é de 220ohm, mesmo com um delay de 200ms continua na mesma :o
se eu ligar o led verde, em lugar do vermelho, acende bem brilhante...
se for isso do sensor variar muito, como corrigo?
-
Adiciona por exemplo 200 ou 300 ou 1000 ao valor ValGreen e ValBlue, muito provavelmente tens de criar duas novas variaveis, chamadas calGreen e calBlue que te vão servir para calibrares o sensor, basicamente somas calGreen e ValGreen até teres resultados sólidos quando só iluminas o sensor com luz verde e fazes o mesmo para o azul até teres resultados estaveis, precisos e que se mantenham ao longo do tempo, isto é calibrar o sensor á unha, lê a datasheet do sensor para ver se fala alguma coisa sobre a calibração do sensor, se não vai por tentativa e erro, tenta somar 200 ao verde e ao azul, já deve ficar melhor
-
tentei tudo, não deu mesmo, o que fiz foi tirar a função sensor initialize, e liguei os pinos ao gnd, e 5v, e usei os pinos que estavam a ser usados para inicializar o sensor, talvez os pinos 11, e 10 estejam fritos :o
agora brilham perfeitamente bem nos pinos 7, e 8... 8)
obrigado a todos ;D
EDIT: os pinos não estão fritos, o código interfere, logo vejo se descubro o que é que está a causar isto...
-
Os pinos 10 e 11 podem ser usados para comunicação isp se calhar é isso, estás a usar alguma biblioteca com esse sensor?
-
estás a usar alguma biblioteca com esse sensor?
Sim, está anexada ao primeiro post.
-
Tiveste em atenção isto?:
/*
This is a library to interface with the Taos TCS230 Light to frequency
sensor. Please extract it into the Arduino library folder which is
usually:
C:\Program Files\arduino-0016\hardware\libraries
The pins of the TCS230 can either be hooked up to the Arduino
or by using John Sarik's custom TCS230 to Arduino Mounting board. The
default constructor assumes this board is being used.
To use this library:
1. Wire up the TCS230 to your Arduino
2. Type #include <TCS230.h> at the top of your code
3. Initialize a TCS230 object in your Arduino code outside the
program functions. For example
TCS230 sensor; //creates object called sensor
4. If the TCS230 is wired in the following manner, then no
parameters need to be passed:
gnd = Arduino Pin 8
oe = Arduino Pin 7
s1 = Arduino Pin 6
s0 = Arduino Pin 5
s2 = Arduino Pin 3
s3 = Arduino Pin 4
out = Arduino Pin 2
vdd = Arduino Pin 9
Otherwise, pass the pin numbers of the Arduino that the pins of
the TCS230 are attached to in the order above.
5. Within the setup function, call the initialize function for the
object. For example:
sensor.initialize(); //initialize sensor object
6. In order to read from the TCS230, call the read functions.
For example:
Sensor.readRed(); //read red photodiodes on TCS230
Sensor.readBlue(); //read blue photodiodes on TCS230
Sensor.readGreen(); //read green photodiodes on TCS230
Sensor.readClear(); //read clear photodiodes on TCS230
These functions return half the value of the period of the
square wave outputted by the TCS230 in microseconds.
Therefore, the higher the light intensity, the smaller the
number and vice versa.
Enjoy using my library!
*/
-
Em principio sim, mas, a que parte? ???
não vejo nada que poderia interferir com os pinos 10, e 11.
-
Por exemplo a ordem dos pinos, não te vejo a passar os parametros dos pinos, e se estás a usar o sensor na placa feita pelo John Sarik's
-
Não sei se estou a perceber...
gnd = Arduino Pin 8
oe = Arduino Pin 7, eu liguei ao GND, pois no datasheet diz active LOW, se estiver low, activa o output...
s1 = Arduino Pin 6, liguei ao GND
s0 = Arduino Pin 5 , liguei aos 5v
s2 = Arduino Pin 3, está igual.
s3 = Arduino Pin 4, está igual.
out = Arduino Pin 2, está igual.
vdd = Arduino Pin 9, liguei aos 5v
Os pinos que liguei ao GND, e 5v, seriam ligados ao mesmo que eu liguei, mas com a funçao initialize, eu tireia para fora e liguei ''manualmente''
-
Sim, tambem acho estranho alimentar isso usando pinos de IO, mas isso deve ter um funcionamento meio marado, liga mesmo como está ai dito e experimenta
-
Já fiz das duas maneiras, só funciona ligado como tenho agora, pois este código faz os pinos 10, e 11 variar :o assim uso uns dos pinos que serviam para a alimentação...
-
os LEDs estavam dim porque não declarei os pinos onde as liguei como outputs :-X
só me demorou um mês para me aperceber... ::)