Sensörün nasıl çalıştığını ve kullanıldığını öğrendiğimize göre küçük bir uygulamayla bu bilgilerimizi pekiştirelim. Uygulamada sensör tutulduğu yüzeyin rengini algılayarak seri port üzerinden bilgisayara aktarmaktadır. Bunun için öncelikle aşağıdaki devreyi kurunuz.
/* Sensör pinleri tanımlanıyor */
int S0 = 8;
int S1 = 9;
int S2 = 12;
int S3 = 11;
int OUT = 10;
int LED = 13;
/* Renk yüzdeleri tanımlanıyor
Bu sayılar ortama göre değişiklik gösterebilir
Bu yüzden sensörü kalibre etmek için sensörden okuduğunuz değerler ile bu sayıları güncelleyiniz
Dizi elemanları sırasıyla sensörden ölçülen Kırmızı,Mavi ve Yeşil frekanslarını göstermektedir
*/
int RenkYuzdesi[5][3] = { {38,31,37}, // Sarı renk
{13,65,26}, // Mavi renk
{29,36,29}, // Beyaz renk
{64,31,22}, // Kırmızı renk
{23,34,45} }; // Yeşil renk
String Renkler[5] = {"Sari", "Mavi", "Beyaz", "Kirmizi", "Yesil"};
/* Sensör hassasiyeti */
int aralik = 7;
/* Renk frekanslarının tutulduğu değişkenler */
int KirmiziYuzdesi, YesilYuzdesi, MaviYuzdesi;
void setup() {
Serial.begin(9600);
pinMode(S0,OUTPUT);
pinMode(S1,OUTPUT);
pinMode(S2,OUTPUT);
pinMode(S3,OUTPUT);
pinMode(LED,OUTPUT);
pinMode(OUT,INPUT);
}
void loop() {
RengiTanimla();
delay(1000);
}
void TCS3200_Ac() {
digitalWrite(LED,HIGH); // switch LED on
digitalWrite(S0,HIGH); // output frequency scaling (100%)
digitalWrite(S1,HIGH);
delay(5);
}
void TCS3200_Kapat() {
digitalWrite(LED,LOW); // switch LED off
digitalWrite(S0,LOW); // power off sensor
digitalWrite(S1,LOW);
}
void Filtresiz() {
digitalWrite(S2,HIGH); // select no filter
digitalWrite(S3,LOW);
delay(5);
}
void KirmiziFiltre() {
digitalWrite(S2,LOW); // select red filter
digitalWrite(S3,LOW);
delay(5);
}
void YesilFiltre() {
digitalWrite(S2,HIGH); // select green filter
digitalWrite(S3,HIGH);
delay(5);
}
void MaviFiltre() {
digitalWrite(S2,LOW); // select blue filter
digitalWrite(S3,HIGH);
delay(5);
}
void RengiTanimla() {
float BeyazFrekansi, KirmiziFrekansi, YesilFrekansi, MaviFrekansi;
TCS3200_Ac();
Filtresiz();
BeyazFrekansi = float(pulseIn(OUT,LOW,40000));
KirmiziFiltre();
KirmiziFrekansi = float(pulseIn(OUT,LOW,40000));
YesilFiltre();
YesilFrekansi = float(pulseIn(OUT,LOW,40000));
MaviFiltre();
MaviFrekansi = float(pulseIn(OUT,LOW,40000));
TCS3200_Kapat();
KirmiziYuzdesi = int((BeyazFrekansi / KirmiziFrekansi) * 100.0);
YesilYuzdesi = int((BeyazFrekansi / YesilFrekansi) * 100.0);
MaviYuzdesi = int((BeyazFrekansi / MaviFrekansi) * 100.0);
RengiBul();
}
void RengiBul() {
Serial.println("Renk Yuzdeleri");
Serial.print("Kirmizi=");
Serial.print(KirmiziYuzdesi);
Serial.print("Mavi=");
Serial.print(MaviYuzdesi);
Serial.print("Yesil=");
Serial.println(YesilYuzdesi);
Serial.println();
Serial.print("Okunan Renk=");
int okunduMu=0;
for(int renk =0; renk < 5; renk ++){
if(KirmiziYuzdesi > RenkYuzdesi[renk][0] - 7 && KirmiziYuzdesi < RenkYuzdesi[renk][0] + 7 &&
MaviYuzdesi > RenkYuzdesi[renk][1] - 7 && MaviYuzdesi < RenkYuzdesi[renk][1] + 7 &&
YesilYuzdesi > RenkYuzdesi[renk][2] - 7 && YesilYuzdesi < RenkYuzdesi[renk][2] + 7 ){
Serial.println(Renkler[renk]);
okunduMu=1;
break;
}
}
if(okunduMu == 0)
Serial.println("Renk Algilanamadi");
Serial.println();
Serial.println();
}
Yukarıdaki kodlamada öncelikle renk aralıkları kalibre edilmelidir. Bu yüzden öncelikle kodu yükleyin. Beş renk için (sarı, mavi, beyaz, kırmızı, yeşil) ölçümleme yapınız. Ölçümde elde ettiğiniz sonuçları sırasıyla RenkYuzdesi değişkenine yazın. Bu noktadan sonra sensörünüz kullanıma hazırdır.
RengiTanıma fonksiyonu sensörün LED'lerini sırasıyla yakarak, sensör önünde bulunan cismin 3 ana renk için frekanslarını bulmaktadır. Bulunan renk frekansları RengiBul fonksiyonu içerisinde kullanılmaktadır. Bu fonksiyonda daha önceden kalibre edilmiş değerlerle ölçülen frekans değerleri karşılaştırılmaktadır. Bu karşılaştırma sonucunda hesaplanan renk ekrana yazdırılmaktadır.
Bu bölümde Arduino ile kullanılan renk sensörlerini incelemiş olduk. Eğer siyah ve beyaz rengin ayırt edilmesi proje için yeterliyse, daha hızlı ölçümler için CYN70 renk sensörü kullanılmalıdır. Ara renklerin de ölçülmesi gereken projelerde TCS3200 gibi tüm renkleri algılayabilen sensörler kullanılmalıdır.
Hiç yorum yok:
Yorum Gönder