پرش به محتوا

آموزش توابع آردوینو – ورودی خروجی پیشرفته

ابتدا آموزش ورودی و خروجی های دیجیتال را برسی کردیم. در این بخش توابع پیشرفته ای را برسی میکنیم که به کمک به کار گیری تایمر ها عملکرد های پیچیده مرتبط با پالس ها را برای شما انجام می دهد. برای ایجاد یک پالس مربعی مشخص و یا خواندن دوره زمانی یک پالس مربعی توابع این آموزش روند برنامه نویسی شما را تسهیل میکند. همچنین برای ارسال یا دریافت یک داده باینری به سادگی یک پروتکل ساده ایجاد کنید. (در آیسی های شیفت رجیستر کاربرد دارد)
آموزش توابع آردوینو

در آموزش توابع آردوینو به کمک 6 تابع ( ورودی خروجی پیشرفته ) ورودی و خروجی دیجیتال میکروکنترلر را با قابلیت های پیشرفته هر تابع کنترل میکنیم.

جهت شرکت در دوره، آموزش جامع توابع آردوینو – Fanctions کلیک کنید.

      برای رفتن به لیست توابع کلیک کنید

()tone

شرح:

این خروجی پیشرفته موج مربعی از فرکانس مشخص شده (و چرخه وظیفه 50٪) را روی پین ایجاد می کند. مدت زمان را می توان مشخص کرد ، در غیر این صورت موج تا تماس با ()noTone  ادامه می یابد. پین را می توان به صدای پیزو یا بلندگو دیگر وصل کرد تا صدای آن را پخش کند. فقط یک لحظه می تواند همزمان تولید شود. اگر tone از قبل روی پین دیگری پخش شود ، تماس با ()tone تأثیر نخواهد داشت. اگر tone در همان پین پخش شود ، تماس فرکانس آن را تنظیم می کند.
استفاده از عملکرد ()tone با خروجی PWM روی پین های 3 و 11 ( روی برد های غیر از مگا ) تداخل خواهد کرد.
تولید tone های کمتر از 31 هرتز امکان پذیر نیست.
برای جزئیات فنی ، به یادداشت ها مراجعه‌ کنید.

ساختار کد دستور:

tone (فرکانس ، پین)
tone (مدت زمان ، فرکانس ، پین)

مولفه ها:

پین: پایه ای که بر روی آن پالس ایجاد می شود.
فرکانس: فرکانس پالس (هرتز) نوع داده: unsigned int 
مدت زمان: مدت زمان پالس بر حسب میلی ثانیه‌ (اختیاری) – نوع داده: unsigned long

ورودی خروجی پیشرفته

یادداشت ها و اخطارها:

اگر می‌خواهید پالس های مختلف را روی چندین پین اجرا کنید، باید قبل از فراخوانی ()tone در پین بعدی، ()noTone را روی پین قبلی فراخوانی کنید.

      برای رفتن به لیست توابع کلیک کنید

;()noTone

شرح:

تولید موج مربعی را که توسط خروجی پیشرفته tone() باعث ایجاد پالس می شود متوقف می کند . اگر تابع tone فراخوانی نشود هیچ تاثیری ندارد.

ساختار کد دستور:

noTone (پین)

مولفه ها:

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

کد نمونه:

این کد برا اساس نت های استاندارد ملودی را از بلندگو پخش میکند.

				
					int melody[] = { 262 , 196 , 196, 220, 196, 0, 247 , 262 };
//مدت زمان نوت موسیقی 4=نت چهارم ، 8 = نت هشتم ، و غیره
int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };
void setup() {
  // تکرار نت های ملودی
  for (int thisNote = 0; thisNote < 8; thisNote++) {
        // برای محاسبه مدت زمان توجه ، یک ثانیه را براساس نوع نت تقسیم کنید
        // به عنوان مثال، نت چهارم = 1000/4 ، یادداشت هشتم = 1000/8 و غیره
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);
       // برای مشخص کردن یادداشت ها ، حداقل زمان را بین آنها قرار دهید
        //  مدت زمان یادداشت + 30٪ خوب به نظر می رسد:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
        // توقف صدای نت:
    noTone(8);
  }
}
void loop() {
  // نیازی به تکرار ملودی نیست
}
				
			
ورودی خروجی پیشرفته

یادداشت ها و اخطارها:

اگر می‌خواهید پالس های مختلف را روی چندین پین اجرا کنید، باید قبل از فراخوانی ()tone در پین بعدی، ()noTone را روی پین قبلی فراخوانی کنید.

      برای رفتن به لیست توابع کلیک کنید

()pulseIn

شرح:

با این تابع ورودی خروجی پیشرفته میتوانید مقدار پالس (High یا Low) ایجاد شده روی یک پین آردوینو را بخوانید. مثلا اگر مقدار را روی High قرار داده‌ باشید، تابع pulseIn() منتظر میماند تا پین High شود و تایمینگ را آغاز میکند. در ادامه زمانی که پین Low شود تایمینگ متوقف شده و مقدار پالس برحسب میکروثانیه بازگردانده‌‌ میشود.

همچنین ممکن است در طی مدت زمان تایم اوت (که مقدار آن را میتوانید مشخص کنید) پالس شروع ارسال نشده‌ باشد. دراین صورت مقدار 0 بازگشت داده‌میشود اما طبق تجربه بهتر است از این تابع برای پالس‌های کوچک استفاده کنید تا با مشکل مواجه‌نشوید. از این تابع میتوانید برای خواندن پالس های 10 میکروثانیه تا 3 دقیقه استفاده‌ کنید. 

نکته‌ مهم: اگر مدت زمان تایم اوت را مشخص کنید، کد سریع تر اجرا میشود.

ورودی خروجی پیشرفته

نحو:

  • pulseIn(پین, مقدار)
  • pulseIn(پین, مقدار,مدت زمان )

مولفه‌ ها:

  • پین‌: مشخص کنید پالس با کدام یک از پین های آردوینو خوانده‌ شود. (‌داده‌ مجاز: int)

    ‌مقدار: نوع پالسی که باید خوانده شود را وارد کنید که High یا Low است. (داده‌ مجاز: int)

    مد‌ت زمان: مشخص کردن مدت زمان تایم اوت اختیاری است و مشخص میکند که چقدر منتظر سیگنال شروع باشید. تایم اوت به صورت پیشفض روی 1.000.000 میکروثانیه تنظیم شده‌ است. (د‌اده‌ مجاز: unsigned long)

مقدار بازگشتی:

طول پالس بر حسب میکروثانیه بازگردانده‌ میشود. در صورتی که تایم اوت طی شود و پالس شروع مشاهده‌ نشود، مقدار صفر بازگردانده‌ خواهد شد. (داده‌‌ مجاز: unsigned long)

نمونه‌ کد:

کد زیر طول پالس ایجاد شده روی پین 7 را پرینت میکند:

				
					int pin = 7;
unsigned long duration;

void setup() {
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop() {
  duration = pulseIn(pin, HIGH);
  Serial.println(duration);
}

				
			

()pulseInLong

شرح:

pulseinlong () تابع جایگزین برای pulseIn() است که برای اندازه گیری مدت زمان یک پالس در پین دیجیتال مورد استفاده‌ قرار میگیرد. از این تابع برای اندازه گیری پالس‌های طولانی تر (تا سه دقیقه) استفاده میشود و نسبت به pulseIn() دقت و اطمینان بیشتری دارد. همچنین در برخی سناریوها وقفه ها روی پالس اثر میگذارند و این تابع برای این موارد نیز طراحی شده‌ است.

این تابع پالس (یعنی سیگنال 1 یا 0) اعمال شده روی یک پین را میخواند. مثلا در صورتی که مقدار value  را روی High قرار داده‌باشید، Pulseinlong () صبر میکند تا پالس از Low به High تبدیل شود. حالا تایمینگ را شروع میکند و این شمارش تا زمانی خواهد داشت که مقدار پین Low شود.

حالا تایمینگ را متوقف میکند و طول پالس را با واحد میکروثانیه‌ برمیگرداند. در صورتی که در طول مدت زمان تایم اوت پالس مورد نظر مشاهده نشود، عدد 0 بازگشت داده‌ میشود. طبق تجربه اگر از این تابع برای پالس های کوتاه استفاده شود احتمال مشاهده خطا بیشتر خواهد بود. در نهایت، بهتر است از این تابع برای پالس های 10 میکروثانیه تا 3 دقیقه استفاده‌ کنید.

همینطور از این روتین تنها زمانی که وقفه فعال شده باشد استفاده‌ میشود. همچنین هر چه فواصل بزرگتر باشند وضوح بالاتر خواهد بود.

ورودی خروجی پیشرفته

ساختار کد دستور:

pulseInLong(پین, مقدار)

pulseInLong(پین, مقدار, مدت زمان)

مولفه‌ ها:

پین: همان شماره پین آردوینو است که میخواهید با آن پالس را بخوانید. (داده‌: int)

مقدار: نوع پالس که High یا Low است. )داد‌ه: int)

مدت زمان: این مولفه اختیاری است و به صورت پیشفرض روی 1.000.000 میکرو ثانیه تنظیم شده‌ است. میتوانید مشخص کنید آردوینو چقدر منتظر پالس شروع باشد. (دا‌ده: unsigned long)

مقدار بازگشتی:

طول پالس برحسب میکروثانیه یا مقدار 0 (در صورتی که پالس شروع در بازه تایم اوت مشاهده‌ نشود).

نو‌‌ع داده: unsigned long

‌نمونه کد:

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

				
					int pin = 7;
unsigned long duration;

void setup() {
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop() {
  duration = pulseInLong(pin, HIGH);
  Serial.println(duration);
}

				
			

()shiftIn

شرح:

یک بایت داده را (به صورت یک بیت با هر کلاک) به داخل شیفت میدهد. این کار میتواند از بیشترین مقدار (یعنی بیت سمت چپ) یا از کمترین مقدار (یعنی بیت سمت راست) شروع شود. خواندن هر بیت به اینصورت است که پین کلاک High میشود، بیت‌بعدی از پین دیتا خوانده میشود و در نهایت پین کلاک Low میشود.

همچنین ممکن است دستگاه مقابل با لبه‌های پایین رونده کلاک شده‌ باشد. در این صورت باید مطمئن شوید که پین کلاک قبل از اولین فراخوانی shiftIn() صفر باشد. به این صورت: digitalWrite(clockPin,LOW)

نکته مهم: این یک پیاده سازی نرم افزاری است و با این وجود آردوینو کتابخانه SPI را ارائه کرده‌است. این کتابخانه با استفاده از پیاده سازی سخت افزاری با سرعت بالاتر اما روی پین های مشخص قابل استفاده‌است.

سا‌ختار کد دستور:

byte incoming = shiftIn(پین دیتا, پین کلاک, ترتیب بیت ها)

مولفه‌ها:

پین دیتا: بیت ها به این پین اعمال میشود. (داده‌ مجاز: int)

پین کلاک: برای همگام سازی ارتباط بین آردوینو و دستگاه خارجی، استفاده و مقدار دهی میشود. باید High یا Low بودن سیگنال خوانده شده توسط پین دیتا را مشخص کنید. 

ترتیب بیت ها: ترتیب خوانده شدن بیت ها را مشخص کنید. شامل MSBFIRST (شروع از بزرگترین بیت یا چپ) و LSBFIRST (شروع از کوچکترین بیت یا سمت راست).

مقدار بازگشتی:

مقدار خوانده شده از نوع byte

یادداشت ها و اخطارها:

این تابع به()micros وابسته است و نباید از تابع ()Nointerrects استفاده‌ شود.

برای رفتن به لیست توابع کلیک کنید

()shiftOut

شرح:

یک بایت داده را (به صورت یک بیت با هر کلاک) به بیرون شیفت میدهد. به این صورت که از بیشترین بیت (یعنی بیت سمت چپ) یا کوچکترین بیت (یعنی بیت سمت راست) این کار آغاز میشود. هر بیت به ترتیب روی پین دیتا نوشته میشود و سپس پین کلاک پالس ایجاد میکند. یعنی پین کلاک High و سپس Low میشود تا در دسترس بودن بیت را نشان دهد.

اگر به دستگاهی متصل شده اید که با لبه بالا رونده کلاک شده است، بهتر است از Low بودن کلاک پین متصل شوید. این پین باید به صورت پیشفرض صفر باشد، یعنی digitalWrite(clockPin, LOW) در برنامه وجود داشته‌ باشد.

نکته‌‌: این یک پیاده سازی نرم افزاری است و با این وجود آردوینو کتابخانه SPI را ارائه کرده‌ است. این‌کتابخانه با استفاده از پیاده سازی سخت افزاری با سرعت بالاتر اما روی پین های مشخص قابل استفاده‌ است.

ساختار کد دستور:

shiftOut(پین دیتا, پین کلاک, ترتیب بیت ها, مقدار)

مولفه‌ ها:

پین دیتا: بیت های خروجی توسط این پین ایجاد میگردد. (داد‌ه‌ مجاز: int)

پین کلاک: پس از قرار دادن دیتای صحیح روی پین دیتا قرار داده‌ شد، وضعیت این پین هربار تغییر میکند. (داده مجاز: int)

ترتیب بیت ها: شیفت دادن بیت ها چطور باشد؟ MSBFIRST (بیت باارزش) یا LSBFIRST (بیت کم ارزش)

مقدار: داده ای که باید شیفت داده شود را وارد کنید. (داده مجاز:Byte)

مقدار بازگشتی:

ندارد.

نمونه‌ کد:

				
					//پین متصل شده به ST_CP  74HC595
int latchPin = 8;
//پین متصل شده به SH_CP  74HC595
int clockPin = 12;
//پین متصل شده به DS  74HC595
int dataPin = 11;

void setup() {
  //تعیین پین به عنوان خروجی چون در لوپ اصلی آدرس دهی شده اند
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  //روتین افزایش مقدار
  for (int j = 0; j < 256; j++) {
  //latchPin را به زمین وصل میکنیم و برای مدت طولانی آن را صفر نگه میداریم تا انتقال دیتا انجام شود    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);
    //latch pin را یک میکنیم

    //برای دریافت اطلاعات مورد نیاز کمی صبر میکنیم    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}

				
			

یادداشت ها و اخطارها:

پین دیتا و پین کلاک را باید با فراخوانی pinMode() به عنوان خروجی پیکربندی کنید.

با این تابع تنها میتوانید دیتای 1 بایتی (8 بیت) را شیفت دهید. در صورتی که قصد دارید دیتای بزرگتر از 255 را شیفت دهید باید در دو مرحله این کار را انجام دهید.

برای رفتن به لیست توابع کلیک کنید

				
					// سریال MSBFIRST شیفت
int data = 500;
// شیفت دادن بیت با ارزش به سمت بیرون
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// شیفت دادن بیت کم ارزش به سمت بیرون
shiftOut(dataPin, clock, MSBFIRST, data);

// سریال LSBFIRST شیفت
data = 500;
// شیفت دادن بیت کم ارزش به سمت بیرون
shiftOut(dataPin, clock, LSBFIRST, data);
// شیفت دادن بیت با ارزش به سمت بیرون
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

				
			

از این که تا انتهای این مطلب آموزشی با ما همراه بودید از شما متشکریم. امیدواریم توابع معرفی شده مرتبط با ورودی خروجی پیشرفته برای شما مفید و کاربردی باشد. 

اشتراک گذاری این نوشته

دانشجوی مکاترونیک هستم و در زمینه اتوماسیون و توسعه صنعت فعالیت میکنم. به اشتراک گذاری تجربیات و خورده دانشی که از الکترونیک دارم علاقمند هستم.

شاید این مطالب براتون جذاب باشه!

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

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

تماس با ما

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

ورود به حساب کاربری