مدیریت مصرف انرژی در سیستم های اینترنت اشیا، امری بسیار مهم و ضروری تلقی می شود. از آنجاییکه اکثر دستگاه های متصل به شبکه اینترنت اشیا از طریق باتری تغذیه شده و نیاز است تا این دستگاه ها سال ها بدون نیاز به شارژ باتری فعال باشند، لذا مدیریت و کاهش توان مصرفی، از چالش های اساسی در طراحی این نوع از سیستم ها به شمار می رود. در این آموزش به تحلیل و بررسی کتابخانه LowPower.h، مخصوص بردهای آردوینو می پردازیم. به کمک این کتابخانه و به سادگی، می توانیم مدهای مختلف توان مصرفی پایین را برای بردهای آردوینو تعیین نماییم. بدین ترتیب، در حین طراحی پروژه، دغدغه خاطر از حیث طراحی برنامه جهت کنترل توان مصرفی کاسته شده و تمرکز بر رویه اصلی برنامه، قرار خواهد گرفت. در این آموزش نیز مطابق سلسله آموزش های کتابخانه، ابتدا به معرفی الزامات و بردهای مورد پشتیبانی کتابخانه LowPower.h می پردازیم. در ادامه به معرفی توابع پرداخته و در نهایت با ارائه مثالی، به بحث خاتمه می دهیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
نصب کتابخانه LowPower.h
اولین قدم در استفاده از یک کتابخانه، نصب آن در محیط آردوینو است. برای نصب کتابخانه، دو روش دستی و خودکار وجود دارد. در روش دستی، پس از دانلود فایل های کتابخانه، می بایست آن را در مسیر نصب آردویینو قرار دهید. اما در روش خودکار، تنها با تایپ نام کتابخانه در قسمت مدیریت کتابخانه ها، کتابخانه مورد نظر به صورت خودکار در مخازن آردوینو جستجو شده و پس از یافتن آن، نصب خواهد شد. به همین منظور، ابتدا در نرم افزار آردوینو، بر روی گزینه Tools و سپس Manage Libraries کلید کنید. با کلیک بر روی گزینه Manage Libraries، می توانید وضعیت کتابخانه های نصب شده و لیستی از کتابخانه های جدید و بروز را مشاهده کنید. این مورد در تصویر زیر، قابل مشاهده است.
مطابق فلش قرمز رنگ تصویر فوق، در کادر جستجو، با تایپ نام کتابخانه، می توان آن را یافته و سپس نصب نمود. در اینجا ما عبارت “rocketscream” را تایپ می کنیم. پس از چند لحظه، کتابخانه مورد نظر به شکل تصویر زیر، به نمایش در می آید. با کلیک بر روی گزینه install، این کتابخانه را نصب نمایید.
پس از اینکه کتابخانه با موفقیت نصب شد، نوبت به استفاده از آن می رسد. به همین منظور، ابتدا به بررسی الزامات فنی و بردهای مورد پشتیبانی کتابخانه LowPower می پردازیم. پس از آن، به معرفی توابع کلیدی و کاربردی پرداخته و در نهایت با ارائه مثالی، به نحوه استفاده از توابع در پروژه های عملی می پردازیم.
بردهای مورد پشتیبانی
کتابخانه LowPower، گستره وسیعی از بردهای آردوینو را در بر می گیرد. به کمک این کتابخانه می توانید بردهای آردوینو را در حالت کم مصرف مد نظر خود، قرار دهید. این کتابخانه، از پردازنده ها و بردهای آردوینو توسعه یافته تحت این میکروکنترلرها، که در ادامه لیست می شوند، پشتیبانی می نماید.
- ATMEGA328P(آردوینو UNO)
- ATMEGA2560(آردوینو MEGA)
- ATMega32U4(آردوینو MICRO)
- ATMega168
- ATMega168
- ATMega644P
- ATMega1284P
- ATMega256RFR2
- ATSAMD21
میکروکنترلرهای AVR که هسته بردهای آردوینو را تشکیل می دهند، دارای مدهای مختلف توان مصرفی هستند. این مدها شامل حالت های idle، Power Down، Power Save و StandBy می شوند. جهت اطلاعات بیشتر در این زمینه، می توانید به دیتاشیت پردازنده مورد نظر مراجعه نمایید.
توابع کلیدی کتابخانه LowPower.h
پس از بررسی الزامات و نکات فنی، نوبت به بررسی و شرح توابع کلیدی می رسد. جدول زیر، لیستی از مهم ترین توابع این کتابخانه را نمایش می دهد. در نظر داشته باشید که در این جدول، ورودی های توابع از سمت چپ به راست، ورودی اول، ورودی دوم، ورودی سوم و… نام گذاری می شوند.
تابع | ورودی | شرح |
void idle(period_t period, adc_t adc, timer2_t timer2,
timer1_t timer1, timer0_t timer0, spi_t spi, usart0_t usart0, twi_t twi); |
ورودی اول: مدت زمان
ورودی دوم: فعال/غیر فعال سازی adc ورودی سوم: فعال غیر فعال سازی تایمر۲ ورودی چهارم: فعال/غیر فعال سازی تایمر۱ ورودی پنجم : فعال/غیر فعال سازی تایمر۰ ورودی ششم: فعال/غیر فعال سازی SPI ورودی هفتم: فعال/غیر فعال سازی USART ورودی هشتم: فعال/غیر فعال سازی ارتباط I2C
|
این تابع میکروکنترلر را در حالت کم مصرف idle قرار می دهد. ورودی اول مدت زمان قرار گیری در این حالت را تعیین کرده و سایر ورودها، بسته به نیاز در زمان قرارگیری در حالت idle، فعال و یا غیر فعال می شوند. برای این مورد ثوابتی تعیین شده که در جدول بعدی آن را خواهیم دید. همچنین این تابع با میکروکنترلرهای زیر سازگار است:
AVR_ATmega328P(uno) AVR_ATmega168 AVR_ATmega168P AVR_ATmega88
|
void idle(period_t period, adc_t adc, timer5_t timer5, timer4_t timer4, timer3_t timer3, timer2_t timer2,timer1_t timer1, timer0_t timer0, spi_t spi,usart3_t usart3, usart2_t usart2, usart1_t usart1,usart0_t usart0, twi_t twi);
|
ورودی اول: مدت زمان
ورودی دوم فعال/غیرفعال سازی adc ورودی سوم الی نهم: فعال/غیر فعال سازی تایمر ۵ الی ۰ ورودی دهم: فعال/غیرفعال سازی SPI ورودی یازدهم الی چهاردهم: فعال/غیرفعال سازی سریال سخت افزاری ورودی پانزدهم: فعال/غیرفعال سازی I2C
|
این تابع دقیقا مشابه مورد بالا عمل کرده، اما با این تفاوت که برای میکروکنترلر MEG2560 یا همان آردوینو MEGA استفاده می شود. |
void idle(period_t period, adc_t adc, timer4_t timer4,
timer3_t timer3, timer1_t timer1, timer0_t timer0, spi_t spi, usart1_t usart1, twi_t twi, usb_t usb);
|
ورودی اول: مدت زمان
ورودی دوم فعال/غیرفعال سازی adc ورودی سوم الی نهم: فعال/غیر فعال سازی تایمر ۵ الی ۰ ورودی دهم: فعال/غیرفعال سازی SPI ورودی یازدهم الی چهاردهم: فعال/غیرفعال سازی سریال سخت افزاری ورودی پانزدهم: فعال/غیرفعال سازی I2C ورودی اول: مدت زمان ورودی دوم: فعال/غیرفعال سازی adc ورودی سوم : فعال/ غیر فعال سازی تایمر ۴ ورودی چهارم: فعال/غیرفعال سازی تایمر ۱ ورودی پنجم: فعال/غیرفعال سازی تایمر ۰ ورودی ششم: فعال/غیرفعال سازی spi ورودی هفتم: فعال/غیرفعال سازی uart ورودی هشتم: فعال/غیر فعال سازی I2C
|
این تابع دقیقا مشابه موارد قبلیست. این تابع برای میکروکنترلر ATMEGA32U4 که همان آردوینو پرو میکروست، اجرا می شود. |
void powerDown(period_t period, adc_t adc, bod_t bod) | ورودی اول: مدت زمان
ورودی دوم: فعال/غیرفعال سازی adc ورودی سوم: فعال یا غیر فعال سازی Brown Out Detection |
به کمک این تابع میکروکنترلر و یا برد آردوینو در حالت powerdown، با مدت زمانیکه در پارامتر اول تنظیم شده، قرار می گیرد. به کمک سایر پارامترها، می توان قابلیت های مختلف را در حین قرار گیری در این مد، فعال و یا غیر فعال نمود. |
void powerSave(period_t period, adc_t adc, bod_t bod, timer2_t timer2) | ورودی اول: مدت زمان
ورودی دوم: فعال/غیرفعال سازی adc ورودی سوم: فعال/غیرفعال سازی Brown Out Detection ورودی چهارم: فعال/غیرفعال سازی timer2 |
به کمک این تابع میکروکنترلر و یا برد آردوینو در حالت powerSave، با مدت زمانیکه در پارامتر اول تنظیم شده، قرار می گیرد. به کمک سایر پارامترها، می توان قابلیت های مختلف را در حین قرار گیری در این مد، فعال و یا غیر فعال نمود. |
void powerStandby(period_t period, adc_t adc, bod_t bod) | ورودی اول: مدت زمان
ورودی دوم: فعال/غیرفعال سازی adc ورودی سوم: فعال یا غیر فعال سازی Brown Out Detection |
به کمک این تابع میکروکنترلر و یا برد آردوینو در حالت powerstandby، با مدت زمانیکه در پارامتر اول تنظیم شده، قرار می گیرد. به کمک سایر پارامترها، می توان قابلیت های مختلف را در حین قرار گیری در این مد، فعال و یا غیر فعال نمود. |
برای استفاده از توابع کتابخانه، می بایست از ثوابت از پیش تعریف شده در ورودی استفاده نمود. در ابتدا، به جدول ثوابت تاخیر زمانی می پردازیم. ثوابت این جدول تعیین کننده مدت زمان قرار گیری برد آردوینو در مد کم مصرف تعیین شده است. جدول زیر، لیست کامل ثوابت زمانی را نمایش می دهد.
مدت قرار گیری در مد کم مصرف | نام ثابت |
۱۵ میلی ثانیه | SLEEP_15MS |
۳۰میلی ثانیه | SLEEP_30MS |
۶۰میلی ثانیه | SLEEP_60MS |
۱۲۰ میلی ثانیه | SLEEP_120MS |
۲۵۰ میلی ثانیه | SLEEP_250MS |
۵۰۰ میلی ثانیه | SLEEP_500MS |
۱ثانیه | SLEEP_1S |
۲ثانیه | SLEEP_2S |
۴ثانیه | SLEEP_4S |
۸ثانیه | SLEEP_8S |
برای همیشه | SLEEP_FOREVER |
در ادامه، جدول زیر لیست ثوابت جهت فعال/غیر فعال سازی تایمرها را نمایش می دهد.
نام ثابت | شرح |
TIMER5_OFF | تایمر ۵ در حالت کم مصرف خاموش |
TIMER5_ON | تایمر ۵ در حالت کم مصرف روشن |
TIMER4_OFF | تایمر۴ در حالت کم مصرف خاموش |
TIMER4_ON | تایمر۴ در حالت کم مصرف روشن |
TIMER3_OFF | تایمر۳ در حالت کم مصرف خاموش |
TIMER3_ON | تایمر۳ در حالت کم مصرف روشن |
TIMER2_OFF | تایمر۲در حالت کم مصرف خاموش |
TIMER2_ON | تایمر۲در حالت کم مصرف روشن |
TIMER1_OFF | تایمر۱ در حالت کم مصرف خاموش |
TIMER1_ON | تایمر۱ در حالت کم مصرف روشن |
TIMER0_OFF | تایمر۰ در حالت کم مصرف خاموش |
TIMER0_ON | تایمر۰ در حالت کم مصرف روشن |
در نهایت، جدول زیر ثوابت مربوط به فعال/ غیر سازی امکانات جانبی را نمایش می دهد.
نام ثابت | شرح |
BOD_OFF | خاموش کردن تشخیص Brown Out حین مد کم مصرف |
BOD_ON | روشن کردن تشخیص Brown Out حین مد کم مصرف |
ADC_OFF | خاموش کردن ADC حین مد کم مصرف |
ADC_ON | روشن کردن ADC حین مد کم مصرف |
TWI_OFF | خاموش کردن I2C حین مد کم مصرف |
TWI_ON | روشن کردن I2C حین مد کم مصرف |
USB_OFF | خاموش کردن USB حین مد کم مصرف |
USB_ON | روشن کردن USB حین مد کم مصرف |
SPI_OFF | خاموش کردن SPI حین مد کم مصرف |
SPI_ON | روشن کردن SPI حین مد کم مصرف |
USART0_OFF | خاموش کردن USART0 حین مد کم مصرف |
USART0_ON | روشن کردن USART0 حین مد کم مصرف |
USART1_OFF | خاموش کردن USART1 حین مد کم مصرف |
USART1_ON | روشن کردن USART1 حین مد کم مصرف |
USART2_OFF | خاموش کردن USART2 حین مد کم مصرف |
USART2_ON | روشن کردن USART2 حین مد کم مصرف |
USART3_OFF | خاموش کردن USART3 حین مد کم مصرف |
USART3_ON | روشن کردن USART3 حین مد کم مصرف |
اجرای یک نمونه برنامه
پس از معرفی بردهای مورد پشتیبانی و توابع کتابخانه ای، نوبت به اجرای یک نمونه برنامه می رسد. کدهای زیر مد idle را در برد آردوینو فعال می نماید. این مد به مدت ۸ ثانیه فعال می شود. پس از اتمام آن، می توانید کد های خودر ا اجرا نمایید. پس از اتمام اجرای برنامه شما، این مد مجددا برای ۸ ثانیه فعال شده و این روال به صورت مککر، تکرار می شود. در ورودی این تابع، قابلیت های مختلف میکروکنترلر حین مد idle، فعال و یا غیر فعال می شود.
#include "LowPower.h" //افزودن کتابخانه void setup() { } void loop() { //تابع زیر برای پردازنده ATMEGA328P که هسته برد اردوینو را شامل می شود استفاده می گردد. به کمک این تابع میکروکنترلر در مد IDLE قرار می گیرد. LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); //در تابع فوق، برد اردوینو در حالت idle به مدت ۸ ثانیه قرار می گیرد. همچنین سایر قابلیت های جانبی میکروکنترلر را می توان در این مد، به کمک سایر ورودی ها فعال و غیر فعال نمود. //در این قسمت کدهای خود را قرار دهید. بدین ترتیب، پس از اتمام مدت زمان ۸ ثانیه که میکروکنترلر در حالت idle قرار می یگیرد، کدهای شما اجرا خواهد شد. پس از اتمام کدهای شما، مجددا حالت idle برای ۸ ثانیه فعلا شده و پس از طی زمان ۸ ثانیه، کدهای شما اجرا می شوند. }
لوازم مورد نیاز
جمع بندی
در این آموزش به تحلیل و بررسی کتابخانه LowPower.h پرداختیم. از آنجاییکه مدیریت و کنترل توان مصرفی در سیستم های IOT امری ضروریست، لذا به کمک این کتابخانه و به سادگی می توان مصرف باتری را کاهش و عمر سیستم را افزایش داد. بدین ترتیب، دغدغه خاطر توسعه دهنده از بابت کنترل توان مصرفی کاسته شده و تمرکز بر اصل طراحی قرار می گیرد. در این آموزش، ابتدا بردهای مورد پشتیبانی این کتابخانه را مورد بررسی قرار دادیم. در ادامه بحث، به بررسی توابع کلیدی این کتابخانه و ثابت های آن، پرداخته شد. در نهایت با ارائه مثالی از کاربرد، بحث را مورد خاتمه قرار دادیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.