مقدمــــــــة عن المشروع
وحدة استشعار الألوان هي كاشف ألوان كامل ، بما في ذلك الـ 4 مصابيح البيضاء وشريحة الاستشعار TAOS TCS3200 RGB .
توفر الأربعة LED البيضاء مصدر إضاءة واسع الطيف . كما يحتوي TCS230 على مصفوفة 8 × 8 من الثنائيات الضوئية مع مرشحات ملونة (16 أحمر ، 16 أزرق ، 16 أخضر ، 16 شفاف) . حيث يولّد محول الضوء إلى التردد موجة مربعة لدورة التشغيل بنسبة 50٪ على دبوس الخرج. التردد يتناسب طرديا مع شدة الضوء .
توسيع نطاق الإخراج 100 ٪ ، 20 ٪ و 2 ٪ يسمح بمجموعة ديناميكية واسعة من الشدة .
اللون المحدد (S2 ، S3) ، مقياس التردد (S0 ، S1) والإخراج هو مستوى منطق TTL ويمكن توصيله مباشرة بوحدة التحكم الصغيرة .
القراءات الأساسية سهلة باستخدام أمر اردوينو “pulsein”. خذ قراءة لكل لون , حيث القراءة مع أضيق عرض النبضة أو أعلى تردد هو اللون الرئيسي .
في هذا المشروع , نتعرف علي طريقة كشف الالون وذلك من خلال تقريب أي لون من الالوان الثلاث ” أحمر , أصفر والأخضر ” الي الحساس نلاحظ أضاءة اللون المشابه , وبذلك نعني عندما نقرب رقاقة ذات لون أخضر مثلا , نلاحظ أضاءة الليد الاخضر مباشرة وهكذا .
متطلبات المشروع
- Arduino Uno
- USB Cable type A to B
- Female to male jumper wire
- Male to male jumper wire
- LED (Red, Green and Blue)
- 470 ohm
طريقة العمل والتوصيل

توضح الصور أعلاه التوصيل البسيطة بين 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);
}
}



