TCS3200 ile algılanan rengi LCD'ye yazdırma
  • Merhabalar,
    Bir adet TCS3200 renk sensörü aldım bu renk sensörünün kullanımı için kodlar geldi. Kodu yükleyip çalıştırdığımda sensör serial monitorde her renge göre farklı farklı RGB değerleri üreterek rengi bize aktarmış oluyor. Bu işlemi sonsuza kadar devam ettiriyor. Ben bu algılama işlemini bir kez yapıp algılanan rgb değerine uygun olarak LCD'ye rengi yazdırmak istiyorum. Bir türlü beceremedim. Kodlar aşağıda ilgilenen olursa çok sevinirim.

    #include _TimerOne.h>

    #define S0 6
    #define S1 5
    #define S2 4
    #define S3 3
    #define OUT 2

    int g_count = 0; // count the frequecy
    int g_array[3]; // store the RGB value
    int g_flag = 0; // filter of RGB queue
    float g_SF[3]; // save the RGB Scale factor


    // Init TSC230 and setting Frequency.
    void TSC_Init()
    {
    pinMode(S0, OUTPUT);
    pinMode(S1, OUTPUT);
    pinMode(S2, OUTPUT);
    pinMode(S3, OUTPUT);
    pinMode(OUT, INPUT);

    digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2%
    digitalWrite(S1, HIGH);
    }

    // Select the filter color
    void TSC_FilterColor(int Level01, int Level02)
    {
    if(Level01 != 0)
    Level01 = HIGH;

    if(Level02 != 0)
    Level02 = HIGH;

    digitalWrite(S2, Level01);
    digitalWrite(S3, Level02);
    }

    void TSC_Count()
    {
    g_count ++ ;
    }

    void TSC_Callback()
    {
    switch(g_flag)
    {
    case 0:
    Serial.println("->WB Start");
    TSC_WB(LOW, LOW); //Filter without Red
    break;
    case 1:
    Serial.print("->Frequency R=");
    Serial.println(g_count);
    g_array[0] = g_count;
    TSC_WB(HIGH, HIGH); //Filter without Green
    break;
    case 2:
    Serial.print("->Frequency G=");
    Serial.println(g_count);
    g_array[1] = g_count;
    TSC_WB(LOW, HIGH); //Filter without Blue
    break;

    case 3:
    Serial.print("->Frequency B=");
    Serial.println(g_count);
    Serial.println("->WB End");
    g_array[2] = g_count;
    TSC_WB(HIGH, LOW); //Clear(no filter)
    break;
    default:
    g_count = 0;
    break;
    }
    }

    void TSC_WB(int Level0, int Level1) //White Balance
    {
    g_count = 0;
    g_flag ++;
    TSC_FilterColor(Level0, Level1);
    Timer1.setPeriod(1000000); // set 1s period
    }

    void setup()
    {
    TSC_Init();
    Serial.begin(9600);
    Timer1.initialize(); // defaulte is 1s
    Timer1.attachInterrupt(TSC_Callback);
    attachInterrupt(0, TSC_Count, RISING);

    delay(4000);

    for(int i=0; i<3; i++)<br /> Serial.println(g_array[i]);

    g_SF[0] = 255.0/ g_array[0]; //R Scale factor
    g_SF[1] = 255.0/ g_array[1] ; //G Scale factor
    g_SF[2] = 255.0/ g_array[2] ; //B Scale factor


    Serial.println(g_SF[0]);
    Serial.println(g_SF[1]);
    Serial.println(g_SF[2]);

    }

    void loop()
    {
    g_flag = 0;
    for(int i=0; i<3; i++)<br /> Serial.println(int(g_array[i] * g_SF[i]));
    delay(4000);

    }


  • void loop()
    {
    g_flag = 0;
    for(int i=0; i<3; i++)<br /> Serial.println(int(g_array[i] * g_SF[i]));
    delay(4000);
    }

    kısmına sızacaksın,
    int(g_array[i] * g_SF[i]) değerine göre renk seçen bir şey yazman lazım.
    daha önce hiç kurcalamadım ama sensörden gelen integer dataya göre rgb derinliğini bir şekilde yakalarsın gibi geliyor.
    yanlış anlamadıysam 255,255,255 olunca beyaz,
    0,128,0 gelince yeşil yazdırmak istiyorsun.
    işin en temiz kısımını bilemeyeceğim de, gerilla methodları ile çözmeyi denemek istersen http://web.njit.edu/~kevin/rgb.txt.html şuradaki rgb kodlarını bir array'a at, senden gelen değeri buna göre karşılaştır olur bence. olmayada bilir, o zaman bu değer aralıklarının özelliğini öğrenmen gerekecek, o özelliğe göre renk listenden bir değerin gelmesini sağlamalısın.
  • yukarıdaki linkin detaylarında bu işi nasıl çözeceğinle ilgili detaylı bilgileri vermişler, azıcık baktım, ismi tespit etmekle ilgili tüm hesaplamaları vermişler sanırım.
    http://www.j-a-b.net/web/hue/color-names burada hesaplamalı bişeyler yapmışlar, oradan yürürsen olur bence.
    güzel proje, kolay gelsin.
  • Teşekkürler, deneyeceğim. Yine de aklına bir şeyler gelen olursa yorumları bekliyorum.
  • Merhaba
    Arduino hakkında hemen hemen hiçbirşey bilmiyorum.Eskiden PIC ile uğraşıyordum.
    Sormak istediğim:
    1) Arduino Uno satın aldım Controller olarak üstünde ATMEGA 326P-PU var.Bunda düzgün çalışan programın aynısını ayr bir boardda ATMEGA326P-PU ve (birkaç parça komponent ile) program atarak çalıştırabilirim değilmi?

    2)Bende TCS230 ile renk okumaya çalışıyorum.Kodların içinde
    Serial.begin(9600);
    diye bir satır var.Bu satır ATMEGA ile TCS 230 arasında haberleşme komutu değilmi?
    yani pc ile ATMEGA arasında ki haberleşme ile ilgili değil dolayısı ile
    Serial.print("->Frequency B=");
    gibi satırları iptal edersem bir MCU ile tüm bu kodları kullanabilirim pc ye ihtiyaç yoktur değilmi?

    3) Acaba TCS230 için 12 renk algılama algoritması yada kodu paylaşacak bir arkadaş varmı?

    Selamlar

  • 1) evet
    2) serial.begin(9600) seri haberleşme için arduino sonuçlarını dışarıya seriporttan atarken hızı belirleyen komut. silmeyin lazım olacak.
    serial.print gerekli değilse kullanmayabilirsiniz. arduino çalışırken pc ye ihtiyaç yok pc yi sadece kod yazıp derledikten sonra kodu arduinıya yazmak için kullanabılırsınız. arduino çalışırken bazı sonuçlar uretıp seriportan dışarı veriyorsa onları da gorebılırsınız pc den.

    3) genel tcs230 kodu https://arduinocode.codeplex.com/releases/view/115253

    projeye çok yanlış yerden başlamışınız anladığım kadarı ile. önce arduinoyu öğrenmeye bakın arduinoturkiye.com daki yazılardan veya bir kitaptan konuları takip edin. robotistan.com da gerekli meteryaller var.

  • @okoman
    Cevaplarınız için teşekkür ederim.
    Çok zorlayacağını sanmıyorm jeremy Blummun tutorialleri falan var internettede çok kaynak var ancak düzgün kodu bulmak sorun gibi

    Ben renk sensörünü
    http://www.arduinoecia.com.br/2014/02/sensor-de-reconhecimento-de-cor-tcs230.html
    Buradaki kodu copy paste yaparak çalıştırdım

    Bu web sitesindeki devre arduinoya bağlı iken sizin verdiğiniz linkteki kütüphaneyi açtım (extract ettim) Verifiy de sorun çıkmadı.Upload et dediğimde ancak altta turuncu bir satırda
    Sensor data does'note name a type hatası verdi

    Bu kütüphanede sensörün bağlantı pinleri ve adları nerede tutuluyor?
    Sanırım onunla ilgili hata
    Selamlar.
  • Yok hocam bu kütüphanenin examples klasörünün içindeki 3-4 tane program var hepsinide denedim hepsindede kodun içinde hatalar veriyor.
    Sanırım işe yarar bir kütüphane bulamayacağım
    Eğer ufak yazılım hataları varsa onu bilemem ama her programda sorun var
    Yüklü olarak gelen kütüphanelerde sorun yok ancak bu linkteki çalışmıyor
  • Anlaşıldı.Pek faal bir yer değil.
    Aslında
    http://forum.arduino.cc/
    da pek cevap yok.
    Neyse herkeze kolay gelsin
  • ne hatası alıyordunuz yazsaydınız bir bilen çıkabilirdi...
  • Sayın Okoman
    verdiğiniz linkteki kütüpheneyi siz çalıştırabildinizmi?
  • hatırınız için test ettim compile ediyor hata vermiyor. şöyle yaptım verdiğim linkteki zip dosyasını indirdim içindeki 2 klasörü arduino altındaki libraries kısmına koydum, sonra arduino ide(v1.05-r2)yi açtım file/examples/md_tc230 altında simple_b_tcs230 örneğini açtım, arduino uno bordum için compile ettim hatasız geçti. program aşağıda

    // TCS230 sensor reading example
    //
    // This is just to show basic functionality with no calibration.
    // Utilises the blocking version of the reading function.
    // Output uses the Serial console.
    //
    #include _MD_TCS230.h>
    #include _FreqCount.h>

    // Pin definitions
    #define S2_OUT 12
    #define S3_OUT 13
    #define OE_OUT 8 // LOW = ENABLED

    MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT);

    void setup()
    {
    Serial.begin(57600);
    Serial.println("[TCS230 Simple BLOCKING Example]");
    Serial.println("Move the sensor to different color to see the value");
    Serial.println("Note: These values are being read in without sensor calibration");
    Serial.println("and are likely to be far from reality");

    CS.begin();
    CS.setEnable(true);
    CS.setFilter(TCS230_RGB_X);
    CS.setFrequency(TCS230_FREQ_HI);
    CS.setSampling(10);
    }

    void readSensor()
    {
    uint32_t v;

    v = CS.readSingle();
    Serial.print("Simple value = ");
    Serial.println(v);
    }


    void loop()
    {
    readSensor();
    }
  • Teşekkür ederim cevabınız için.Bende şimdi hatasız derleyebildim.Sanırım ben farklı path kullanmışım.

    Şimdiki ufak sorunum her renk için Seri Monitörde RGB:255,255,255 yazması (her rengi beyaz görüyor kalibrasyonda yapmıştım).Doc klasörünü inceleyim.
    Tekrar teşekkür ederim yardımınız için

  • Bağlantıları
    SENSOR UNO
    (s3)-->13
    (S2)--->12
    (OE)-->8
    (S1)-->7
    (S0)--->ALTI
    (OUT)--->5

  • çalışan son halini gönderir misin.

  • aşağıdaki kod sürekli 255,255,255 veriyor ne yapmalıyım
    // TCS230 sensor reading example
    //
    // This is just to show basic functionality without calibration.
    // Utilises the non-blocking version of the reading function.
    // Output uses the Serial console.
    //
    #include
    #include

    // Pin definitions
    #define S2_OUT 12
    #define S3_OUT 13
    #define OE_OUT 5 // LOW = ENABLED

    MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT);

    void setup()
    {
    Serial.begin(9600);
    Serial.println("[TCS230 Simple NON_BLOCKING Example]");
    Serial.println("\nMove the sensor to different color to see the RGB value");
    Serial.println("Note: These values are being read in without sensor calibration");
    Serial.println("and are likely to be far from reality");

    CS.begin();
    }

    void readSensor()
    {
    static bool waiting;

    if (!waiting)
    {
    CS.read();
    waiting = true;
    }
    else
    {
    if (CS.available())
    {
    colorData rgb;

    CS.getRGB(&rgb);
    Serial.print("RGB [");
    Serial.print(rgb.value[TCS230_RGB_R]);
    Serial.print(",");
    Serial.print(rgb.value[TCS230_RGB_G]);
    Serial.print(",");
    Serial.print(rgb.value[TCS230_RGB_B]);
    Serial.println("]");

    waiting = false;
    }
    }
    }


    void loop()
    {
    readSensor();
    }
  • bacakların bağlantısı hatalıymış yukarıdaki kod çalıştı.:)
  • linkde bahsedilen zip dosyasi tam nerede?
    banada lazim ama zip dosyasini bulamadim.acaba zip dosyasinin tam linkini verebilirmisiniz?

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.