نظرتان چیست با آردوینو یک آفتاب پرست بسازیم!!!؟
به این صورت که به کمک یک LED RGB و ماژول تشخیص رنگ TCS3200 رنگ جسم مورد نظر را نشان دهیم 🙂 ماژول TCS3200 به نوع خود یکی از پرکاربردر ترین ماژول های تشخیص رنگ می باشد. در این نوع ماژول از سنسور RGB TCS3200 به همراه ۴ عدد ال ای دی سفید استفاده شده است.این ماژول قادر به شناسایی و اندازه گیری طیف بی نهایتی از رنگ ها می باشد.مجموعه ای از فیلتر های قرمز ، آبی ، سبز بر روی این سنسور قرار گرفته اند.سنسور با توجه به شدت رنگ دریافتی ، یک موج مربعی شکل با فرکانس متناسب آن رنگ به خروجی ارسال میکند.در ادامه آموزش با مرجع تخصصی آردینو ، دیحی اسپارک همراه باشید.
خب بریم سراغ انجام پروژه، آماده اید!!!؟
سخت افزار مورد نیاز
LED RGB,مقاومت ۳۳۰ اهم
اتصالات
اتصال S0 ماژول به پین ۸ آردوینو
اتصال S1 ماژول به پین ۹ آردوینو
اتصال S2 ماژول به پین ۱۰ آردوینو
اتصال S3 ماژول به پین ۱۱ آردوینو
اتصال OUT ماژول به پین ۲ آردوینو
اتصال VCC ماژول به ۵ ولت آردوینو
اتصال GND ماژول به GND آردوینو
اتصال پایه بلند تر LED RGB(کاتود) به ۵ولت آردوینو
اتصال سه پایه ی دیگر LED RGB به مقامت و پین ۳،۵و ۶ آردوینو
نکته مهم: در این مثال از LED RGB نوع کاتود استفاده کردیم که نوع بسته شدن آن با آنود فرق دارد در نوع آنود پایه ی بلند تر به زمین به همراه مقاومت وصل میشود و پایه های کوتاه تر به پین ها ولی در نوع کاتود پایه ی بلندتر به ۵ ولت و بقیه پایه ها مانند مثال به همراه مقاومت به پینها متصل میشوند.
برای کامپایل شدن برنامه نیاز به کتابخانه 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 12 ولت وصل کنم چه تغییری باید بدم
با سلام و تشکر از شما
دقت داشته باشید که 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 استپر موتور باشه؟
باسلام
بایستی در کدهای پروژه تغییرات ایجاد کنید.
سلام میخواستم ببینم اگر از ال ای دی نیوپیکسل تکی که در فروشگاه دانشجو کیت هست استفاده کنم باید چیکار کنم
با سلام
در این خصوص از آموزش زیر استفاده کنید.
استفاده از ال ای دی neopixel
سلام اگه بخوایم از ال ای دی نیوپیکسل تکی که در فروشگاه دانشجو کیت موجوده استفاده کنیم باید چیکار کنیم ممنون
باسلام
بایستی خروجی ماژول تشخیص رنگ را به کدهای رنگ نئوپیکسل تبدیل کنید. تا روی آن نمایش دهد.
سلام.
ببخشید من نمیخوام led rgb استفاده کنم.میشه بگین کجا های برنامه رو باید پاک کنم؟ اخه من من پایه دیجیتال کم دارم و نمی خوام از led rgb استفاده کنم.
ممنون
با سلام
تفاوتی در نوع ال ای دی وجود ندارد. ال ای دی را فقط به یکی از پایه ها متصل کنید.
سلام و خسته نباشید،
بنده میخوام با استفاده از این سنسور و برد آردوینو دستگاهی طراحی کنم که بتونه رنگ دو قطعه رو مقایسه کنه و به صورت دیتا روی صفحه نمایش نشون بده. مشابه دستکاه کالر متر. میشه راهنمایی بفرمایید؟
با سلام
در کدام بخش نیاز به راهنمایی دارید؟
سلام میخواستم ببینم میشه رنگ خروجی رو روی ال سی دی کاراکتر ۱۶٫۲ نمایش بدیم یعنی توی خروجی خروجی رنک رو بنویسه ؟
سلام
منظورتون کد رنگ هست؟