توابع ورودی/خروجی در آردوینو ، پایه های روی برد آردوینو را میتوانیم بر روی دو حالت ورودی یا خروجی تنظیم کنیم. عملکرد هر پایه را در بخش های بعدی توضیح خواهیم داد. نکته مهمی که باید به آن اشاره شود این است که بسیاری از تنظیمات مرتبط به پایه های آنالوگ مشابه پایه های دیجیتال است و میتوانیم مانند یک پایه دیجیتال از پایه های آنالوگ استفاده کنیم.
تنظیم پایه های آردوینو به عنوان ورودی :
پایه های آردوینو به صورت پیشفرض ورودی هستند و در صورتی که میخواهید از یک پایه به عنوان ورودی استفاده کنید نیازی به استفاده از تابع 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 ها بحث میکنیم.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
با عرض سلام چگونه میتوانم خروجی سنسور انالوگ که یک سنسور القایی است را به میلی متر در اردینو برنامه نویسی کنم؟البته با دقت دهم میلی متر ممنونم
همه مطالب عالی بودن .
تشکر فراوان از زحمات شما