جلسه دهم آموزش آردوینو – معرفی موج های PWM و کنترل نور LED با استفاده از آن
مقدمه
با سلام خدمت همه شما دوستان گرامی.با دانشی که تا حالا بدست آوردیم میتونیم یه لامپ رو با استفاده از یک کلید on/off کنترل کنیم. حالا میخوایم یه مرحله بریم بالاتر. در این جلسه میخوایم یاد بگیریم که چطور نور یه LED رو کنترل کنیم. یعنی این نور کم و زیاد کنیم و علاوه بر حالت های روشن و خاموش حالت هایی هم باشه که LED روش باشه ولی نورش به مقداری که ما میگیم روشن باشه.پیشنهاد میکنم قبل از این که این مطلب رو بخونید مطلب زیر رو برای بهتر فهمیدن این جلسه بخونید:
معرفی موج های PWM
دوستان یادتون هست وقتی میخواستیم یه LED رو روشن و خاموش کنیم چیکار میکردیم؟ میومدیم در یک زمان مقدار 1 رو روی پاسه قرار میدادیم و مقداری تاخیر ایجاد میکردیم. یعنی به اندازه زمان تاخیر ما روی پایه مقدار 1 منطقی ( همون 5 یا 3.3 ولت) رو داشتیم و سپس مقدار 0 منطقی( 0 ولت) رو روی اون پایه مینوشتیم و سپس مقداری تاخیر ایجاد میکردیم به عبارت دیگه به اندازه اون تاخیر مقدار 0 منطقی روی پایه مربوطه قرار میگرفت.
حالا بیایید و یه جوری این 2 تا تاخیر مربوط به روشن و خاموش شدن رو عوض کنید که چشمک زدن LED قابل مشاهده نباشه. یعنی LED بین روشنی و خاموشی قرار بگیره. توجه داشته باشید که در این حالت هم LED روشن و خاموش میشه ولی این روشن و خاموش شدن به قدری سریع هست که چشم ما نمیتونه اون رو تشخیص بده و فقط یه مقدار نور بسته به اون تاخیرها میبینه. اگه زمان این تاخیرها یکی باشه LED دقیقا 50 درصد نور اصلی خودش رو داره.
حالا بیایید یه کار کنیم. این بار تاخیر مربوط به روشن شدن LED ها رو به اندازه 25% از کل زمان تاخیر مربوط به روشن شدن و خاموش شدن قرار بدید. در این حالت مشاهده خواهید کرد که نور LED هم به اندازه 25% ماکزیمم نورش خواهد بود و همینطور به هر اندازه زمان تاخیر شما میتونید نور LED رو کنترل کنید. به این تکنیک میگن مدولاسیون پهنای باند( به انگلیسی Pulse width modulation ) که 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 روشن بشه.
خوب حالا میخوایم وارد قسمت مربوط به کدنویسی بشیم. ابتدا مداری که در شکل زیر اومده رو ببندید. حتما توجه دارید که LED یه قطعه پلاریته دار هست و در جلسه مربوط به پلاریته چیست؟ اون رو بررسی کردیم. پس حواستون به پایه های مربوط به LED باشه که یه وقت اون رو اشتباه نزنید. حتما میدونید که در سر راه LED باید یه مقاومت بذاریم. این موضوع رو هم در جلسه مربوط به مقاومت LED بررسی کردیم. مقاومتی که ما در اینجا استفاده کردیم مقدارش 270 اهم هست ( قرمز، بنفش، قهوه ای)
خوب حالا یه sketch جدید ایجاد کنید و کد زیر رو در اون بنویسید:
البته دوستان ما این کد رو برای شما توضیح نمیدیم و از این به بعد باید خودتون دیگه بشینید و کدها رو تحلیل کنید تا خوب آردوینو رو یاد بگیرید ولی اگه نشستید و فکر کردید و جاییش رو مشکل داشتید بفرمایید تا ما به صورت کامل برای شما توضیح بدیم.
خوب دیگه به پایان این جلسه هم رسیدیم. مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:
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 رو شرح دهید
با سلام.
در حلقه for اول ، به مرور زمان ، Duty Cycle مربوط به LED افزایش پیدا میکند و LED از مرحله خاموش کامل به مرحله روشن کامل می رسد. این مراحل در 256 گام انجام می شود. برای حلقه for دوم نیز برعکس این کار انجام می شود. یعنی LED از حالت روشن کامل به حالت خاموش کامل تغییر وضعیت می دهد.
موفق باشید.