جلسه نهم : راه اندازی ال ای دی RGB

سلام و عذر خواهی بابت تاخیر در آپلود کردن جلسه ها.
این جلسه قصد داریم در مورد ال ای دی های RGB حرف بزنیم. این که منطق کارشون چیه و با آردوینو چطوری باید راه اندازیشون کنیم.

خب اول میریم سراغ معرفی خود این ال ای دی ها. برای این که با تکنولوژی RGB آشنا بشید یه سری به این لینک بزنید و برگردید.

LED-RGB-8CD5kCA

قسمت اول ماجرا با کمک دوستان حل شد. میریم سراغ کار اصلی خودمون اتصال این ال ای دی به آردوینو. همونطوری که تو عکس بالا می بینید 4 تا پایه داره. سه پایه مربوط به رنگه و یک پایه مربوط به زمین. مسلمه که گراند(زمین) به گراند آردوینو وصل می شه، میمونن اون سه تا پایه. اون سه تا پایه باید به پین های دیجیتال آردوینو وصل بشن ولی سوالی که پیش میاد اینه که به هر پین دیجیتال دلخواه یا یه سری پین خاص. برای این که بفهمیم باید چیکار کنیم یه کم توضیح میدم:

ببینید ما یه موقع میخوایم رنگ سفید تولید کنیم. برای تولید این رنگ باید از سه رنگ قرمز، سبز و آبی با درصد های مساوی استفاده کنیم. یه موقع می خوایم رنگ بنفش تولید کنیم. برای رنگ بنفش درصد رنگ سبز با درصد رنگ قرمز صد در صد مساوی نیست (طبق قانون ترکیب رنگ ها ). حالا، گفتیم که پین های ال ای دی به پین های دیجیتال آردوینو وصل میشن. اگه قرار باشه مثل پروژه های قبل با دستور digitalWrite کار کنیم نمی تونیم برای هر رنگ درصد قائل بشیم و رنگ های مختلف ایجاد کنیم علتش اینه که وقتی می نویسیم (digitalWrite(8,HIGH داریم ولتاژ ( دقت کنید ولتاژ ) پین 8 رو 5 ولت می کنیم. وقتی می نویسیم (digitalWrite(8,LOW داریم ولتاژ این پایه رو صفر می کنیم. ما برای تولید رنگ بنفش ولتاژی که به سه تا پایه میدیم نباید مساوی باشه بلکه مثلا یکی باید 5 باشه یکی باید 3 باشه یکی باید 1.5 باشه. خب چاره چیه؟ چجوری ولتاژ متفاوت تولید کنیم؟

راه حل استفاده از PWM هست. اول یه سری به این لینک بزنید و ببینید که PWM چیه؟
با کمک منطق PWM و کد نویسی می تونیم یه کاری بکنیم که روی پایه های دیجیتال ولتاژ های بین 0 و 5 ولت بیفته. دستوری که با کمک اون از PWM استفاده می کنیم دستور analogWrite هست. مثلا (analogWrite(9,255
این دستور دو تا آرگومان داره. آرگومان اول شماره پین دیجیتال مورد نظره. آرگومان دوم یک عدد در بازه 0 تا 255 هست. وقتی صفر میدیم روی پایه دیجیتال شماره 9 ولتاژ 0 ولت می افته وقتی 255 می نویسیم روی پایه دیجیتال 9 ولتاژ 5 ولت می افته. یعنی یک تناسب بین عدد آرگومان دوم ما و ولتاژی که روی پین دیجیتال می افته وجود داره. حالا اگه قرار باشه ولتاژ 2.5 ولت روی پین 9 بیفته به جای 255 عدد 127 رو می نویسیم. یعنی میشه (analogWrite(9,127.
حالا آیا میشه به جای این پین شماره 9 هر پین دیجیتالی رو نوشت؟ جواب منفیه! پین های دیجیتالPWM آردوینو خاص هستن مثلا روی آردوینو UNO پین های PWM پین های شماره 3, 5, 6, 9, 10 و 11 هستن و تنها از این پین ها استفاده میشه. برای این که راحت تر پیداشون کنین روی برد کنار پین های PWM یه علامت مد کشیده شده:
dsku-fidhsfudhsfdsfidhsi00001
تا این جای جلسه منطق حاکم بر پروژه رو گفتیم الان میریم سراغ انجام خود پروژه عملیمون: می خوایم سه رنگ اصلی (قرمز، سبز وآبی ) رو با توالی 1 ثانیه روشن کنیم. مداری که استفاده می کنیم به صورت زیره:
learn_arduino_fritzing

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

2015-09-13_11-45-17

اگه دقت کنید این کد به 4 بخش تقسیم شده. بخش اول هدر برنامه هست که متغیر های گلوبال رو توش تعریف کردیم (قبلا هم تاکید کردم حتما یه سری به برنامه نویسی بزنید). الان ما تو هدر برناممون اومدیم شماره پین های PWM مورد نظرمون رو (یعنی 9 و 10 و11) ریختیم توی سه تا متغیر. فایده این کار چیه؟ آخر برنامه میگم 😆

قسمت دوم برنامه که تابع setup هست اومدیم پین های دیجیتال استفاده شده رو output کردیم با این کار پین های دیجیتالمون رو کانفیگ کردیم.

قسمت سوم تابع RGB هست. اومدیم یک تابع نوشتیم که به وسیله اون رنگ ال ای دی RGB مون رو تغییر میدیم. به فرم نوشتن تابع دقت کنید. تابع سه تا ورودی اینتیجر گرفته که مقادیر پین های دیجیتال هستن. این مقادیر با دستور analogWrite توی پین های دیجیتال ریخته میشن.

و اما قسمت چهارم، تابع LOOP. توی این تابع 6 بار تابع RGB صدا زده میشه. دفعه اول (RGB(200,0,0 صدا زده میشه و با این کار نور قرمز روی ال ای دی با قدرت 200 ظاهر میشه (دقت کنید اگه به جای 200، 255 میزاشتیم با توان بیشتری ال ای دی روشن میشد ولی برای جلوگیری از خطر کور شدن میزاریمش 200 حتی شما اگه بزارینش 100 بازم بهتره). بعد تابع delay رو داریم که مدت 1 ثانیه صبر میکنه و تو این یک ثانیه رنگ ال ای دی قرمزه. بعد از delay تابع (RGB(0,0,0 رو داریم. با این دستور داریم ال ای دی رو خاموش می کنیم تا برای مرحله بعد که تولید رنگ سبزه آماده بشه. تا آخر تابع loop همینطوری پیش میره و رنگ ها یکی پس از دیگری نمایش داده میشن.

پروژه ما اینجا تموم شد. اما:
1.اگه خواستید رنگ سفید درست کنید چون باید هر سه رنگ به یک میزان وجود داشته باشن از دستور (RGB(200,200,200 استفاده کنید.
2.اگه یادتون باشه تو هدر برنامه گفتم شماره پین ها رو می ریزیم تو متغیر. فایده این کار چیه ؟ فرض کنید به هر دلیلی پین شماره 10 آردوینو شما سوخت و شما تصمیم گرفتید به جای استفاده از پین PWM شماره 10 از پین PWM شماره 6 استفاده کنید. علاوه بر این که از لحاظ سخت افزاری باید تغییر مورد نظر رو انجام بدید باید توی کدنویسی تون هم این تغییر رو لحاظ کنید. الان که شماره پین تو هدر برنامه تعریف شده شما فقط و فقط همون خط معرفی پین شماره 10 رو به پین شماره 6 تغییر می دید. ولی اگه تو هدر برنامه شماره پین رو تو متغیر نریخته بودیم برای این تغییر لازم بود هم توی دستور pinMode هم توی دستور analogWrite عدد 10 رو به 6 تغییر می دادید. البته ما الان کدمون بیست خط هم نیست ولی وقتی خطوط کد نویسی زیاد بشه این کار خیلی به چشم میاد.

پایان جلسه