اینترنت اشیا IOT سیستم عامل FreeRTOS

کنترل وضعیت چندین LED به صورت همزمان به کمک FreeRTOS در آردوینو

freertos-multi-led-control-system-digispark
نوشته شده توسط معین صابری

زمانیکه سطح پروژه ها بالا رفته و پیچیدگی آن در اجرا افزایش می یابد، یک دغدغه همواره ذهن برنامه نویس سیستم میکروکنترلری را درگیر به خود می کند؛ این که چطور می توان فرایند های زمانبر را به صورت همزمان اجرا کرد. یک راه حل ساده این است که هر فرایند زمانبر تنها بر روی یک برد اجرا شود. اما این مورد سبب ایجاد هزینه خواهد شد. یک راه حل جامع و البته کاربردی، استفاده از سیستم عامل است. به کمک سیستم عامل می توان به سادگی چندین فرایند زمانبر و حتی دارای حلقه تکرار بی نهایت را به صورت همزمان با هم اجرا نمود. در این آموزش قصد داریم تا به کمک سیستم عامل FreeRTOS چندین LED را به صورت چشمک زن و البته همزمان، کنترل نماییم. به کمک پروژه کنترل led با FreeRTOS ال ای دی‌ها به صورت همزمان و به طوریکه هیچ یک بر دیگری اثر و تداخلی نداشته، وضعیت نور را کنترل می کنند. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 


سیستم عامل و اجرای همزمان چندین فرایند


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

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

سیستم عامل و اجرای همزمان چندین فرایند - دیجی اسپارک

 

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

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

 


نصب سیستم عامل FreeRTOS


همانطور که اطلاع دارید، کتابخانه ها یکی از ابزارهای کلیدی و کاربردی در برنامه نویسی به شمار می روند. به کمک این ابزار، می توانیم توابع نوشته شده در فایلهایی به نام کتابخانه ذخیره کرده و سپس در پروژه های متعدد از آن استفاده کنیم.  همانطور که پیشتر گفته شد، برای راه اندازی و کار با سیستم عامل FreeRTOS  کتابخانه توسعه داده شده است. برای استفاده از این کتابخانه، ابتدا باید آن را نصب کنیم. برای نصب کتابخانه در محیط آردویینو، ابتدا مطابق تصویر زیر بر روی گزینه Tools و سپس Manage Libraries کلیک کنید.

اصول نصب کتابخانه در آردوینو - دیجی اسپارک

 

پس از کلیک بر روی گزینه Manage Libraries، در صفحه ظاهر شده، در قسمت کادر جستجو، عبارت freertos را جستجو نموده و کتابخانه مشخص شده در تصویر زیر را نصب نمایید.

نصب سیستم عامل FreeRTOS آردوینو - دیجی اسپارک

 


 شماتیک و اتصالات پروژه


پس از نصب سیستم عامل، نوبت به بررسی شماتیک و اتصالات می رسد. در پروژه کنترل led با FreeRTOS ما ۴ LED داریم که به ترتیب به پایه های ۵ الی ۸ متصل می شوند. به تصویر زیر دقت نمایید.

 شماتیک و اتصالات پروژه FreeRTOS - دیجی اسپارک

 

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

 


کدهای پروژه کنترل LED با FreeRTOS


پس از اجرای شماتیک، نوبت به آپلود برنامه کنترل led با FreeRTOS روی برد می رسد. در اینجا می توانید کدها را روی برد آپلود کنید. توجه داشته باشید که این کدها برای برد آردوینو UNO توسعه یافته، اما شما می توانید برای برد  MEGA نیز استفاده نمایید.

#include <Arduino_FreeRTOS.h>   //اضافه کردن کتابخانه سیستم عامل
//تعریف توابعی که توسط سیستم عامل باید اجرا شوند. توابع b1 الی b4 وظیفه کنترل LED ها را دارند. همچنین این توابع ورودی ندارند به همین دلیل در ورودی ازمقدار پیش تعریف شده
//استفاده شده است.
void b1( void *pvParameters );
void b2( void *pvParameters );
void b3( void *pvParameters );
void b4( void *pvParameters );
//تعریف پایه های متصل به LED
#define LED1 5
#define LED2 6
#define LED3 7
#define LED4 8
void setup() {
  //تعریف پایه های به عنوان خروجی
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  //توجه: به کمک تابع xtaskCreate توابعی که سیستم عامل باید به صورت همزمان اجرا کند، به سیستم عامل معرفی می شود.
  xTaskCreate(
    b1   //نام تابع
    ,  "Blink 1"   // یک نام دلخواه جهت اختصاص دادن به تابع
    ,  ۱۲۸  // میزان حافظه به بایت که تابع نیاز دارد
    ,  NULL  //در صورتیکه تابع ورودی داشته باشد در این قسمت درج می شود اما از آنجاییکه ورودی ندارد NULL تعیین می گردد.
    ,  ۲  //تععین شماره اولویت اجرا، در سیستم عامل FreeRTOS توابع یا Task ها از لحاظ اولیت اجرا بین ۰ الی ۳ شماره گذاری می شوند. هرچه عدد بیشتر شود اولویت بالاتر خواهد بود.
    ,  NULL //در صورتیکه handler تعریف شده باشد، در این جا آدرس تابع handler مشخص می شود. تابع handler تابعی خارج از تابع Task بوده که به اجرای آن در مواقع خاص کمک می کند. چون در اینجا این تابع وجود ندارد ورودی NULL می شود.
    ); 

  xTaskCreate(
    b2
    ,  "Blink 2"   
    ,  ۱۲۸  
    ,  NULL
    ,  ۲  
    ,  NULL );
  xTaskCreate(
    b3
    ,  "Blink 3"  
    ,  ۱۲۸  
    ,  NULL
    ,  ۲  
    ,  NULL );
  xTaskCreate(
    b4
    ,  "Blink 4"  
    ,  ۱۲۸  
    ,  NULL
    ,  ۲  
    ,  NULL );

}

void loop()
{
  //در سیستم عامل تابع LOOP خالی بوده و توابع task اجرا می شوند.
}


void b1(void *pvParameters)  // تابع b1
{
  (void) pvParameters;  //پاارمترهای ورودی که NULL هستند.


  for (;;) // توجه: یک تابع در سیستم عامل که با Task هم شناخته می شود، همواره به صورت دائم باید اجرا گردد. در حقیقت شما در سیستم عامل ، هر تابع یا Task مثل تابع void loop آردوینو باید همیشه اجرا شود.
  {
    digitalWrite(LED1, HIGH);
    delay(1500);
    digitalWrite(LED1, LOW);
    delay(1500);
  }
}

//*****************************************************************************
void b2(void *pvParameters)  
{
  (void) pvParameters;
  for (;;)
  {
    digitalWrite(LED2, HIGH);
    delay(500);
    digitalWrite(LED2, LOW);
    delay(1500);
  }
}
//*****************************************************************************
void b3(void *pvParameters)  
{
  (void) pvParameters;

  for (;;) 
  {
    digitalWrite(LED3, HIGH);
    delay(3500);
    digitalWrite(LED3, LOW);
    delay(500);
  }
}
//*****************************************************************************
void b4(void *pvParameters)  
{
  (void) pvParameters;

  pinMode(LED_BUILTIN, OUTPUT);

  for (;;) 
  {
    digitalWrite(LED4, HIGH);
    delay(600);
    digitalWrite(LED4, LOW);
    delay(400);
  }
}

 


اجرای پروژه کنترل LED با FreeRTOS


پس از آپلود برنامه، نوبت به اجرای پروژه کنترل led با FreeRTOS می رسد. پس از اجرای پروژه مشاهده خواهید کرد که LED ها به طور همزمان نور خود را کنترل می کنند. در اینجا مطابق کدهای پروژه LED ها دارای وضعیت زیر هستند.

                                    وضعیت شماره پایه آردوینو متصل به LED
۱۵۰۰ میلی ثانیه روشن

۱۵۰۰ میلی ثانیه خاموش

۵
۵۰۰ میلی ثانیه روشن

۱۵۰۰ میلی ثانیه خاموش

۶
۳۵۰۰ میلی ثانیه روشن

۵۰۰ میلی ثانیه خاموش

۷
۶۰۰ میلی ثانیه روشن

۴۰۰ میلی ثانیه خاموش

۸

 

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

اجرای پروژه کنترل led با FreeRTOS آردوینو - دیجی اسپارک

 


لوازم مورد نیاز


لینک خرید برد آردوینو، کلیک کنید

لینک خرید LED، کلیک کنید

لینک خرید مقاومت، کلیک کنید

 


جمع بندی


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

 

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

 

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

معین صابری

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

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

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