آردوینومقدماتی۶ دقیقه مطالعهArduino IDE 2.x / Uno R3

PWM و ورودی آنالوگ

با analogRead ولتاژ ۰ تا ۵ ولت را می‌خوانید، با analogWrite خروجی PWM می‌سازید و نور LED را با پتانسیومتر تنظیم می‌کنید.

آنچه در این درس می‌آموزید

  • خواندن ولتاژ آنالوگ با analogRead و تبدیل آن به ولت را انجام دهید
  • اصل PWM و رابطهٔ آن با duty cycle را توضیح دهید
  • نور LED را با پتانسیومتر و تابع map کنترل کنید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۰
فهرست مطالب

دنیای واقعی آنالوگ است: نور پیوسته کم و زیاد می‌شود، دما پیوسته بالا و پایین می‌رود. در این درس دو طرف این ارتباط را می‌سازید: با analogRead ولتاژ پیوستهٔ یک پتانسیومتر را می‌خوانید و با analogWrite از پین دیجیتال خروجی «شبه‌آنالوگ» می‌سازید تا نور LED نرم کم و زیاد شود.

خواندن ولتاژ: analogRead

Uno مبدل آنالوگ به دیجیتال (ADC) ده‌بیتی دارد که ولتاژ ۰ تا ۵ ولت را به عدد ۰ تا ۱۰۲۳ تبدیل می‌کند؛ یعنی هر پله حدود ۴٫۹ میلی‌ولت. تبدیل عدد خوانده‌شده به ولتاژ:

V=reading1023×5V = \frac{reading}{1023} \times 5

پتانسیومتر رایج‌ترین منبع ولتاژ قابل‌تنظیم برای تمرین است؛ دسته‌اش را می‌چرخانید و پایهٔ وسطش ولتاژی بین صفر تا ۵ ولت می‌دهد:

پین آردوینو اتصال توضیح
5V یک پایهٔ کناری پتانسیومتر بالای مبدل ولتاژ
GND پایهٔ کناری دیگر پایین مبدل ولتاژ
A0 پایهٔ وسط (Wiper) ولتاژ متغیر به ورودی ADC
read-pot.ino
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

fade.ino
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 (۰ تا ۲۵۵) می‌بریم:

pot-dimmer.ino
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 می‌تواند بازهٔ مقصد را برعکس بگیرد.

cpp
// Write your code here
نمایش راه‌حل
cpp
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 است.

با نور متغیر آشنا شدید؛ در درس بعدی یاد می‌گیرید برد چه خبرهایی برای شما دارد: ارتباط سریال، پنجرهٔ گفت‌وگوی آردوینو با رایانه.

منابع و ارجاع‌ها

درس‌های مرتبط