collapse

* Links de Robótica

* Posts Recentes

EtherCAT / LAN9252 por beirao
[Hoje às 20:31]


Apresentação por senso
[Hoje às 17:34]


Díodo schottky por Njay
[Hoje às 01:46]


Fonte de Alimentação Simétrica com carregadores por Njay
[Ontem às 21:06]


pasta de soldar por fergas
[20 de Agosto de 2017, 11:47]


duvidas sobre utilização de um osciloscopio(zito) num circuito básico por vasco
[19 de Agosto de 2017, 01:09]


A Paixão da Física Walter Lewin , Warren Goldstein por Njay
[18 de Agosto de 2017, 11:45]


Gerar CPL file a partir dos Gerbers? por Hugu
[18 de Agosto de 2017, 00:22]


Ajuda num relógio para termoacumulador por dennis_boy
[17 de Agosto de 2017, 00:07]


Aspiração para CNC por LVirtual
[14 de Agosto de 2017, 17:34]

Autor Tópico: Arduino + TCS3200  (Lida 6686 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Arduino + TCS3200
« 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.
« Última modificação: 29 de Março de 2010, 11:29 por amando96 »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: Arduino + TCS3200
« Responder #1 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;
}

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #2 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...

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.726
Re: Arduino + TCS3200
« Responder #3 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()                     
{
}

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #4 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'' ?



Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.361
  • Helpdesk do sitio
Re: Arduino + TCS3200
« Responder #5 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);
   }
Avr fanboy

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #6 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...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.361
  • Helpdesk do sitio
Re: Arduino + TCS3200
« Responder #7 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.
Avr fanboy

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #8 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?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.361
  • Helpdesk do sitio
Re: Arduino + TCS3200
« Responder #9 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
Avr fanboy

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #10 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...
« Última modificação: 30 de Março de 2010, 09:08 por amando96 »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.361
  • Helpdesk do sitio
Re: Arduino + TCS3200
« Responder #11 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?
Avr fanboy

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #12 em: 30 de Março de 2010, 12:32 »
estás a usar alguma biblioteca com esse sensor?

Sim, está anexada ao primeiro post.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.361
  • Helpdesk do sitio
Re: Arduino + TCS3200
« Responder #13 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!

   

   

*/
Avr fanboy

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Arduino + TCS3200
« Responder #14 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.