نمایش نتایج: از 1 به 7 از 7

موضوع: نحوه استفاده از مد sleep در آردوینو

  1. #1
    Junior Member
    تاریخ عضویت
    Jan 2017
    نوشته ها
    3

    Smile نحوه استفاده از مد sleep در آردوینو

    سلام دوستان من یه پروژه دارم که میخوام یک مقدار رو هر یک ساعت از یک سنسور دریافت کنم و با استفاده از nrf ارسال کنه
    مشکلم اینه که برق وجود نداره باید باتری بزارم از پنل خورشیدی هم نمیتونم استفاده کنم
    با این کد زیر تونست ۱۰ روز کاری دووم بیاره باتریم (۱۲ ولت و ۴.۵ آمپر)
    حالا میخوام از مد sleep استفاده کنم ولی متوجه نشدم چطور تنظیم کنم که sleep بره و بعد از ۱ ساعت خودش دوباره روشن شه و داده رو ارسال کنه و دوباره sleep بشه
    ممنون میشم راهنماییم کنید این لینک رو هم خوندم ولی به کار من نیومد

    کد فرستنده من:
    کد:
    #include <nRF24L01.h>
    #include <printf.h>
    #include <RF24.h>
    #include <RF24_config.h>
    #include <SPI.h>
    
    RF24 radio(9,10);
    
    byte address[6] = "01001";
    
    void setup(void){
     Serial.begin(57600);
     radio.begin();
     radio.setAutoAck(1);                   
     radio.setRetries(15, 15);               
     radio.openWritingPipe(address);}
    
    void loop(void)
    {  
     int data[1];
     data[0] = analogRead(A0);
     data[0] = map(data[0] , 0, 1023, 0, 180);
     radio.write(data, sizeof(data));  
      Serial.println(data[0]); 
      delay(3600000); 
     }

  2. #2
    Member
    تاریخ عضویت
    Apr 2015
    محل سکونت
    ایران :|
    نوشته ها
    76
    من متاسفانه زیاد با آردویینو کار نکردم

    ولی برای اینکار شما باید گامهای زیر رو انجام بدید

    1) از یکی از تایمر ها به عنوان زمان سنج استفاده کنید.
    2) برای تایمر اینتراپت (وقفه) تعریف کنید که در انتهای دوره یه ساعته مثلا، میکرو رو روشن کنه و سرویس وقفه رو که همون فرستادن داده ها هست انجام بده

    توجه کنید که وقتی میکروکنترلر رفت تو مود اسلیپ، فقط با اینتراپت برمیگرده. اینتراپت میتونه گرفتن داده ی سریال باشه ، میتونه تایمر اورفلو باشه (مث کار شما) میتونه حتا اینتراپت خارجی باشه


    شما کارتون دقیقا به بخش تیره ی آردویینو داره اشاره میکنه ! چون آردویینو، محدودیت داره
    شما تو آردویینو همیشه باید با فرکانس 16 مگاهرتز کار کنید. چون کریستال 16 مگاهرتز داره و نمیشه از مدار خارجش کرد.
    با این وضع ، شما در بهترین حالت میتونید هر 4 ثانیه (دقیقا 4.194304 ثانیه) یه درخواست وقفه بگیرید. با فرض استفاده از تایمر 16 بیت و مقسم فرکانس 1024. یعنی اصلا نمیتونید کاری کنید که هر یه ساعت بگیرید
    در حالی که بصورت عادی میشه کریستال های خیلی پایین تر از 16 مگاهرتز قرار داد تا زمان وقفه طولانی تر بشه. (هر چند بازم یک ساعت نمیشه)

    کریستال هایی هست که دقت خیلی بالایی رو برای تایمر میدن. مثلا من توی یه پروژه که داشتم، با دقت سه رقم اعشار، بازه های 16 ثانیه (یعنی 16.000 ثانیه) درست کنم.


    به هر حال. میتونید اینکارو کنید که هر 4 ثانیه فقط میکروکنترلر بیدار بشه با وقفه، به یه متغییر مقدار 1 اضافه کنه و دوباره بخوابه.
    وقتی که هر بار بیدار شد و دید مقدار اون متغییره شده 900 یعنی 15*60 تا 4 ثانیه گذشته که میشه یک ساعت، مقدار متغییر رو صفر کنه، داده ها رو بفرسته و دوباره برگرده به اسلیپ مود.

    اینطوری درسته داره هر 4 ثانیه یه بار بیدار میشه و به خوبی هر یه ساعت نیست. اما به هر حال مصرف از زمانی که مداوم روشن باشه خیلی کمتره.

    * وقتی از کریستال پایینتر استفاده بشه، حتا اگر تو حالت اسلیپ مود هم نباشه، مصرف میکروکنترلر خیلی کمتره.

  3. #3
    Junior Member
    تاریخ عضویت
    Jan 2017
    نوشته ها
    3
    نقل قول نوشته اصلی توسط Tiranoid نمایش پست ها
    من متاسفانه زیاد با آردویینو کار نکردم

    ولی برای اینکار شما باید گامهای زیر رو انجام بدید

    1) از یکی از تایمر ها به عنوان زمان سنج استفاده کنید.
    2) برای تایمر اینتراپت (وقفه) تعریف کنید که در انتهای دوره یه ساعته مثلا، میکرو رو روشن کنه و سرویس وقفه رو که همون فرستادن داده ها هست انجام بده

    توجه کنید که وقتی میکروکنترلر رفت تو مود اسلیپ، فقط با اینتراپت برمیگرده. اینتراپت میتونه گرفتن داده ی سریال باشه ، میتونه تایمر اورفلو باشه (مث کار شما) میتونه حتا اینتراپت خارجی باشه


    شما کارتون دقیقا به بخش تیره ی آردویینو داره اشاره میکنه ! چون آردویینو، محدودیت داره
    شما تو آردویینو همیشه باید با فرکانس 16 مگاهرتز کار کنید. چون کریستال 16 مگاهرتز داره و نمیشه از مدار خارجش کرد.
    با این وضع ، شما در بهترین حالت میتونید هر 4 ثانیه (دقیقا 4.194304 ثانیه) یه درخواست وقفه بگیرید. با فرض استفاده از تایمر 16 بیت و مقسم فرکانس 1024. یعنی اصلا نمیتونید کاری کنید که هر یه ساعت بگیرید
    در حالی که بصورت عادی میشه کریستال های خیلی پایین تر از 16 مگاهرتز قرار داد تا زمان وقفه طولانی تر بشه. (هر چند بازم یک ساعت نمیشه)

    کریستال هایی هست که دقت خیلی بالایی رو برای تایمر میدن. مثلا من توی یه پروژه که داشتم، با دقت سه رقم اعشار، بازه های 16 ثانیه (یعنی 16.000 ثانیه) درست کنم.


    به هر حال. میتونید اینکارو کنید که هر 4 ثانیه فقط میکروکنترلر بیدار بشه با وقفه، به یه متغییر مقدار 1 اضافه کنه و دوباره بخوابه.
    وقتی که هر بار بیدار شد و دید مقدار اون متغییره شده 900 یعنی 15*60 تا 4 ثانیه گذشته که میشه یک ساعت، مقدار متغییر رو صفر کنه، داده ها رو بفرسته و دوباره برگرده به اسلیپ مود.

    اینطوری درسته داره هر 4 ثانیه یه بار بیدار میشه و به خوبی هر یه ساعت نیست. اما به هر حال مصرف از زمانی که مداوم روشن باشه خیلی کمتره.

    * وقتی از کریستال پایینتر استفاده بشه، حتا اگر تو حالت اسلیپ مود هم نباشه، مصرف میکروکنترلر خیلی کمتره.

    آها مرسی خیلی کامل و دقیق بود
    به جز مد sleep مد دیگه ای برای کم کردن مصرف وجود نداره؟
    مثلا این کتابخونه چی هست و چطور همچین چیزی رو نوشته:
    https://github.com/n0m1/Sleep_n0m1

    در نهایت کمترین کریستالی که میتونم گیر بیارم چیه؟
    مقدار مصرف AVR یا میکرو های دیگه چطوره خیلی کمتر از آردوینو مصرف میکنن یا همونن
    کم مصرف ترین میکرویی که میتونم قرار بدم چی هست؟

  4. #4
    Member
    تاریخ عضویت
    Apr 2015
    محل سکونت
    ایران :|
    نوشته ها
    76
    میشه مود اسلیپ راه انداخت با آردویینو. نه اینکه نمیشه.
    چیزی که نمیشد با آردویینو انجام داد، داشتن "بازه های مختلف تایمر" و محدودیت در استفاده از کریستال هست


    کریستال رو گفتم ، چون از دو نظر میتونه به کار شما کمک کنه :

    1) با استفاده از کریستال پایینتر، میتونید بازه های طولانی تری برای وقفه تایمرتون درست کنید. یعنی بجای اینکه هر 4 ثانیه یه بار میکرو روشن بشه، مثلا هر 20 ثانیه یه بار روشن بشه.
    2) با استفاده از کریستال پایینتر، کلا میتونید مصرف میکروکنترلرتون رو پایین بیارید. این ربطی به مورد اول نداره.

    در اصل با همون میکروی روی آردویینو میشه مصرف رو کمتر کرد با کریتسال کمتر .
    ببینید، میکروکنترلر استفاده شده توی آردویینو، مدل Atmega328p هست.

    این میکروکنترلر میتونه با ولتاژ 1.8 ولت تا 5 ولت کار کنه
    این میکروکنترلر میتونه با فرکانس دلخواه تا ماگزیمم 20 مگاهرتز کار کنه (توی آردویینو از حالت ماگزییمم استفاده نمیشه و با فرکانس 16 مگاهرتز کار میکنه بخاطر سازگاری با میکروهای قدیمی و کلا محکم کاری!)


    نکته اینکه، فرکانس استفاده ، ولتاژ تغذیه و جریان مصرفی به هم مربوط هستن

    مثلا فرض کنید شما میخواید یه دستگاه درست کنید، که با دو تا باتری قلمی کار کنید. یعنی تقریبا 2.8 تا 3 ولت تغذیه. برای اینکار شما نمیتونید با فرکانس 16 مگاهرتز کار کنید. تو راهنمای میکروکنترلر نوشته که با این ولتاژ میتونید ماگزیمم 8 تا 10 مگاهرتز کار کنید
    یا مثلا اگه بخواید 1.8 ولت استفاده بکنید، ماگزیمم میتونید از 4 مگاهرتز فرکانس استفاده کنید. آردویینو تغذیه 5 ولت داره، چون داره از فرکانس بالا استفاده میکنه. وگرنه آردویینو اگه کریستال کمتری داشت، میشد مثلا با ولتاژ 1.8 ولت هم کار کرد باش !

    در مورد جریان مصرفی :
    مثلا تو دیتا شیت نوشته، اگر شما بتونید از فرکانس کمتر مثل 4 مگاهرتز استفاده کنید، میتونید بجای 5 ولت ، 1.8 ولت استفاده کنید برای تغذیه و تو این حالت جریان مصرفی شما، حدود 0.8 میلی آمپره ! (یعنی حتا یه میلی آمپر هم نیست)
    و در حالت پاورسیو (یکی از مودهای اسلیپه) میتونه مصرفش به 3 میکروآمپر هم برسه !!

    در حالی که تو آردویینو ، فرکانس اجباری 16 مگاهرتز، مجبوریم حتما از تغذیه 4.5 ولت به بالا استفاده کنیم و مصرف در حالت کار حدود 14 میلی آمپره ! یعنی تقریبا 20 برابر حالت پایه.

    این مقاله رو میتونید بخونید در این مورد
    https://learn.sparkfun.com/tutorials...er-consumption

  5. #5
    Member
    تاریخ عضویت
    Apr 2015
    محل سکونت
    ایران :|
    نوشته ها
    76
    در مورد میکروکنترلرهای 8 بیتی دیگه AVR ،

    سری های attiny و atmega48 و 88 و 168 و 328 که اون 328 تو آردویینو بکار رفته، اینا کم مصرف ترین میکروکنترلر های عمومی این شرکت هستن. ولتاژ تغذیه 1.8 ولت به بالا دارن و تا 20 مگاهرتز میتونن کار کنن

    سری های تقریبا قدیمی ، ولی ارزان و پابرجای atmega8 و 16 و 32 و 64 (توجه کنید اون بالاییا همشون آخرشون 8 داشتن. ولی این سری کل عدد انتهای واژه atmega عوض میشه و میشه 8 و 16 و ...) کم مصرف نیستن. ولتاژ کاری بالای 2.7 ولت لازم دارن و ماگزیمم فرکانس کاری هم 16 مگاهرتزه. مصرفشونم نزدیک دو برابر اون بالاییاس

    اینا زیاد تو بازار ایران هستن. چون تو بازار ایران قطعات معروف، اصلی نیستن.

  6. #6
    Member
    تاریخ عضویت
    Apr 2015
    محل سکونت
    ایران :|
    نوشته ها
    76
    نکته دیگه، استفاده از کریستال دقیقه.

    ببینید، تو میکروکنترلر، تایمر، لزوما با فرکانس کاری خود cpu (یعنی همون 16 مگاهرتز) کار نمیکنه
    میتونه همین باشه، میتونه کمتر باشه. مثلا تقسیم بر یه عدد از 2 تا 1024 بشه.
    هرچی این عدد بزرگتر باشه، فرکانس کاری تایمر کمتر میشه ، یعنی بازه های زمان سنجی ما بزرگتر میشه.

    وقتی میگیم فرکانس 16 مگاهرتزه، یعنی در هر ثانیه، 16 میلیون پالس داریم.
    ما میتونیم تایمرمون رو کمتر از این مقدار کنیم. تقسیمش میکنیم بر 1024 (این کار با مقدار دادن رجیسترهای میکروکنترلر انجام میشه) . یعنی میشه 16 میلیون تقسیم بر یک هزار، میشه 16 هزار.
    تا الان تونستیم کاری کنیم که تایمرمون، در هر ثانیه بجای 16 میلیون شمارش، 16 هزار تا انجام بده !

    برای زمان سنجی و وقفه، یه رجیستر 8 یا 16 بیتی استفاده میشه (اینجا باید دیگه میکروکنترلر رو کامل بلد باشید !)
    ولی همینقدر بدونید که اتمگا 328 ، دو تا تایمر 8 بیتی داره و یه تایمر 16 بیتی

    اگه از تایمر 8 بیتی استفاده کنیم ، میتونیم 16 هزار رو یه بار دیگه تقسیم کنیم بر عدد 256
    اگه از تایمر 16 بیت استفاده کنیم، میتونیم 16 هزار رو تقسیم کنیم بر عدد 65536

    پس از تایمر 16 بیت استفاده میکنیم. پس در کل شد :

    16 میلیون پالس در ثانیه، تفسیم بر 1024، تقریبا میشه 16 هزار پالس در ثانیه
    یه بار دیگه تقسیم بر 65536 ، تقریبا 0.25 پالس در ثانیه. یعنی هر 4 ثانیه یه پالس !

    یعنی ما تونستیم با این تقسیم ها، 16 میلیون پالس در ثانیه رو بکنیم یه پالس در 4 ثانیه
    این خیلی خوبه

    حالا چند تا عیب هست
    1) ما باید بتونیم بازه های بزرگتری داشته باشیم. مثلا اگه بتونیم با فرکانس کمتری کار کنیم، یعنی بجای 16 مگاهرتز، مثلا 8 مگاهرتز (یا 6 یا 7.5 یا هر عدد دلخواهی که کرییتالش تولید بشه!) میتونیم این بازه رو بیشتر کنیم
    مثلا اگه از کریستال 4 مگاهرتز استفاهد کنیم، تقریبا یه پالس در هر 16 ثانیه خواهیم داشت که این خیلی خوبه.

    2) عیب دوم اینکه. این عدد دقیق نیست !! یعنی 16000000 تقسیم بر 1024 و بعد تقسیم بر 65536 ، دقیقا نمیشه 4 ثانیه. میشه 4.2 تقریبا.
    اما کریستال هایی هست که برای همینکار ساخته شدن. یعنی بجای مثلا 16 مگاهرتز دقیق، مقدار هست 167460000 مگاهرتز (همینطوری نوشتنم)
    وقتی از اینا استفاده کنیم، و تقسیمش کنید بر اون دو تا عدد، دقیقا میده مثلا 4 ثانیه، یا 5 ثانیه یا 4.5 ثانیه. و اینا. یعنی عدد اعشاری نمیده. زمان سنجی خیلی دقیق میشه

    شاید 0.2 ثانیه چیزی نباشه (واسه همین سازنده های آردویینو ازش چشم پوشی کردن) اما تو زمان سنجی های بزرگ مثلا ی ماه روشن بودن مداوم، کلی عقب میفته.

    من توی پروژه ای که داشتم، از کریستال 4.164304 استفاده کردم به همراه یه تایمر 8 بیتی. یعنی میشه 4194304 تقسیم بر 256 تقسیم بر 1024 که دقیقا میشه 16 .
    یعنی اصن سازنده کریستال همین مد نظرش بوده


    * برای ارتباط سریال هم همین مشکل هست. یعنی بازم رند نیست. کریستال هایی هست که میشه از اونا استفاده کرد که مقدارشون دقیقا با مقدار مورد نیاز ارتباط سریال میخونه و در نتیجه ارتباط سریال کاملا دقیق میشه. مزیتش اینه که میشه از سرعت های خیلی خیلی بالا استفاده کرد. الان آردویینو تو ارتباط سریال، از سرعت های خیلی بالا پشتیبانی نمیکنه (هرچند خود میکروکنترلره میکنه) چون 16 مگاهرتز، اعداد دقیق و رندی نمیده برای ارتباط سریال و در نتیجه خطا پیش میاد تو ارتباط.
    در حالی که اکریستال های 7.4562 مگاهرتز، 12.288 مگاهرتز، 16.684 و ... اعداد دقیق برای ارتباط سریال میدن.

  7. #7
    Junior Member
    تاریخ عضویت
    Jan 2017
    نوشته ها
    3
    نقل قول نوشته اصلی توسط Tiranoid نمایش پست ها
    میشه مود اسلیپ راه انداخت با آردویینو. نه اینکه نمیشه.
    چیزی که نمیشد با آردویینو انجام داد، داشتن "بازه های مختلف تایمر" و محدودیت در استفاده از کریستال هست


    کریستال رو گفتم ، چون از دو نظر میتونه به کار شما کمک کنه :

    1) با استفاده از کریستال پایینتر، میتونید بازه های طولانی تری برای وقفه تایمرتون درست کنید. یعنی بجای اینکه هر 4 ثانیه یه بار میکرو روشن بشه، مثلا هر 20 ثانیه یه بار روشن بشه.
    2) با استفاده از کریستال پایینتر، کلا میتونید مصرف میکروکنترلرتون رو پایین بیارید. این ربطی به مورد اول نداره.

    در اصل با همون میکروی روی آردویینو میشه مصرف رو کمتر کرد با کریتسال کمتر .
    ببینید، میکروکنترلر استفاده شده توی آردویینو، مدل Atmega328p هست.

    این میکروکنترلر میتونه با ولتاژ 1.8 ولت تا 5 ولت کار کنه
    این میکروکنترلر میتونه با فرکانس دلخواه تا ماگزیمم 20 مگاهرتز کار کنه (توی آردویینو از حالت ماگزییمم استفاده نمیشه و با فرکانس 16 مگاهرتز کار میکنه بخاطر سازگاری با میکروهای قدیمی و کلا محکم کاری!)


    نکته اینکه، فرکانس استفاده ، ولتاژ تغذیه و جریان مصرفی به هم مربوط هستن

    مثلا فرض کنید شما میخواید یه دستگاه درست کنید، که با دو تا باتری قلمی کار کنید. یعنی تقریبا 2.8 تا 3 ولت تغذیه. برای اینکار شما نمیتونید با فرکانس 16 مگاهرتز کار کنید. تو راهنمای میکروکنترلر نوشته که با این ولتاژ میتونید ماگزیمم 8 تا 10 مگاهرتز کار کنید
    یا مثلا اگه بخواید 1.8 ولت استفاده بکنید، ماگزیمم میتونید از 4 مگاهرتز فرکانس استفاده کنید. آردویینو تغذیه 5 ولت داره، چون داره از فرکانس بالا استفاده میکنه. وگرنه آردویینو اگه کریستال کمتری داشت، میشد مثلا با ولتاژ 1.8 ولت هم کار کرد باش !

    در مورد جریان مصرفی :
    مثلا تو دیتا شیت نوشته، اگر شما بتونید از فرکانس کمتر مثل 4 مگاهرتز استفاده کنید، میتونید بجای 5 ولت ، 1.8 ولت استفاده کنید برای تغذیه و تو این حالت جریان مصرفی شما، حدود 0.8 میلی آمپره ! (یعنی حتا یه میلی آمپر هم نیست)
    و در حالت پاورسیو (یکی از مودهای اسلیپه) میتونه مصرفش به 3 میکروآمپر هم برسه !!

    در حالی که تو آردویینو ، فرکانس اجباری 16 مگاهرتز، مجبوریم حتما از تغذیه 4.5 ولت به بالا استفاده کنیم و مصرف در حالت کار حدود 14 میلی آمپره ! یعنی تقریبا 20 برابر حالت پایه.

    این مقاله رو میتونید بخونید در این مورد
    https://learn.sparkfun.com/tutorials...er-consumption
    واقعا مرسی خیلی کمک کردید
    این چند کتابخونه رو پیدا کردم تست میکنم اگر با اینا به جواب نرسیدم میرم سراغ همون استفاده از کریستال و هر ۴ ثانیه یک بار مد اسلیپ
    https://github.com/n0m1/Sleep_n0m1
    https://github.com/brabl2/narcoleptic
    https://github.com/LowPowerLab/LowPower
    https://github.com/rocketscream/Low-Power

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO