در این آموزش توابع آردوینو به کمک 11 تابع فوق از توابع ریاضی و مثلثات، محاسبات قدر مطلق، محدوده اعداد، تناسب، عدد بزرگتر، عدد کوچک تر، عدد توان دار، مربع عدد، جذر عدد، کسینوس زاویه، سینوس زاویه، تانژانت زاویه در میکروکنترلر را برسی میکنیم.
جهت شرکت در دوره، آموزش جامع توابع آردوینو – Fanctions کلیک کنید.
;()abs
شرح
تابع ()abs از توابع ریاضی، قدر مطلق یک عدد را محاسبه می کند.
ساختار کد دستور
abs(x)
مولفه ها
x: عدد دلخواه.
مقدار بازگشتی
- x: در صورتی که مقدار عدد بزرگتر یا مساوی صفر باشد.
- -x: در صورتی که مقدار عدد کمتر از 0 باشد.
نمونه کد
با استفاده از کد زیر، مقدار قدر مطلق عدد x را در سریال مانیتور پرینت می کنیم.
void setup() {
Serial.begin(9600);
while (!Serial) {
; // تا زمان متصل شدن به پورت سریال، برنامه متوقف میشود
}
int x = 42;
Serial.print("The absolute value of ");
Serial.print(x);
Serial.print(" is ");
Serial.println(abs(x));
x = -42;
Serial.print("The absolute value of ");
Serial.print(x);
Serial.print(" is ");
Serial.println(abs(x));
}
void loop() {
}
یادداشت ها و اخطارها
با توجه به نحوه اجرای تابع ()abs، داخل براکت از توابع دیگر استفاده نکنید. در غیر اینصورت احتمال اینکه نتایج نادرست نشان داده شود، وجود خواهد داشت.
abs(a++); // از این کد خودداری کنید
به جای آن از کد زیر استفاده کنید:
abs(a);
a++; // دیگر دستورات ریاضی را خارج از تابع انجام دهید
;()constrain
شرح
اعداد خارج از محدوده را در محدوده مورد نظر قرار میدهد. در صورتی که عدد مورد نظر ما از مقدار حداکثر (مشخص شده) بیشتر باشد، عددنهایی برابر با حداکثر خواهد بود. همچنین در صورتی که عدد مورد نظر ما از مقدار حداقل (مشخص شده) کمتر باشد، مقدار نهایی برابر با مقدار حداقل خواهد بود.
ساختار کد دستور
constrain(x, a, b)
مولفه ها
- x: عددی که باید با توجه به محدوده مورد بررسی قرار بگیرد. (نوع داده: همه داده ها)
- a: پایین ترین مقدار مجاز در محدوده (نوع داده: همه داده ها)
- b: بالاترین مقدار مجاز در محدوده (نوع داده: همه داده ها)
مقدار بازگشتی
- x: در صورتی که عدد x در محدوده a و b باشد.
- a: اگر x کمتر از a باشد.
- b: اگر x بزرگتر از b باشد.
نمونه کد
با استفاده از کد زیر، مقدار سنسور را در محدوده 10 تا 150 قرار میدهیم.
sensVal = constrain(sensVal, 10, 150);
یادداشت ها و اخطارها
مقدار بازگشتی کد زیر در بسیاری موارد اشتباه است:
int constrainedInput = constrain(Serial.parseInt(), minimumValue, maximumValue); // از این کد خودداری کنید
به جای آن، از کد زیر استفاده کنید:
int input = Serial.parseInt(); // دیگر عملگردها را خارج از تابع بنویسید
int constrainedInput = constrain(input, minimumValue, maximumValue);
;()map
شرح
از این تابع برای تبدیل یک عدد از یک محدوده به محدوده دیگر استفاده میشود. در این تابع 5 پارامتر وارد میشود. در ادامه با شناخت مولفه های این تابع، عملکرد آن را مشاهده خواهید کرد.
این تابع محاسبات ریاضی مقادیر خارج از محدوده را نیز محاسبه میکند. در صورتی که میخواهید مقادیر خارج از محدوده را محدود کنید، میتوانید قبل یا بعد از تابع map() از constrain() استفاده کنید.
توجه داشته باشید که “حداقل مقدار” گاهی اوقات میتواند بزرگتر از “حداکثر مقدار” در نظر گرفته شود. در این صورت تابع map() محدوده اعداد را برعکس خواهد کرد.
y = map(x, 1, 50, 50, 1);
همچنین در این تابع میتواند عدد منفی قرار داد و خروجی را بر اساس آن محاسبه کرد. به مثال زیر توجه کنید:
y = map(x, 1, 50, 50, -100);
این تابع با وجود دریافت اعداد برعکس و مقادیر منفی به درستی کار میکند. از آنجایی که map() از اعداد ریاضی صحیح استفاده میکند، خروجی آن شامل اعداد کسری نخواهد بود. در واقع اگر عدد خروجی لازم است اعشاری باشد، قسمت اعشار عدد حذف شده و یک عدد صحیح مشاهده میشود.
ساختار کد دستور
map(value, fromLow, fromHigh, toLow, toHigh)
مولفه ها
- Value: عدد map که لازم است تبدیل شود.
- fromLow: حداقل عدد محدوده فعلی که Value در آن قرار گرفته است.
- fromHigh: حداکثر عدد محدوده فعلی که Value در آن قرار گرفته است.
- toLow: حداقل عدد محدوده مورد نظر.
- toHigh: حداکثر عدد محدوده مورد نظر.
مقدار بازگشتی
مقدار تبدیل شده (نوع داده: long)
کد مثال
با استفاده از کدهای زیر، مقدار آنالوگ را به 8 بیت (0 – 255) تبدیل کرده ایم:
/* Map an analog value to 8 bits (0 to 255) */
void setup() {}
void loop() {
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}
ضمیمه: کل تابع در این بخش آورده شده است.
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
یادداشت ها و اخطارها
همانطور که اشاره شد، در تابع map() از اعداد صحیح استفاده شده است. به همین خاطر مقدار بازگشتی عدد کسری نخواهد بود. در واقع اعدادی مثل 3/2، 4/3، 5/4 در این تابع به عنوان 1 بازگردانده میشود. در صورتی که به اعداد دقیق نیاز دارید، لازم است به جای این تابع، به صورت دستی محاسبات را انجام دهید.
;()max
شرح
تابع max() از توابع ریاضی، ماکزیمم دو عدد را محاسبه می کند.
ساختار کد دستور
max(x, y)
مولفه ها
- x: مقدار اول (نوع داده: هر داده ای)
- y: مقدار دوم (نوع داده: هر داده ای)
مقدار بازگشتی
عدد بزرگتر بازگشت داده میشود.
نمونه کد
با اسفتاده از کد زیر، میتوان مطمئن شد که مقدار سنسور یعنی sensVal حداقل 20 است.
sensVal = max(sensVal, 20); //میخواهیم مطمئن شویم که مقدار سنسور بزرگتر از 20 است
شرح
یادداشت ها و اخطارها
میتوان گفت که تابع max() بخش پایینی یک متغیر را محدود میکند، در حالی که تابع min() بخش بالایی را محدود میکند. با توجه به نحوه اجرا شدن این تابع، داخل براکت هیچ تابع دیگری قرار ندهید تا نتایج نادرست بازگردانده نشود.
max(a--, 0); // از این کد استفاده نکنید
به جای آن از کد زیر استفاده شود:
max(a, 0);
a--; // توابع ریاضی دیگر را خارج از تابع بیاورید
;()min
شرح
تابع min() از توابع ریاضی، حداقل مقدار بین دو عدد را مشخص میکند.
ساختار کد دستور
min(x, y)
مولفه ها
- x: مقدار اول (نوع داده: همه انواع داده)
- y: مقدار دوم (نوع داده: همه انواع داده)
مقدار بازگشتی محاسبات ریاضی
کوچکترین مقدار بین دو عدد بازگشت داده میشود.
نمونه کد
با استفاده از کدهای زیر، میخواهیم مطمئن شویم که مقدار یک سنسور، از 100 بالاتر نخواهد رفت.
sensVal = min(sensVal, 100);
یادداشت ها و اخطارها
میتوان گفت که تابع max() وظیفه دارد بخش پایین یک محدوده را محدود کند، در حالی که تابع min() بخش بالای محدوده را محدود می کند. با توجه به نحوه اجرا شدن این تابع، داخل براکت هیچ تابع دیگری قرار ندهید، تا نتایج نادرست بازگشت داده نشود.
min(a++, 100); // از این کد خودداری کنید
به جای آن از کد زیر استفاده کنید:
min(a, 100);
a++; // توابع ریاضی را در خارج از تابع قرار دهید
در مثال زیر، میتوانید نحوه استفاده از تابع min() و max() را مشاهده کنید:
;()pow
شرح
با استفاده از تابع pow() از توابع ریاضی، میتوان توان یک عدد صحیح را محاسبه کرد. این تابع امکانی را فراهم کرده که بتوان اعداد را به توان های اعشاری رساند. همچنین از این تابع برای ایجاد نمودارها و منحنی های رشد یا کاهش صعودی با شدت نمایی استفاده میشود.
ساختار کد دستور
pow(base, exponent)
مولفه ها
- Base: عدد (داده های مجاز: float)
- Exponent: توان (داده های مجاز: (float)
مقدار بازگشتی
- خروجی محاسبه شده (نوع داده: double)
نمونه کد
مقدار x به توان y را محاسبه کنید:
z = pow(x, y);
;()sq
شرح
تابع ()sq از توابع ریاضی مثلثات، مربع یک عدد (ضرب عدد در خودش) را محاسبه میکند.
ساختار کد دستور
sq(x)
مولفه ها
X: عدد دلخواه. (داده های مجاز: همه انواع داده)
مقدار بازگشتی
مربع عدد بازگشت داده میشود. (نوع داده: double)
یادداشت ها و هشدارها
با توجه به نحوه اجرا شدن این تابع، داخل براکت هیچ تابع دیگری قرار دهید تا نتایج به شکل صحیح محاسبه شود.
در صورت استفاده از کدهای زیر، مقدار بازگشتی میتواند نادرست باشد:
int inputSquared = sq(Serial.parseInt()); // از این کد اجتناب کنید
به جای کد بالا، میتوانید از کدهای زیر استفاده کنید:
int input = Serial.parseInt(); // عملگرهای دیگر را خارج از تابع قرار دهید
int inputSquared = sq(input);
;()sqrt
شرح
تابع ()sqrt از توابع ریاضی مثلثات، جذر یک عدد را محاسبه می کند.
ساختار کد دستور
sqrt(x)
مولفه ها
X: عدد دلخواه (داده های مجاز: انواع داده)
مقدار بازگشتی
جذر عدد بازگشت داده میشود. (نوع داده: double)
تا اینجا، توابع ریاضی در آردوینو به صورت کامل شرح داده شد و حالا میخواهیم توابع مثلثاتی را بررسی کنم. توابع مثلثاتی در آردوینو در کتابخانه math.h قرار دارند. در این مطلب آموزشی 3 تابع مثلثاتی مهم شامل سینوس، کسینوس و تانژانت بررسی شده است.
با نصب این کتابخانه میتوان از این توابع در پروژه های مختلف مثل خودروهای هوشمند، سنسورهای پارک هوشمند و… استفاده کرد. این توابع به خصوص در رباتیک کاربرد دارند، زیرا حرکات اجزای مختلف ربات ها، به زوایای خاص وابسته است.
;()cos
شرح
کسینوس یک زاویه (به رادیان) را محاسبه می کند. نتیجه عددی بین -1 و 1 خواهد بود.
ساختار کد دستور
cos(rad)
مولفه ها
- rad: زاویه بر حسب رادیان. (داده های مجاز: float)
مقدار بازگشتی
کسینوس زاویه بازگردانده میشود. (نوع داده: double)
;()sin
شرح
تابع ()sin از توابع ریاضی مثلثات، سینوس یک زاویه (به رادیان) را محاسبه می کند. نتیجه عددی بین -1 و 1 خواهد بود.
ساختار کد دستور
sin(rad)
مولفه ها
- rad: زاویه بر حسب رادیان. (نوع داده: float)
مقدار بازگشتی
سینوس زاویه. (نوع داده: double)
;()tan
شرح
تابع ()tan از توابع ریاضی مثلثات، تانژانت یک زاویه را (به رادیان) محاسبه می کند. نتیجه عددی بین منفی بی نهایت تا بی نهایت خواهد بود.
ساختار کد دستور
tan(rad)
مولفه ها
- rad: زاویه بر حسب رادیان. (داده های مجاز: float)
مقدار بازگشتی
تانژانت زاویه بازگردانده خواهد شد. (نوع داده: double)