جلسه دهم آموزش آردوینو – معرفی موج های PWM و کنترل نور LED با استفاده از آن

مقدمه

با سلام خدمت همه شما دوستان گرامی.با دانشی که تا حالا بدست آوردیم میتونیم یه لامپ رو با استفاده از یک کلید on/off کنترل کنیم. حالا میخوایم یه مرحله بریم بالاتر. در این جلسه میخوایم یاد بگیریم که چطور نور یه LED رو کنترل کنیم. یعنی این نور کم و زیاد کنیم و علاوه بر حالت های روشن و خاموش حالت هایی هم باشه که LED روش باشه ولی نورش به مقداری که ما میگیم روشن باشه.پیشنهاد میکنم قبل از این که این مطلب رو بخونید مطلب زیر رو برای بهتر فهمیدن این جلسه بخونید:

معرفی موج های PWM

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

معرفی موج های PWM

دوستان یادتون هست وقتی میخواستیم یه LED رو روشن و خاموش کنیم چیکار میکردیم؟ میومدیم در یک زمان مقدار 1 رو روی پاسه قرار میدادیم و مقداری تاخیر ایجاد میکردیم. یعنی به اندازه زمان تاخیر ما روی پایه مقدار 1 منطقی ( همون 5 یا 3.3 ولت) رو داشتیم و سپس مقدار 0 منطقی( 0 ولت)  رو روی اون پایه مینوشتیم و سپس مقداری تاخیر ایجاد میکردیم به عبارت دیگه به اندازه اون تاخیر مقدار 0 منطقی روی پایه مربوطه قرار میگرفت.

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

نمونه ای از یک موج PWM

حالا بیایید یه کار کنیم. این بار تاخیر مربوط به روشن شدن LED ها رو به اندازه 25% از کل زمان تاخیر مربوط به روشن شدن و خاموش شدن قرار بدید. در این حالت مشاهده خواهید کرد که نور LED هم به اندازه 25% ماکزیمم نورش خواهد بود و همینطور به هر اندازه زمان تاخیر شما میتونید نور LED رو کنترل کنید. به این تکنیک میگن مدولاسیون پهنای باند( به انگلیسی Pulse width modulation ) که PWM هم نامیده میشه.

نمونه ای از یک موج PWM

نمونه ای از یک موج PWM

البته همینجا بگیم که این تکینک فقط برای LED نیست و در خیلی از جاها کاربرد داره. نمونه اش هم در کنترل دور موتورهای DC هست که از همین تکنیک استفاده میشه.

البته این تکنیک که بخوایم با delay  این نور رو کنترل کنیم زیاد جالب نیست و راه های بهتری هم وجود داره که در ادامه خدمت شما عرض میکنیم. علتش هم اینه که مثلا وقتی که شما میخواید داده های یه سنسور رو بخونید و یا داده ها رو از طریق پورت سریال ارسال کنید عملا دیگه دستورات delay مربوط به LED انجام نمیشه و نهایتا شما وقتی میتونید این نور رو کنترل کنید که این داده ها رو ارسال کرده باشید و این فرایند تموم شده باشه  ولی شما میخواید در حین ارسال هم این نور داشته باشید و براتون میزان نور مهمه. پس باید از یه روشی غیر از delay استفاده کنیم. خوشبختانه در پردازنده ای که به وسیله آردوینو استفاده میشه یه بخش سخت افزار جداگانه برای این کار در نظر گرفته شده که وقتی شما  دارید یه کار دیگه رو هم انجام میدید ( مثلا یه سنسور رو میخونید یا داده ها رو ارسال میکنید) بتونید نور LED ها رو هم کنترل کنید. این سخت افزار از طریق پایه های دیجیتال شماره3, 5 , 6,  9 , 10 و 11 در دسترس  هست و میتونید با استفاده از دستور analogWrite() این کار رو انجام بدید.

این دستور دو تا آرگومان ورودی داره. آرگومان اول شماره پایه ای هست که میخواید شما از اون برای کنترل نور LED تون استفاده کنید و آرگومان دوم هم عددی بین 0 تا 255 هست که خیلی دور از ذهن نیست که بدونیم عدد 0 مشابه اینه که کل این موج خروجی روی پایه مقدارش صفر هست. عدد 128 یعنی 50 درصد از موج مقدار منطقی 1 و 50 درصد از موج مقدار منطقی صفر رو داره و در نهایت عدد 255 هم یعنی کل موج مقدار منطقی 1 رو داره.

به عنوان مثال دستور analogWrite(9,128)  یعنی ما میخوایم روی پایه شماره 9 از این خاصیت استفاده کنیم و مقدار روشنایی هم از بین اعداد 0 تا 255 روی مقدار 128 تنظیم کردیم که به این معناهست که میخوایم 50 درصد از ماکزیمم نور LED روشن بشه.

تذکر
استفاده از سه تا پایه مربوط به PWM کنار هم یه خاصیت خیلی خوب داره. اونم اینه که فرض کنید شما سه LED به رنگ های قرمز و سبز و آبی (همون RGB معروف )خریدید و در این صورت میتونید با این سه تا LED کل رنگ هایی که دلتون میخواد رو بسازید.

خوب حالا میخوایم وارد قسمت مربوط به کدنویسی بشیم. ابتدا مداری که در شکل زیر اومده رو ببندید. حتما توجه دارید که LED یه قطعه پلاریته دار هست و در جلسه مربوط به پلاریته چیست؟ اون رو بررسی کردیم. پس حواستون به پایه های مربوط به LED باشه که یه وقت اون رو اشتباه نزنید. حتما میدونید که در سر راه LED باید یه مقاومت بذاریم. این موضوع رو هم در جلسه مربوط به مقاومت LED بررسی کردیم. مقاومتی که ما در اینجا استفاده کردیم مقدارش 270 اهم هست ( قرمز، بنفش، قهوه ای)

مدار مربوط به کنترل نور LED

خوب حالا یه sketch جدید ایجاد کنید و کد زیر رو در اون بنویسید:

کد مربوط به کنترل نور LED

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

خوب دیگه به پایان این جلسه هم رسیدیم. مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:

اشتراک گذاری:
مطالب زیر را حتما بخوانید

20 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • مشخصه که ما میخوایم نور ال ای دی رو کنترل کنیم چرا به جای این روش ولتاژ رو با همین عدد 255 کنترل نمیکنیم ؟

    • با سلام.در این جلسه ما قصد داشتیم که با موج های PWM آشنا شویم و به همین خاطر با آنها نور LED را کنترل میکردیم. هدف صرفا کنترل نور LED نبود. هدف در گام اول آشنا شدن و کار با موج های PWM بود.
      موفق باشید.

  • سلام، اگر بخوایم از یک نوار ال ای دی(strip) استفاده کنیم، شدت نورش چطوری تنظیم میشه؟چون من خوندم که فقط یک بار در تابعsetup این میزان توسط تابع() strip. setBrightness تنظیم میشه، اما من میخوام در طول اجرای برنامه، میزان روشنایی رو بنابر شرایطی تغییر بدم. لطفا راهنماییم کنید.

    • با سلام. لطفا دقیقا بفرمایید که از چه کتابخانه ای برای این کار استفاده میکنید و این کتابخانه متعلق به چه شرکتی می باشد؟
      کتابخانه های نوشته شده برای شرکت های معتبر ( مثل sparkfun و adafruit ) معمولا محدودیت ها را با دلایلی کاملا منطقی قرار می دهند و به همین علت تغییر آنها کمی مشکل می باشد. ولی در مورد کتابخانه های غیر استاندارد ، میتوان با کمی تغییر به خواسته خود رسید.
      موفق باشید.

  • با سلام و تشکر فراوان دوتا سوال داشتم:
    1- مقدار دوره تناوب یا در حقیقت فرکانس رو چه جوری میشه داد؟ مثلا یک PWM با فرکانس 500 هرتز یا به عبارتی با دوره تناوب 2 میلی ثانیه؟
    2-چون این دستورات پشت هم انجام میشه مثلا اگه بخواهیم چهارتا PWM رو همزمان بدیم چیکار باید کرد؟

    • با سلام خدمت شما.
      در مورد سوال اول آن که برای تعیین فرکانس ، نمی توان از دستورات مربوط به arduino استفاده کرد و باید مستقیما از خود رجیسترهای مربوط به میکروکنترلر استفاده کرد. به عنوان مثال میتوان از رجیسترهای TCCR2A و OCR استفاده کرد که از لینک زیر میتوانید توضیحات تکمیلی را مشاهده کنید:
      تعیین فرکانس موج PWM در آردوینو
      در مورد سوال دوم هم آن که به سادگی و به جای یک بار استفاده از دستور analogWrite ، چند بار و به صورت پشت سر هم از این دستور استفاده کنید و در مرحله تنها شماره پایه مربوط به پین PWM را عوض کنید.
      موفق باشید.

      • ممنونم از راهنمایی آقای مهندس.در مورد سوال دوم استفاده پشت سر هم از دستو مگه باعث تاخیر تو اجرای PWM بعدی نمیشه؟چون تو میکرو دستورات به صورت خط به خط اجرا میشه.مثلا برای یک کواد روتور که نیاز هست هر چهار PWM باهم کار کنند این دستور به مشکل بر نمی خوره؟

        • با سلام مجدد.
          فاصله set شدن بین PWM ها بسیار پایین و در حد میکروثانیه می باشد و از این بابت اگر هم مشکلی ایجاد شود به سادگی و با کالیبره کردن اسپیدکنترلرها این مشکل حل می شود.
          موفق باشید.

    • با سلام.
      در حلقه for اول ، به مرور زمان ، Duty Cycle مربوط به LED افزایش پیدا میکند و LED از مرحله خاموش کامل به مرحله روشن کامل می رسد. این مراحل در 256 گام انجام می شود. برای حلقه for دوم نیز برعکس این کار انجام می شود. یعنی LED از حالت روشن کامل به حالت خاموش کامل تغییر وضعیت می دهد.
      موفق باشید.

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