
آموزش ورودی و خروجی دیجیتال در آردوینو
یکی از اولین مهارت هایی که برای کار با آردوینو باید یاد بگیرید، استفاده از ورودی ها و خروجی های دیجیتال است. با کمک این قابلیت می توانید LED را روشن کنید، وضعیت دکمه را بخوانید، رله را کنترل کنید یا اطلاعات دیجیتال را از یک حسگر دریافت کنید.
در این آموزش، سه تابع اصلی را یاد می گیریم:
pinMode()برای تعیین نوع عملکرد پایهdigitalWrite()برای تنظیم وضعیت خروجی دیجیتالdigitalRead()برای خواندن وضعیت ورودی دیجیتال
برای مثال های این آموزش از برد Arduino Uno استفاده می کنیم. در بردهای دیگر، تعداد پایه ها، ولتاژ منطقی و بعضی محدودیت ها ممکن است متفاوت باشد.
۱. ورودی و خروجی دیجیتال چیست؟
سیگنال دیجیتال در ساده ترین حالت دو وضعیت منطقی دارد:
HIGH: وضعیت منطقی بالاLOW: وضعیت منطقی پایین
در Arduino Uno که از میکروکنترلر ۵ ولتی استفاده می کند، این وضعیت ها معمولا با ولتاژ نزدیک به ۵ ولت و نزدیک به صفر ولت متناظر هستند. مقدار دقیق ولتاژ به شرایط مدار و مشخصات پایه بستگی دارد.
خروجی دیجیتال
وقتی یک پایه را به عنوان خروجی تنظیم می کنیم، برنامه می تواند وضعیت آن را کنترل کند.
برای مثال، می توانیم پایه را روی HIGH قرار دهیم تا LED روشن شود و سپس آن را روی LOW قرار دهیم تا LED خاموش شود.
ورودی دیجیتال
وقتی یک پایه را به عنوان ورودی تنظیم می کنیم، آردوینو وضعیت الکتریکی آن را می خواند.
برای مثال، می توانیم یک دکمه را به ورودی متصل کنیم و با فشردن آن، برنامه را وادار کنیم LED را روشن کند.
نکته: ورودی دیجیتال فقط دو وضعیت منطقی را تشخیص می دهد؛ برای اندازه گیری یک مقدار پیوسته مانند ولتاژ خروجی پتانسیومتر، معمولا از ورودی آنالوگ و تابع analogRead() استفاده می کنیم.
۲. تابع pinMode()
تابع pinMode() مشخص می کند که یک پایه به عنوان ورودی یا خروجی کار کند.
ساختار تابع:
pinMode(pin, mode);پارامترها:
pin: شماره پایه مورد نظرmode: حالت عملکرد پایه
حالت های پرکاربرد عبارت اند از:
| حالت | کاربرد |
|---|---|
INPUT | خواندن وضعیت ورودی |
OUTPUT | کنترل خروجی دیجیتال |
INPUT_PULLUP | ورودی با فعال کردن مقاومت پول آپ داخلی |
مثال:
pinMode(8, OUTPUT);این دستور پایه دیجیتال شماره ۸ را به عنوان خروجی تنظیم می کند.
مثال دیگر:
pinMode(2, INPUT);این دستور پایه شماره ۲ را به عنوان ورودی تنظیم می کند. در این حالت، مدار خارجی باید وضعیت ورودی را به شکل مشخصی تعیین کند؛ در غیر این صورت ممکن است پایه شناور شود و مقدار ناپایدار بخواند.
برای بسیاری از کاربردهای دکمه می توان از INPUT_PULLUP استفاده کرد:
pinMode(2, INPUT_PULLUP);در این حالت مقاومت پول آپ داخلی فعال می شود و اگر دکمه پایه را به GND وصل کند، هنگام فشردن دکمه مقدار LOW خوانده می شود.
۳. تابع digitalWrite()
تابع digitalWrite() وضعیت یک پایه دیجیتال را تنظیم می کند.
ساختار تابع:
digitalWrite(pin, value);pin: شماره پایهvalue: وضعیت مورد نظر، یعنیHIGHیاLOW
مثال:
digitalWrite(8, HIGH);اگر پایه ۸ به عنوان خروجی تنظیم شده باشد، آن را در وضعیت منطقی بالا قرار می دهد.
برای پایین آوردن خروجی:
digitalWrite(8, LOW);در مدار مناسب، این دستور باعث می شود ولتاژ خروجی به سطح منطقی پایین نزدیک شود.
نکته مهم: digitalWrite() جایگزین مدار درایور برای بارهای پرمصرف نیست. موتور، رله یا بارهای جریان بالا را نباید مستقیما از پایه آردوینو تغذیه کرد؛ برای این کار به مدار واسط مناسب نیاز است.
۴. اولین مثال: روشن و خاموش کردن LED
در این مثال، یک LED را به پایه دیجیتال شماره ۸ متصل می کنیم و هر یک ثانیه وضعیت آن را تغییر می دهیم.
قطعات مورد نیاز
- یک برد Arduino Uno
- یک بردبرد
- یک LED
- یک مقاومت مناسب، برای مثال ۲۲۰ یا ۳۳۰ اهم
- سیم جامپر
اتصال مدار
اتصال را به شکل زیر انجام دهید:
- پایه دیجیتال ۸ آردوینو را به یک سر مقاومت وصل کنید.
- سر دیگر مقاومت را به آند LED وصل کنید.
- کاتد LED را به GND آردوینو وصل کنید.
مقاومت و LED در یک مسیر سری قرار می گیرند. مقاومت، جریان عبوری از LED را محدود می کند.
کد برنامه
const int ledPin = 8;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}بررسی برنامه
const int ledPin = 8;شماره پایه LED را در یک ثابت ذخیره می کند.setup()فقط یک بار پس از راه اندازی یا ریست اجرا می شود.pinMode(ledPin, OUTPUT);پایه را به عنوان خروجی تنظیم می کند.digitalWrite(ledPin, HIGH);LED را روشن می کند.delay(1000);برنامه را به مدت تقریبی یک ثانیه متوقف می کند.digitalWrite(ledPin, LOW);LED را خاموش می کند.- چون دستورات داخل
loop()تکرار می شوند، LED پیوسته روشن و خاموش خواهد شد.
تمرین: مقدارهای delay(1000) را به delay(200) تغییر دهید. چه تغییری در سرعت چشمک زدن LED ایجاد می شود؟
۵. تابع digitalRead()
تابع digitalRead() وضعیت منطقی یک پایه دیجیتال را می خواند.
ساختار تابع:
digitalRead(pin);نتیجه این تابع یکی از دو مقدار زیر است:
HIGHLOW
مثال:
int buttonState = digitalRead(2);در این مثال، وضعیت پایه شماره ۲ خوانده و در متغیر buttonState ذخیره می شود.
برای تصمیم گیری درباره نتیجه می توان از شرط استفاده کرد:
if (buttonState == HIGH) {
// دستورات مربوط به وضعیت HIGH
}توجه کنید که digitalRead() فقط وضعیت الکتریکی پایه را می خواند. اینکه HIGH به معنی فشرده شدن دکمه باشد یا رها بودن آن، به نحوه سیم کشی مدار بستگی دارد.
۶. مثال عملی: کنترل LED با دکمه
در این مثال، با فشردن دکمه LED روشن و با رها کردن آن خاموش می شود. از مقاومت پول آپ داخلی آردوینو استفاده می کنیم تا نیاز به مقاومت خارجی برای تعیین وضعیت اولیه ورودی نداشته باشیم.
اتصال دکمه
- یک پایه دکمه را به پایه دیجیتال شماره ۲ وصل کنید.
- پایه دیگر دکمه را به GND وصل کنید.
- LED را مانند مثال قبلی، با مقاومت سری به پایه شماره ۸ متصل کنید.
در این مدار از INPUT_PULLUP استفاده می کنیم؛ بنابراین هنگام رها بودن دکمه مقدار ورودی HIGH و هنگام فشردن دکمه مقدار آن LOW است.
کد برنامه
const int buttonPin = 2;
const int ledPin = 8;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}برنامه چگونه کار می کند؟
ابتدا پایه دکمه به عنوان ورودی دارای پول آپ داخلی و پایه LED به عنوان خروجی تنظیم می شود.
سپس در هر بار اجرای loop():
- وضعیت دکمه خوانده می شود.
- اگر وضعیت
LOWباشد، یعنی دکمه فشرده شده است؛ LED روشن می شود. - در غیر این صورت، LED خاموش می شود.
نکته: به دلیل استفاده از INPUT_PULLUP، منطق دکمه برعکس چیزی است که ممکن است در ابتدا انتظار داشته باشید: فشردن دکمه برابر با LOW است، نه HIGH.
این مثال برای یادگیری ورودی دیجیتال مناسب است؛ اما دکمه های مکانیکی ممکن است هنگام فشردن یا رها کردن چند تغییر سریع در سیگنال ایجاد کنند. این پدیده «لرزش کنتاکت» یا Debounce نام دارد. برای برنامه هایی که به تشخیص دقیق هر بار فشردن نیاز دارند، باید از روش حذف لرزش استفاده کرد.
برای آموزش کامل تر، مستند «خواندن دکمه با آردوینو: digitalRead، پول آپ و دی بانس» را مطالعه کنید.
۷. تفاوت INPUT، INPUT_PULLUP و OUTPUT
این سه حالت را با هم اشتباه نگیرید:
| حالت | رفتار پایه | کاربرد نمونه |
|---|---|---|
INPUT | وضعیت الکتریکی پایه را می خواند | دریافت سیگنال از یک مدار خارجی |
INPUT_PULLUP | ورودی را می خواند و پول آپ داخلی را فعال می کند | اتصال ساده دکمه بین پایه و GND |
OUTPUT | وضعیت خروجی را کنترل می کند | روشن و خاموش کردن LED |
در حالت INPUT، اگر هیچ مدار مشخصی وضعیت پایه را تعیین نکند، ورودی شناور می شود و ممکن است مقادیر غیرقابل پیش بینی ایجاد کند.
در حالت INPUT_PULLUP، مقاومت داخلی پایه را در حالت عادی به سطح منطقی بالا می کشد. با اتصال پایه به GND، ورودی به LOW تبدیل می شود.
۸. نکات مهم و اشتباهات رایج
فراموش کردن pinMode()
اگر پایه را به عنوان خروجی تنظیم نکنید، ممکن است برنامه مطابق انتظار LED را کنترل نکند.
راه حل: در setup() حالت هر پایه را مشخص کنید.
اشتباه گرفتن شماره پایه
شماره پایه ای که در کد می نویسید باید با محل اتصال سیم روی برد هماهنگ باشد.
راه حل: قبل از اجرا، شماره پایه را روی برد بررسی کنید.
حذف مقاومت LED
LED را بدون مقاومت محدودکننده جریان به خروجی آردوینو وصل نکنید. مقدار مقاومت باید با ولتاژ، افت ولتاژ LED و جریان هدف متناسب باشد.
فراموش کردن زمین مشترک
در مدارهایی که از منبع تغذیه یا ماژول خارجی استفاده می کنند، معمولا لازم است GND ها به شکل صحیح مشترک شوند تا سطح منطقی سیگنال ها قابل تشخیص باشد.
ورودی شناور
اگر ورودی به سطح HIGH یا LOW مشخصی متصل نباشد، مقدار خوانده شده ممکن است تصادفی به نظر برسد. از مقاومت پول آپ یا پول داون مناسب استفاده کنید.
تصور اشتباه درباره HIGH و LOW
HIGH همیشه به معنی «دکمه فشرده» نیست. معنی آن به طراحی مدار بستگی دارد. در مدار INPUT_PULLUP، دکمه متصل به GND هنگام فشردن LOW خوانده می شود.
اتصال بار پرمصرف به پایه
پایه های آردوینو جریان محدودی دارند. برای موتور، رله یا نوار LED باید از مدار درایور مناسب استفاده کنید و محدودیت های برد و قطعات را رعایت کنید.
۹. تمرین های پیشنهادی
تمرین اول: چشمک زدن سریع و آهسته
کد LED را تغییر دهید تا LED به مدت ۲۰۰ میلی ثانیه روشن و ۸۰۰ میلی ثانیه خاموش باشد.
تمرین دوم: معکوس کردن رفتار LED
برنامه دکمه را تغییر دهید تا هنگام فشرده بودن دکمه LED خاموش و هنگام رها بودن آن روشن باشد.
تمرین سوم: انتخاب پایه متفاوت
LED را به پایه دیجیتال شماره ۷ منتقل کنید. برنامه را هم تغییر دهید تا LED همچنان درست کار کند.
تمرین چهارم: نمایش وضعیت دکمه
با استفاده از Serial.begin() و Serial.println() وضعیت دکمه را در Serial Monitor نمایش دهید. بررسی کنید هنگام فشردن و رها کردن دکمه، چه مقدارهایی مشاهده می کنید.
تمرین پنجم: کنترل دو LED
دو LED با مقاومت های سری مناسب به دو پایه خروجی وصل کنید. برنامه را طوری تغییر دهید که هنگام روشن بودن LED اول، LED دوم خاموش باشد و برعکس.
جمع بندی
ورودی و خروجی دیجیتال از پایه های اصلی برنامه نویسی آردوینو هستند.
- با
pinMode()نوع عملکرد پایه را تعیین می کنیم. - با
digitalWrite()وضعیت خروجی را رویHIGHیاLOWقرار می دهیم. - با
digitalRead()وضعیت منطقی ورودی را می خوانیم.
با ترکیب این سه تابع و شرط های برنامه نویسی می توان مدارهای ساده ای مانند چشمک زن، کنترل LED با دکمه و بسیاری از پروژه های مقدماتی را ساخت.
پیشنهاد می شود پس از انجام مثال های این آموزش، به سراغ خواندن دکمه با حذف لرزش کنتاکت، ورودی آنالوگ با analogRead() و کنترل خروجی با PWM بروید.
