مشروع استخدام حساس الالوان والتعرف عليها اكتب تعليقُا

 تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث الحرائق أو غيرها لا سمح الله.

مقدمــــــــة عن المشروع

وحدة استشعار الألوان هي كاشف ألوان كامل ، بما في ذلك الـ 4 مصابيح البيضاء وشريحة الاستشعار TAOS TCS3200 RGB .

توفر الأربعة  LED البيضاء مصدر إضاءة واسع الطيف . كما يحتوي TCS230 على مصفوفة  8 × 8  من الثنائيات الضوئية مع مرشحات ملونة (16 أحمر ، 16 أزرق ، 16 أخضر ، 16 شفاف) . حيث يولّد محول الضوء إلى التردد موجة مربعة لدورة التشغيل بنسبة 50٪ على دبوس الخرج. التردد يتناسب طرديا مع شدة الضوء .

توسيع نطاق الإخراج 100 ٪ ، 20 ٪ و 2 ٪ يسمح بمجموعة ديناميكية واسعة من الشدة .

اللون المحدد (S2 ، S3) ، مقياس التردد (S0 ، S1) والإخراج هو مستوى منطق TTL ويمكن توصيله مباشرة بوحدة التحكم الصغيرة .

القراءات الأساسية سهلة باستخدام أمر اردوينو “pulsein”. خذ قراءة لكل لون , حيث القراءة مع أضيق عرض النبضة أو أعلى تردد هو اللون الرئيسي .

في هذا المشروع , نتعرف علي طريقة كشف الالون وذلك من خلال تقريب أي لون من الالوان الثلاث ” أحمر , أصفر والأخضر ” الي الحساس نلاحظ أضاءة اللون المشابه , وبذلك نعني عندما نقرب رقاقة ذات لون أخضر مثلا , نلاحظ أضاءة الليد الاخضر مباشرة  وهكذا .

متطلبات المشروع

  1. Arduino Uno
  2. USB Cable type A to B
  3. Female to male jumper wire
  4. Male to male jumper wire
  5. LED (Red, Green and Blue)
  6. 470 ohm
تنبيه : في حال لم تكن متأكد من قدرتك على تنفيذ خطوات المشروع يرجى استشارة شخص متخصص في هذا المجال.

طريقة العمل والتوصيل

FIGQ0XFJ5IG0KP2.LARGE

توضح الصور أعلاه التوصيل البسيطة بين Color Sensor و Arduino UNO :

 

vcc > 5v
GND > GND
SO > D3
S1 > D4
S2 > D5
S3 > D6
OUT > D2
Connection between LED and Arduino UNO :

Red LED > D8
Green LED > D9
Blue LED > D10

بعد الانتهاء من الاتصال ، قم بتوصيل Arduino بمصدر الطاقة باستخدام كابل USB .

الكـــــود البرمجي

لتحميل الكود البرمجي اضغط هنا
int s0=3,s1=4,s2=5,s3=6;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;

const short LED_RED = 8;
const short LED_GREEN = 9;
const short LED_BLUE = 10;

void setup()
{
  Serial.begin(115200);
  pinMode(s0,OUTPUT);
  pinMode(s1,OUTPUT); 
  pinMode(s2,OUTPUT);
  pinMode(s3,OUTPUT);
  
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
  
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_GREEN, LOW);
  digitalWrite(LED_BLUE, LOW);
}

void TCS()
{
  digitalWrite(s1,HIGH);
  digitalWrite(s0,LOW);
  flag=0;
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer2_init();
}

void ISR_INTO()
{
  counter++;
}

void timer2_init(void)
{
  TCCR2A=0x00;
  TCCR2B=0x07; //the clock frequency source 1024 points
  TCNT2= 100;    //10 ms overflow again
  TIMSK2 = 0x01; //allow interrupt
}

int i=0;

ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
  TCNT2=100;
  flag++;
  if(flag==1)
  {
   counter=0;
  }
  else if(flag==2)
  {
   digitalWrite(s2,LOW);
   digitalWrite(s3,LOW); 
   countR=counter/1.051;
   Serial.print("red=");
   Serial.println(countR,DEC);
   digitalWrite(s2,HIGH);
   digitalWrite(s3,HIGH);   
  }
  else if(flag==3)
  {
   countG=counter/1.0157;
   Serial.print("green=");
   Serial.println(countG,DEC);
   digitalWrite(s2,LOW);
   digitalWrite(s3,HIGH); 
  }
  else if(flag==4)
  {
    countB=counter/1.114;
    Serial.print("blue=");
    Serial.println(countB,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
  }
  else
  {
    flag=0; 
    TIMSK2 = 0x00;
  }
  counter=0;
  delay(2);
}

void loop()
{
 delay(10);
 TCS();
 if((countR>10)||(countG>10)||(countB>10))
  {
     if((countR>countG)&&(countR>countB))
      {
          digitalWrite(LED_RED, HIGH);
          digitalWrite(LED_GREEN, LOW);
          digitalWrite(LED_BLUE, LOW);
           Serial.print("red");
           Serial.print("\n");
           delay(1000);
      }
     else if((countG>=countR)&&(countG>countB))
      {
          digitalWrite(LED_RED, LOW);
          digitalWrite(LED_GREEN, HIGH);
          digitalWrite(LED_BLUE, LOW);
           Serial.print("green");
           Serial.print("\n");
           delay(1000);
      } 
    else if((countB>countG)&&(countB>countR))
     {
          digitalWrite(LED_RED, LOW);
          digitalWrite(LED_GREEN, LOW);
          digitalWrite(LED_BLUE, HIGH);
           Serial.print("blue");
           Serial.print("\n");
          delay(1000);
     }
   }
   else 
   {
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_GREEN, LOW);
      digitalWrite(LED_BLUE, LOW);     
      delay(1000);       
   }
}

نتائج التجربة

اترك تعليقاً



لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *