Arduino ile TCS3200 Nedir Nasıl kullanılır.
Bu projenin içeriği oldukça ilginç görünüyor. TCS3200 renk sensörünün nasıl çalıştığını ve bu projede LCD ekran ile nasıl kullanıldığını anlamak heyecan verici bir deneyim olabilir.
TCS3200'nin çalışma prensibi, üzerine gelen ışığın frekansta kare dalgalar üretmesi ve bu dalganın özelliklerinin fotodiyotlar ve akım-frekans dönüştürücüsü ile ölçülmesi olarak özetlenebilir. Bu verileri alarak, çeşitli renklerin algılanması ve analizi mümkün olur. PulseIn() fonksiyonunun kullanılması, bu verileri daha iyi anlayabilmek için oldukça faydalı bir yaklaşım gibi görünüyor.
Renk sensörünün çalışma prensibi oldukça ilginç ve karmaşıktır. Renkleri ayırt etmek için fotodiyotlar ve filtrelerin kullanılması, sensörün çeşitli renklerdeki ışığı algılayabilmesini sağlar. Bu nedenle, sensörün iç yapısını ve çalışma mantığını anlamak önemlidir.
Sensörde bulunan 8x8 dizideki fotodiyotlar, belirli renklerin (kırmızı, yeşil ve mavi) algılanmasına yardımcı olan filtrelerle donatılmıştır. Bu filtrelere sahip olan fotodiyotlar, belirli bir renge daha duyarlıdır ve bu renklerin yoğunluğunu daha iyi ölçebilir. Geri kalan fotodiyotlar ise filtreye sahip değildir ve tüm renkleri genel olarak algılarlar.
S2 ve S3 pinleri, hangi filtrenin kullanılacağını belirlemek için kullanılır. Örneğin, kırmızı rengi belirlemek istediğinizde S2 ve S3 pinlerini lojik-0 konumuna getirirsiniz. Bu, sensörün yalnızca kırmızı renk için daha hassas olmasını sağlar. Aynı işlemi yeşil ve mavi renkler için de yapabilirsiniz.
Sonuç olarak, bu yöntem kullanılarak sensörün algıladığı renklerin yoğunluğunu ölçebilir ve RGB (Kırmızı-Yeşil-Mavi) renk değerlerini elde edebilirsiniz.
TCS3200 renk sensörü, çıkış frekansını ayarlamamıza yardımcı olan S0 ve S1 pinlerine sahiptir. Biz bu ölçeği, S0'ı "HIGH" ve S1'i "LOW" konumlarına getirerek %20 düzeyinde tutmayı tercih edeceğiz. Verileri almak için ise OUT pini kullanılacaktır. Bu pinleri kullanarak sensörü Arduino'nun dijital giriş-çıkışlarına bağlayarak projemizi gerçekleştireceğiz.
Sensörün üzerinde bulunan 4 adet beyaz LED, daha hassas veri elde etmemize yardımcı olan yardımcı elemanlardır. TCS3200 sensörü, yuvalı ve yuvasız olarak iki farklı versiyonla karşılaşabilirsiniz. Her iki versiyon da aynı işlevi yerine getirir, ancak yuvalı versiyon çipin dış etkilerden daha az etkilenmesi için bir yuvada bulunur. bu yü
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.
#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 koduna geçmeden önce, projemizin temelinde yer alan TCS3200 renk sensörünü anladığımızdan emin olmak istiyoruz. Bu sensör, renkleri algılamak ve bunları sayısal değerlere çevirmek için kullanılır. Sensörün üzerinde bulunan S0, S1, S2 ve S3 gibi pinler, çıkış frekansını ve algılama hassasiyetini ayarlamamıza olanak tanır. Ayrıca, beyaz LED'ler, doğru renk algılaması için ışık kaynağı sağlar.
Projemizde, bu sensörü kullanarak çeşitli renkleri algılayıp LCD ekran üzerinde göstermeyi planlıyoruz. Ancak 2x16 ekranın sınırlı boyutları nedeniyle değerleri ve algılanan rengi ayrı ayrı göstereceğiz. Renklerin algılanması için aşağıdaki renk diyagramından yararlanacağız.
Proje kodumuzda sensör tarafından ölçülen frekansları alacak ve bu frekansları renk değerlerine dönüştüreceğiz. Ardından, LCD ekran üzerinde bu renk değerlerini görüntüleyeceğiz.
#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
//Kalibrasyon bölümünde elde ettiğimiz değerleri bu kısımda kullanacağız
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);
}
Sayfamız sürekli olarak yeni içeriklerle güncelleniyor. Size sormak istediğimiz soruları lütfen yorum olarak paylaşın!
Berat KURTGÖZ (Yazar)
Tasarım ssnasıl göründüğü ya da nasıl hissettirdiği ile ilgili bir şey değildir. Tasarım nasıl çalıştığı ile ilgilidir
Makaleleri
45
Makale Okunması
20296
Yorumunuz Gönder