Arduino İle TCS3200 Renk Sensörü Kullanımı

TCS3200 renk sensörü, dalga boylarına göre çok çeşitli renkleri algılayabilir. Bu sensör özellikle renk eşleştirme, renk sınıflandırma, test şeridi okuma ve çok daha fazlası gibi renk tanıma projeleri için kullanışlıdır.

TCS3200 Renk Sensörü Özellikleri

Aşağıdaki şekilde gösterilen TCS3200 renk sensörü, rengi algılamak için bir TAOS TCS3200 RGB sensör çipi kullanır. Ayrıca önündeki nesneyi aydınlatan dört beyaz LED içerir.

TCS3200 Renk Sensörü
TCS3200 Renk Sensörü

Özellikleri:

  • Giriş Voltajı: 2.7V – 5.5V
  • Boyutu: 28.4 x 28.4mm 
  • Arayüz: Dijital TTL
  • Programlanabilir renk ve tam ölçekli çıkış frekansı
  • Doğrudan mikrodenetleyici ile iletişim kurar
  • Işık yoğunluğunun frekansa yüksek çözünürlüklü dönüşümü

TCS3200 Sensörü Nasıl Çalışır?

TCS3200, 4 farklı filtreye sahip bir dizi fotodiyot içerir. Fotodiyot, ışığı akıma dönüştüren basit bir yarı iletken cihazdır. Sensörde şunlar bulunur:

  • Kırmızı filtreli 16 fotodiyot – kırmızı dalga boyuna duyarlı
  • Yeşil filtreli 16 fotodiyot – yeşil dalga boyuna duyarlı
  • Mavi filtreli 16 fotodiyot – mavi dalga boyuna duyarlı
  • Filtresiz 16 fotodiyot

TCS3200 çipine daha yakından bakarsanız, farklı filtreleri görebilirsiniz.

TCS3200 Çipi

Fotodiyot, filtresinin okumalarını seçerek, farklı renklerin yoğunluğunu tespit eder. Sensör, fotodiyotların okumalarını seçilen rengin ışık yoğunluğuyla orantılı bir frekansla kare dalgaya dönüştüren bir akım-frekans dönüştürücüye sahiptir. Bu frekans daha sonra Arduino tarafından okunur – bu aşağıdaki şekilde gösterilmiştir.

Işığın Yoğunluğunun Okunup Arduinoya Gönderilmesi

TCS3200 Pin Şeması

TCS3200 Pin Şematiği
PinI/OAçıklaması
GND (4)Toprak
OE (3)IÇıkış frekansı için etkinleştir (aktif düşük(LOW))
OUT (6)OÇıkış frekansı
S0, S1(1,2)IÇıkış frekansı ölçekleme seçimi girişleri
S2, S3(7,8)IFotodiyot tipi seçim girişleri
VDD(5)Vcc
Pin Açıklamaları

Filtre Seçimi

Fotodiyot tarafından okunan rengi seçmek için S2 ve S3 kontrol pinlerini kullanırsınız. Fotodiyotlar paralel bağlı olduğundan, S2 ve S3 DÜŞÜK ve YÜKSEK’in farklı kombinasyonlarda ayarlanması, farklı fotodidotlar seçmenize olanak tanır. Aşağıdaki tabloya bir göz atın:

Fotodiyot TipiS2S3
KırmızıLOWLOW
MaviLOWHIGH
YeşilHIGHHIGH
FiltresizHIGHLOW
Filtre Seçim Ayarları

Frekans Ölçekleme

S0 ve S1 pinleri çıkış frekansını ölçeklendirmek için kullanılır. Aşağıdaki ön ayar değerlerine ölçeklenebilir: %100, %20 veya %2. Çıkış frekansını ölçeklendirmek, çeşitli frekans sayaçları veya mikro denetleyiciler için sensör okumalarını optimize etmek için kullanışlıdır. Aşağıdaki tabloya bir göz atın:

Çıkış Frekansı ÖlçeklendirmeS0S1
Gücü kapatLOWLOW
2%LOWHIGH
20%HIGHLOW
100%HIGHHIGH
Frekans Ölçeklendirme

Arduino için, %20’lik bir frekans ölçeklemesi kullanmak yaygındır. Böylece, S0 pinini HIGH ve S1 pinini LOW olarak ayarlarsınız.

TCS3200 Kullanımı

Gerekli Malzemeler:

Arduino TCS3200 Bağlantı Şeması

Arduino İle TCS3200 Renk Sensörü Bağlantı Şeması
Arduino İle TCS3200 Renk Sensörü Bağlantı Şeması

Arduino ile TCS3200 bağlantı pinleri:

  • S0: dijital pin 4
  • S1: dijital pin 5
  • VCC: 5V
  • S3: dijital pin 6
  • S4: dijital pin 7
  • OUT: dijital pin 8

Kodlama

Bu proje için iki taslağa ihtiyacınız var:

  1. Seri monitörde çıkış frekansını okuma ve görüntüleme: Bu kısımda sensörün önüne farklı renkler koyduğunuzda frekans değerlerini yazmasını sağlama.
  2. Farklı renkler arasında ayrım yapma: Bu bölümde, sensörünüzün farklı renkleri ayırt edebilmesi için kodunuzda önceden seçilmiş frekans değerlerini gireceksiniz. Kırmızı, yeşil ve mavi renkleri tespit edeceğiz.

1.Çıkış Frekansını(R,G,B) Okuma

// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;

void setup() {
  // Setting the outputs
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  
  // Setting the sensorOut as an input
  pinMode(sensorOut, INPUT);
  
  // Setting frequency scaling to 20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  
   // Begins serial communication 
  Serial.begin(9600);
}
void loop() {
  // Setting RED (R) filtered photodiodes to be read
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  
  // Reading the output frequency
  redFrequency = pulseIn(sensorOut, LOW);
  
   // Printing the RED (R) value
  Serial.print("R = ");
  Serial.print(redFrequency);
  delay(100);
  
  // Setting GREEN (G) filtered photodiodes to be read
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  
  // Reading the output frequency
  greenFrequency = pulseIn(sensorOut, LOW);
  
  // Printing the GREEN (G) value  
  Serial.print(" G = ");
  Serial.print(greenFrequency);
  delay(100);
 
  // Setting BLUE (B) filtered photodiodes to be read
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  

Seri monitörü 9600 baud hızında açın.

Sensörün önüne farklı mesafelerde mavi bir nesne yerleştirin ve R,G,B değerlerini okuyun.

Uzaklık ile RGB değerleri değişir

Seri monitörde görüntülenen değerleri kontrol edin. Mavi frekans (B), kırmızı (R) ve yeşil (G) frekans okumalarına kıyasla en düşük olmalıdır – aşağıdaki şekle bakın.

RGB Değerleri

Mavi cismi sensörün önüne koyduğumuzda mavi frekans (B) değerleri 59 ile 223 arasında salınım yapar (vurgulanan değerlere bakın).

Not: Kodunuzda bu frekans değerlerini (59 ve 223) kullanamazsınız, kendi renk sensörünüzle belirli nesneniz için renkleri ölçmelisiniz. Ardından, mavi renk için üst ve alt frekans sınırlarınızı kaydedin, çünkü bunlara daha sonra ihtiyacınız olacak.

Bu işlemi yeşil ve kırmızı nesnelerle tekrarlayın ve her renk için üst ve alt frekans sınırlarını yazın.

Kırmızı ve Yeşil Rengin Okunması

2. Farklı Renkler Arasında Ayrım Yapma

Bu sonraki çizim, frekans değerlerini RGB değerleriyle eşler (0 ile 255 arasında).

Bir önceki adımda, maksimum maviye sahip olduğumuzda 59’luk bir frekans elde etmiştik ve daha yüksek bir mesafede maviye sahip olduğumuzda 223’lük bir frekans elde etmiştik.

Bu nedenle, frekanstaki 59, 255’e (RGB’de) ve frekansta 223, 0’a (RGB’de) karşılık gelir. Bunu Arduino map() fonksiyonu ile yapacağız. map() işlevinde XX parametrelerini kendi değerlerinizle değiştirmeniz gerekir.

// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;

// Stores the red. green and blue colors
int redColor = 0;
int greenColor = 0;
int blueColor = 0;

void setup() {
  // Setting the outputs
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  
  // Setting the sensorOut as an input
  pinMode(sensorOut, INPUT);
  
  // Setting frequency scaling to 20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  
  // Begins serial communication
  Serial.begin(9600);
}

void loop() {
  // Setting RED (R) filtered photodiodes to be read
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  
  // Reading the output frequency
  redFrequency = pulseIn(sensorOut, LOW);
  // Remaping the value of the RED (R) frequency from 0 to 255
  // You must replace with your own values. Here's an example: 
  // redColor = map(redFrequency, 70, 120, 255,0);
  redColor = map(redFrequency, XX, XX, 255,0);
  
  // Printing the RED (R) value
  Serial.print("R = ");
  Serial.print(redColor);
  delay(100);
  
  // Setting GREEN (G) filtered photodiodes to be read
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  
  // Reading the output frequency
  greenFrequency = pulseIn(sensorOut, LOW);
  // Remaping the value of the GREEN (G) frequency from 0 to 255
  // You must replace with your own values. Here's an example: 
  // greenColor = map(greenFrequency, 100, 199, 255, 0);
  greenColor = map(greenFrequency, XX, XX, 255, 0);
  
  // Printing the GREEN (G) value  
  Serial.print(" G = ");
  Serial.print(greenColor);
  delay(100);
 
  // Setting BLUE (B) filtered photodiodes to be read
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  
  // Reading the output frequency
  blueFrequency = pulseIn(sensorOut, LOW);
  // Remaping the value of the BLUE (B) frequency from 0 to 255
  // You must replace with your own values. Here's an example: 
  // blueColor = map(blueFrequency, 38, 84, 255, 0);
  blueColor = map(blueFrequency, XX, XX, 255, 0);
  
  // Printing the BLUE (B) value 
  Serial.print(" B = ");
  Serial.print(blueColor);
  delay(100);

  // Checks the current detected color and prints
  // a message in the serial monitor
  if(redColor > greenColor && redColor > blueColor){
      Serial.println(" - RED detected!");
  }
  if(greenColor > redColor && greenColor > blueColor){
    Serial.println(" - GREEN detected!");
  }
  if(blueColor > redColor && blueColor > greenColor){
    Serial.println(" - BLUE detected!");
  }
}

Şimdi sensörün önüne bir şey koyun. Seri monitörünüzde algılanan rengi yazdırmalıdır: kırmızı, yeşil veya mavi.

Farklı renkleri ayırt etmek için üç koşulumuz var:

  • R maksimum değer olduğunda (RGB parametrelerinde) kırmızı bir nesnemiz olduğunu anlarız.
  • G maksimum değer olduğunda, yeşil bir nesnemiz olduğunu anlarız.
  • B maksimum değer olduğunda, mavi bir nesnemiz olduğunu anlarız.