Leia também!
Home / Ferramentas / Arduíno / Sensor de cor com lente TCS3200D para Arduíno

Sensor de cor com lente TCS3200D para Arduíno

Este pequeno sensor TCS3200D com lente é capaz de perceber cores e enviá-las ao Arduíno. Apesar de não muito confiável, me pareceu muito legal. Tem também uma versão sem lentes.

570feb7116d85_IMG_20160414_160510

Possui 4 leds montados na placa.

570feb730cecc_IMG_20160414_160516

Os conectores são: S0, S1, S2, S3, GND, VCC, OUT e LED.

570feb751d7d3_IMG_20160414_160524

Há uma tampa para proteger a lente.

570feb771e264_IMG_20160414_160536

Veja como ficou a ligação com o Arduíno.

570feb653fa95_IMG_20160414_160107

Eu usei a tensão de 3.3V do Arduíno para conectar aos leds. Ficou muito bom o brilho.

570feb66707a2_IMG_20160414_160139

Nesta foto estou tentando ler o azul do meu grampeador.

570feb67a23fd_IMG_20160414_160153

Os resultados para azul não são muito bons, mas dá para perceber que o nível de azul é um pouco maior.

570feb6879495_IMG_20160414_160203

Falando nisso, vou deixar o programa aqui para quem quiser usar:

int s2Pin = 7;
int s3Pin = 8;
int outPin = 4;

void setup() {
  pinMode(s2Pin, OUTPUT);
  pinMode(s3Pin, OUTPUT);
  pinMode(outPin, INPUT);
  Serial.begin(9600);
}

int readOutputPulse(int pin) {
  int count = 0;
  while ((digitalRead(pin) == 1) & (count < 32640)) {
    count++;
  }
  if (count == 32640) return count+2;
  count = 0;  while ((digitalRead(pin) == 0) & (count < 32640)) {
    count++;
  }
  return count;
}

int readRed() {
  int pulseWidth = 0;
  int colorStrength = 0;
  digitalWrite(s2Pin, LOW); 
  digitalWrite(s3Pin, LOW);
  delay(100);
  pulseWidth = readOutputPulse(outPin);
  colorStrength = (pulseWidth/128);
  colorStrength = (255 - colorStrength);
  return colorStrength;
}

int readGreen() {
  int pulseWidth = 0;
  int colorStrength = 0;
  digitalWrite(s2Pin, HIGH); 
  digitalWrite(s3Pin, HIGH);
  delay(100);
  pulseWidth = readOutputPulse(outPin);
  colorStrength = (pulseWidth/128);
  colorStrength = (255 - colorStrength);
  return colorStrength;
}

int readBlue() {
  int pulseWidth = 0;
  int colorStrength = 0;
  digitalWrite(s2Pin, LOW); 
  digitalWrite(s3Pin, HIGH);
  delay(100);
  pulseWidth = readOutputPulse(outPin);
  colorStrength = (pulseWidth/128);
  colorStrength = (256 - colorStrength);
  return colorStrength;
}

void loop() {
  Serial.print("R:");
  Serial.println(readRed());
  Serial.print("G:");
  Serial.println(readGreen());
  Serial.print("B:");
  Serial.println(readBlue());
  Serial.println("");
  delay(500);
}

Agora estou lendo uma tela branca no computador.

570feb6f21b80_IMG_20160414_160356

Uma tela vermelha. Veja que o sensor é muito mais sensível a esta cor do que qualquer outra.

570feb6a1b811_IMG_20160414_160226

Uma tela verde:

570feb6d3fb12_IMG_20160414_160318

E finalmente azul.

570feb6bbce1c_IMG_20160414_160245

Embora muito mais sensível a vermelho do que azul ou verde, o sensor funciona. Talvez alguma calibração seja necessária para funcionar melhor. Deixo abaixo link para as versões com lente (Ebay) e sem lentes (DX):

Com lentes – http://www.ebay.com/sch/i.html?_nkw=tcs3200d+lens&_sacat=0

Sem lentes – http://www.dx.com/p/gy-31-tcs230-tcs3200-color-sensor-recognition-module-blue-black-216448

Sobre Adriano

Professor, Engenheiro e comprador de produtos malucos da China.

Um comentário

  1. Hello Adriano,

    Thanks for you helpful article.
    About the code. It seems to be missing some characters?

    While ((digitalRead(PIN) == 1) & (count < 32640)) {
    count ;

    Should this be "count++;"?

    And what about this piece: If (count == 32640) return count 2;
    What's between "count" and "2"?

Deixe um Comentário

Seu endereço de e-mail não será publicado. Campos Obrigatórios *

*