RGB -آموزش آردوینو{جلسه دهم}

 

RGB

در این جلسه با نحوه کار با ال ای دی RGB و تولید رنگهای متفاوت با آن می پردازیم. در این درس می خواهیم با استفاده از تابع analogWrite نور ال ای دی را کنترل کنیم.

به طور خلاصه ال ای دی RGB از سه رنگ Red-Green-Blue تشکیل شده است. این ال ای دی در حقیقت 3 ال ای دی را درخود جای داده است که با کنترل رنگ هرکدام می توان رنگ های بسیار زیبایی را تولید کرد ما اینکار را با استفاده از پین های که علامت  مد ~ در کنارشان است انجام می دهیم. این علامت نشانه PWM در بردهای آردوینو می باشد. تابعی که کار PWM در بردهای آردوینو را برای ما انجام می دهد analogWrite نام دارد.

ال ای دی RGB چهار پایه دارد. یک پایه منفی مشترک برای هر سه ال ای دی در نظر گرفته شده و سه پایه دیگر هرکدام پایه های مثبت ال ای دی ها هستند. دقت کنید که این پایه منفی مشترک برای نوع کاتدمشترک می باشد و درصورتی که شما از نوع آند مشترک استفاده می کنید یک پایه مثبت مشترک برای هر 3 دارید.

 

 

پین منفی مشترک ال ای دی ها پین دومی از طرف سطح مسطح می باشد. همچنین ابن پایه بلندترین پایه RGB می باشد و به زمین متصل می شود.

 

هر ال ای دی برای جلوگیری از ورود جریان بیش از حد به آن به مقاومت 270 اهم نیاز دارد.

در ال ای دی های معمولی سطح مسطح به صورت زیر است:

 

 

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

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

راه حل استفاده از PWM هست. اول یه سری به لینک زیر بزنید و ببینید که PWM چیه؟

http://robotuav.blog.ir/1394/10/17/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 یه علامت مد کشیده شده:

 

 

در شکل فوق می بینید که پایه طولانی تر مربوط به کاتد مشترک(پایه دوم) به زمین وصل شده است.چنانچه از RGB آند مشترک استفاده کردیداین پایه را به +5 ولت وصل کنید.

دلیل اینکه شما هر رنگی رو میتونید با ترکیبی از رنگهای قرمز و سبز و آبی میکس کنید اینه که چشمان شما در درون خودش سه نوع رنگ(آبی-سبز-قرمز) را می پذیرد که چشمان شما و مغز شما میزان رنگهای آبی قرمز و سبز را بررسی می کند و آن را به طیف رنگ مربوطه تبدیل می کند.

در این روش در حقیقت ما با استفاده از 3 نوع رنگ یک حقه را روی چشم ها اجرا می کنیم. این ایده در تلویزیون ها هم استفاده شده است در جایی که LCD این سه رنگ را در نقطه های رنگی که به نام پیکسل شناخته می شوند در خود جای داده است.

 

 

به شکل بالا بسیار دقت کنید: گر ما شفافیت هر 3 رنگ را به یک اندازه تنظیم کنیم آنگاه رنگ سفید تولید می شود که در وسط شکل بالاست. اگر ما رنگ آبی را خاموش کنیم و رنگ های سبز و قرمز را با اندازه یکسان شفاف کنیم رنگ زرد تولید می شود که در سمت چپ شکل بالاست.

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

 

و اما کد برنامه تولید رنگها:


و اما تفسیر کدهای برنامه:

 

 

در سه خط بالا اومدیم پین هایی که قراره پایه های RGB رو بهش وصل کنیم تعیین کردیم که رنگ قرمز پایه 11 و رنگ سبز پایه 10 و رنگ آبی پایه 9 است.

همانطور که میدانید برای اینکه بتونیم از پایه هایی که برای RGB تعریف کردیم استفاده کنیم باید به آردوینو بگیم که لطفا از این پایه ها برامون ولتاژ خارج کن. هر سه تا پین را به صورت زیر خروجی قرار می دهیم. و چون فقط یکبار اینکارو انجام بده کافیه پس اون رو در تابع setup قرار می دهیم:

 

قبل از اینکه به حلقه loop برویم تابعی که در انتهای کد تعریف کردیم را باهم بررسی می کنیم. در این تابع در درون پرانتزش 3تا ورودی می بینید که اولی مربوط به روشنایی نور قرمز و دومی مربوط به روشنایی نور سبز و سومی مربوط به روشنایی نور آبی می باشد. در هر سه مورد عدد بین 0 تا 255 تغییر می کند.حداکثر روشنایی روی عدد 255 اتفاق می افتد چون رجیستر های AVR هشت بیتی هستند(256=8^2) . چون شمارش از صفر شروع میشه 256 تبدیل به 255 میشه یعنی از 0 تا 255 که معادل از 1تا 256 هست.

تابع analogWrite هم همون PWM است که نور هر ال ای دی را تغییر می دهد.

 

و اما قسمت هایی که به طور مداوم تکرار می شوند را در حلقه loop قرار می دهیم:

همانطور که میبینید برای رنگ قرمز در قسمت اول عدد 255 یعنی حداکثر روشنایی را قرار دادیم و برای ورودی های دوم و سوم عدد0 گذاشتیم پس فقط رنگ قرمز نمایان می شود. به همین ترتیب بقیه رنگ ها را بر روی RGB نمایان می کنیم و یک تاخیر 1ثانیه ای را بین آنها قرار می دهیم.

 

 

خب حالا از کجا بفهمیم که برای تولید مثلا رنگ قرمز(red) عدد ورودی ها چند باشه؟؟

فقط چیزی که هست اینه که هر رنگی برای خودش یه کد داره مثلا کد رنگ قرمز FFoooo#(دوتا حرف F و چهارتا صفر) است. برای دیدن کد بقیه رنگ ها یه سر به صفحه زیر بزنید:

http://www.devguru.com/features/colors
خب حالا یه نگاهی به عکس زیر بندازید. اون قسمتی که درون کادرش نوشتم قرمز کد مربوط به رنگ قرمزه. حالا هر رنگی شما خواستید می تونید کدشو از این سایت بردارید.

 

خب حالا بیاییم کد (255,0,0) setColor رو باهم بررسی کنیم:

همانطور که دیدید کل کدهای اعداد 6 رقم می باشد که در مبنای هگز می باشد حالا 2 رقم 2 رقم جدا کنید که 2 رقم اول(FF) مربوط به رنگ قرمز می باشد در مبنای باینری FF یعنی 11111111 که همون 255 خودمون میشه. دو رقم دومی هم که 00 است که در مبنای باینری 00000000 میشه که همون صفر دومی خودمون است و دو رقم سومی هم که باز 00 میشه که همون صفر سومی خودمون هست.

البته بدون تبدیل کردن هم میتونستیم کدهای بالا رو قرار بدیم یعنی مستقیم آدرس رنگ ها رو برداریم و بریزیم توی ورودیهای تابع مثل زیر:

  1. setColor(0xFF, 0x0, 0x0); // red

که باز همون رنگ قرمز رو تولید می کنه. در ابتدای هر یک 0x می بینید که معرف مبنای هگزادسیمال می باشد.

FF=255

00=0

00=0

برای دریافت آخرین مطالب سایت  و همچنین مطالب منحصر به فرد دیگر که در سایت منتشر نمی شوند میتوانید در کانال تلگرام ما عضو شوید و یا در اینستاگرام ما را فالوو کنید:

در پناه حق باشید.

قاسم قاسمی

دوستان قسمتی از مطالب بالا برگرفته از سایتhttp://blog.arduino.ir نوشته خانم مریم اسماعیل زاده می باشد. مطالب بسیار جالبی اونجا هست.حتما سر بزنید.

4 نظر

  • moji

    int redpin=11;
    int greenpin=10;
    int bluepin=9;
    void setup() {
    // put your setup code here, to run once:
    pinMode(redpin,OUTPUT);
    pinMode(greenpin,OUTPUT);
    pinMode(bluepin,OUTPUT);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    setColor(255,0,0); // red
    delay(1000);
    setColor(0,255,0); //green
    delay(1000);
    setColor(0,0,255); //blue
    delay(1000);
    setColor(255,255,0); //yellow
    delay(1000);
    setColor(80,0,80); //purple
    delay(1000);
    }
    void setColor(int red,int green,int blue);{
    analogWrite(redPin,red);
    analogWrite(gereenPin,green);
    analogWrite(bluepin,blue);
    }

    • حامد قاسمی

      با سلام مجدد. کد شما دارای چند اشکال می باشد:
      1- در خط شماره 1 متغیر مربوط به LED قرمز رنگ به صورت “redpin” نوشته شده است در حالی که در خط اول متغیر تابع SetColor این متغیر به صورت “redPin” نوشته شده است که باید تصحیح شود.
      2-در خط شماره 2 متغیر مربوط به LED سبز رنگ به صورت “greenpin” نوشته شده است که این متغیر در خط دوم تابع SetColor به صورت “gereenPin” آمده است و باید این مورد نیز تصحیح گردد.
      3- در تعریف تابع SetColor قبل از آن که علامت “}” در پایان خط تعریف تابع آورده شود از “;” استفاده شده است که این کار اشتباه است چون این علامت برای دستورات عادی می باشد و برای توابع به کار نمی رود. ( خطایی که می فرمودید مربوط به این اشتباه است).

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

  • moji

    سلام خسته نباشید
    ببخشید من موقع آ‍‍‍‍‍‍پلودبرنامه من به این errorبرخوردم و از نگارش برنامه هم اطمینان دارم که درست.

    error: ‘setColor’ was not declared in this scope

    setColor(255, 0, 0); // red

    • حامد قاسمی

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

  • نوشتن نظر

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

    Optionally add an image (JPEG only)