آموزش آردوینو

آشنایی با برد آردوینو و پین‌ها (دیجیتال، آنالوگ، PWM و تغذیه)

در این مستند با ساختار کلی برد آردوینو، انواع پین های دیجیتال و آنالوگ، خروجی PWM، پایه های تغذیه و روش صحیح اتصال قطعات الکترونیکی آشنا می شوید. همچنین تفاوت پین های ورودی و خروجی، ولتاژ کاری برد و نکات مهم برای جلوگیری از آسیب دیدن آردوینو را با مثال های عملی یاد می گیرید.

سطح مقدماتی

آشنایی با برد آردوینو و پین‌ها (دیجیتال، آنالوگ، PWM و تغذیه)

مقدمه

برد آردوینو یک بستر سخت افزاری برای ساخت پروژه های الکترونیکی و برنامه نویسی میکروکنترلر است. با استفاده از این برد می توان قطعاتی مانند LED، کلید، سنسور، نمایشگر، موتور و ماژول های مختلف را کنترل کرد.

برای کار با آردوینو، لازم است بدانیم هر پایه یا Pin چه کاربردی دارد و چگونه باید قطعات را به آن متصل کنیم.

در این آموزش، برد Arduino Uno را به عنوان نمونه اصلی بررسی می کنیم. شماره پایه ها و بعضی از قابلیت ها ممکن است در بردهای دیگر مانند Arduino Nano، Mega و مدل های مبتنی بر ESP32 متفاوت باشد.

۱. آشنایی با ساختار کلی برد آردوینو

بیشتر بردهای آردوینو دارای بخش های زیر هستند:

  • میکروکنترلر: تراشه اصلی که برنامه را اجرا می کند.
  • پین های دیجیتال: برای خواندن وضعیت های HIGH و LOW یا کنترل خروجی های دیجیتال.
  • پین های آنالوگ: برای اندازه گیری ولتاژ متغیر از طریق مبدل آنالوگ به دیجیتال.
  • پین های PWM: برای تولید خروجی شبه آنالوگ با تغییر نسبت روشن و خاموش بودن سیگنال.
  • پین های تغذیه: برای تامین ولتاژ و اتصال زمین مدار.
  • درگاه USB: برای بارگذاری برنامه و ارتباط با رایانه و در بسیاری از بردها تامین برق.
  • مدار تنظیم ولتاژ و تغذیه: برای مدیریت برق ورودی، متناسب با طراحی برد.

۲. پین دیجیتال چیست؟

پین های دیجیتال برای کار با سیگنال هایی استفاده می شوند که دو وضعیت منطقی دارند:

  • HIGH: وضعیت منطقی بالا
  • LOW: وضعیت منطقی پایین

در Arduino Uno با منطق ۵ ولتی، این وضعیت ها معمولا با ولتاژ نزدیک به صفر ولت و نزدیک به ۵ ولت مرتبط هستند. آستانه دقیق تشخیص HIGH و LOW به مشخصات میکروکنترلر وابسته است.

پین دیجیتال می تواند به دو شکل اصلی استفاده شود:

ورودی دیجیتال

در حالت ورودی، آردوینو وضعیت یک کلید، سنسور دیجیتال یا خروجی یک ماژول را می خواند.

const int buttonPin = 2;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int state = digitalRead(buttonPin);

  if (state == LOW) {
    Serial.println("Button pressed");
  } else {
    Serial.println("Button released");
  }

  delay(200);
}

در این مثال، پایه ۲ با مقاومت Pull-up داخلی تنظیم شده است. یک سر کلید به پایه ۲ و سر دیگر آن به GND متصل می شود. در نتیجه، هنگام فشردن کلید مقدار خوانده شده LOW خواهد بود.

خروجی دیجیتال

در حالت خروجی، آردوینو می تواند قطعاتی مانند LED را روشن یا خاموش کند.

const int ledPin = 8;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);

  digitalWrite(ledPin, LOW);
  delay(1000);
}

در این برنامه، LED هر یک ثانیه روشن و خاموش می شود.

نکته: برای اتصال LED به پین آردوینو باید از مقاومت محدودکننده جریان مناسب، برای مثال ۲۲۰ تا ۳۳۰ اهم در یک مدار آموزشی معمولی، استفاده کنید.

۳. پین آنالوگ چیست؟

برخی از سنسورها به جای خروجی صفر و یک، ولتاژی متغیر تولید می کنند. برای خواندن این ولتاژها از ورودی آنالوگ استفاده می شود.

در Arduino Uno کلاسیک، پایه های A0 تا A5 ورودی های آنالوگ هستند. این پایه ها به مبدل آنالوگ به دیجیتال یا ADC متصل اند.

مبدل ADC ولتاژ ورودی را به یک عدد دیجیتال تبدیل می کند. در Arduino Uno با ADC ده بیتی، مقدار خروجی analogRead() معمولا بین ۰ تا ۱۰۲۳ است.

برای مرجع ولتاژ ۵ ولتی، رابطه تقریبی زیر را می توان به کار برد:

ولتاژ ورودی = مقدار ADC × ۵ ÷ ۱۰۲۳

این رابطه تقریبی است؛ ولتاژ مرجع واقعی و دقت مدار روی نتیجه تاثیر دارند.

مثال خواندن ولتاژ از پایه A0

const int sensorPin = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(sensorPin);

  float voltage = value * (5.0 / 1023.0);

  Serial.print("ADC: ");
  Serial.print(value);

  Serial.print(" | Voltage: ");
  Serial.println(voltage, 2);

  delay(500);
}

این برنامه مقدار خوانده شده از A0 و ولتاژ تقریبی متناظر با آن را در Serial Monitor نمایش می دهد.

در این مثال فرض شده است که مرجع ADC برابر ۵ ولت است. اگر مرجع تغییر کند یا برد از ولتاژ کاری دیگری استفاده کند، باید محاسبه متناسب با همان شرایط اصلاح شود.

نکته مهم درباره ورودی آنالوگ

در Arduino Uno، ولتاژ ورودی آنالوگ باید در محدوده مجاز تراشه باشد؛ معمولا بین GND و ولتاژ مرجع انتخاب شده، با رعایت محدودیت های دیتاشیت. وارد کردن ولتاژ بیش از حد مجاز می تواند به برد آسیب بزند.

اگر می خواهید ولتاژ باتری یا منبعی با ولتاژ بالاتر از محدوده ورودی را اندازه گیری کنید، باید از مدار مناسب مانند تقسیم ولتاژ استفاده کنید.

۴. پین PWM چیست؟

PWM مخفف Pulse Width Modulation و به معنی مدولاسیون پهنای پالس است.

در این روش، خروجی به سرعت بین وضعیت HIGH و LOW تغییر می کند. با تغییر نسبت زمان روشن بودن به کل دوره تناوب، می توان توان متوسط تحویلی به برخی بارها را کنترل کرد.

این نسبت را Duty Cycle یا چرخه کاری می نامند.

برای مثال:

  • Duty Cycle برابر ۰ درصد: خروجی همیشه LOW است.
  • Duty Cycle برابر ۵۰ درصد: خروجی نیمی از زمان HIGH است.
  • Duty Cycle برابر ۱۰۰ درصد: خروجی همیشه HIGH است.

در Arduino Uno کلاسیک، پین های PWM با علامت ~ مشخص می شوند و عبارت اند از:

3, 5, 6, 9, 10, 11

برای تولید مقدار PWM از تابع analogWrite() استفاده می شود. در این برد کلاسیک، مقدار معمول این تابع از ۰ تا ۲۵۵ است.

مثال کنترل روشنایی LED با PWM

const int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for (int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(ledPin, brightness);
    delay(10);
  }

  for (int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(ledPin, brightness);
    delay(10);
  }
}

با اجرای این برنامه، روشنایی LED به تدریج افزایش و سپس کاهش پیدا می کند.

آیا PWM خروجی آنالوگ واقعی است؟

خیر. در Arduino Uno کلاسیک، analogWrite() معمولا خروجی PWM تولید می کند، نه یک ولتاژ آنالوگ ثابت. تغییر چرخه کاری باعث تغییر توان متوسط می شود؛ اما خود سیگنال همچنان بین HIGH و LOW تغییر می کند.

برای تبدیل PWM به ولتاژ تقریبا پیوسته می توان از فیلتر پایین گذر مناسب استفاده کرد. برای خروجی آنالوگ واقعی نیز باید از برد یا مبدل DAC دارای این قابلیت استفاده شود.

توجه: شماره پین های PWM، فرکانس و وضوح خروجی در مدل های مختلف آردوینو یکسان نیستند.

۵. پین های تغذیه و کاربرد آنها

بخش تغذیه برای تامین برق برد و اتصال صحیح زمین مدار اهمیت زیادی دارد.

پایه 5V

این پایه در Arduino Uno پنج ولت است و بسته به نحوه تغذیه برد می تواند برای تامین برق برخی قطعات مناسب باشد.

جریان قابل برداشت از این پایه نامحدود نیست و به منبع تغذیه، مدار برد و محدودیت های قطعات وابسته است.

پایه 3.3V

این پایه برای تغذیه ماژول هایی مناسب است که با ولتاژ ۳٫۳ ولت کار می کنند، به شرط آنکه جریان مورد نیازشان از ظرفیت این خروجی بیشتر نباشد.

ظرفیت جریان پایه 3.3V را باید در مشخصات همان مدل برد بررسی کرد.

پایه GND

GND مرجع صفر ولت مدار است. در بیشتر پروژه ها، زمین آردوینو باید به زمین سنسورها و ماژول های متصل نیز وصل شود تا سیگنال ها مرجع مشترک داشته باشند.

پایه VIN

VIN در بسیاری از بردها برای دریافت ولتاژ ورودی به مدار تغذیه برد استفاده می شود. محدوده مناسب ولتاژ VIN به مدل برد وابسته است.

در Arduino Uno کلاسیک، VIN معمولا برای تغذیه از منبع خارجی مناسب در نظر گرفته می شود؛ اما باید محدوده مجاز ولتاژ و شرایط دفع حرارت رگولاتور بررسی شود.

درگاه USB

درگاه USB برای بارگذاری برنامه و ارتباط با رایانه کاربرد دارد و معمولا می تواند برق برد را نیز تامین کند.

از اتصال هم زمان چند منبع تغذیه بدون بررسی طراحی برد خودداری کنید؛ نحوه مدیریت تغذیه USB و ورودی خارجی بین مدل ها متفاوت است.

۶. تفاوت پایه های اصلی در یک نگاه

نوع پایهکاربرد اصلینمونه تابع یا نام
دیجیتال ورودیخواندن کلید یا سیگنال دیجیتالdigitalRead()
دیجیتال خروجیروشن و خاموش کردن خروجیdigitalWrite()
آنالوگ ورودیخواندن ولتاژ متغیرanalogRead()
PWMکنترل چرخه کاری سیگنالanalogWrite()
تغذیه 5Vتامین ولتاژ پنج ولت در محدوده مجاز5V
تغذیه 3.3Vتامین ولتاژ سه و سه دهم ولت در محدوده مجاز3.3V
زمینمرجع مشترک ولتاژ مدارGND
ورودی تغذیه خارجیورود برق به مدار تغذیه بردVIN

۷. آیا یک پین می تواند چند کاربرد داشته باشد؟

بله. بعضی از پین ها علاوه بر کاربرد عمومی، وظایف دیگری هم دارند.

برای نمونه، در Arduino Uno کلاسیک:

  • پین های ۰ و ۱ برای ارتباط سریال سخت افزاری نیز استفاده می شوند.
  • پین های ۱۰ تا ۱۳ در رابط SPI نقش دارند.
  • پین های A4 و A5 برای ارتباط I2C نیز به کار می روند.
  • بعضی از پین های دیجیتال قابلیت PWM دارند.

استفاده هم زمان از چند قابلیت روی یک پین ممکن است باعث تداخل شود. بنابراین پیش از اتصال قطعات، بهتر است نقشه پایه های برد و نیازهای هر ماژول بررسی شود.

۸. تفاوت شماره پایه و شماره کانال آنالوگ

در کد آردوینو، پایه های آنالوگ را معمولا با نام هایی مانند A0 و A1 مشخص می کنیم:

int value = analogRead(A0);

در برخی بردها، پایه های آنالوگ قابلیت استفاده به عنوان ورودی و خروجی دیجیتال را نیز دارند؛ اما شماره گذاری و قابلیت های آنها به مدل برد وابسته است.

نباید فرض کرد که تمام بردهای آردوینو شماره پایه ها و امکانات کاملا یکسانی دارند.

۹. نکات مهم برای جلوگیری از آسیب به برد

  1. ولتاژ مجاز را رعایت کنید. پایه های برد را به ولتاژی بالاتر از محدوده مجاز متصل نکنید.
  1. جریان خروجی را محدود نگه دارید. پین های میکروکنترلر برای تامین جریان زیاد طراحی نشده اند. مقدار مجاز جریان هر پایه و مجموع جریان پایه ها را از دیتاشیت بررسی کنید.
  1. برای LED از مقاومت استفاده کنید. اتصال مستقیم LED به خروجی بدون محدودکننده جریان می تواند به LED یا میکروکنترلر آسیب بزند.
  1. موتورها را مستقیم به پین وصل نکنید. برای موتور، رله یا بارهای پرجریان از درایور مناسب استفاده کنید. در بارهای القایی، حفاظت مناسب در برابر ولتاژ برگشتی نیز ضروری است.
  1. زمین مشترک را فراموش نکنید. در مدارهایی که از منبع تغذیه خارجی استفاده می کنند، معمولا باید GND منبع و GND آردوینو مشترک باشند؛ مگر آنکه مدار به طور اصولی ایزوله طراحی شده باشد.
  1. ورودی آنالوگ را محافظت کنید. برای اندازه گیری ولتاژ باتری یا منابع بالاتر از محدوده ورودی، از تقسیم ولتاژ یا مدار اندازه گیری مناسب استفاده کنید.
  1. به ولتاژ منطقی ماژول ها توجه کنید. بردهای ۳٫۳ ولتی ممکن است در برابر سیگنال ۵ ولتی آسیب پذیر باشند. برای اتصال آنها به بردهای ۵ ولتی، سازگاری سطح منطقی را بررسی کنید.
  1. پایه ها را هنگام روشن بودن مدار جابه جا نکنید، مگر آنکه طراحی مدار و روش کار این امکان را به صورت ایمن فراهم کرده باشد.

۱۰. یک تمرین ساده

برای تمرین، یک LED را با مقاومت مناسب به پین دیجیتال ۸ متصل کنید و یک پتانسیومتر را به شکل زیر سیم کشی کنید:

  • پایه کناری اول پتانسیومتر به 5V
  • پایه کناری دوم پتانسیومتر به GND
  • پایه وسط پتانسیومتر به A0
  • آند LED از طریق مقاومت به پین PWM شماره ۹
  • کاتد LED به GND

سپس برنامه زیر را اجرا کنید:

const int potPin = A0;
const int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int sensorValue = analogRead(potPin);

  int brightness = map(sensorValue, 0, 1023, 0, 255);

  analogWrite(ledPin, brightness);

  delay(10);
}

با چرخاندن پتانسیومتر، مقدار خوانده شده از A0 تغییر می کند و روشنایی LED نیز به کمک PWM تنظیم می شود.

در این تمرین، سه مفهوم مهم را هم زمان به کار می برید:

  • خواندن ورودی آنالوگ با analogRead()
  • تبدیل محدوده عددی با map()
  • کنترل خروجی PWM با analogWrite()

جمع بندی

برای کار با آردوینو لازم است کاربرد پایه های مختلف را بشناسیم:

  • پین دیجیتال برای خواندن یا تولید وضعیت های منطقی استفاده می شود.
  • پین آنالوگ برای اندازه گیری ولتاژ متغیر به کار می رود.
  • پین PWM برای کنترل چرخه کاری سیگنال و تنظیم توان متوسط برخی بارها استفاده می شود.
  • پایه های 5V، 3.3V، GND و VIN در تغذیه و اتصال صحیح مدار نقش دارند.

پیش از سیم کشی هر پروژه، مدل دقیق برد، ولتاژ کاری، محدودیت جریان و نقشه پایه ها را بررسی کنید. این کار هم از آسیب سخت افزاری جلوگیری می کند و هم باعث می شود مدار قابل اعتمادتر و ایمن تری بسازید.

نمونه کد :

const int potPin = A0;
const int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int sensorValue = analogRead(potPin);
  int brightness = map(sensorValue, 0, 1023, 0, 255);

  analogWrite(ledPin, brightness);

  delay(10);
}