PWM و ورودی آنالوگ
با analogRead ولتاژ ۰ تا ۵ ولت را میخوانید، با analogWrite خروجی PWM میسازید و نور LED را با پتانسیومتر تنظیم میکنید.
آنچه در این درس میآموزید
- خواندن ولتاژ آنالوگ با analogRead و تبدیل آن به ولت را انجام دهید
- اصل PWM و رابطهٔ آن با duty cycle را توضیح دهید
- نور LED را با پتانسیومتر و تابع map کنترل کنید
فهرست مطالب
دنیای واقعی آنالوگ است: نور پیوسته کم و زیاد میشود، دما پیوسته بالا و پایین میرود. در این درس دو طرف این ارتباط را میسازید: با analogRead ولتاژ پیوستهٔ یک پتانسیومتر را میخوانید و با analogWrite از پین دیجیتال خروجی «شبهآنالوگ» میسازید تا نور LED نرم کم و زیاد شود.
خواندن ولتاژ: analogRead
Uno مبدل آنالوگ به دیجیتال (ADC) دهبیتی دارد که ولتاژ ۰ تا ۵ ولت را به عدد ۰ تا ۱۰۲۳ تبدیل میکند؛ یعنی هر پله حدود ۴٫۹ میلیولت. تبدیل عدد خواندهشده به ولتاژ:
پتانسیومتر رایجترین منبع ولتاژ قابلتنظیم برای تمرین است؛ دستهاش را میچرخانید و پایهٔ وسطش ولتاژی بین صفر تا ۵ ولت میدهد:
| پین آردوینو | اتصال | توضیح |
|---|---|---|
| 5V | یک پایهٔ کناری پتانسیومتر | بالای مبدل ولتاژ |
| GND | پایهٔ کناری دیگر | پایین مبدل ولتاژ |
| A0 | پایهٔ وسط (Wiper) | ولتاژ متغیر به ورودی ADC |
const int potPin = A0;
void setup() {
Serial.begin(9600); // To see values in the serial monitor
}
void loop() {
int reading = analogRead(potPin); // A number between 0 and 1023
float voltage = reading * 5.0 / 1023.0; // Convert to volts
Serial.print(voltage);
Serial.println(" V");
delay(300);
}برای ورودی آنالوگ نیازی به pinMode نیست. اگر سریال مانیتور را باز کنید، با چرخاندن دسته، ولتاژ از ۰ تا ۵ ولت پیوسته تغییر میکند؛ جزئیات سریال مانیتور موضوع درس بعدی است.
ساخت خروجی آنالوگ: PWM
پین دیجیتال فقط ۵ ولت یا صفر میدهد؛ اما اگر آن را بسیار سریع (چند صد بار در ثانیه) روشن و خاموش کنید، LED میانگین را «میبیند» و نورش متناسب با نسبت زمان روشن به کل دوره تنظیم میشود. به این ترفند مدولاسیون پهنای پالس (PWM) میگویند و نسبت زمان روشن به کل دوره را duty cycle مینامند.
در Uno تابع analogWrite(pin, value) مقدار ۰ تا ۲۵۵ میگیرد (۸ بیت):
| مقدار analogWrite | duty cycle | نتیجه روی LED |
|---|---|---|
| 0 | ۰٪ | خاموش |
| 64 | حدود ۲۵٪ | نور کم |
| 127 | حدود ۵۰٪ | نیمهروشن |
| 255 | ۱۰۰٪ | کامل روشن |
PWM فقط روی پینهای علامتدار با ~ کار میکند: روی Uno پینهای ۳، ۵، ۶، ۹، ۱۰ و ۱۱. فرکانس PWM روی بیشتر این پینها حدود ۴۹۰ هرتز است (پینهای ۵ و ۶ حدود ۹۸۰ هرتز)؛ چشم این فرکانس را درک نمیکند و فقط نور میانگین میبیند.
محو شدن نور LED
const int ledPin = 9; // PWM pin
void setup() {
}
void loop() {
for (int value = 0; value <= 255; value += 5) {
analogWrite(ledPin, value);
delay(20);
}
for (int value = 255; value >= 0; value -= 5) {
analogWrite(ledPin, value);
delay(20);
}
}LED هر حدود ۵ ثانیه از خاموش به روشن کامل و برعکس میرود؛ همان افکت «نفس کشیدن» چراغهای دستگاههای امروزی. مقاومت ۲۲۰ اهم سری را مانند درس قبل فراموش نکنید.
کنترل نور با پتانسیومتر
تابع map() یک بازهٔ عددی را به بازهٔ دیگر تبدیل میکند؛ اینجا خواندن ADC (۰ تا ۱۰۲۳) را به بازهٔ PWM (۰ تا ۲۵۵) میبریم:
const int potPin = A0;
const int ledPin = 9;
void setup() {
}
void loop() {
int reading = analogRead(potPin);
int brightness = map(reading, 0, 1023, 0, 255);
analogWrite(ledPin, brightness);
delay(10);
}دستهٔ پتانسیومتر را بچرخانید تا نور LED پیوسته کم و زیاد شود؛ همین ترکیب ساده، هستهٔ کنترل روشنایی و سرعت موتور در پروژههای واقعی است.
تمرینها
تمرین
تمرین ۱ — پتانسیومتر معکوس
کد pot-dimmer را طوری تغییر دهید که چرخاندن دسته به سمت ولتاژ بالا، نور LED را کم کند؛ یعنی رابطه معکوس شود. راهنمایی: map میتواند بازهٔ مقصد را برعکس بگیرد.
// Write your code hereنمایش راهحل
const int potPin = A0;
const int ledPin = 9;
void setup() {
}
void loop() {
int reading = analogRead(potPin);
int brightness = map(reading, 0, 1023, 255, 0); // Reversed range
analogWrite(ledPin, brightness);
delay(10);
}:::
خلاصه
analogReadولتاژ ۰ تا ۵ ولت ورودیهای A0 تا A5 را به عدد ۰ تا ۱۰۲۳ تبدیل میکند.analogWriteخروجی PWM با بازهٔ ۰ تا ۲۵۵ میسازد و فقط روی پینهای ~ (۳، ۵، ۶، ۹، ۱۰، ۱۱ در Uno) کار میکند.- duty cycle نسبت زمان روشن به کل دوره است و چشم آن را بهصورت تغییر روشنایی میبیند.
mapیک بازهٔ عددی را به بازهٔ دیگر تبدیل میکند و پل میان ADC و PWM است.
با نور متغیر آشنا شدید؛ در درس بعدی یاد میگیرید برد چه خبرهایی برای شما دارد: ارتباط سریال، پنجرهٔ گفتوگوی آردوینو با رایانه.