TCS3200 & Konveyör Renk Ayırıcı Band Sistemi

Konveyör ile çalışmalarım devam ediyor arkadaşlar. Bu projemde konveyör üzerine bırakılan malzemeleri renklerine göre ayırt etmek ve bunu her renk için ayrı konveyörlerle çıkışa ulaştırma çalışmasını yaptım.  3 adet renk ayrımı yaparak çalışmaktadır. RGB diye bilinen (R)Kırmızı -(G)Yeşil-(B)Mavi. Renkleri sorunsuz ve çok hızlı bir şekilde renklerini tespit ediyoruz ve bandlar sayesinde ayrıştırma işlemini gerçekleştiriyoruz. Ürün konveyörden çıktığı zaman buzzer ile uyarı alıyoruz ve sistem otomatik duruyor taki yeni ürün TCS3200 renk sensörünün önüne gelene kadar. Bu uygulamam da renk ayrımını TCS3200 renk sensörü ile yapmaktayım.

TCS3200 RGB verilerini kaynak ışığı ile filtreler. Işık yoğunluğuna orantılı olarak kare dalga frekansına dönüştürür.

tcs3200

Çıkış frekansı S0-S1 uçları ile kontrol edilir. Bu uçlara uygulanacak gerilim ile frekans kontrolü yapılır. Yukarıdaki resimde göründüğü üzere S0 gnd (LOW) ile S1 vcc (HIGH) ile kısa devre yapılmıştır. Bu sayede frekans kontrolü için bağlantıları yapılmış olmaktadır. Bu bağlantıya göre %2 lik frekans ayarı yapılmıştır.Neden Direkt sensör üzerinden bu şekilde yaptığımı sorarsanız arkadaşlar , Arduino uno da bu proje için tüm pinleri kullanmak zorundayım o yuzden pinleri boşa kullanmamak için bu şekilde yaptım . Yani;

digitalwrite (S1,HIGH);

digitalwrite (S0,LOW);     Yaparakta bu işelem olur  ama boştan yere iki pini işgal etmiş olurdum.

frekans

 

 

 

 

 

TCS3200 Sensörümüzün freknas ayarını yaptığımıza göre şimdi hanigi renk algılanacak ve neye göre algılayacak bu kısma deyineyim.

Sensörde bulunan S2 ve S3 pini RGB filtresini kontrol eder. Bu pinlere gerilimler vererek fotodiyotu harekete geçirecegiz ve bu sayede elde edilen filtrelenmiş frekansa göre o rengin ne olduğuna bakacağız. S2 ve S3 pinlerini Arduinoda tanımlıyoruz.
secim

const int s2 = 6;
const int s3 = 5;
const int out = 2;

Bu tanımlamaya göre Arduinonun 
digital 6. bacağı S2
digital 5. bacağı S3
digital 2. bacağı out olmuştur.

Yandaki tabloya göre uygulanan
 gerilimlerin hangi 
renge denk geldiği gözükmektedir.
Örnek olarak kırımızı rengi sorgulama için S2 LOW - S3 LOw olacak.
Arduinoda ki yazılımı şu şekildedir.

void color()
{
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
  //Kırmızı
  red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s3, HIGH);
  //Mavi
  blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s2, HIGH);
  //Yeşil
  green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}

ilk başta S2 LOW S3 LOW Bunun karşılığı kırmızı renkgi sorgulamaktır.
" red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); " bu komudun açılımı :
                                 out degeri HIGH mıdır ? Eğer HIGH ise LOW yap.
                                                         Eğer HIGH değil ise HIGH yap.
ikinci olarak mavi renk sorgulanmaktadır. Dikkat edersek S3 HIGH yapılmış S2 De değişiklik 
olmamış yani;

S3 HIGH
S2 LOW        bunun tablodaki karşılığı mavi rengin sorgulanmasıdır.
Son olarak ta Yeşil renk sorgulanmak için

S3 HIGH
S2 HIGH       yapılmıştır.


İlk olarak kullanmış olduğum sensörü denedim ve sonuçlarına baktım. İlk olarak 3 adet led ile 
çıkış aldım.

Projemin son halinin çalışma mantığı Şu şekildedir.
İlk başlangıçta bulunan ır engel sensörünün önüde engel yani cisim gelirse TCS3200 sensörü 
ölçüm yapmaya başlıyorki bu ölçüm diğer örnek yazılımlardan daha hızlı olmaktadır.Yapılan ölçümler
sonucunda Ölçülen rengin R-G-B de ki değerleri kayıt edilerek karşılaştırma yapılmaktadır. 
Okunan bu değerler red -green - blue olarak kayıt edilmektedir.
 
Bu kayıtların karşılaştırılması yazılımda şu şekilde olmuştur.

if (red < blue && red < green && red < 800 ) Bu sorguda okunan değerlerin kıyası yapılmaktadır. 
Okunan degerlerden kücük olan sayı o rengi temsil etmektedir. 800 den küçük olaması şartıda
 boşta duruduğu zaman okunan değerlere göre eşik değeri seçilmiştir.

Eğer bu şart sağlanıyorsa renk sensörünün önünde duran küp kırmızı renklidir. Devre üzerindeki
 led yanacak ve Konveyör çalışmaya başlayacaktır tabi ki de kırımızı alana taşıma yapan konveyörde
 çalışacaktır. Kırmızı küp için konum değiştirici olan servo motor açısını 135 dereceye getirecek
 ve ana konveyör üzerinde bulunan kırımız küpü ilgili konveyör üzerine kaydıracaktır.
 Kırmızı küp kendi konveyöründe sona ulaşınca engel sensörü sayesinde bunu anlayacak ve 
buzzer ile uyarı vererek işlemi sonandıracaktır taki bir başka küp başlangıca koyulana dek.
20170209_134141 20170209_134151 20170209_134203sonhali
20170212_152312
 devre renk band_bbrenk band_şema
malzeme

malzeme



 yazilim  
#include<Servo.h>
Servo kirmizi_servo;
Servo mavi_servo;
Servo yesil_servo;
#define buzzer     3
#define led     4
#define y_motor    8
#define m_motor    7
#define k_motor    12
#define a_motor    13

int sure = 0;
int mesafe = 0;
const int s2 = 6;
const int s3 = 5;
const int out = 2;
int kirmizi_urun = 0;
int mavi_urun = 0;
int yesil_urun = 0;
int diger_urun = 0;
// LED pins connected to Arduino

// Variables
int red = 0;
int green = 0;
int blue = 0;
int baslangic = analogRead(A0);
int m_son = analogRead(A1);
int y_son = analogRead(A2);
int k_son = analogRead(A3);
void setup()
{ kirmizi_servo.attach(9);
  yesil_servo.attach(10);
  mavi_servo.attach(11);
  Serial.begin(9600);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(out, INPUT);
  pinMode(y_motor, OUTPUT);
  pinMode(k_motor, OUTPUT);
  pinMode(m_motor, OUTPUT);
  pinMode(a_motor, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
  kirmizi_servo.write(90);
  yesil_servo.write(90);
  mavi_servo.write(90);

}

void loop()
{

  int baslangic = analogRead(A0);
  digitalWrite(a_motor, LOW);
  digitalWrite(m_motor, LOW);
  digitalWrite(y_motor, LOW);
  digitalWrite(k_motor, LOW);
  
  digitalWrite(led, LOW);
  kirmizi_servo.write(90);
  yesil_servo.write(90);
  mavi_servo.write(90);
  if (baslangic < 100)
  {  digitalWrite(led, HIGH);
    int baslangic = analogRead(A0);
    color();
    Serial.print("R Intensity:");
    Serial.print(red, DEC);
    Serial.print(" G Intensity: ");
    Serial.print(green, DEC);
    Serial.print(" B Intensity : ");
    Serial.print(blue, DEC);
    //Serial.println();



    if (red < blue && red < green && red < 800 )
    {
      kirmizi_urun ++ ;
      while (kirmizi_urun > 0)
      {
        int m_son = analogRead(A1);
        int y_son = analogRead(A2);
        int k_son = analogRead(A3);
        if (k_son < 100)
        {
          digitalWrite(buzzer, HIGH);
          kirmizi_urun -- ;
          if (kirmizi_urun < 0)
          { kirmizi_urun = 0;
          }
          delay(500);
          digitalWrite(buzzer, LOW);
        }

        Serial.print ("while ici kirmizi urun sayisi = "); Serial.println (kirmizi_urun);
        Serial.println(" - (Red Color)");
        kirmizi_servo.write(135);
        yesil_servo.write(90);
        mavi_servo.write(90);
        digitalWrite(k_motor, HIGH);
        digitalWrite(a_motor, HIGH);
        delay(50);


      }
    }

    else if (blue < red && blue < green && blue < 800)
    {

      mavi_urun ++ ;

      while (mavi_urun > 0)
      {
        int m_son = analogRead(A1);
        int y_son = analogRead(A2);
        int k_son = analogRead(A3);
        if (m_son < 100)
        {
  digitalWrite(buzzer, HIGH);
          mavi_urun -- ;
          if (mavi_urun < 0)
          { mavi_urun = 0;
          }
          delay(500);
            digitalWrite(buzzer, LOW);
        }

        Serial.print ("while ici mavi_urun sayisi = "); Serial.println (mavi_urun);
        Serial.println(" - (blue Color)");
        kirmizi_servo.write(90);
        yesil_servo.write(90);
        mavi_servo.write(135);
        digitalWrite(m_motor, HIGH);
        digitalWrite(a_motor, HIGH);
        delay(50);


      }
    }

    else if (green < red && green < blue && green < 800)
    {
      yesil_urun ++ ;

      while (yesil_urun > 0)
      {
        int m_son = analogRead(A1);
        int y_son = analogRead(A2);
        int k_son = analogRead(A3);
        if (y_son < 100)
        {
  digitalWrite(buzzer, HIGH);
          yesil_urun -- ;
          if (yesil_urun < 0)
          { yesil_urun = 0;
          }
          delay(500);
            digitalWrite(buzzer, LOW);
        }

        Serial.print ("while ici yesil_urun sayisi = "); Serial.println (yesil_urun);
        Serial.println(" - (Green Color)");
        kirmizi_servo.write(90);
        yesil_servo.write(135);
        mavi_servo.write(90);
        digitalWrite(y_motor, HIGH);
        digitalWrite(a_motor, HIGH);
        delay(50);


      }
    }
    else {

      digitalWrite(m_motor, LOW);
      digitalWrite(y_motor, LOW);
      digitalWrite(k_motor, LOW);
      kirmizi_servo.write(90);
      yesil_servo.write(90);
      mavi_servo.write(90);
      Serial.println();
    }
    delay(300);

  }
}

void color()
{
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
  //Kırmızı
  red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s3, HIGH);
  //Mavi
  blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s2, HIGH);
  //Yeşil
  green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}



Sosyal Medyada Paylaş Facebook Twitter Google+

Etiketler: , , , , , , ,
Eklenme Tarihi: 12 Şubat 2017

Konu hakkında yorumunuzu yazın

TCS3200 & Konveyör Renk Ayırıcı Band Sistemi (8 Yorum)

  1. Hocam 10 temel renk ile ilgili frekans olcumleri ald?m. Bahsettiginiz turden bir katsay? arad?m ama tam olarak her renk icin uygun bir katsay? mant?g? oturtamad?m renkler aras?nda. Olcumlerim su sekilde;

HOŞ GELDİNİZ

Youtube kanalıma Abone Olabilirsiniz.