آردوینو – توابع I/O
پین های روی برد آردوینو می توانند به صورت ورودی یا خروجی تنظیم شوند. ما توابع مربوط به پین ها را در مُد آن ها توضیح خواهیم داد. ذکر این نکته حائز اهمیت است که اکثر پین های آنالوگ آردوینو ، دقیقاً مانند پین های دیجیتال ، تنظیم شده و مورد استفاده قرار می گیرند.
تنظیم پین ها به عنوان ورودی یا INPUT :
پین های آردوینو به طور پیش فرض به عنوان ورودی تنظیم شده اند ، بنابراین نیازی نیست وقتی از آن ها به عنوان ورودی استفاده می کنید از دستور ()pinMode برای تعیین مُد پین ها استفاده کنید. مد پین هایی که از طریق دستور ()pinMode تنظیم شده اند ، در حالت امپدانس بالا قرار دارند. پین های ورودی درخواست های بسیار کمی را در مدار نمونه برداری می کنند ، معادل مقاومت سری 100 مگا اهم در مقابل پین.
این بدان معنی است که برای جا به جایی پین ورودی از یک حالت به حالت دیگر ، جریان بسیار کمی را می کشد. این باعث می شود پین ها برای چنین کار هایی مانند راه اندازی یک سنسور لمسی خازنی یا خواندن یک LED به عنوان یک فتودیود ، مفید باشد.
پین ها با دستور (pinMode(pin, INPUT بدون هیچ اتصالی تنظیم می شوند. پین ها نیز می توانند با متصل کردن سیم هایی که به مدارهای دیگر وصل نیستند ، گزارش تغییرات تصادفی در حالت پین ، نویز گرفتن از محیط و یا حالت اتصال کوتاه خازنی را بدهند.
مقاومت در برابر فشار (pull-up) :
در صورت عدم وجود ورودی ، مقاومت های Pull-up اغلب برای شناسایی حالتِ پین ورودی مفید هستند. این کار را می توان با اضافه کردن یک مقاومت Pull-up (به + 5 ولت) یا مقاومت pull-down (مقاومت به زمین) روی ورودی انجام داد. مقاومت 10K یک مقدار مناسب برای مقاومت در برابر فشار (pull-up) یا مقاومت در برابر کشش (pull-down) است.
استفاده از مقاومت Pull-up داخلی با پین های تنظیم شده به عنوان ورودی :
20،000 مقاومت pull-up در تراشه Atmega وجود دارد که از طریق نرم افزار قابل دسترسی است. با تنظیم ()pinMode به عنوان INPUT_PULLUP به این مقاومت های pull-up داخلی دسترسی پیدا می کنید. تنظیم این مُد به طور موثری رفتار حالت INPUT را معکوس می کند تا جایی که HIGH به معنی این است که سنسور خاموش است و LOW به معنی روشن بودن سنسور است. مقدار مقاومت pull-up به میکروکنترلر مورد استفاده بستگی دارد. در اکثر برد های مبتنی بر AVR ، تضمین شده است که این مقدار بین 20kΩ و 50kΩ باشد. این مقاومت در آردوینو Due ، بین 50kΩ و 150kΩ است. برای پیدا کردن مقدار دقیق مقاومت pull-up باید به دیتاشیت (datasheet) میکروکنترلر استفاده شده در برد آردوینو ی خود مراجعه کنید.
اگر بخواهیم سنسوری را به پین تنظیم شده به صورت INPUT_PULLUP متصل کنیم ، انتهای دیگر سنسور باید به زمین وصل شود. از طرف دیگر در متصل کردن یک کلید ساده ، این مسئله باعث می شود که پین هنگامی که کلید نخورده ، مقدار HIGH را بخواند و هنگام فشار دادن کلید مقدار LOW باشد. مقاومت های pull-up جریان کافی را برای روشن کردن یک چراغ LED کم نور به پین ورودی را فراهم می کنند. اگر حس می کنید که LED های یک پروژه کار می کنند اما بسیار کم نور هستند ، احتمالاً درگیر افت جریان اند.
رجیستر های مشابه (مکان های حافظه ی تراشه ی داخلی) که کنترل می کنند پین HIGH یا LOW باشد ، مقاومت های pull-up را نیز کنترل می کنند. در نتیجه ، یک پین تنظیم شده است تا هنگامی که پین در حالت INPUT قرار دارد، به مقاومت های pull-up را نگاه می کند . اگر مقاومت پین برای حالت HIGH تنظیم شده باشد ، پین پس از آن با دستور ()pinMode به حالت OUTPUT تبدیل می شود . این عمل در جهت عکس نیز کار می کند و یک پین خروجی که در حالت HIGH باقی مانده است ، در صورت تبدیل به ورودی با دستور pinMode ، مقاومت pull-up را تنظیم خواهد کرد.
مثال :
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
پین ها به عنوان OUTPUT تنظیم شدند :
پین هایی که با دستور ()pinMode به عنوان OUTPUT تنظیم شده اند ، در حالت امپدانس کم قرار دارند. این بدان معنی است که آن ها می توانند مقدار قابل توجهی از جریان را به مدارهای دیگر ارائه دهند. پین های Atmega می توانند تا 40 میلی آمپر (میلی لیتر) جریان را به سایر دستگاه ها / مدارها ، source (منبع جریان مثبت) یا sink (تأمین جریان منفی) کنند. این جریان برای روشن کردن یک چراغ (مقاومت سری را فراموش نکنید) ، یا بسیاری از سنسور ها کافی است اما جریان کافی را برای اجرای رله ها ، solenoid ها یا موتور ها دارا نیست.
تلاش برای اجرای دستگاه های با جریان بالا از پین های خروجی ، می تواند ترانزیستور های خروجی موجود در پین را خراب یا از بین ببرد ، یا به کل تراشه Atmega آسیب برساند. اغلب منجر به پین “مُرده” در میکروکنترلر می شود اما تراشه های باقی مانده هنوز به اندازه کافی کار می کنند. به همین دلیل ایده خوبی است که بتوانید پین های OUTPUT را از طریق مقاومت 470Ω یا 1k به سایر دستگاه ها وصل کنید ، مگر اینکه حداکثر جریان کشیده شده از پین ها برای یک برنامه خاص مورد نیاز باشد.
تابع ()pinMode :
تابع ()pinMode برای تنظیم یک پین خاص برای رفتار به عنوان ورودی یا خروجی استفاده می شود. فعال کردن مقاومت های pull-up داخلی با حالت INPUT_PULLUP امکان پذیر است. علاوه بر این ، حالت INPUT صراحتاً مقاومت های pull-up داخلی را غیرفعال نمی کند.
pinMode() Function Syntax
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 برای دادن یک مقدار HIGH یا LOW در پین دیجیتال استفاده می شود. اگر پین به عنوان OUTPUT با دستور ()pinMode تنظیم شده باشد ، ولتاژ آن روی مقدار متناظر تنظیم می شود: 5 ولت (یا 3.3 ولت روی برد های 3.3 ولت) برای HIGH و برای LOW ، زمین یا 0 ولت . اگر پین به عنوان INPUT تنظیم شده باشد ، ()digitalWrite مقاومت داخلی pullup را در پین ورودی (HIGH) فعال و یا (LOW) غیرفعال می کند. توصیه می شود دستور ()pinMode را بر روی INPUT_PULLUP تنظیم کنید تا مقاومت داخلی pullup را فعال کنید.
اگر ()pinMode را روی OUTPUT قرار ندهید و یک LED را به یک پین وصل کنید ، هنگام دادن مقدار (digitalWrite(HIGH ، ممکن است LED کم رنگ باشد. اگر ()pinMode واضح مشخص نشود ، ()digitalWrite مقاومت داخلی pullup را فعال می کند که مانند یک مقاومت بزرگ محدود کننده جریان عمل خواهد کرد.
تابع دستوری ()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 :
آردوینو قادر است تشخیص دهد ولتاژ اعمال شده در یکی از پین های آن وجود دارد و آن را از طریق تابع ()analogRead اعلام کند. بین یک سنسور روشن / خاموش (که وجود یک شی را تشخیص می دهد) و یک سنسور آنالوگ ، که مقدار آن به طور مداوم تغییر می کند ، تفاوت وجود دارد. برای خواندن این نوع سنسور ، به نوع دیگری از پین احتیاج داریم.
در قسمت پایین سمت راست برد آردوینو ، شش پین با علامت “Analog In” مشاهده خواهید کرد. این پین های مخصوص نه تنها قابلیت اعمال ولتاژ بر روی آن ها وجود دارد بلکه قابلیت اندازه گیری مقدار را نیز دارند. با استفاده از تابع ()analogRead می توانیم ولتاژ اعمال شده در یکی از پین ها را بخوانیم.
این تابع یک عدد را بین 0 تا 1023 بر می گرداند که ولتاژ های بین 0 تا 5 ولت را نشان می دهد. به عنوان مثال ، اگر یک ولتاژ 2.5 ولت برای پین شماره 0 اعمال شود ، تابع (analogRead(0 عدد 512 را برمی گرداند.
فرم دستوری ()analogRead :
analogRead(pin);
- pin : شماره پین ورودی آنالوگ برای خواندن (0 تا 5 در اکثر برد ها ، 0 تا 7 در Mini و Nano ، صفر تا 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 }