در آموزش بخش پانزدهم به بررسی توابع کاربردی و دستورات تکمیلی برنامه نویسی آردوینو میپردازیم. هر یک از دستورات کاربرد خاصی در اجرای برنامه ها دارد. برای استفاده از چیپ های ۷۴HC595 و یا ۷۴HC516 از فانکشن های SHIFT بایستی استفاده کرد. برای تولید موج مربعی و تولید فرکانس از توابع TONE , NOTONE باید استفاده کرد. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
تابع noTone()
یکی از دستورات تکمیلی برنامه نویسی آردوینو از نامش پیداست. برای متوقف کردن tone موج مربعی در برنامه نویسی آردوینو استفاده میشود.
روش فراخوانی
noTone(pin)
منظور از pin همان پایه آردوینو است. به عنوان مثال آموزش ساخت میکسر صوتی با ماژول ولوم کشویی Slide Potentiometer آردوینو توسط یک بیزر و یک ولوم و ایجاد موج مربعی و فرکانس های مختلف میتوانید با دستور tone مقادیر را تغییر دهید.
#include "Tone.h" void setup() { } void loop() { tone(11, 440); delay(1000); noTone(11); delay(4000); }
تابع tone()
تولید موج مربعی در یک فرکانس خاص توسط دستور tone شکل میگیرد.
tone(pin, frequency) tone(pin, frequency, duration)
//یک نمونه برنامه برای تعریف کردن تابع tone //پایه آردوینو به پایه بیزر متصل است. int piezoPin = 8; // انتخاب یک پایه برای بیزر void setup() { }//پایان دستورات setup void loop() { /*تابع tone دارای دو آرگومان است ۱) Pin# ۲) Frequency - this is in hertz (cycles per second) which determines the pitch of the noise made ۳) Duration - how long teh tone plays */ tone(piezoPin, 1000, 500); //tone(piezoPin, 1000, 500); // انتخاب فرکانس //delay(1000); // انتخاب تاخیر }
تابع pulsein()
از تابع pulseIn() برای خواندن پالس از پین میکروکنترلر استفاده میشود. اگر مقدار value برابر با High باشد، منتظر میماند تا پین از وضعیت LOW به HIGH تغییر وضعیت دهد. سپس زمان اندازه گیری شده و منتظر میماند تا پین به وضعیت LOW برگردد و سپس زمان متوقف میگردد. مقدار پالس بر حسب میکروثانیه برمیگردد. زمان بندی این تابع به صورت تجربی تعیین شده و ممکن است در پالس های طولانی خطا در اندازه گیری وجود داشته باشد.
روش فراخوانی
pulseIn(pin, value) pulseIn(pin, value, timeout)
int pin = 7; unsigned long duration; void setup() { Serial.begin(9600); pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); Serial.println(duration); }
استفاده از دستور pulsein برای srf
int TRIG_PIN=13; int ECHO_PIN=12; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600);} void loop() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); int duration= pulseIn(ECHO_PIN, HIGH); int distance= duration/29/2; if(duration==0){ Serial.println("Warning: no pulse from sensor"); } else{ Serial.print("distance to nearest object:"); Serial.println(distance); Serial.println(" cm"); } delay(100);}
تابع pulseInLong()
pulseInLong () جایگزینی برای pulseIn () است که در کنترل پالس طولانی و استفاده از اینتراپت بهتر است. پالس را از یک پایه خوانده و اگر دارای ارزش high باشد، تابع pulseinlog منتظر میماند تا پین از low به high برسد. زمان شروع شده و سپس منتظر میماند تا مجدد به low برسد. سپس مدت زمان پالس را بر حسب میکروثانیه ارسال میکند.
روش فراخوانی
pulseInLong(pin, value) pulseInLong(pin, value, timeout)
int pin = 7; unsigned long duration; void setup() { Serial.begin(9600); pinMode(pin, INPUT); } void loop() { duration = pulseInLong(pin, HIGH); Serial.println(duration); }
تابع shiftIn()
تابع shiftin برای دریافت دیتا استفاده میشود. این تابع از همه ی پایه های دیجیتال میتواند استفاده کند. از این تابع برای دریافت ورودی سریال از یک چیپ موازی به سریال است. تراشه ای مانند ۷۴hc165 که میتوانید تعداد پایه های ورودی پردازنده را فقط توسط دو پایه افزایش دهید. Arduino shiftIn یک پیاده سازی کاملا نرم افزاری از یک رابط ورودی سریال است. رابط سخت افزاری معادل SPI است اما توجه داشته باشید shiftIn () نیمی از آن رابط یعنی قسمت ورودی داده را نشان می دهد.
روش فراخوانی
byte incoming = shiftIn(dataPin, clockPin, bitOrder)
پارامترها
- PIN = پایه ای که به عنوان بیت ورودی مشخص میشود.
- CLOCKPIN = برای توگل شدن سیگنالی که از پایه ی ورودی دیتاپین خوانده میشود.
- BITORDER = کدام دستور شیفت ها را انجام میدهد.
تابع shiftIn() در برنامهنویسی آردوینو برای خواندن دادهها از یک واسط سریال ساختاردادهای به نام “شیفت رجیستر” (Shift Register) استفاده میشود. شیفت رجیسترها به عنوان ورودی و خروجیهای دیجیتال مورد استفاده قرار میگیرند و به شما امکان میدهند تعداد زیادی سیگنال دیجیتال را با استفاده از تنها یک تعداد کمتری پین دیجیتال مدیریت کنید.
تابع shiftIn() به شما اجازه میدهد دادهها را از یک شیفت رجیستر خوانده و به طور متوالی از پاینده به بالا (یا از راست به چپ و یا از چپ به راست، به تنظیمات آن بستگی دارد) آنها را به عنوان یک عدد صحیح دریافت کنید.
سینتکس تابع shiftIn() به صورت زیر است:
int shiftIn(int dataPin, int clockPin, int bitOrder)
پارامترها:
- dataPin: پین مربوط به ورودی داده شیفت رجیستر.
- clockPin: پین مربوط به سیگنال کلاک شیفت رجیستر.
- bitOrder: تعیین ترتیب بیتها در خروجی (میتواند MSBFIRST یا LSBFIRST باشد).
مقدار بازگشتی تابع shiftIn() عدد صحیحی است که از دادههای خوانده شده از شیفت رجیستر به دست میآید.
int dataPin = 8; // پین ورودی داده
int clockPin = 9; // پین کلاک
int bitOrder = MSBFIRST; // ترتیب بیتها از پایین به بالا
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = shiftIn(dataPin, clockPin, bitOrder);
Serial.println(sensorValue);
delay(1000);
}
در این مثال، مقادیر دادههای خوانده شده از شیفت رجیستر از پین ورودی داده به پورت سریال ارسال میشوند و در مانیتور سریال نمایش داده میشوند.
تابع shiftOut()
تابع shiftOut() در برنامهنویسی آردوینو برای ارسال دادهها به یک شیفت رجیستر (Shift Register) به منظور کنترل ارتباط دادهای با دستگاههای خارجی استفاده میشود. این تابع به شما امکان میدهد دادهها را به شیفت رجیستر ارسال کرده و کنترل بیتهای مختلف آن را داشته باشید.سینتکس تابع shiftOut() به صورت زیر است:
void shiftOut(int dataPin, int clockPin, int bitOrder, byte value)
پارامترها:
dataPin: پین مربوط به ارسال داده به شیفت رجیستر.
clockPin: پین مربوط به سیگنال کلاک شیفت رجیستر.
bitOrder: تعیین ترتیب بیتها در دادهها که میتواند MSBFIRST یا LSBFIRST باشد.
value: دادهای که باید به شیفت رجیستر ارسال شود.
به عنوان مثال، اگر میخواهید بایت ۰b11001010 را به یک شیفت رجیستر ارسال کنید، میتوانید از تابع shiftOut() به این صورت استفاده کنید:
int dataPin = 8; // پین ارسال داده
int clockPin = 9; // پین کلاک
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop() {
// ارسال بایت ۰b11001010 به شیفت رجیستر با ترتیب بیتهای MSB به LSB
shiftOut(dataPin, clockPin, MSBFIRST, 0b11001010);
delay(1000);
}
در این مثال، با فراخوانی تابع shiftOut()، بایت ۰b11001010 به شیفت رجیستر ارسال شده و سپس با تاخیر یک ثانیه، دستگاه خارجی که به شیفت رجیستر متصل است، میتواند از این دادهها استفاده کند.توسط فانکشن SHIFTOUT بسیاری از چیپ ها را میتوانیم کنترل کنیم. به عنوان مثال کنترل دیوایس های سریال مثل سنسور BMP280 و یا تراشه ۷۴HC595 که هر دو در دو آموزش جداگانه کامل بر روی سایت تحلیل شده است. Arduino shiftOut یک پیاده سازی کاملا نرم افزاری از یک رابط خروجی سریال است. رابط سخت افزاری معادل SPI است. بسیاری از چیپ ها از یک رابط سریال برای کاهش استفاده ی فیزیکی از پین ها استفاده میکنند. از SHIFTOUT برای ارسال دیتا استفاده میشود و از همه ی پایه های دیجیتال برای فراخوانی میتوان استفاده کرد. در آموزش راه اندازی آی سی شیفت رجیستر روش استفاده از SHIFTOUT گفته شده است. روش فراخوانی فانکشن به صورت زیر است.
shiftOut(dataPin, clockPin, bitOrder, value)
وسایل مورد نیاز
همین!
جمع بندی لیدی پای
آموزش دستورات تکمیلی برنامه نویسی آردوینو به روز رسانی خواهد شد. دوباره برگردید!
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
با سلام
دقیقا pulsein چیکار میکنه؟
با سلام
دقیقا مدت زمان HIGH بودن و یا مدت زمان LOW بودن را اندازه گیری میکند.
خانم مهندس بابت انتشار آموزش های آردوینواز شما ممنونیم
با سلام
سپاس از همراهی شما کاربر گرامی
برای هر دستور یک برنامه نوشتید که قابل تحسینه
موفق باشید
با سلام
کاربر گرامی از همراهی شما ممنونم.
ممنونم از puls در چه پروژه هایی بیشترین استفاده شده ؟
با سلام
در اجرای پروژه فاصله سنج sRF بیشترین استفاده شده است.
با سلام
برای کد tone از چه نوع بیزری استفاده کردید؟
با سلام
از بیزرددوقطبی اکتیو استفاده شده است.
لینک خرید بیزر
سلام و خسته نباشید
برای تابع pulsein حتی میشه مدت زمان صفر بودن پالس را محاسبه کرد؟ چه جوری؟
با سلام
بله میتوانید مدت زمان HIGH و مدت زمان LOW بودن را با فرخوانی کلاس pulseIN به صورت HIGHو LOW در کد برنامه تعریف کرد.
از توضیحاتتون ممنونم بانو
با سلام
کاربر گرامی سپاس از همراهی شما
امیدوارم مفید واقع شده باشد
اگر از pulsein برای Srf استفاده کنید ، دقت بالاتری برای فاصله دارید
با سلام
کاربر گرامی از اینکه تجربه ی خود را با دیگر کاربران به اشتراک میگذارید، صمیمانه سپاسگزاریم.
سلام مهندس
برای راه اندازی ۷۴HC595 آموزشی موجود است؟
با سلام
کاربر گرامی لینک زیر را مطالعه کنید.
راه اندازی ۷۴hc955
توضیحات جامع و عالی
ممنونم
با سلام
سپاس از همراهی شما