TCS3200 Renk Ölçüm Sensörü Kullanımı Hakkında

Başlatan XX_CİHAN_XX, 07 Nisan 2013, 12:31:09

kimlenbu

Okuldayken rgb led kullanarak fotodirenç + adc ile yansıyan ışığa göre renk bulan bir uygulama yapmıştık, bu sensörde nasıldır bilmem ama örneğin kırmızı bir a4 veya kırmızı bir cips jelatini çok farklı sonuçlar veriyor.

Yansıma katsayısı göz önüne alınarak her renk için normalizasyon gerekli bence yüksek çözünürlük için.

Mucit23

Selamlar

Bu sensörün çıkışını nasıl değerlendiriyorsunuz? Ana renkler dışında birkaç farklı rengi tespit etmeye çalışıyorum. STM32F4 de timer input capture moduna ayarladım

Her Renk için bir değer okuyorum ama nasıl yorumlanacak? Bunun kolay bir yolu varmı?

apsis

Ben tcs34725 ile çokça deney yaptım hatta bir kart basıp okulda konveyor üzerinde kutuları ayrıştırdım. Frekans modunda çıktı verenler için sanırım 0-255 , 0-1024 gibi aralığa skala etmek gerekiyor. l2 ve l3 den zaten okunacak kanalar seçiliyor. clear kanalından aldığın değer filitre olarak kullanılır. Bu kanal ortamın ışık şiddetini algılamanı sağlar. Dökümanlarda algoritmalar var. İstersen bende de uygulama kodları var(tcs34725 için ama okunan değerleri ölçekleyebilisen aynen kullanılabilir).
http://ams.com/eng/Products/Light-Sensors/Color-Sensors/TCS3200
buradaki dökümanlardan çok yararlandım belki işinizi görür.
"Makineye Beyin" MEKATRONİK

Mucit23

#18
Teşekkürler.
Ölçeklemeyi nasıl yapmam gerekiyor onu anlamadım. Sizin kodu incelemem mümkün olursa bir fikir edinebilirim. Birde ortam ışığı yani clear i Nasıl degerlendirecegim?

apsis

Main kısmını paylaşıyorum asıl iş burada
int main()
{
        unsigned int id,clear,red,green,blue,gammatable[256];
	unsigned long int sum;
	
	float r,g,b;
	int i=0;
  for (i=0; i<256; i++) {
    float x = i;
    x /= 255;
    x = pow(x, 2.5);
    x *= 255;
    gammatable[i] = 255 - x;      
  }
	i2c1_init();
	init_tim1();
	id=TCS_test();
  

	while(1)
	{
		
			TCS_interrupt(0);
			Delay(60);
			ColRawData(&red, &green, &blue, &clear);
			TCS_interrupt(1);
		
			r=red;    r/=clear;  
			g=green;  g/=clear;
			b=blue ;  b/=clear;
			r*=256; g*=256; b*=256;
			red=r; green=g; blue=b;

			TIM1->CCR1	= gammatable[color=red]*39;
			TIM1->CCR2	= gammatable[color=green]*39;
			TIM1->CCR3	= gammatable[color=blue]*39;
}


Kodların geri kalan kısmı I2C ve timerlardan oluşuyor. İstersen özelden atarım. Burada çok yer kaplamasın diye koymadım.

Clear aslında referans noktandır. Okunan değer buna bölünür 256 ile çarpılır. Daha sonra oluşturulan gamma tablosundan renk içi aradığınız sayısal değer gözükür. Zaten genelde renkler 0-255 arası değerlerde gösterir (r-g-b için ayrı ayrı). Buradaki gamma tablosuda 0-255 arası değerleri verir.
Ben okuduğum değeri rgb led ile göstermiştim.

"Makineye Beyin" MEKATRONİK

XX_CİHAN_XX

@apsis, elde ettiğiniz bu R,G,B değerlerinin doğruluğunu hiç kontrol edebildiniz mi? Örneğin R,G,B değerleri net bilinen renkleri ölçüp aynı değerleri elde edebildiniz mi?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

apsis

Evet kontrol ettim. Yüksek bir yaklaşıklıkla doğru veriyor. Hatta kazancıyla oynayarak mesafeye göre bunu değiştirebiliyorsunuz.(tcs34725 için) ben yanlış hatırlamıyorsam 5 cm kadar ölçmüştüm. Ama birazda ola sapma yapıyordu. 3cm kadar iyi sonuç veriyor.
"Makineye Beyin" MEKATRONİK

serter

@universitelim54 Ben bu proje ile 2.5 sene uğraşmıştım. O günkü yazmış olduğum yazılımı yükleyeyim. Sen lazım olanları alırsın oradan.
//.......buzzer.............
int Buzzer = 12;
 
int CountTone =1;
int CountTone2 =2;
int CountTone3 =3;
int tones1[] = {10};
int tones2[] = {100};
int tones3[] = {1000};
int tones4[] = {10, 100};
int tones5[] = {100, 1000};
int tones6[] = {10 , 1000};
int tones7[] = {10, 100 ,1000};
int tones8[] = {50,500,5000 };
int tones9[] = {100,1000,10000};
//...............................
int S2=7;
int S3=8;
int outpin=4;

int kirmizirenk;
int yesilrenk;
int mavirenk;
int kirmizifark;
int yesilfark;

unsigned int pulseWidth;

void setup ()
{
    
  Serial.begin(9600);
  
  pinMode (S2,OUTPUT);
  pinMode (S3,OUTPUT);
  pinMode (outpin,INPUT);
  
}

void loop()

{
  kirmizifark = kirmizirenk-mavirenk;
  yesilfark = yesilrenk - mavirenk;
  
//.......kırmızı ıcın.................
   digitalWrite (S2,LOW);
   digitalWrite (S3,LOW);
   
   pulseWidth = pulseIn(outpin,LOW);
   kirmizirenk = pulseWidth/400. -1;
   kirmizirenk = (255 - kirmizirenk);
   
//.......yesil için.................
    digitalWrite (S2,HIGH);
   digitalWrite (S3,HIGH);
   
   pulseWidth = pulseIn(outpin,LOW);
   yesilrenk = pulseWidth/400. -1;
   yesilrenk = (255 - yesilrenk);
   
//.......mavi için.................

        digitalWrite (S2,LOW);
   digitalWrite (S3,HIGH);
   
   pulseWidth = pulseIn(outpin,LOW);
   mavirenk = pulseWidth/400. -1;
   mavirenk = (255 - mavirenk);
   
   Serial.print(kirmizirenk);
   Serial.print(" , ");
   Serial.print(yesilrenk);
   Serial.print(" , ");
   Serial.println(mavirenk);
   Serial.println("");
   
   
   if ( kirmizirenk>mavirenk && mavirenk>yesilrenk && kirmizifark>2 )
   {
   
   Serial.println("kirmizi");
   Serial.println("");
   for (int i = 0; i < CountTone; i++)
 {
 tone(Buzzer, tones1[i]);
 delay(600);
 }
 noTone(Buzzer);
   
   }
   else  if ( kirmizirenk>yesilrenk && mavirenk<yesilrenk && yesilfark <= 2)
   {
   
   Serial.println("turuncu");
   Serial.println("");
    for (int i = 0; i < CountTone; i++)
 {
 tone(Buzzer, tones2[i]);
 delay(600);
 }
 noTone(Buzzer);
   
   }
   
    else  if ( yesilrenk<=kirmizirenk && mavirenk<kirmizirenk && yesilfark >= 2)
   {
   
   Serial.println("sari");
   Serial.println("");
         for (int i = 0; i < CountTone; i++)
 {
 tone(Buzzer, tones3[i]);
 delay(600);
 }
 noTone(Buzzer);

   
   }
   
   else  if ( mavirenk<=kirmizirenk && yesilrenk<kirmizirenk && kirmizirenk>245 )
   {
   
   Serial.println("pembe");
   Serial.println("");
      for (int i = 0; i < CountTone2; i++)
 {
 tone(Buzzer, tones6[i]);
 delay(600);
 }
 noTone(Buzzer);

   
   }
   
   else  if ( mavirenk>yesilrenk && yesilrenk>kirmizirenk )
   {
   
   Serial.println("mavi");
   Serial.println("");
      for (int i = 0; i < CountTone2; i++)
 {
 tone(Buzzer, tones5[i]);
 delay(600);
 }
 noTone(Buzzer);
   
   }
   
   else  if ( mavirenk>=yesilrenk && yesilrenk<kirmizirenk && kirmizirenk<245 && kirmizirenk>230)
   {
   
   Serial.println("kahverengi");
   Serial.println("");
      for (int i = 0; i < CountTone2; i++)
 {
 tone(Buzzer, tones4[i]);
 delay(600);
 }
 noTone(Buzzer);
   
   }
   
   else  if ( mavirenk<yesilrenk && mavirenk<=kirmizirenk )
   {
   
   Serial.println("yesil");
   Serial.println("");
      for (int i = 0; i < CountTone3; i++)
 {
 tone(Buzzer, tones7[i]);
 delay(600);
 }
 noTone(Buzzer);
   
   }
   
   else  if ( mavirenk==yesilrenk && mavirenk==kirmizirenk )
   {
   
   Serial.println("beyaz");
   Serial.println("");
      for (int i = 0; i < CountTone3; i++)
 {
 tone(Buzzer, tones8[i]);
 delay(600);
 }
 noTone(Buzzer);   
   }
   
   else  if ( kirmizirenk>yesilrenk && mavirenk>kirmizirenk && kirmizirenk<230 )
   {   
   Serial.println("siyah");
   Serial.println("");
      for (int i = 0; i < CountTone3; i++)
 {
 tone(Buzzer, tones9[i]);
 delay(600);
 }
 noTone(Buzzer);
   
   }      
   delay (1000);
}