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

الموضوع في 'برمجة الاشياء arduino' بواسطة ابوفارس, بتاريخ ‏22 أكتوبر 2023.

  1. ابوفارس

    ابوفارس ادارة المنتدى إداري

    إنضم إلينا في:
    ‏12 يوليو 2014
    المشاركات:
    690
    الإعجابات المتلقاة:
    200
    نقاط الجائزة:
    43
    الجنس:
    ذكر
    مقدمــــــــة عن المشروع
    وحدة استشعار الألوان هي كاشف ألوان كامل ، بما في ذلك الـ 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
    [​IMG]

    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


    يمكنك تحميل داتاشيت الحساس من هنا

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

    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);
    }
    }
     

مشاركة هذه الصفحة