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++) 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++) Serial.println(int(g_array[i] * g_SF[i])); delay(4000); }
void loop() { g_flag = 0; for(int i=0; i<3; i++)
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
- 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 <md_tcs230.h>
include <freqcount.h>
// 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();
}
</freqcount.h></md_tcs230.h>
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?