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

Título: Arduino + TCS3200
Enviado 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:
Citar
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:
Código: [Seleccione]
#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.
Título: Re: Arduino + TCS3200
Enviado por: metRo_ em 29 de Março de 2010, 02:54
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:
Código: [Seleccione]
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;
}
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 29 de Março de 2010, 20:01
E essa parte vai exactamente onde?  :o
estive a mexer lá pelo outro código, e não deixa...
Título: Re: Arduino + TCS3200
Enviado por: metRo_ em 29 de Março de 2010, 20:53
Algo deste género:

Código: [Seleccione]
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()                     
{
}
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 29 de Março de 2010, 22:28
Com esse aí ^^ dava sempre 0, pela porta com  :'(

depois fiz este:
Código: [Seleccione]
  //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:
Citar
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'' ?


Título: Re: Arduino + TCS3200
Enviado por: senso em 29 de Março de 2010, 23:07
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.

Código: [Seleccione]

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);
   }
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 29 de Março de 2010, 23:48
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...
Título: Re: Arduino + TCS3200
Enviado por: senso em 30 de Março de 2010, 00:26
É 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.
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 30 de Março de 2010, 00:35
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?
Título: Re: Arduino + TCS3200
Enviado por: senso em 30 de Março de 2010, 00:39
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
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 30 de Março de 2010, 01:05
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...
Título: Re: Arduino + TCS3200
Enviado por: senso em 30 de Março de 2010, 01:28
Os pinos 10 e 11 podem ser usados para comunicação isp se calhar é isso, estás a usar alguma biblioteca com esse sensor?
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 30 de Março de 2010, 12:32
estás a usar alguma biblioteca com esse sensor?

Sim, está anexada ao primeiro post.
Título: Re: Arduino + TCS3200
Enviado por: senso em 30 de Março de 2010, 14:46
Tiveste em atenção isto?:
Citar
/* 

   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!

   

   

*/
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 30 de Março de 2010, 14:48
Em principio sim, mas, a que parte?  ???
não vejo nada que poderia interferir com os pinos 10, e 11.
Título: Re: Arduino + TCS3200
Enviado por: senso em 30 de Março de 2010, 14:54
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
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 30 de Março de 2010, 16:17
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''
Título: Re: Arduino + TCS3200
Enviado por: senso em 30 de Março de 2010, 16:45
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
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 30 de Março de 2010, 16:50
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...
Título: Re: Arduino + TCS3200
Enviado por: amando96 em 19 de Abril de 2010, 17:47
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...  ::)