توابع ورودی/خروجی در آردوینو

توابع ورودی/خروجی در آردوینو ، پایه های روی برد آردوینو را میتوانیم بر روی دو حالت ورودی یا خروجی تنظیم کنیم. عملکرد هر پایه را در بخش های بعدی توضیح خواهیم داد. نکته مهمی که باید به آن اشاره شود این است که بسیاری از تنظیمات مرتبط به پایه های آنالوگ مشابه پایه های دیجیتال است و میتوانیم مانند یک پایه دیجیتال از پایه های آنالوگ استفاده کنیم.

توابع ورودی/خروجی در آردوینو

تنظیم پایه های آردوینو به عنوان ورودی :

پایه های آردوینو به صورت پیشفرض ورودی هستند و در صورتی که میخواهید از یک پایه به عنوان ورودی استفاده کنید نیازی به استفاده از تابع pinMode وجود ندارد. به پایه هایی که در این وضعیت هستند به اصطلاح وضعیت امپدانس-بالا گفته می شود. در این حالت مشابه این است که یک مقاومت 100 مگا اهمی با هر پایه سری شده است و در نتیجه پایه آردوینو تاثیر بسیار کمی بر روی مدارای که به آن متصل می شود می گذارد.

در این حالت برای تغییر وضعیت یک پایه جریان بسیار کمی از مداری که به آن متصل شده است کشیده خواهد شد. در این حالت استفاده از پایه به عنوان استفاده از وسایل جانبی مانند سنسور لمسی یا خواندن مقدار یک فتودیود کاربرد دارد.

پایه ای که به صورت (pinMode(pin, INPUT  تنظیم شده است و چیزی به آن متصل نشده است یا به سیمی متصل شده است که به بخشی از مدار متصل نیست، مقدار ورودی مقداری تصادفی خواهد بود و امکان دریافت نویز از این پایه وجود خواهد داشت یا امکان القای مقدار پایه های ورودی روی این پایه وجود خواهد داشت.

مقاومت های بالاکش (Pull-up) :

کاربرد مقاومت بالاکش در تعیین وضعیت منطقی یک پایه ورودی در صورتی که مقدار معینی وجود نداشته باشد است. برای این منظور میتوان یک مقاومت بالاکش (به ولتاژ +5V) یا یک مقاومت پایین کش (به زمین) به پایه ورودی  متصل نمود. به عنوان پیشنهاد یک مقاومت 100 کیلو اهم میتواند مقدار مناسبی برای مقاومت بالاکش یا پایین کش باشد.

توضیحات بیشتر : مقاومت های بالاکش و پایین کش

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

در آردوینو  مقاومت بالاکش داخلی وجود دارد که به صورت نرم افزاری قابل تنظیم هستند. به این منظور باید از تابع pinMode  برای تنظیم حالت INPUT_PULLUP استفاده شود. در این حالت وضعیت ورودی پایه معکوس می شود. مثلا در صورتی که ورودی یک باشد یعنی سنسور غیرفعال است و زمانی که ورودی صفر باشد یعنی سنسور فعال شده است. مقدار مقاومت بالاکش بستگی به نوع میکروکنترلر مورد استفاده دارد. در اغلب بردهای آردوینو این مقدار بین 20 کیلو اهم تا 50 کیلو اهم است. در بردهای Arduino Due معمولا مقدار مقاومت بالاکش بین 50 کیلو اهم تا 150 کیلو اهم است. به منظور اطلاع از مقدار دقیق آن دیتاشیت نوع میکروکنترلر استفاده شده بر روی برد را مطالعه کنید.

مطلب پیشنهادی:  انواع داده در آردوینو

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

همان رجسیترهایی (مکان های حافظه داخلی میکروکنترلر) که وضعیت یک یا صفر بودن یک پایه را تعیین می کنند برای تعیین وضعیت مقاومت بالاکش نیز استفاده می شوند. به عنوان مثال اگر مقاومت بالاکش را در حالتی که وضعیت پایه بر روی INPUTmode فعال کرده باشیم، اگر حالت پایه را توسط تابع pinMode   به حالت OUTPUT یا خروجی تغییر دهیم، خروجی در وضعیت یک خواهد بود. برعکس این موضوع نیز صحیح است، یعنی اگر پایه ای که خروجی است و مقدار آن یک منطقی است را توسط تابع pinMode  به حالت خروجی تغییر دهیم، در این حالت مقاومت بالاکش فعال خواهد بود.

مثال :

pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor

تنظیم پایه های آردوینو به عنوان خروجی

پایه هایی که توسط تابع pinMode() به حالت خروجی تنظیم شوند به اصطلاح گفته می شود که در وضعیت امپدانس-پایین تنظیم شده اند. در این وضعیت این پایه میتواند جریانی مناسب را برای مدارات دیگر تامین کند. میکروکنترلرهای Atmega میتوانند جریان خروجی (مثبت) یا جریان ورودی (منفی) تا حداکثر مقدار 40mA را برای دیگر قطعات یا مدارات تامین کنند. این جریان برای روشن کردن یک LED (به همراه مقاومت سری) یا فعال سازی بسیاری از سنسورها کافی خواهد بود اما قطعا برای راه اندازی رله ، موتور و… کافی نخواهد بود.

مطلب پیشنهادی:  توابع پایه مرتبط با ارتباط سریال در آردوینو

هر تلاشی به منظور کشیدن جریانی بیش از مقدار ذکر شده منجر به آسیب دیدن ترانزیستور پایه های و آسیب دیدن میکروکنترلر Atmega خواهد شد. البته اغلب در این شرایط همه تراشه آسیب نمی بیند و فقط پایه مذکور آسیب خواهد دید. برای جلوگیری از این مسئله همواره توصیه می شود که یا از توانایی میکروکنترلر به منظور تامین جریان قطعات دیگر اطمینان حاصل کنید یا با پایه های خروجی یک مقاومت 1 کیلو اهم تا 470 کیلو اهم سری کنید.

تابع pinMode

همان طور که در مورد تابع pinMode  صحبت شد، از این تابع به منظور تعیین ورودی یا خروجی بودن یک پایه از میکروکنترلر استفاده می شود. همچنین به منظور فعال سازی مقاومت بالاکش داخلی می توان از وضعیت INPUT_PULLUP استفاده نمود. در صورت عدم استفاده از این حالت نیز در حالت ورودی مقاومت بالاکش داخلی غیر فعال خواهد بود.

دستور نگارش تابع pinMode :

Void setup () {
 pinMode (pin , mode);
}
  • Pin : شماره پایه ای که میخواهید وضعیت آنها را تغییر دهید.
  • Mode : INPUT ، OUTPUT یا INPUT_PULLUP

مثال :

int button = 5 ; // button connected to pin 5
int LED = 6; // LED connected to pin 6

void setup () {
 pinMode(button , INPUT_PULLUP); 
 // set the digital pin as input with pull-up resistor
 pinMode(button , OUTPUT); // set the digital pin as output
}

void setup () {
 If (digitalRead(button ) == LOW) // if button pressed {
 digitalWrite(LED,HIGH); // turn on led
 delay(500); // delay for 500 ms
 digitalWrite(LED,LOW); // turn off led
 delay(500); // delay for 500 ms
 }
}

تابع digitalWrite

از تابع digitalWrite  برای نوشتن مقدار یک یا صفر منطقی بر روی یک پایه دیجیتال استفاده می شود. اگر پایه توسط تابع pinMode در وضعیت خروجی تنظیم شده است، ولتاژ آن را میتوانیم به روی 5V (یا 3.3V در بعضی از بردها) برای وضعیت یک منطقی (HIGH) و 0V (زمین) برای وضعیت صفر منطقی (LOW) تنظیم نمایید.

اگر پایه به عنوان ورودی (INPUT) تنظیم شده است، تابع digitalWrite  مقاومت بالاکش داخلی را فعال (HIGH) یا غیرفعال (LOW) خواهد کرد. پیشنهاد می شود برای فعال سازی مقاومت بالاکش داخلی توسط تابع pinMode  وضعیت پایه را بر روی حالت INPUT_PULLUP قرار دهید.

اگر با استفاده از تابع pinMode  وضعیت پایه را خروجی نکرده باشید، در صورتی که از تابع به صورت (digitalWrite(HIGH استفاده کنید و یک LED به پایه متصل کنید، LED به صورت کم نور روشن خواهد شد. بدون استفاده از تابع pinMode  ، تابع digitalWrite  مقاومت بالاکش داخلی را به عنوان یک مقاومت کاهش دهنده جریان های زیاد فعال سازی خواهد کرد.

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

دستور نگارش تابع digitalWrite  :

Void loop() {
 digitalWrite (pin ,value);
}
  • Pin : شماره پایه ای که میخواهید آن را تنظیم کنید
  • Value : HIGH یا LOW

مثال :

int LED = 6; // LED connected to pin 6

void setup () {
 pinMode(LED, OUTPUT); // set the digital pin as output
}

void setup () { 
 digitalWrite(LED,HIGH); // turn on led
 delay(500); // delay for 500 ms
 digitalWrite(LED,LOW); // turn off led
 delay(500); // delay for 500 ms
}

تابع analogRead 

در آردوینو توسط تابع digitalRead  میتوانید مقدار ولتاژ اعمال شده به پایه ورودی را بخوانید. بین یک سنسوری که تنها دو حالت یک یا صفر دارد (که وجود یک شیء را تشخیص می دهد) و یک سنسور آنالوگ که خروجی آن به صورت پیوسته تغییر می کند تفاوت وجود دارد. به منظور خواندن مقدار یک سنسور آنالوگ نیاز به استفاده از پایه های آنالوگ داریم.

در بخش پایین سمت راست برد آردوینو پایه هایی با نام Analog In مشخص شده اند. توسط این پایه ها علاوه بر این که میتوانید متوجه شوید که آیا ولتاژی اعمال شده است یا خیر، میتوانید مقدار ولتاژ اعمال شده را نیز توسط تابع analogRead   بخوانید. این تابع یک عدد از0  تا 1023 را به عنوان نمادی از مقدار ولتاژ ورودی از 0V تا 5V به خروجی ارسال می کند. مثلا اگر ولتاژ ورودی پایه آنالوگ صفر 2.5V باشد، توسط تابع (analogRead(0 عدد 512 برگردانده خواهد شد.

دستور نگارش تابع analogRead

analogRead(pin);
  • pin : شماره پایه آنالوگی که میخواهید مقدار آن را بخوانید (در اکثر بردها از 0 تا 5، در بردهای Mini و Nano از 0 تا 7 و در بردهای Mega از 0 تا 15)

مثال :

int analogPin = 3;//potentiometer wiper (middle terminal)
 // connected to analog pin 3
 int val = 0; // variable to store the value read

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

void loop() {
 val = analogRead(analogPin); // read the input pin
 Serial.println(val); // debug value

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

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

2 دیدگاه

  1. حمیدرضا قربانی

    با عرض سلام چگونه میتوانم خروجی سنسور انالوگ که یک سنسور القایی است را به میلی متر در اردینو برنامه نویسی کنم؟البته با دقت دهم میلی متر ممنونم

  2. همه مطالب عالی بودن .
    تشکر فراوان از زحمات شما