آردوینو آموزش آردوینو دسته‌بندی

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

نوشته شده توسط معین صابری

بردهای آردوینو از پرکاربردترین بردهای توسعه به حساب می آیند. این بردها که از پردازنده های مبتنی بر تراشه AVR بهره می بردند، امکانات سخت افزاری و نرم افزاری بسیاری را فراهم می کنند. جهت برنامه نویسی بردهای آردوینو، زبان برنامه نویسی مخصوص آن توسعه یافته است. این زبان که مبتنی بر زبان شی گرای ++C است، امکانات برنامه نویسی بسیاری را در اختیار ما قرار می دهد. از جمله این امکانات می توان به تعریف کلاس ها، مشتق سازی کلاس ها و…. اشاره نمود. در زبان برنامه نویسی آردوینو، تعداد بسیاری از توابع به صورت پیشفرض تعریف شده اند. این توابع عملیات ریاضی، رشته ای و…. را در بر می گیرند. در این آموزش به بررسی ۱۰ تابع پرکاربرد در آردوینو می پردازیم. اما پیش از معرفی توابع، به طور مختصر بردهای آردوینو را مورد بررسی قرار می دهیم. در ادامه به صورت مختصر، به قواعد برنامه نویسی آن اشاره خواهیم نمود. پس از آن به معرفی ۱۰ تابع کلیدی به همراه مثال از عملکرد در برنامه، می پردازیم.  در ادامه این آموزش، با مرجع تخصصی رزبری پای و آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.

 


تعریف و کاربرد برد آردوینو


برد آردوینو، یک برد سده با هدف تسریع روند توسعه پروژه ها به بازار آمد. از زمان حضور این برد، انقلاب وسیعی در حوزه برنامه نویسی سخت افزاری شکل گرفت. ظهور برد آردوینو سبب تسریع در روند نمونه سازی و ارائه محصول نهایی گردید. اگر پیش از این برای راه اندازی یک سنسور چند روز زمان نیاز بود، امروزه به لطف آردوینو و جامعه کاربری منسجم آن، سنسور مورد نظر را می توان در عرض چند دقیقه راه اندازی نمود.

 

بزرگترین مزیت آردوینو، بوت لودر آن است. به لطف وجود بوت لودر می توانید به سادگی و بدون نیاز به هیچ پروگرامر جانبی و صرفا از طریق کابل USB، برد خود را پروگرام کنید. همچنین بر روی برد آردوینو کریستال جهت منبع کلاک قرار گرفته است. از طرفی دیگر، وجود پین هدرهای مادگی، امکان دسترسی آسان به پایه های GPIO را فراهم می کند.

 


قواعد کلی برنامه نویسی آردوینو


همانطور که پیشتر گفته شد، برای برنامه نویسی آردوینو، زبان مخصوص و مبتنی بر ++C توسعه یافته است. این زبان که ساختاری مطابق با ++C دارد، در دو مورد جزیی با آن متفاوت است. در اینجا تابعی به نام main نخواهیم داشت. به جای آن، تابعی به نام loop، دستورات اصلی برنامه را به صورت یک حلقه تکرار، اجرا می کند. از طرفی دیگر، تنظیمات اولیه برد نظیر تنظیم پایه های ورودی/خروجی که تنها به یکبار اجرای آن ها نیاز است، در تابع setup قرار می گیرد.

void setup() {
  // کدهایی که قرار است یکبار اجرا شوند در این قسمت قرار گیرند

}

void loop() {
  // کدهایی که قرار است مکررا اجرا شوند را در اینجا قرار دهید.

}

پس از معرفی خلاصه از عملکرد آردوینو، به بررسی توابع کلیدی و کاربری که به صورت پیشفرض در آردوینو برنامه نویسی شده اند، می پردازیم.

 


۱-  round


محاسبات عددی در بردهای آدروینو، امری جدایی ناپذیر از ساختار آن است. کلیه سنسورها مقادیر خود را یا به صورت عدد صحیح و یا اعشاری، در خروجی قرار می دهند.  در برخی مواقع نیاز است تا مقادیر خروجی برخی از سنسورها، از حالت اعشاری خارج شده و به اصطلاح، رند شوند. برای این مورد، تابع round مقادیر اعشاری قرار گرفته در ورودی خود را به صورت مقدار رند شده، در خروجی قرار می دهد. برای روشن تر شدن موضوع، لطفا قطعه کد زیر را بررسی نمایید.

  float y = 2.9;
  int x = round(y);
  //مقدار x برابر با ۳ خواهد بود

به کمک تابع round، مقدار ۲٫۹  که در متغیر y قرار دارد، رند شده و برابر با ۳ می گردد. این مقدار در متغیر x که از نوع صحیح است، قرار می گیرد.

 


۲- map


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

y = map(x, 1, 50, 50, -100);
//در تابع فوق مقدار  x در بازه ۱ الی ۵۰، به بازه ۵۰ الی -۱۰۰ نگاشت شده و در y قرار می گیرد.

به عنوان یک مثال کامل، همانطور که اطلاع دارید دقت مبدل ADC آردوینو UNO به میزان ۱۰ بیت است. به عبارت دیگر، خروجی ADC در بازه ۰ الی ۱۰۲۳ قرار می گیرد. از طرفی دیگر، تابع analogwrite قادر به نوشتن مقادیر در خروجی، در بازه ۰ الی ۲۵۵ است. برنامه زیر مقدار خوانده شده در بازه ۰ الی ۱۰۲۳ را در بازه ۰ الی ۲۵۵ قرار می دهد.

void setup() {}

void loop() {
  int val = analogRead(0);  //خواندن مقدار از ورودی آنالوگ
  val = map(val, 0, 1023, 0, 255);   //نگاشت مقدار خوانده شده در بازه هدف
  analogWrite(9, val);  //تنظیم خروجی PWM به کمک مقدار نگاشت شده
}

همانطور که مشاهده کردید، تابع map وظیفه نگاشت مقادیر از یک بازه به بازه دیگر را بر عهده دارد. فرم کلی این تابع به شکل زیر است:

map(value, fromLow, fromHigh, toLow, toHigh)

در تابع فوق، هر یک از مقادیر به شکل زیر تعریف می شوند.

  • value: عدد مورد نظر که می بایست نگاشت شود.
  • fromLow: حد پایین بازه ای که عدد در آن قرار گرفته است
  • fromHigh: حد بالای بازه ای که عدد در آن قرار دارد.
  • toLow: حد پایین بازه ای که عدد قرار است به آن نگاشت شود.(بازه هدف)
  • toHigh: حد بالای بازه ای که عدد قرار است به آن نگاشت شود(بازه هدف)

توجه: کلیه مقادیر تابع اعم از ورودی ها و خروجی، از نوع long هستند.

 


۳- delay


ایجاد تاخیر و متوفق کردن برنامه برای مدت زمان خاص، یکی از مباحث کلیدی و پرکاربرد در بردهای آردوینو به شمار می رود. تابع delay، یک تابع کاربردی جهت ایجاد تاخیر و متوقف کردن برنامه برای مدت زمان خاص است. به کمک این تابع می توانید تاخیر  در واحد میلی ثانیه تاخیر ایجاد نمایید.  به عنوان مثال، تابع زیر به میزان یک ثانیه(۱۰۰۰ میلی ثانیه) در برنامه تاخیر ایجاد می کند.

delay(1000)

با قرار گیری این تابع در هر قسمت از برنامه، برنامه به مدت یک ثانیه متوقف می شود. به عنوام مثال برنامه زیر، هر یک ثانیه یکبار، عبارت salam را در سریال مانیتور قرار می دهد.

void setup() {
  Serial.begin(9600);
  }

void loop() {
Serial.print("salam");
delay(1000);
}

 

 


۴- delayMicroseconds


در قسمت قبلی به بررسی ایجاد تاخیر به کمک تابع delay، تاخیر از نوع میلی ثانیه ایجاد نمودیم. اما گاهی اوقات لازم است که تاخیرهایی با مقدار بسیار پایین تر بسازیم. در اینجا به کمک تابع delayMocroseconds، می توانیم تاخیرهایی در بازه میکروثانیه ایجاد نماییم. به عنوان مثال، تابع زیر یک تاخیر به اندازه ۱۰۰ میکروثانیه(۰٫۱ میلی ثانیه) ایجاد نمود.

delayMicroseconds(100)

 

 


۵- millis


در دو قسمت قبلی، به بررسی  دو تابع delay و delayMicroseconds جهت ایجاد تاخیر در برنامه پرداختیم. این دو تابع در عین حال که که به سادگی در برنامه تاخیر ایجاد می کنند، اما دو مشکل نیز ایجاد خواهند نمود. مشکل نخست عدم دقت آنهاست. به عبارت دیگر، مقدار تاخیر ایجاد شده به صورت حدودی بوده و دقیق نخواهد بود. اما مشکل دوم، متوقف نمودن روال برنامه است. با فراخوانی این توابع، روال برنامه به ازای تاخیر تعیین شده در ورودی، متوقف خواهد شد. این در حالیست که به کمک تابع millis، می توانید تاخیر دقیق و بدون متوقف شدن برنامه، بسازید.

تابع millis مدت زمان سپری شده از زمان راه اندازی برد آردوینو تا به اکنون را در خروجی قرار می دهد. این تابع که از تایمرهای داخلی آردوینو بهره می برد، می توان این زمان را تا حدود ۴۹ روز در خروجی قرار داده و سپس ریست شود. قطعه کد زیر، زمان دریافتی از تابع millis را در سریال مانیتور نمایش می دهد. خروجی این تابع بر حسب میلی ثانیه است.

Serial.println(millis());
Serial.flush();

همانطور که بیان شد، تابع millis پس از حدود ۴۹ روز، ریست خواهد شد. این مورد می تواند سبب ایجاد مشکلاتی در برنامه شود. جهت جلوگیری از این موضوع، پیشتر مطابق آموزشی که در این لینک آمده، به تحلیل و بررسی موضوع پرداخته ایم.

 


۶-find


یکی دیگر از توابع کلیدی و کاربردی آردوینو، تابع find است. به کمک این تابع می توانیم به جستجوی یک رشته خاص در رشته دریافتی از طریق سریال(سخت افزای و نرم افزاری) بپردازیم. برای روشن تر شدن موضوع، فرض کنید پایه ۱۰ آردوینو به عنوان سریال نرم افزاری تعیین شده و شما از طریق این پایه، داده هایی را دریافت می کنید. از بین داده های دریافتی، به دنبال عبارتی خاص، مثلا salam هستید. به کمک این تابع می توانید به جستجوی این عبارت در پیام های دریافتی بپردازید. این تابع زمانیکه عبارت مورد نظر را بیابد، خروجی true تولید خواهد کرد. برنامه زیر نحوه استفاده از این تابع را نمایش می دهد.

#include <SoftwareSerial.h>
SoftwareSerial tst(10, 11);  //ایجاد سریال نرم افزاری بر روی پایه ۱۰ و ۱۱
void setup() {
  tst.begin(9600);  //راه اندازی سریال نرم افزاری
  Serial.begin(9600);

}

void loop() {
  char data[] = {"salam"};    //تعییت عبارت salam جهت جستجو در مقادیر دریافتی در سریال
   while(tst.find(data)== false)    //تا زمانیکه عبارت salam یافت نشده حلقه تکرار اجرا می شود.
   Serial.println("NOT FOUND");
   Serial.println("FOUND");
}

برنامه  فوق، نحوه استفاده از این تابع را نمایش می دهد. در این برنامه تا زمانیکه عبارت salam در سریال نرم افزاری دریافت نشود، برنامه عبارت NOT FOUND را در ترمینال آردوینو قرار می دهد. توجه داشته باشید که برای تعیین عبارت جستجو، می بایست به صورت آرایه ای از کاراکترها، این ورودی را تعیین نمایید. این مورد به دلیل تعریف تابع find است. همچنین در نظر داشته باشید که این تابع به مدت یک ثانیه برای جستجوی عبارت مورد نظر صبر کرده و  پس از آن خروجی را تولید خواهد نمود.

 


۷- readStringUntil


تابعی که در این بخش مورد بررسی قرار می دهیم، یکی از توابع فوق العاده کلیدی و کاربردی است. به کمک این تابع می توانید تا دریافت یک کاراکتر خاص، داده ها را در یک رشته ذخیره نمایید. فرض کنید قصد دریافت رشته ای را داشته دارید. درون این رشته کاراکتر ‘\n’ نیز وجود دارد. به کمک تابع readStringUntil، می توان کلیه کاراکترهای پیش از کاراکتر ‘n\’ را خوانده و در رشته ذخیره نمود. قطعه کد زیر نحوه استفاده از این تابع را نمایش می دهد. در این قطعه کد، داده ها از پورت سریال سخت افزاری دریافت می گردد.

 ;String data = Serial.readStringUntil('\n')

توجه داشته باشید که در این تابع نیز همانند تابع find، مدت زمان یک ثانیه جهت خواندن داده ها لحاظ می شود. به عبارت دیگر، این تابع به مدت یک ثانیه منتظر دریافت کاراکتر تعیین شده از سوی کاربر می ماند. این مدت زمان، قابل تنظیم و تغییر از سوی کاربر است. در قسمت بعد، به این موضوع می پردازیم.

 


۸- setTimeout


برخی از توابع بخش سریال در یک بازه زمانی خاص اجرا می شوند. از آن جمله می توان به دو تابع find و readStringUntil اشاره نمود. زمان پیشفرض سریال، چه سخت افزاری و چه نرم افزاری، یک ثانیه است. اما به کمک تابع setTimeout می توان این زمان را تغییر داد. این تابع زمان را در ورودی به صورت میلی ثانیه دریافت می نماید. قطعه کد زیر زمان را انتظار در پورت سریال را ۵ ثانیه تعیین می نماید.

Serial.setTimeout(5000);

 


۹-flush


از دیگر توابع کلیدی و کاربردی ارتباط سریال، تابع flush است. این تابع تا زمانیکه داده ها به طور کامل از طریق پورت سریال ارسال شوند، منتظر می ماند. بدین ترتیب می توان تاخیر زمانی جهت ارسال داده ها را به بهینه ترین شکل ممکن، ایجاد کرد. چراکه ممکن است داده ها خیلی سریع تر از تاخیر تعیین شده، ارسال شوند. قطعه کد زیر مثالی از کاربرد را نشان می دهد.

Serial.println("SALAM");
Serial.flush();

 


۱۰-random


تولید عدد تصادفی همواره یکی از مواردیست که در پروژه های مختلف به آن نیاز داریم. به همین علت، تابع random در آردوینو توسعه یافته است. به کمک این تابع می توان عدد تصادفی، در بازه دلخواه تولید کرد. تابع زیر با مقدار بیشنه ای که در ورودی قرار گرفته، عدد تصادفی تولید کرده و در خروجی قرار می دهد.

long random_number=random(50);

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

long random_number=random(50,150);

 


لوازم متناسب با آموزش


انواع برد آردوینو

 


جمع بندی


در این آموزش به بررسی ۱۰ تابع کلیدی و کاربردی آردوینو(از نظر نویسنده!) پرداخته شد. بردهای آردوینو که با ورودشان به بازار الکترونیک تحولی شگرف در این صنعت ایجاد کردند، دارای امکانات بسیاری هستند. خیل عظیمی از این امکانات و ویژگی ها، مربوط به قابلیت های نرم افزاری آردوینو می شود.  زبان برنامه نویسی آردوینو دارای توابع پیشفرض زیادی است. این توابع روال برنامه نویسی را بسیار ساده نموده و روند توسعه پروژه را تسریع می بخشند. در این آموزش به معرفی ۱۰ تابع پرکاربرد آردوینو پرداختیم. در هر قسمت نیز، برای روشن تر شدن موضوع، مثالی از عملکرد هر کدام بیان شده است.

 

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

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۲ دیدگاه

  • سلام
    یه مدار برای محافظت از این منبع تغذیه در برابر اتصال کوتاه در خروجی میخوام لطفا شمای اونو بزارید که ضروری هست
    چطور باید نمایشگر ولتاژ و جریان رو به منبع وصل کنم چون توی مداری که شما گذاشتید از منبع جدا برای پنل نمایشگر ولتاژ و جریان استفاده کرده بودید

    • سلام
      فکر می کنم برای آموزش دیگری باید کامنت بگذارید، لطفا در آموزش مرتبط کامنت خود را ثبت کنید تا مورد بررسی شود.