Herkese Merhabalar!

Bu proje yazısında sizlerle beraber TCS3200 renk sensörünü yakından tanıyacağız ve LCD display ile beraber kullanarak bir proje gerçekleştireceğiz. Projeye geçmeden önce TCS3200’ün iç yapısına ve çalışma mantığına bir göz atalım.

TCS3200 Nasıl Çalışır?

TCS3200, oluşturduğu verileri fotodiyotlar ve bir akım-frekans dönüştürücüsü yardımıyla sağlıyor diyebiliriz. Sensör, üzerine gelen ışığın şiddetiyle orantılı bir frekansta kare dalga üretiyor, biz de bu kare dalgayı kullanarak verileri alıyor olacağız. Kodumuzda pulseIn() fonksiyonunu kullanarak gelen dalgadaki HIGH veya LOW sürelerini elde edeceğiz.

Peki sensör renkleri nasıl ayırt ediyor? Burada devreye fotodiyotların üzerinde bulunan filtreler giriyor. Sensörün yapısındaki 8×8 diziminde bulunan fotodiyotların 16’sı kırmızı, 16’sı mavi, 16’sı yeşil filtreye sahip, geriye kalan 16 fotodiyotta ise filtre bulunmuyor. Bu fotodiyotları kontrol etmek için sensörün üzerindeki S2 ve S3 pinlerini kullanacağız. Örneğin; kırmızı rengi belirlemek için S2 ve S3’ü lojik-0 konumuna getirerek işlem yapmamız gerekecek. Bu sayede sensörü kullandığımız yerdeki kırmızı rengin yoğunluğu hakkında bilgi sahibi olmuş olacağız. Aynı işlemi aşağıdaki tabloya göre yeşil ve mavi renkleri için de uygulayacağız. Bu sayede RGB(Kırmızı-Yeşil-Mavi) değerleri elde etmiş olacağız.

 

Sensörün üzerindeki S0 ve S1 pinleri de çıkış frekansını ölçeklendirmeye yarıyor. Biz bu ölçeği S0 “HIGH” ve S1” LOW” olacak şekilde %20 düzeyinde tutacağız. OUT pini ile de verileri alacağız. Tüm bu pinleri Arduino’nun dijital giriş-çıkışlarına bağlayarak kullanacağız.

Sensörün üzerinde 4 adet de beyaz led var. Bu ledler daha sağlıklı veri elde etmemiz için konmuş yardımcı elemanlar diyebiliriz. TCS3200 sensörü ile yuvalı ve yuvasız olarak karşılaşabilirsiniz. Bu sensörler arasında kullanımı açısından herhangi bir fark yoktur. Yuvalı olan sensörde çip, dış ortamdan daha az etkilenmesi için bir yuvanın içinde bulunur.


TCS3200 ile Renk Algılayıcısı

TCS3200 ile aldığımız değerleri 2×16 LCD ekran üzerinden göreceğimiz bir proje gerçekleştireceğiz. Aynı zamanda belirlediğimiz değer aralıklarına göre belli renkleri algılayarak LCD ekrandan okuyabileceğiz. Eğer 2×16 LCD display kullanımını bilmiyorsanız şu yazımıza göz atabilirsiniz.

Gerekli Malzemeler 

Devre Şeması

Kalibrasyon

Projede kullandığımız TCS3200 sensöründen alacağımız değerler birçok etkene göre değişiklik gösterebilir. Bu etkenler ortamın ışık yoğunluğu, sensörün yuvalı olup olmaması olabilir. Bu yüzden bizim kullandığımız kodu direkt olarak projenize uygulamak istediğinizde farklı sonuçlar alabilirsiniz. Bu oldukça normal bir durum, o yüzden bu aşamada yalnızca sensör değerlerini serial monitörde görebileceğimiz bir kod kullanacağız. Bu sayede sensörümüzden aldığımız çıktıları görmüş olacağız.

Ben bu kodu kullanarak ilk testimi beyaz kağıt üzerinde yaptım. Sağladığımız değerler düştükçe renk yoğunluğu artıyor demektir. Beyaz kağıttan aldığımız veriler beklediğimiz gibi 3 renk için de düşük çıktı. Aynı testi hızlıca ana renkler öncelikli olmak üzere bazı ara renkler için de uyguladım. Bu testleri farklı renkteki kağıtları kullanarak yaptım. Testlerin sonucunda sensörün renkler üzerinde hangi değerlerde tepkiler verdiğini görmüş olduk.

Bu gözlemleri yapmamızın amacı kodumuzu yazarken renkler için bir eşik değer belirlemekti.  Hangi değerler ne ifade ediyor bunu görmüş olduk. Örneğin kırmızı renk için eşik değerini 100 olarak belirlediğimizi düşünelim. Kodumuzu yazarken bu değeri göz önünde bulundurarak 100’ün altında değer aldığımız nesnelerde kırmızı yoğunluğunun yüksek seviyelerde olduğunu çıkarabiliriz. Yani bu gözlemler, elimizdeki değerler ile ilgili fikir sahibi olmamızı sağlamış olacak. Tüm bu işlemler için aşağıdaki kodu kullanmamız gerekiyor.

//maker.robotistan.com

#define s0 8 //Bağladığımız pinlere göre tanımlamalarımızı yapıyoruz
#define s1 9
#define s2 10
#define s3 11
#define sensorOut 12


int K, Y, M = 0; //3 ana renk için değişken tanımlıyoruz

void setup() {
  pinMode(s0, OUTPUT);//S0, S1, S2 ve S3 pinlerini OUTPUT olarak tanımlıyoruz
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(sensorOut, INPUT);//OUT pinini INPUT olarak tanımlıyoruz

  digitalWrite(s1,LOW);  //Frekans ölçeğimizi %20 olarak tanımlıyoruz
  digitalWrite(s0,HIGH);  
  Serial.begin(9600);

}

void loop() {
  

  digitalWrite(s2, LOW); //Kırmızıyı filtrelemek için
  digitalWrite(s3, LOW);
  K = pulseIn(sensorOut, LOW);//OUT pini üzerindeki LOW süresini okur
  Serial.print("Kırmızı= ");
  Serial.print(K); //Kırmızı için aldığımız değeri serial monitöre yazdır
  Serial.print("  ");
  delay(50);//50 milisaniye bekle
 
  digitalWrite(s2, HIGH); //Yeşili filtrelemek için
  digitalWrite(s3, HIGH);
  Y = pulseIn(sensorOut, LOW); //OUT pini üzerindeki LOW süresini okur
  Serial.print("Yeşil= ");
  Serial.print(Y); //Yeşil için aldığımız değeri serial monitöre yazdır
  Serial.print("   ");
  delay(50);//50 milisaniye bekle
 
  digitalWrite(s2, LOW); //Maviyi filtrelemek için
  digitalWrite(s3, HIGH);
  M = pulseIn(sensorOut, LOW);//OUT pini üzerindeki LOW süresini okur
  Serial.print("Mavi= ");
  Serial.print(M);//Mavi için aldığımız değeri serial monitöre yazdır
  Serial.println();
  delay(50);//50 milisaniye bekle
}

Proje Kodu

Şimdi proje için ihtiyacımız olan koda geçiyoruz. Bu kodda basit bir şekilde aldığımız değerleri LCD ekrana yazdıracağız. Belli kriterlere uyan renklerimizi “Algılanan Renk” şeklinde LCD ekranımızda göreceğiz. Hem değerleri hem de algılanan rengi 2×16’lık bir ekranda görmemiz mümkün değil. Bu yüzden ekranda sırasıyla değerleri ve ardından bu değerlerin sonucunda ortaya çıkan rengi okuyacağız. Ara renkleri belirlerken aşağıdaki renk diyagramından yararlandım.

Algılanan rengi belirlerken kullandığımız değerleri kendi sensörünüzden aldığınız değerlere göre değiştirin. Aksi halde doğru değerleri okuyamayabilirsiniz.

//maker.robotistan.com

#include <LiquidCrystal.h> //LCD kütüphanesini kodumuza dahil ediyoruz

#define s0 8 //Bağladığımız pinlere göre tanımlamalarımızı yapıyoruz
#define s1 9
#define s2 10
#define s3 11
#define sensorOut 12

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);//LCD pinlerini tanımlıyoruz
int K, Y, M = 0; //3 ana renk için değişken tanımlıyoruz

void setup() {

  lcd.begin(16,2);
  pinMode(s0, OUTPUT);//S0, S1, S2 ve S3 pinlerini OUTPUT olarak tanımlıyoruz
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(sensorOut, INPUT);//OUT pinini INPUT olarak tanımlıyoruz

  digitalWrite(s1,LOW);  //Frekans ölçeğimizi %20 olarak tanımlıyoruz
  digitalWrite(s0,HIGH);  
  Serial.begin(9600);

}

void loop() {
  
  lcd.print("K=");
  digitalWrite(s2, LOW); //Kırmızıyı filtrele
  digitalWrite(s3, LOW);
  K = pulseIn(sensorOut, LOW); //OUT pini üzerindeki LOW süresini okur
  Serial.print("Kırmızı= ");
  Serial.print(K); //Kırmızı için aldığımız değeri serial monitöre yazdır
  Serial.print("  ");
  lcd.print(K); //Kırmızı için aldığımız değeri LCD ekrana yazdır
  lcd.print("  ");
  lcd.setCursor(7, 0); //İmleci 7. sütuna al
  delay(50); //50 milisaniye bekle
 
  lcd.print("Y=");
  digitalWrite(s2, HIGH); //Yeşili filtrele
  digitalWrite(s3, HIGH);
  Y = pulseIn(sensorOut, LOW); //OUT pini üzerindeki LOW süresini okur
  Serial.print("Yeşil= ");
  Serial.print(Y); //Yeşil için aldığımız değeri serial monitöre yazdır
  Serial.print("   ");
  lcd.print(Y); //Yeşil için aldığımız değeri LCD ekrana yazdır
  delay(50);

  lcd.setCursor(4, 1); //İmleci 2. satır 4. sütuna taşı
  lcd.print("M=");
  digitalWrite(s2, LOW); //Maviyi filtrele
  digitalWrite(s3, HIGH);
  M = pulseIn(sensorOut, LOW); //OUT pini üzerindeki LOW süresini okur
  Serial.print("Mavi= "); 
  Serial.print(M); //Mavi için aldığımız değeri serial monitöre yazdır
  Serial.println();
  lcd.print(M); //Mavi için aldığımız değeri LCD ekrana yazdır
  lcd.setCursor(0, 0);
  delay(1000); //1000 milisaniye bekle
  //Renk değerlerini 1 saniye boyunca ekranda göreceğiz
  
  lcd.clear(); //Ekranı temizle
  delay(150); //150 milisaniye bekle


  lcd.setCursor(1,0); //İmleci 1. sütuna al
  lcd.print("Algilanan Renk");
  lcd.setCursor(2,1); //İmleci 2. satır 2. sütuna al
  
  if(K<70 && M<70 && Y<70) //Eğer tüm renklerin yoğunluğu yüksekse: Beyaz
  {
  Serial.print("Renk = Beyaz   ");
  lcd.print("Beyaz");  
  }
  else if(K<100 && Y<M && abs(K-Y)<20)
  //Kırmızı yoğunluğu yüksek ve yeşille arasındaki değer 20'den azsa: Sarı
  {
  Serial.print("Renk = Sarı   ");
  lcd.print("Sari");
  }
  else if(K<100 && M<Y && abs(M-K)<20)
  //Kırmızı yoğunluğu yüksek ve mavi ile arasındaki değer 20'den azsa: Magenta
  {
  Serial.print("Renk = Magenta   ");
  lcd.print("Magenta");
  }
  else if(Y<130 && Y<M && Y<K)
  //Yeşil yoğunluğu belli bir seviyenin üstünde ve kırmızı-maviden daha yoğunsa: Yeşil
  {
  Serial.print("Renk = Yeşil   ");
  lcd.print("Yesil");
  }
  else if(M<100 && M<Y && M<K)
  //Mavi yoğunluğu belli bir seviyenin üstünde ve yeşil-kırmızıdan daha yoğunsa: Mavi
  {
  Serial.print("Renk = Mavi   ");
  lcd.print("Mavi");
  }
  else if(K<100 && K<Y && K<M)
  //Kırmızı yoğunluğu belli bir seviyenin üstünde ve yeşil-maviden daha yoğunsa: Kırmızı
  {
  Serial.print("Renk = Kırmızı   ");
  lcd.print("Kirmizi");
  }
  else
  {
  Serial.print("Renk algılanamadı   ");//Belirlediğimiz kıstaslara uymayan diğer renkler
  lcd.print("---");
  }
  
  Serial.println(); //Serial monitörde bir satır aşağı geç
  delay(1000);//1000 milisaniye bekle
  lcd.clear();//LCD ekranı temizle
  delay(150);
  
}

Hadi deneyelim!

Kod aşamasıyla beraber projemizi bitirmiş olduk. Başka projelerde buluşmak dileğiyle, hoşça kalın!

7 Yorumlar

    • Merhaba, bağlantıları doğru şekilde yaptıktan ve sensörün verdiği değerleri test ettikten sonra herhangi bir sorun olacağını sanmıyorum. Bir problemle karşılaşırsanız buraya yazabilirsiniz, yardımcı olmaya çalışırım her zaman. 🙂

    • Hayır, yazıdaki kısımları adım adım gerçekleştirdikten sonra sıkıntı çıkmayacaktır. Yine de bir problem yaşarsanız yazabilirsiniz.

    • Kalibrasyon bölümünde bahsedildiği gibi kendi sensör değerlerinize göre koddaki değerlerde oynama yaparsanız sorun çözülecektir.

CEVAP VER

Please enter your comment!
Please enter your name here