Renk Sensörü ve Servo Motor Birleştirme

Batuhan01

Kilopat
Katılım
25 Mayıs 2014
Mesajlar
53
Daha fazla  
Cinsiyet
Erkek
[CODE title="Ortalama Renk Sensörü Kodu"]/* 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] = {
{24,62,28}, // Mavi renk
{29,36,29}, // Beyaz renk
{66,26,25}, // Kırmızı renk
{46,27,44} }; // Yeşil renk

String Renkler[5] = { "Mavi", "Beyaz", "Kirmizi", "Yesil"};

/* Sensör hassasiyeti */
int aralik = 10;

/* 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,HIGH); // 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] - 10 && KirmiziYuzdesi < RenkYuzdesi[renk][0] + 10 &&
MaviYuzdesi > RenkYuzdesi[renk][1] - 10 && MaviYuzdesi < RenkYuzdesi[renk][1] + 10 &&
YesilYuzdesi > RenkYuzdesi[renk][2] - 10 && YesilYuzdesi < RenkYuzdesi[renk][2] + 10 ){
Serial.println(Renkler[renk]);
okunduMu=1;
break;
}

}
if(okunduMu == 0)
Serial.println("Renk Algilanamadi");

Serial.println();
Serial.println();

}
[/CODE]
[CODE title="Eklemek İstediğim Servo Motor Kodu"]
void ServoM(){
if ( KirmiziYuzdesi > YesilYuzdesi > MaviYuzdesi || KirmiziYuzdesi > MaviYuzdesi > YesilYuzdesi )
{
servo_motor.write(30);
}
else if ( YesilYuzdesi > KirmiziYuzdesi > MaviYuzdesi || YesilYuzdesi > MaviYuzdesi > KirmiziYuzdesi )
{
servo_motor.write(60);
}
else if ( MaviYuzdesi > KirmiziYuzdesi > YesilYuzdesi || MaviYuzdesi > YesilYuzdesi > KirmiziYuzdesi )
{
servo_motor.write(120);

}
}
[/CODE]
Merhaba arkadaşlar,

Arduino da şekilleri renklerine göre ayıran bir sistem hazırlamaya çalışıyorum. TCS3200 renk sensörünü kullanıyorum ve başarılı şekilde çalışıyor. Gelen sinyalin ortalamasını alarak bana cismin hangi renk olduğunu söylüyor fakat sistemin sonuna bir servo motor koyarak çark şeklinde istediğim açıya gelmesini istiyorum bunu nasıl ayarlayabilirim. Kendi denemelerimde servo dönmüyor yada sürekli mavi renk algılayarak mavi rengin konumunda kalıyor. Kendi yazdığım servo motor kodunu sensöre nasıl entegre edebilirim ? Anlayan yardım eden olursa çok sevinirim.
 
Görünürde bir hata yok gibi, büyük ihtimalle if kısımlarında yazdığın yerde bir mantık hatası var, for döngüsünün içerisine yazdığın ile servom fonksiyonuna yazdığın if kısımı aynı değil, mantıken aynı olması gerekiyordur diye tahmin ediyorum.
 
Sorun çözüldü, renk sensörünün kodunu internetten hazır almıştım. Renkler kod içerisinde 1,2,3 diye kodlanmış
Kod:
  if(renk==0)servo_motor.write(25);     //Pulun rengi sarı ise alttaki servo motor 35 dereceye konumlansın
  if(renk==3)servo_motor.write(90);     //Pulun rengi mavi ise alttaki servo motor 60 dereceye konumlansın
  if(renk==2)servo_motor.write(150);     //Pulun rengi kırmızı ise alttaki servo motor 85 dereceye konumlansın
Bu tarz basit bir kod ile sorun çözüldü. İyi akşamlar, iyi forumlar.
 

Yeni konular

Geri
Yukarı