Robotik ve Kodlama

Arduino

Yüzey Renklerinin Algılanması

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Cansu Uludağ

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.