جلسه پنجم:خروجی آنالوگ PWM در آردوینو
در این مبحث از آموزش آردوینو ما می خواهیم با استفاده از کد دستوری analogWrite() میزان روشنایی یک لامپ ال ای دی را کنترل کنیم. AnalogWrite از مدولاسیون پهنای پالس (PWM) استفاده می کند. توسط PWM می توان یک پین دیجیتال آردوینو را با سرعت زیاد صفر و یک کرد. حال هر چقدر تعداد دفعات روشن و خاموش شدن آن پین دیجیتال در یک ثانیه بیشتر باشد ولتاژی نزدیکتر به VCC یا همان 5 ولت بر روی خروجی پایه ظاهر می گردد و بلعکس هر چقدر تعداد دفعات متناوب (صفر و یک شدن) در یک ثانیه کمتر باشد، ولتاژی نزدیک به GND یا همان 0 ولت بر روی خروچی پایه ظاهر می گردد.
قطعات مورد نیاز
:: آردوینو Arduino Uno برد
:: یک عدد لامپ LED پنج یا سه میلی متری
:: یک عدد مقاومت با مقدار 220 اهم
:: جامپر برد بوردی سیم
:: برد بورد
توضیحات پروژه
برای راه اندازی لامپ LED و اتصال آن به برد آردوینو باید همانند نقشه شماتیک زیر عمل کنید، به این صورت پایه بلند لامپ ال ای دی که نشان دهنده پلاریته مثبت آن است را به واسطه مقاومت 220 اهمی به پایه دیجیتال شماره 9 بر روی آردوینو متصل کنید. و پایه کوتاهتر لامپ ال ای دی که نشان دهند پلاریته منفی آن است را به منفی منبع تغذیه یا پایه GND بر روی آردوینو متصل کنید.
تعریف پایه آردوینو به عنوان خروجی
بعد از اینکه لامپ LED را همچون دو تصویر بالا به برد آردوینو خود متصل کردید، در اولین خط برنامه توسط دستور زیر، در تابع setup() پایه دیجیتال شماره 9 آردوینو را که به پلاریته مثبت لامپ ال ای دی متصل شده است، را خروجی تعریف می کنیم. همانطور که در دستور زیر مشاهده می کنید ما LED را خروجی قرار داده ایم، که در حقیقت LED یک متغیر از جنس Int می باشد که در شروع برنامه آنرا با نام LED از جنس Int تعریف کرده ایم و مقدار اولیه 9 به آن داده ایم. به زبان ساده تر می توان گفت در این دستور ما پایه شماره 9 آردوینو را خروجی تعریف کرده ایم.
pinMode(led, OUTPUT); |
تولید پالس PWM در آردوینو
در ادامه برای استفاده از PWM نیاز است توسط تابع analogWrite() آنرا فراخوانی کنیم. که برای این منظور در حلقه اصلی برنامه از دستور زیر استفاده می کنیم. برای استفاده از تابع analogWrite() نیاز به دو آرگومان داریم. اولین آرگومان شماره پایه ای است که قرار است پالس های PWM بر روی آن اعمال گردد، و دومین آرگومان تعین مقدار تناوب در یک ثانیه است.
همانطور که در دستور زیر مشاهده می کنید، در تابع analogWrite() ابتدا توسط متغیر LED که با عدد 9 مقدار دهی شده است پایه مورد نظر در آردوینو برای اعمال پالس های PWM را مشخص کرده ایم و سپس توسط متغیر brightness که یک متغیر از جنس Int با مقدار اولیه 0 می باشد را برای تعیین مقدار تناوب در یک ثانیه مشخص کرده ایم.
در تابع analogWrite() مقدار متغیر PWM می تواند عددی بین حداقل 0 الی حداکثر 255 باشد. همانطور که پیشتر ذکر شد در این تابع ما برای اعلام مقدار PWM از متغیری به نام brightness استفاده کردیم. به این ترتیب در هر بار اجرای تابع analogWrite() در حلقه برنامه ، اگر متغیر brightness با عدد 0 مقدار دهی شود حاصل پالس های اعمالی بر روی پایه PWM برابر با ولتاژ صفر خواهد شد، و اگر متغیر brightness با عدد 255 مقدار دهی شود حاصل پالس های اعمالی بر روی پایه PWM برابر با ولتاژ 5 ولت یا VCC خواهد شد. همچنین اگر متغیر brightness با عددی مابین 0 الی 255 مقدار دهی شود، بسته به عدد مقدار دهی شده، حاصل پالس های اعمالی بر روی پایه PWM برابر با ولتاژ متغیر صفر الی 5 ولت خواهد شد.
analogWrite(led, brightness); |
شرح عملکرد پروژه
در این مثال ما می خواهیم نور LED به صورت لحظه ای از روشنایی کم به روشنایی زیاد تغییر یابد و سپس نور ال ای دی از روشنایی زیاد به صورت لحظه ای به روشنایی کم تغییر کند و این عمل تا مادامی که آردوینو روشن است تکرار شود. به همین دلیل در ادامه برنامه نویسی در خط بعدی برنامه با استفاده از دستور زیر، مقدار متغیر brightness را در هر بار اجرای حلقه با مقدار متغیر fadeAmount جمع می کنیم. لازم به ذکر است متغیر fadeAmount نیز از جنس Int می باشد که همانند دیگر متغیرها در ابتدای شروع برنامه تعریف شده است و با عدد 5 مقدار دهی شده است.
همانطور که در دستور زیر مشاهده می کنید هر بار که دستور زیر در حلقه اجراء می شود، با استفاده از متغیر fadeAmount که با عدد 5 مقدار دهی شده است، به مقدار متغیر brightness تعدا 5 عدد اضافه می شود.
brightness = brightness + fadeAmount;
همانطور که در قسمت تابع analogWrite() توضیح دادیم، مقدار PWM می تواند بین حداقل 0 الی حداکثر 255 باشد. به این ترتیب با توجه به دستور بالا که در هر بار اجرا به مقدار brightness تعداد 5 عدد اضافه می شود، برای جلوگیری از زیاد شدن مقدار متغیر از 255 توسط دستور زیر شرطی می نویسیم که توسط آن به آردوینو دستور می دهیم، در هر بار تکرار حلقه متغیر brightness را بررسی کند و هر زمانیکه مقدار متغیر brightness از 255 بیشتر-مساوی و یا از عدد brightness صفر کمتر- مساوی شد، مقدار متغیر fadeAmount را معکوس کند، به زبان ساده تر اگر متغیر fadeAmount مثبت بود آنرا منفی و بلعکس اگر متغیر fadeAmount منفی بود آنرا مثبت کند. به این ترتیب هر زمان که متغیر brightness به عدد 255 برسد، در هر بار تکرار حلقه شروع به کم شدن به مقدار هر بار 5 واحد می کند و هر زمانکه متغیر brightness به عدد صفر رسید، در هر بار تکرار حلقه شروع به زیاد شدن به مقدار هر بار 5 واحد می کند.
|
if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } |
در خط بعدی برنامه مدت زمانی را در هر بار تکرار حلقه صبر می کنیم، این مدت زمان برای این است که کاربر بتواند تغییر میزان شدت روشنایی لامپ LED را به صورت واضح درک کند. به همین خاطر توسط دستور زیر مدت زمان تاخیر را در واحد میلی ثانیه برای پردازشگر تعریف می کنیم:
delay(30); |
سورس کد برنامه در نرم افزار آردوینو
int led = 9; int brightness = 0; int fadeAmount = 5; void setup() { pinMode(led, OUTPUT); } void loop() { analogWrite(led, brightness); brightness = brightness + fadeAmount; if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } delay(30); } |