همانطور که در این آموزش ملاحظه کردید برنامه ای نوشتیم که LED به صورت چشمک زن روشن و خاموش می کند. اما اگر دقت کرده باشید برای نور LED حد وسطی وجود ندارد. یا کامل روشن است و یا کامل خاموش. برای اینکه بتوانیم نور LED را بطور تدریجی کم و یا زیاد کنیم باید از مدولاسیون عرض پالس یا PWM ( Pulse Width Modulation ) استفاده کنیم. و اما PWM چیست؟
PWM یک موج مربعی است که مقدار HIGH و LOW بودن آن قابل تغییر است. بخش HIGH که عرض پالس هم نامیده می شود می تواند از صفر ( کامل LOW ) تا مقدار کامل سیکل موج مربعی ( کامل HIGH ) تغییر کند. نسبت عرض پالس به پریود یا سیکل کامل موج مربعی Duty Cycle گفته می شود. ولتاژ متوسط موج PWM می تواند بین صفر تا VDD که در NodeMCU مقدار آن ۳٫۳ ولت است تغییر کند. در تصاویر زیر می توانید مفاهیم فوق را بهتر درک کنید:
تصویر A
تصویر B
خروجی آنالوگ یا Analog Output
در پلتفرم Arduino به PWM خروجی آنالوگ هم گفته می شود. می توان به روش نرم افزاری بر روی پایه های GPIO0 الی GPIO16 خروجی آنالوگ ایجاد کرد. برای کار باید از تابع analogWrite(pin, value) استفاده کرد. این تابع دو آرگومان قبول می کند. اولی نام یا شماره پایه مورد نظر و دومی عددی است که برای سیگنال آنالوگ خروجی تعیین می شود و بازه پیشفرض آن بین ۰ تا ۱۰۲۳ متغیر می باشد. اگر می خواهید مقدار محدوده بالا تغییر دهید می توانید از تابع analogWriteRange(range) استفاده کنید. مقدار فرکان PWM بطور پیشفرض ۱ کیلوهرتز است این مقدارهم می تواند با استفاده از تابع analogWriteFreq(freq) تغییر کند.
برنامه نمونه
برای برنامه نمونه از مدار ساده زیر استفاده خواهیم کرد. اگر آموزش ها را به ترتیب دنبال می کنید این همان مداری است که برای برنامه چشمک زن از آن استفاده کردیم :
برنامه زیر را در Arduino IDE وارد کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { } void loop() { // *** Increase brightness *** for (int i = 0; i <= 1023; i += 20) { analogWrite(D3, i); delay(25); } // *** Decrease brightness *** for (int i = 1023; i >= 0; i -= 20) { analogWrite(D3, i); delay(25); } } |
ساختار برنامه بسیار ساده است. همانطور که ملاحظه می کنید برای نوشتن مقدار آنالوگ نیاز به پیکربندی پین نداریم. در حلقه اصلی دو حلقه for داریم. در حلقه اول for مقدار i از ۰ تا ۱۰۲۳ در گامهای ۲۰ تایی افزایش پیدا می کند و مقدار آن توسط تابع analogWrite بر روی پایه D3 نوشته می شود و در گام توسط دستور delay یک وقفه ۲۵ میلی ثانیه ای ایجاد می گردد. حلقه دوم مانند حلقه اول است با این تفاوت که مقدار i از ۱۰۲۳ به ۰ کاهش پیدا می کند. در صورتی که خطایی در مدار و برنامه نداشته باشید پس از Upload برنامه خواهید دید نور LED به طور تدریجی زیاد و کم می شود.