الجمعة، 2 أغسطس، 2013

وضع الأسبات في الأردوينو Arduino Sleep Mode الجزء الأول



 وضع الإسبات Sleep Mode يوفر لنا أمكانية التحكم في كمية الطاقة التي يصرفها المتحكم الأصغري .




طرق الإسبات Sleep mode و الإيقاظ Wake up  متعددة منها المبرمج و منها الخارجي المعتمد على تغير حالة أحد المخارج .

سأتحدث في البداية عن طرق توفير الطاقة و أختلاف كل طريقة عن الأخرى .

في النشرة الفنية لل Atmega168/328 تتحدث بالتفصيل عن هذه الطرق و الجول التالي يوضحها كلها :


               

يظهر من الجدول 6 وضعيات للإسبات :


SLEEP_MODE_IDLE 
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN 



الطريقة الأولى أقل طريقة توفيراً , و الأخيرة هي وضعية shutdown الأكثر اقتصادية في الإستهلاك .


اختيارك يجب أن يكون لإحدى هذه الوضعيات حسب طبيعة برنامجك "استخدام ADC او ال EEPROM او ال SRAM "خلال عمليه الإسبات  حيث انك اذا استخدمت  
SLEEP_MODE_STANDBY  لا يمكنك قراءة ال ADC خلاله , بعكس SLEEP_MODE_IDLE الذي يمكنك قراءة ال ADC خلال الإسبات, لكنه يستهلك طاقة أكبر .

في النشرة الفنية يوجد طريقة برمجة هذا النمط باستخدام لغة الألة Assembly 


المسجلات اللتي تتحكم في الاوضاع و طريقة تنصيبها موجودة في الجدول .

قد يكون صعباً للبعض التعامل مع لغة الآلة لذلك سنسهل الموضوع هنا و ذلك باستخدام مكتبة رئيسية من مكتبات AVR التي وضعتها شركة أتميل تسهيلاً للمستخدمين " ليست هذه المكتبة حكراً على الأردوينو , يمكن استخدامها لأي برنامج AVR " 
تتنوع طرق الخروج من وضع الإسبات بين الطرق المبرمجة مثل ال watchdog Timer او عن طريق تغيير حالة المداخل مثل ال interrupt & Serial  .

سأتحدث أولاً عن طريقة الإيقاظ عن طريق مقاطعة البرنامج خارجياً interrupt  .

في هذا البرنامج سنقوم بجعل البرنامج يقوم بقراءة حساس كللمدة 10 ثواني و عرض هذه القراءة على ال Serial Monitor  , 
 ثم ادخال المتحكم في وضع الإسبات حتى نضغط على زر الإيقاظ .

لن تحتاج لتنفيذ هذه التجربة  سوى :

1) بطاقة  أردوينو .
2) مفتاح كبسة push Button .
3)اسلاك توصيل Jumper .


التوصيل : 



الكود :

// Written by : Mohannad Rawashdeh

// http://www.genotronex.com

//this simple code to run arduino on sleep mode .
#include <avr/sleep.h>
#include <avr/power.h>

int SwitchPin=2; // interrupt INT0;


void SleepNow(void){
  digitalWrite(13,LOW);
 // use one of those Sleep mode :
 /*
SLEEP_MODE_IDLE 
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN 

Notice :  use SLEEP_MODE_STANDBY with extenal Resonater only
 */
 set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
 sleep_enable();
 attachInterrupt(0,WakeUp,LOW);
 sleep_mode();
 sleep_disable(); // The program will continue from here.
// you can detach interrup here , uncomment this line
detachInterrupt(0);
}
void WakeUp(void){ 
}
//........................
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(SwitchPin, INPUT);
  
}

void loop(){
  digitalWrite(13,HIGH);
  for(int i=0;i<10;i++){
  int SensorValue=analogRead(A0);
  Serial.print("SensorValue = ");
  Serial.println(SensorValue);
  delay(1000);
  }
  Serial.print("MCU In sleep Mode Now ,");
  Serial.println("To wake up press the button");
  delay(100);
  SleepNow(); 
  
}



برنامج آخر يعمل على تطبيق برنامج blink لمدة 5 ثواني ثم اسبات النظام و تفعيله مجدداً عند الضغط على الزر .


بنفس التوصيلة السابقة .


// Written by : Mohannad Rawashdeh

// http://www.genotronex.com

//this simple code to run arduino on sleep mode .
#include <avr/sleep.h>
#include <avr/power.h>

int SwitchPin=2; // interrupt INT0;


void SleepNow(void){
  digitalWrite(13,LOW);
 // use one of those Sleep mode :
 /*
SLEEP_MODE_IDLE 
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN 

Notice :  use SLEEP_MODE_STANDBY with extenal Resonater only
 */
 set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
 sleep_enable();
 attachInterrupt(0,WakeUp,LOW);
 sleep_mode();
 sleep_disable(); // The program will continue from here.
// you can detach interrup here , uncomment this line
detachInterrupt(0);
}
void WakeUp(void){ 
}
//........................
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(SwitchPin, INPUT);
  
}

void loop(){
  int counter=0;
  while(counter<10){
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(200);
  counter++;
  }
  delay(20);
  SleepNow(); 
  
}
تقل الطاقة المصروفة بنسبة 25% في هذه الحالة كما هو مبين بالصورة لقراءة الأميتر Ammeter  .



0 التعليقات :

إرسال تعليق

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.