با نحوه کنترل روشنایی LED متصل به Raspberry Pi با استفاده از PWM آشنا شوید.
PWM چیزی است که همه ما هر روز از آن استفاده می کنیم، حتی اگر آن را ندانیم. این تکنیکی است که در طیف وسیعی از کاربردها ساده و فوق العاده مفید است. بهترین حالت، این چیزی است که رزبری پای شما می تواند بدون عرق کردن انجام دهد. چگونه؟ بیا یک نگاهی بیندازیم.
PWM چیست؟
همانطور که اصطلاحات می گوید، “مدولاسیون عرض پالس” بسیار فانتزی به نظر می رسد. اما تنها چیزی که در اینجا واقعاً در مورد آن صحبت می کنیم، خاموش و روشن کردن مجدد سیگنال الکتریکی است – بسیار سریع. چرا ممکن است بخواهیم این کار را انجام دهیم؟ صرفاً به این دلیل که روشی بسیار آسان برای شبیهسازی سیگنال آنالوگ متغیر، بدون استفاده از کلاههای Raspberry Pi، افزونهها یا مدارهای اضافی است. برای کاربردهای خاص، مانند گرم کردن اجاق گاز، راندن موتور، یا کاهش نور LED، سیگنال PWM به معنای واقعی کلمه از یک ولتاژ آنالوگ “واقعی” قابل تشخیص نیست.
چرخه های وظیفه
بنابراین، ما یک سری پالس داریم که به یک بار (چیزی که در حال رانندگی آن هستیم) وارد می شوند. این به تنهایی چندان مفید نیست – تا زمانی که شروع به تغییر (یا تعدیل) عرض آن پالس ها نکنیم. مرحله “روشن” یک دوره روشن و خاموش معین می تواند از 0 تا 100 درصد کل چرخه را به خود اختصاص دهد. ما این درصد را چرخه وظیفه می نامیم.
به عنوان مثال، فرض کنید یک سیگنال 3 ولت PWM با چرخه کاری 50 درصد داریم. مقدار متوسط برقی که از LED عبور می کند معادل یک سیگنال همیشه روشن 1.5 ولت است. چرخه کار را بالا ببرید و LED روشن تر می شود. آن را شماره گیری کنید و LED کم نور می شود. ما میتوانیم با استفاده از روش مشابه صدا تولید کنیم – به همین دلیل است که اگر از PWM برای چیزهای دیگر استفاده میکنید، صدای خروجی در Raspberry Pi شما ممکن است از کار بیفتد.
PWM در Raspberry Pi
می توانید از نرم افزار PWM روی هر پین GPIO Raspberry Pi استفاده کنید. اما PWM سخت افزاری فقط در GPIO12، GPIO13، GPIO18 و GPIO19 در دسترس است.
تفاوت در چیست؟ خوب، اگر قرار است از نرم افزاری برای تولید سیگنال استفاده کنید، سیکل های CPU را مصرف خواهید کرد. با این حال، CPU شما ممکن است کارهای بهتری نسبت به خاموش کردن و روشن شدن LED چند صد بار در ثانیه داشته باشد. در واقع، ممکن است حواسش پرت و گرفتار کارهای دیگر شود، که می تواند به طور جدی زمان بندی PWM شما را مختل کند.
در نتیجه، اغلب ایده بهتری است که کار را به مدارهای تخصصی محول کنید. در مورد Raspberry Pi، این مدار در داخل سیستم روی تراشه که CPU را در خود جای داده است، زندگی می کند. PWM سختافزاری اغلب بسیار دقیقتر و راحتتر است و بنابراین در بیشتر موارد گزینه ارجح است. اگر می خواهید در مورد آنچه در زیر کاپوت تراشه Broadcom BCM2711 Raspberry Pi 4 در حال رخ دادن است بدانید، می توانید به مستندات BCM2711 نگاه کنید. فصل 8 موارد PWM را پوشش می دهد!
کم نور کردن یک LED
برای اینکه LED ما با Raspberry Pi خود کار کند، باید مقداری breadboarding انجام دهیم. این به معنای دو جزء است: خود LED و یک مقاومت محدود کننده جریان که به صورت سری به آن وصل خواهیم کرد. بدون مقاومت، اگر جریان بیش از حد از آن عبور کند، LED شما در معرض خطر مرگ در یک دود بدبو است.
محاسبه مقدار مقاومت
فرقی نمی کند که مقاومت را به کدام انتهای LED وصل کنید. آنچه مهم است مقدار مقاومت است. Raspberry Pi 4 می تواند حدود 16 میلی آمپر در هر پین تولید کند. بنابراین، میتوانیم از قانون اهم برای محاسبه مقدار مقاومت مورد نیاز استفاده کنیم.
قانون مذکور بیان می کند که مقاومت باید برابر با ولتاژ جریان باشد. ما می دانیم ولتاژ خروجی از پین GPIO Pi (3.3 ولت) و می دانیم که جریان باید چقدر باشد (16 میلی آمپر یا 0.016 آمپر). اگر اولی را بر دومی تقسیم کنیم 206.25 به دست می آید. اکنون، از آنجایی که برای یافتن مقاومت هایی با این مقدار مشکل دارید، به جای آن به سراغ 220 اهم می رویم.
آند LED (پای بلند) را به GPIO 18 (که پایه فیزیکی 12 در Raspberry Pi است) وصل کنید. کاتد (پای کوتاه) را به هر یک از پایه های زمین Pi وصل کنید. مقاومت را در جایی در مسیر فراموش نکنید. شما اکنون آماده رفتن هستید!
پیاده سازی PWM در Raspberry Pi
برای اینکه PWM سختافزاری روی Raspberry Pi کار کند، از کتابخانه rpi-hardware-pwm از Cameron Davidson-Pilon استفاده میکنیم که از کد جرمی ایمسون اقتباس شده است. این در Pioreactor (یک بیوراکتور مبتنی بر Pi) استفاده شده است – اما برای اهداف ما به اندازه کافی ساده است.
ابتدا اجازه دهید فایل config.txt را که در پوشه /boot یافت می شود ویرایش کنیم. فقط باید یک خط اضافه کنیم: dtoverlay=pwm-2chan. اگر میخواهیم از پینهای GPIO غیر از 18 و 19 استفاده کنیم، میتوانیم چند آرگومان اضافی در اینجا اضافه کنیم. در حال حاضر، اجازه دهید همه چیز را ساده نگه داریم.
Pi خود را مجددا راه اندازی کنید و اجرا کنید:
lsmod | grep pwm
این دستور تمام ماژول های بارگذاری شده در قسمت مرکزی سیستم عامل به نام کرنل را فهرست می کند. در اینجا، با استفاده از دستور grep (که «چاپ عبارت منظم جهانی» است، آنها را فیلتر می کنیم تا فقط موارد PWM را پیدا کنند.
اگر pwm_bcm2835 در میان ماژولهای فهرست شده نشان داده شود، در مسیر درستی هستیم. ما تقریباً آماده سازی را تمام کرده ایم! تنها چیزی که باقی می ماند نصب کتابخانه واقعی است. از ترمینال، اجرا کنید:
sudo pip3 install rpi-hardware-pwm
ما اکنون برای شروع آماده ایم.
کدگذاری مدار LED PWM
وقت آن است که با کمی کدنویسی در پایتون دستمان را کثیف کنیم. Thonny را روشن کنید و در کد زیر کپی کنید. سپس Run را بزنید.
from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()
همه چیز خوب است، خواهید دید که LED به تدریج روشن تر می شود تا زمانی که متغیر شمارنده i به 100 برسد. سپس خاموش می شود. اینجا چه خبره؟ از آن عبور کنیم.
ما در حال وارد کردن قطعه مربوطه از کتابخانه PWM سخت افزاری (همراه با ماژول زمان) و اعلام یک متغیر جدید هستیم. می توانیم pwm_channel را روی 0 یا 1 قرار دهیم که به ترتیب با پایه های 18 و 19 GPIO در Pi مطابقت دارد.
مقدار هرتز را که میتوانیم روی هر فرکانسی که دوست داریم تنظیم کنیم (اگرچه در نهایت توسط سرعت کلاک Pi محدود میشویم). در 60 هرتز، ما نباید هیچ گونه سوسو زدن PWM را ببینیم. اما ممکن است ایده خوبی باشد که با یک مقدار بسیار کم (مانند 10) شروع کنید و به تدریج همه چیز را تغییر دهید. این کار را انجام دهید، و در واقع قادر خواهید بود نبض ها را مشاهده کنید. فقط حرف ما را قبول نکنید!
ما چرخه وظیفه (i) خود را از 0 تا 100 با استفاده از یک حلقه برای Python بالا می بریم. شایان ذکر است که میتوانیم آرگومان time.sleep را تا زمانی که دوست داریم تنظیم کنیم – از آنجایی که PWM در سختافزار مدیریت میشود، در پشت صحنه اجرا میشود، هر چقدر که به برنامه بگوییم صبر کند.
چیزهای بیشتری برای یادگیری با PWM وجود دارد
تبریک می گویم! شما اولین برنامه PWM خود را نوشته اید. اما، همانطور که اغلب در مورد Raspberry Pi اتفاق می افتد، کارهای زیادی می توانید با این موارد انجام دهید، به خصوص اگر Raspberry Pi خود را با کلاه PWM مناسب تقویت کنید. بنابراین، به یک LED کوچک بسنده نکنید. شما می توانید از این قدرت جدید برای کنترل موتورها، رمزگذاری پیام ها و تولید آهنگ های سینت سایزر استفاده کنید. دنیایی از مدولاسیون در انتظار است!