در این مقاله میخواهیم به سازوکار GPIOها در ESP32 و ESP8266 با استفاده از میکروپایتون نگاهی بیندازیم. به شما نشان خواهیم داد چگونه ورودیهای آنالوگ ودیجیتال را بخوانید، چگونه خروجیهای دیجیتال را کنترل کنید و چگونه سیگنال PWM ایجاد کنید.
پیشنیازها
برای پروگرم کردن ESP32 و ESP8266 با میکروپایتون، از uPyCraft IDE به عنوان محیط برنامه نویسی استفاده میکنیم.
اگر با uPyCraftIDE مشکل دارید، پیشنهاد میکنیم به جای آن از Thonny IDE استفاده کنید.
مرور کلی پروژه
با استفاده از این آموزش شما یاد خواهید گرفت که چگونه از GPIOهای ESP32 و یا ESP8266 در میکروپایتون استفاده کنید.
ما یک مثال ساده خواهیم ساخت که به صورت زیر عمل میکند:
- وضعیت دکمه فشاری خوانده میشود و مطابق آن وضعیت LED مشخص میشود. (وقتی دکمه را فشار میدهید، LED روشن میشود.)
- ولتاژ از یک پتانسیومتر خوانده میشود و نور LED توسط شفت پتانسومتر کم و زیاد میشود.
شماتیک
مدار این پروژه شامل سیمکشیها، ۲ LED، یک دکمه فشاری و یک پتانسیومتر است. لیست مواردی که برای ساخت مدار نیاز دارید، به شرح زیر است:
ESP32 یا ESP8266
۲ عدد LED
دکمه فشاری
پتانسیومتر
بردبرد
سیم جامپر
ESP32 – شماتیک
اگر از ESP32 استفاده میکنید، از دیاگرام شماتیکی زیر استفاده کنید.
توجه: ESP32 از خواندن آنالوگ در چندین GPIO پشتیبانی میکند:
0، ۲، ۴، ۱۲، ۱۳، ۱۴ ،۱۵، ۲۵، ۲۶، ۲۷، ۳۲، ۳۳، ۳۴، ۳۵، ۳۶، ۳۹
ESP8266 – شماتیک
اگر از ESP8266 استفاده میکنید، از دیاگرام شماتیکی زیر استفاده کنید.
توجه: ESP8266 فقط از خواندن آنالوگ در پین ADC0 (A0) پشتیبانی میکند.
کد
کد زیر را در فایل main.py در uPyCraft IDE کپی کنید.
توجه: خواندن آنالوگ در ESP32 با ESP8266 متفاوت است. این کد در ESP32 کار میکند. برای استفاده از ESP8266 باید خطوط مربوط به ESP32 را کامنت کنید و خطوط مربوط به ESP8266 را از حالت کامنت خارج کنید.
from machine import Pin, ADC, PWM
from time import sleep
led = Pin(2, Pin.OUT)
button = Pin(15, Pin.IN)
#Configure ADC for ESP32
pot = ADC(Pin(34))
pot.width(ADC.WIDTH_10BIT)
pot.atten(ADC.ATTN_11DB)
#Configure ADC for ESP8266
#pot = ADC(0)
led_pwm = PWM(Pin(4),5000)
while True:
button_state = button.value()
led.value(button_state)
pot_value = pot.read()
led_pwm.duty(pot_value)
sleep(0.1)
کد چگونه کار میکند
توضیح خواهیم داد که کد چگونه عمل میکند.
وارد کردن کتابخانهها
برای راهاندازی GPIOها نیاز دارید که ماژول machine را وارد کنید که شامل کلاسهای راهاندازی GPOI است. کلاسهای pin را برای راهاندازی پینها، ADC را برای خواندن مقدار آنالوگ و PWM را برای تولید سیگنال PWM وارد کنید.
from machine import Pin, ADC, PWM
متد () sleep را از ماژول time را وارد کنید. متد sleep() به شما اجازه میدهد تا تاخیر را به کد اضافه کنید.
from time import sleep
نمونهسازی pins
بعد از وارد کردن تمام ماژولهایی که نیاز داریم، آبجکت(شی) pin را معرفی میکنیم که در GPIO 2، led نامیده میشود و خروجی است.
led = Pin(2, Pin.OUT)
آبجکت Pin ویژگیهای زیر را به همین ترتیب میپذیرد:
Pin(Pin number, pin mode, pull, value)
- number به GPIO که میخواهیم استفاده کنیم، اشاره دارد.
- Pin mode میتوانید ورودی (IN)، خروجی (OUT) یا اپن درین (OPEN_DRAIN) باشد.
- Pull زمانی استفاده میشود که بخواهیم یک از مقاومت داخلی بالانگهدار (pull up) یا پاییننگهدار (pull down) استفاده کنیم.
- Value وضعیت GPIO را مشخص میکند. (که روشن یا خاموش است.) و میتواند ۰ یا ۱ (True یا False) باشد. ۱ یعنی GPIO روشن است و اگر هیچ پارامتری را برای آن تنظیم نکنیم، به طور پیش فرض ۰ است. (کاری که ما در این مثال انجام میدهیم.)
پس از معرفی آبجکت led، به حالت دیگری از کلاس Pin برای دکمه فشاری احتیاج دارید. دکمه فشاری به GPIO 15 وصل میشود و به عنوان وردی تنظیم میشود:
button = Pin(15, Pin.IN)
نمونهسازی ADC
در ESP32 برای ساخت یک آبجکت ADC برای پتانسیومتر در GPIO 34 داریم:
pot = ADC(Pin(34))
اگر از ESP8266 استفاده میکنید، برای ADC فقط از پین ADC0 (A0) پشتیبانی میشود. برای استفاده از ADC در ESP8266 باید بنویسیم:
pot = ADC(0)
دوخط زیر فقط برای ESP32 اعمال میشود. یعنی میخواهیم ولتاژ را در کل محدوده بخوانیم. (ولتاژ ۰ تا ۳/۳ ولت)
pot.atten(ADC.ATTN_11DB)
خط بعدی یعنی اینکه ما میخواهیم با رزولوشن ۱۰ بیت بخوانیم. (از ۰ تا ۱۰۲۳)
pot.width(ADC.WIDTH_10BIT)
پارامترهای متد () width برای تنظیم سایر رزولوشنها هستند:
- WIDTH_9BIT: محدوده ۰ تا ۵۱۱
- WIDTH_10BIT: محدوده ۰ تا ۱۰۲۳
- WIDTH_11BIT: محدوده ۰ تا ۲۰۴۷
- WIDTH_12BIT: محدوده ۰ تا ۴۰۹۵
اگر رزولوشن را مشخص نکنید، در ESP32 به طور پیش فرض رزولوشن ۱۲ بیت است.
نمونهسازی PWM
شی PWM را که led_pwm نامگذاری شده است، در GPIO 4 با فرکانس ۵۰۰۰ هرتز میسازیم:
led_pwm = PWM(Pin(4), 5000)
برای ساخت آبجکت PWM، نیاز دارید که پارامترهای پین، فرکانس و سیکل عملکرد دستگاه را مشخص کنید.
فرکانس میتواند مقداری بین ۰ تا ۷۸۱۲۵ هرتز باشد. فرکانس ۵۰۰۰ هرتز برای LED کافی است.
سیکل عملکرد دستگاه باید مقداری بین ۰ تا ۱۰۲۳ باشد که ۱۰۲۳ مطابق ۱۰۰% سیکل است. (روشنایی کامل) و ۰ معادل ۰% سیکل است. (LED بدون نور)
ما سیکل دستگاه را در حلقه مشخص میکنیم و الان از این پارامتر میگذریم. اگر در معرفی PWM، سیکل دستگاه را مشخص نکنیم، به طور پیش فرض ۰ در نظر گرفته میشود.
گرفتن وضعیت GPIO
وقتی حلقه داریم، همواره درست (True) است. (مشابه تابع () loop در Arduino IDE)
وضعیت دکمه را میگیریم و آن را در متغیر button_state ذخیره میکنیم. برای اینکه وضعیت پین را بگیریم، از متد () value به صورت زیر استفاده میکنیم:
button_state = button.value()
بر اساس این که دکه فشاری، فشار داده شده باشد یا نه، مقدار ۰ یا ۱ را بر میگرداند.
تنظیم کردن وضعیت GPIO
برای تنظیم کردن وضعیت پین، از متد value(state) در آبجکت Pin استفاده میشود. در اینجا ما متغیر button_state را به عنوان آرگومان تنظیم کردهایم. در این حالت اگر دکمه فشار داده شود، LED روشن خواهد شد.
led.value(button_state)
خواندن ورودیهای آنالوگ
برای خواندن ورودی آنالوگ از متد () read در آبجکت ADC استفاده میشود. (در این حالت آبجکت ADC، pot نامیده میشود.)
pot_value = pot.read()
کنترل سیکل عملکرد دستگاه
برای کنترل دستگاه از متد () duty در آبجکت PWM استفاده کنید. (led_pwm). متد () duty مقداری بین ۰ تا ۱۰۲۳ دارد. پس pot_value را به عنوان آرگومان قرار میدهیم. با این کار شما میتوانید با چرخاندن پتانسیومتر، سیکل دستگاه را عوض کنید.
led_pwm.duty(pot_value)
تست کردن کد
فایل main.py را در ESP32 یا ESP8266 آپلود کنید. برای این کار uPyCraft IDE را باز کنید و کد آماده شده را در فایل main.py کپی کنید. به مسیر Tools >Serial بروید و پورت serial را انتخاب کنید و برد خودتان را در مسیر Tools > Board انتخاب کنید.
سپس با انتخاب Download and Run کد را در ESP32 یا ESP8266 آپلود کنید.
بعد از آپلود کد، دکمه EN/RST روی برد را بزنید تا کد اجرا شود.
حال وقتی دکمه را فشار میدهید، LED باید روشن شود.
میزان نور LED نیز وقتی پتانسیومتر را میچرخانید، عوض میشود.
جمعبندی
این مثال ساده نشان میدهد که چگونه با بردهای ESP32 و ESP8266 توسط میکروپایتون، ورودیهای دیجیتال و آنالوگ را بخوانید، خروجیهای دیجیتال را کنترل کنید و سیگنال PWM تولید کنید.