آردوینو آموزش آردوینو پروژه های آردوینو

آموزش اتصال ماژول تشخیص رنگ TCS3200 به آردوینو

آموزش اتصال ماژول تشخیص رنگ به آردوینو
نوشته شده توسط شهاب کمالی

نظرتان چیست با آردوینو  یک آفتاب پرست بسازیم!!!؟

به این صورت که به کمک یک LED RGB و  ماژول تشخیص رنگ TCS3200 رنگ جسم مورد نظر را نشان دهیم 🙂 ماژول TCS3200 به نوع خود یکی از پرکاربردر ترین ماژول های تشخیص رنگ می باشد. در این نوع ماژول از سنسور RGB TCS3200  به همراه  ۴ عدد ال ای دی سفید استفاده شده است.این ماژول قادر به شناسایی و اندازه گیری طیف بی نهایتی از  رنگ ها می باشد.مجموعه ای از فیلتر های قرمز ، آبی ، سبز بر روی این سنسور قرار گرفته اند.سنسور با توجه به شدت رنگ دریافتی ، یک موج مربعی شکل با فرکانس متناسب آن رنگ به خروجی ارسال میکند.در ادامه آموزش با مرجع تخصصی آردینو ، دیحی اسپارک همراه باشید.

آفتاب پرست

آفتاب پرست

 

خب بریم سراغ انجام پروژه، آماده اید!!!؟

 

 


 

 

نکته مهم:  در این مثال از LED RGB نوع کاتود استفاده کردیم که نوع بسته شدن آن با آنود فرق دارد در نوع آنود پایه ی بلند تر به زمین به همراه مقاومت وصل میشود و پایه های کوتاه تر به پین ها ولی در نوع کاتود پایه ی بلندتر به ۵ ولت و بقیه پایه ها مانند مثال به همراه مقاومت به پینها متصل میشوند.

اتصالات

اتصالات

اتصال Arduino به ماژول تشخیص رنگ

اتصال Arduino به ماژول تشخیص رنگ


 

برای کامپایل شدن برنامه نیاز به کتابخانه Metro.h دارید.دانلود کنید.

پس از دانلود آن را از حالت فشرده خارج کنید و در مسیر نصب آردوینو در پوشه libraries کپی کنید.

یا از محیط آردوینو ازمنوی Sketch–>Import Library–>add library فایل کتابخانه را به آردوینو اضافه کنید سپس یک بار محیط را ببندید و باز کنید.

کدنویسی:

#include <Metro.h>  // library
#include <math.h>
Metro ledlightup = Metro(60);
Metro processdata = Metro(50);
Metro TcsTrigger = Metro(10);

int s0=8,s1=9,s2=10,s3=11; // port definition of color sensor
int out=2;
int flag=0;  // initialization
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
  Serial.begin(115200);
  pinMode(s0,OUTPUT);
  pinMode(s1,OUTPUT);
  pinMode(s2,OUTPUT);
  pinMode(s3,OUTPUT);

  analogWrite(3,0);
  analogWrite(5,0);
  analogWrite(6,0);

}

void TCS()
{
  digitalWrite(s0,HIGH);
  digitalWrite(s1,HIGH);
  attachInterrupt(0, ISR_INTO, CHANGE);

}

void ISR_INTO()
{
  counter++;
}

int Raverage = 0;
int Baverage = 0;
int Gaverage = 0;

void loop()       //   call function
{
  TCS();
  if(TcsTrigger.check()){
    Tcstrigger();
  }
  if(processdata.check()){
    procedata();
  }
  if(ledlightup.check()){
   ledup();
  }

}
void Tcstrigger()  //   data acquisition
{
      flag++;
    if(flag==1){
      digitalWrite(s2,LOW);
      digitalWrite(s3,LOW);
      countR=counter;
      digitalWrite(s2,HIGH);
      digitalWrite(s3,HIGH);
    }
    else if(flag==2){
      countG=counter;
      digitalWrite(s2,LOW);
      digitalWrite(s3,HIGH);

    }
    else if(flag==3){
      countB=counter;
      digitalWrite(s2,LOW);
      digitalWrite(s3,LOW);
      flag=0;
    }
    counter=0;
}

void  procedata()        // data processing
{
      static int Rinput[5] ={
      ۰,۰,۰,۰,۰                }
    ,Binput[5] ={
      ۰,۰,۰,۰,۰                }
    ,Ginput[5] ={
      ۰,۰,۰,۰,۰                };

    for(int i = 4;i > 0;i--){
      Rinput[i] = Rinput[i-1];
      Binput[i] = Binput[i-1];
      Ginput[i] = Ginput[i-1];
    }

    if(countR < 2500)
      Rinput[0] = countR;
    else
      Rinput[0] = Rinput[1];

    if(countB < 2500)
      Binput[0] = countB;
    else
      Binput[0] = Binput[1];

    if(countG < 2500)
      Ginput[0] = countG;
    else
      Ginput[0] = Ginput[1];

    Raverage = 0;
    Baverage = 0;
    Gaverage = 0;

    for(int i = 0;i <= 4;i++){
      Raverage += Rinput[i];
      Baverage += Binput[i];
      Gaverage += Ginput[i];
    }
    Raverage /= 5;
    Baverage /= 5;
    Gaverage /= 5;

}

void  ledup()     // data output
{
    int ledvalueR = Raverage;
    int ledvalueG = Gaverage;
    int ledvalueB = Baverage;

    ledvalueR = constrain(ledvalueR,350,1700);
    ledvalueB = constrain(ledvalueB,350,1500);
    ledvalueG = constrain(ledvalueG,350,1650);
     Serial.print("R:");
    Serial.print(Raverage,DEC);
    Serial.print(" ");
    Serial.print(ledvalueR,DEC);
    Serial.print("B:");
    Serial.print(Baverage,DEC);
    Serial.print(" ");
    Serial.print(ledvalueB,DEC);
    Serial.print("G:");
    Serial.print(Gaverage,DEC);
    Serial.print(" ");
    Serial.println(ledvalueG,DEC);


    ledvalueR = map(ledvalueR,350,1700,0,255);
    ledvalueB = map(ledvalueB,350,1500,0,255);
    ledvalueG = map(ledvalueG,350,1650,0,255);

    analogWrite(3,255-ledvalueR);
    analogWrite(6,255-ledvalueB);
    analogWrite(5,255-ledvalueG);

}

 شرح برنامه:

در تابع زیر مقدار های خوانده شده از سنسور که در بازه های ۳۵۰ تا ۱۷۰۰ است در بازه ۰تا ۲۵۵ تبدیل میکند که مقدار رنگ هر رنگ قرمز، سبز و آبی را بین ۰تا ۲۵۵ در خروجی و پورت آنالوگ برای روشن شدن ال ای دی نمایش میدهد.

void  ledup()     // data output
{
    int ledvalueR = Raverage;
    int ledvalueG = Gaverage;
    int ledvalueB = Baverage;

    ledvalueR = constrain(ledvalueR,350,1700);
    ledvalueB = constrain(ledvalueB,350,1500);
    ledvalueG = constrain(ledvalueG,350,1650);
    Serial.print("R:");
    Serial.print(Raverage,DEC);
    Serial.print(" ");
    Serial.print(ledvalueR,DEC);
    Serial.print("B:");
    Serial.print(Baverage,DEC);
    Serial.print(" ");
    Serial.print(ledvalueB,DEC);
    Serial.print("G:");
    Serial.print(Gaverage,DEC);
    Serial.print(" ");
    Serial.println(ledvalueG,DEC);


    ledvalueR = map(ledvalueR,350,1700,0,255);
    ledvalueB = map(ledvalueB,350,1500,0,255);
    ledvalueG = map(ledvalueG,350,1650,0,255);

    analogWrite(3,255-ledvalueR);
    analogWrite(6,255-ledvalueB);
    analogWrite(5,255-ledvalueG);

}

 

در قسمت زیر چون ما از LED RGB کاتود استفاده کردیم یکبار مقدار را از ۲۵۵ کم کردیم ولی اگر LED RGB آنود داشتیم نیازی به کم کردن مقدار از ۲۵۵ نداریم:

analogWrite(3,255-ledvalueR);
    analogWrite(6,255-ledvalueB);
    analogWrite(5,255-ledvalueG);

خروجی:

مقدار R شدت رنگ قرمز ۰ تا ۲۵۵ است.مقدار G شدت رنگ سبز ۰ تا ۲۵۵ است.مقدار B شدت رنگ آبی ۰ تا ۲۵۵ است.

خروجی سنسور تشخیص رنگ

خروجی سنسور تشخیص رنگ

 

 

درباره نویسنده

شهاب کمالی

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۶ دیدگاه

    • درود.
      بله. برای این منظور باید از واسط‌های دیگری استفاده کرد.
      به عنوان مثال میتوان از طریق یک ماژول بلوتوث اطلاعات رنگ را برای گوشی اندروید ارسال کرد.

    • با سلام
      ضمن تشکر از توجه شما، پیرو سوال شما، بنده مجددا کدها را روی آردوینو آپلود کردم و مشکلی نداشتند. ولی برای این منظور تغییراتی در سطرهای ۳ تا ۵ داده شد. لطفا مجددا بررسی کنید.

    • با سلام و تشکر از شما
      دقت داشته باشید که LED RGB رشته‌ای دارای چند مدل می‌باشد به طور معمول یک مدل ۴ سیمه دارد که عملکرد آن با این آموزش یکسان است. مدل دیگری دارد که به Neopixel معروف است و فقط با یک پین آردوینو و موج مربعی PWM کار می‌کند. اگر این نوع باشد دیگر با کدهای این آموزش کارایی نخواهد داشت.

  • سلام
    به نظرم این قسمت کد مشکل داره اگه میشه بررسی کنین
    void Tcstrigger() // data acquisition
    {
    flag++;
    if(flag==1){
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
    countR=counter;
    digitalWrite(s2,HIGH);
    digitalWrite(s3,HIGH);
    }
    else if(flag==2){
    countG=counter;
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH);

    }
    else if(flag==3){
    countB=counter;
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
    flag=0;
    }
    counter=0;
    }
    وقتی سنسور رنگ رو روی شئ قرمز میگیرم led رنگ سبز رو نشون میده و اینکه برای پایه های s3و s2 تو دیتا شیت مقادیری دیگه تعریف شده که مثه کد شما نیست
    خواهشا توضیح بدین

    • با سلام
      خب در این صورت می‌توانید پایه‌ها را جابجا کنید. ممکن است در کالای مورد استفاده جنابعالی موارد متفاوت باشد. سپس نتیجه را از همین طریق اطلاع رسانی کنید.

  • سلام
    ممنون از مطالب خوبتون
    من نیاز دارم که تشخیص رنگ همراه با صدا باشه مثلا اگر رنگ آبی رویت شد صدا از از برد خارج بشه
    ممنون میشم راهنمایی کنید چون خیلی نیاز دارم
    مجددا تشکر

  • با سلام
    ماژول تشخیص رنگ میتونه طیف رنگهای مایع به رنگ صورتی کم رنگ تا پررنگ رو تشخیص بده
    ممنون میشم برام نتیجه رو ایمیل هم بکنید
    Mr.sa***********i67@gmail.com

    • با سلام
      سنسورهای مختلفی وجود دارند. در اثر برگشت نور از محیط، سنسور رنگ را تشخیص میدهد. در خصوص درخواست شما میبایست دیتاشیت کالاها را بررسی بفرمایید.

  • سلام.
    ببخشید من نمیخوام led rgb استفاده کنم.میشه بگین کجا های برنامه رو باید پاک کنم؟ اخه من من پایه دیجیتال کم دارم و نمی خوام از led rgb استفاده کنم.
    ممنون

    • با سلام
      تفاوتی در نوع ال ای دی وجود ندارد. ال ای دی را فقط به یکی از پایه ها متصل کنید.

  • سلام و خسته نباشید،
    بنده میخوام با استفاده از این سنسور و برد آردوینو دستگاهی طراحی کنم که بتونه رنگ دو قطعه رو مقایسه کنه و به صورت دیتا روی صفحه نمایش نشون بده. مشابه دستکاه کالر متر. میشه راهنمایی بفرمایید؟

  • سلام میخواستم ببینم میشه رنگ خروجی رو روی ال سی دی کاراکتر ۱۶٫۲ نمایش بدیم یعنی توی خروجی خروجی رنک رو بنویسه ؟