این آموزش نشان میدهد که چگونه با بردهای ESP32 و ESP8266 با استفاده از میکروپایتون، سیگنالهای PWM تولید کنیم. به عنوان مثال، شدت نور یک LED را با تغییر چرخه کاری(duty cycle) کم و زیاد میکنیم.
پیشنیازها
برای دنبال کردن این آموزش نیاز دارید که فریمور میکروپایتون را در برد ESP32/ESP8266 نصب داشته باشید. همچنین برای نوشتن و آپلود کد، به یک IDE نیاز دارید. پیشنهاد ما این است که از Thonny IDE یا uPyCraft IDE استفاده کنید.
شماتیک
برای این مثال، یک LED را به برد ESP خود وصل کنید. ما در هر دو برد LED را به GPIO 5 وصل میکنیم اما شما میتوانید هر پین دیگری که مناسب PWM باشد را انتخاب کنید.
قطعات مورد نیاز
لیستی از قطعاتی که برای ساخت مدار نیاز داری، به شرح زیر است:
ESP32 یا ESP8266
LED 5 mm
مقاومت ۳۳۰ اهم
بردبرد
سیم جامپر
شماتیک ESP32
اگر از برد ESP32 استفاده میکنید، از دیاگرام شماتیک زیر استفاده کنید:
شماتیک ESP8266
اگر از برد ESP8266 استفاده میکنید، از دیاگرام شماتیک زیر استفاده کنند:
نوشتن کد
اینجا کدی است که شدت روشنایی LED را در طی زمان، با افزایش duty cycle تغییر میدهد. این کد هم در ESP32 و هم در ESP8266 کار میکند:
from machine import Pin, PWM
from time import sleep
frequency = 5000
led = PWM(Pin(5), frequency)
while True:
for duty_cycle in range(0, 1024):
led.duty(duty_cycle)
sleep(0.005)
کد چگونه کار میکند
برای ایجاد یک پین PWM، علاوه بر کلاس Pin، کلاس PWM را هم از ماژول machine وارد میکنیم.
from machine import Pin, PWM
سپس برای ایجاد آبجکت(شی) PWM که led نامیده میشود، داریم:
led = PWM(Pin(5), frequency)
برای ایجاد یک آبجکت PWM، شما باید به عنوان پارامتر، پینی که به آن متصل است، فرکانس سیگنال و چرخه کاری(duty cycle) را در نظر بگیرید.
فرکانس: فرکانس میتواند مقداری بین ۰ تا ۷۸۱۲۵ داشته باشد. برای کنترل روشنایی LED از فرکانس ۵۰۰۰ هرتز استفاده میشود.
چرخه کاری(duty cycle): duty cycle مقداری بین ۰ تا ۱۰۲۳ دارد که ۱۰۲۳ معادل ۱۰۰% چرخه(بیشترین شدت روشنایی) و ۰ معادل ۰% چرخه(خاموش) هستند.
ما duty cycle را در یک حلقه while تنظیم میکنیم؛ پس نیازی نیست که پارامتر duty cycle را تعریف کنیم. اگر در معرفی آبجکت PWM، چرخه کاری را تنظیم نکنیم، به صورت پیش فرض ۰ در نظر گرفته میشود.
برای تنظیم duty cycle، از متد ()duty در آبجکت PWM استفاده میکنیم و duty cycle را به عنوان آرگومان ارسال میکنیم:
led.duty(duty_cycle)
در داخل حلقه while، یک حلقه for ایجاد میکنیم که duty cycle را در هر حلقه با بازهی ۵ میلی ثانیه، ۱ واحد افزایش میدهد.
for duty_cycle in range(0, 1024):
led.duty(duty_cycle)
sleep(0.005)
سینتکس تابع ()range به شکل زیر است:
range(start, stop, step)
start: مشخص میکند از چه شمارهای شروع شود. ما میخواهیم duty cycle از ۰ شروع شود.
stop: عددی که مشخص می کند در کدام موقعیت می خواهیم متوقف شویم. (بدون در نظر گرفتن آخرین عدد). بیشترین مقدار duty cycle مقدار ۱۰۲۳ است. چون ما در هر حلقه ۱ واحد افزایش duty cycle داریم، آخرین مقدار باید ۱+۱۰۲۳ باشد. پس از ۱۰۲۴ استفاده میکنیم.
step: عدد صحیحی که افزایش را مشخص میکند و به طور پیش فرض برابر ۱ است.
در هر حلقه، چرخه کاری LED را برابر مقدار کنونی متغیر duty_cycle تنظیم میکنیم:
led.duty(duty_cycle)
بعد از آن مقدار متغیر duty_cycle یک واحد افزایش میابد.
نمایش عملی
با استفاده از Thonny IDE یا uPyCraft IDE کد را در برد ESP ذخیره کنید. LED که به GPIO 5 متصل شده است، باید در طی زمان، شدت نورش بیشتر شود.
امیدواریم که این آموزش میکروپایتون برای شما مفید بوده باشد.