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.
Ö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.
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.
TCS3200 Pin Şeması
Pin | I/O | Açı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) | I | Fotodiyot tipi seçim girişleri |
VDD(5) | Vcc |
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 Tipi | S2 | S3 |
Kırmızı | LOW | LOW |
Mavi | LOW | HIGH |
Yeşil | HIGH | HIGH |
Filtresiz | HIGH | LOW |
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çeklendirme | S0 | S1 |
Gücü kapat | LOW | LOW |
2% | LOW | HIGH |
20% | HIGH | LOW |
100% | HIGH | HIGH |
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 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:
- 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.
- 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.
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.
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.
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.