الثلاثاء، 20 أغسطس، 2013

ما لا تعلمه عن التعديل النبضي PWM Mode




التعديل النبضي PWM  هو من أهم المواضيع التي يهتم به المبرمجون في عالم المايكروكنترولر , و في تدوينة سابقة لي تحدثت عن التعديل النبضي و عن استخداماته الواسعة في المجالات العملية .

فكرة التعديل النبضي هو التحكم بعرض النبضة بحيث تعطي قيمة فولتية متغيرة اعتماداً على عرض هذه النبضة . 



المداخل Pins التي تعمل على توليد نبضات ذات تعديل نبضي هي D3,D5,D6,D9,D10,D11 و حيث أن أقل قيمة يمكن أن تكون 0 و أكبر قيمة هي 255 و الصورة أعلاه تبين قيم مختلفة اعتماداً على عرض النبضة .

تحسب الدورة Duty cycle بقسمة النبضة الفّعالة على طول النبضة الكلي  

duty cycle = ton/ttotal  .

أقصى تردد يمكن الحصول عليه هنا في الطريقة المباشرة هي 490 هيرتز , هي جيده للكثير من التطبيقات , لكن إذا أردنا التحكم بشكل أدق بالعمليات قد نحتاج لتردد أعلى . 

لكن هل من الممكن عمل ذلك بواسطة المتحكم Atmega 168/ 328 الموجود على بطاقة الأردوينو Arduino Board؟ هل من الممكن توليد موجه تعديل نبضي PWM Wave ذات تردد يصل ل 10كيلو هيرتز مثلاً  ؟

الجواب نعم , سنتحدث الأن في موضوعين متقدمين ألا و هما ال
Fast PWM and Phase correct PWM

و هما أحدى الخصائص الموجودة في المؤقتات Timers في المتحكم AVR Atmega328 و نستطيع من خلالهما استعمال أي من المؤقتات الثلاث Timer 0,1,2 لتوليد تعديل نبضي ذو مدى واسع من الترددات .

سأبدأ بنمط التوليد النبضي السريع fast PWM باستخدام المؤقت Timer 2 8bit  .

ستحتاج لمعرفة بعض المفاهيم الخاصة بالمؤقتات , حيث يمكنك مراجعة المقال هنا لكي تكون لك خلفية حول الموضوع .

بالعموم هذه الجداول هي التي نستخدمها في البرمجة بشكل واسع يجب عليك أن تعود أليها كلما اردت البرمجة .





لتبسيط الفكرة هناك مقارنين داخلين يسميان TCCRxA و TCCRxB و هما المتحكمان الأساسيان للمؤقت يتحكمان بمسجلات المداخل و المخارج output control register  OCRx و المقارنين  TCCRxA و TCCRxB  يتكونان من عدة بتات تتحكم بعدة أمور مثل 
wave form Generation Mode ( WGM) .
Compare Match Output A  (COMnA) .
Compare Match Output B  (COMnB).

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

لنأخذ مثال بسيط , نريد التحكم من خلال المؤقت Timer2 " D3, D11 " و توليد تعديل نبضي بتردد 7.81 كيلو هيرتز ! بحيث يكون احد المخارج بدورة مشغولية Duty cycle تساوي 30% و الأخرى 70% "طبعاً في هذا الوضع التردد في الحالتين متساوي " .

البرنامج :


void setup() {
  // put your setup code here, to run once:
   pinMode(3, OUTPUT);
   pinMode(11, OUTPUT);
   TCCR2A = (1<<COM2A1) | (1<<COM2B1) | (1<<WGM21) | (1<<WGM20);
   TCCR2B = (1<<CS21);// set prescale = 8 
//   output freq = 16*10^6 /(8*256) = 7.812KHz .
   OCR2A = 179; // calculated by (179+1)/256 = 70.3%
   OCR2B = 75;  // calculated by (76+1)/256 = 29.7%

}

void loop() {
  // put your main code here, to run repeatedly: 
  
}



الصورة للناتج على المدخلين D3,D11 باستخدام راسم الإشارة 



اذا أردنا تغيير التردد فقط نغير ال Prescaler حسب الجدول أعلاه . و تغيير دورة المشغولية duty cycle "OCR2A, OCR2B  " و الصور ادناه تبين الخرج على راسم الإشارة .

هذا برنامج آخر باستخدام المؤقت Timer0 8bit .
void setup() {
   // put your setup code here, to run once:
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   TCCR0A = (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00);
   TCCR0B = (1<<CS00);// set prescale = 1 
//   output freq = 16*10^6 /(1*256) = 62.5KHz .
   OCR0A = 179; // calculated by (179+1)/256 = 70.3%
   OCR0B = 75;  // calculated by (76+1)/256 = 29.7%

}
  // put your setup code here, to run once:
void loop() {
  // put your main code here, to run repeatedly: 
  
}



المؤقت Timer1 16bit يختلف في أننا نقسم التردد الكلي على 2 . بالإضافة لعمل المؤقت على 8,9,10bit  .




النمط الآخر هو Phase correct :

يختلف هذا النمط عن سابقه بأنه يقوم بالعد من 0-255 و من ثم يقوم بالعد تنازلياً من 255 إلى أن يعود للصفر مجدداً , و تكون حالة المخرج Output واحد منطقي HIGH حتى تصل قيمة العد إلى القيمة المحددة في ال OCR فتتحول قيمة المخرج إلى الصفر المنطقي LOW  .

في هذا النمط يكون التردد الكلي مقسوماً على 2 و أيضاً تكون اشارة المخارج أكثر تماثلاً Symmetric  .

في لغة الأردوينو يتم استخدام هذا النمط عند استدعاء analogRead من أجل التعديل النبضي .



لحساب التردد نختار المعامل Prescale  , و نعوض في المعادلة :
f=clock /(256*prescale)
f=16*10^6/(256*
prescale)


مثال :
void setup() {
  // put your setup code here, to run once:
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = (1<<COM2A1) |(1<<COM2B1)|(1<<WGM20);
  TCCR2B = (1<<CS20);// prescale = 1
  // f = 16*10^6 /(256*1*2) = 31.32KHz 
  OCR2A = 225; // 88.23%
  OCR2B = 80;  //31.37%

}

void loop() {
  // put your main code here, to run repeatedly: 
  
}



التردد  على جهاز راسم الأشارة كما هو متوقع 31.32KHz


هذه أهم التقنيات التي تساعدك على بناء مشروعك و استخدام الموقتات لتوليد موجات تعديل نبضي PWM بترددات عالية لغاية 60 كيلو هيرتز .

الأربعاء، 14 أغسطس، 2013

المؤقتات في لغة أردوينو Arduino Timer

Arduino Timer

المؤقتات في لغة أردوينو


في التطبيقات المتقدمة من برمجة المتحكمات الأصغرية Microcontrollers تصبح التعليمات و الأوامر في الكود كثيرة و متداخلة , و قد يصادف استعمال العديد من جمل الdelay و while و for و احياناً قد تحتاج للاستجابة للعديد من الأشارات سواءاً القدامة من الحساسات أو من نفس البرنامج , لذلك تحتاج إلى تقنية جديدة في البرمجة تسمى المؤقتات Timers.


ما هي المؤقتات :

الفكرة العامة التي قد يعرف بها المؤقت , هو استخدامه لقياس فترة زمنية معطاة , الفكرة موجودة في المتحكمات الأصغرية , و هو أن تقوم بقدح"Trigger " أو مقاطعة " Interrupt "عمل مخرج , مدخل , تعليمة , في نقطة محددة في البرنامج , و يمكن تشبيهه بالتنبيه للمتحكم الصغري Microcontrollers بأن حدث ما تم حصوله ليقوم بدوره بتغيير سير عمل البرنامج .

المؤقتات تعمل بشكل لا تزامني Asynchronous و هذه ميزة مهمة لنتعامل مع المتغيرات بشكل متوازي , بحيث يستمر تنفيذ الأوامر في جملة الدوران Loop و تنفذ اوامر المقاطعة في نفس اللحظة .

فبدون الحاجة لجمل دوران و استخدام الأمر millis , نستطيع باستخدام المؤقتات الأستغناء عنها جميعاً .

كيف تعمل ؟

المؤقت يقوم بزيادة قيمة العد عند كل عملية , عبر مسجلات عدّ counter Registers , و هذه المسجلات Registers بدورها لها مقدار " قيمة معينة ", عندما تصل قيمة العد لهذه القيمة , تعود قيمة العداد إلى الصفر فيما يعرف بال Overflow و المسجل يقوم بتغيير قيمة Flag bit إلى الواحد ليبين لنا حدوث رجوع إلى الصفر Overflow هنا في هذه الحالة يمكننا جعل المؤقت يقوم بعملية مقاطعة لبرنامج معين في هذه اللحظة .

لذلك استخدام المؤقت Timer , لانه وسيلة سهلة و سريعة للتطبيقات العملية .

تعتمد المقاطعات Interrupt بشكل رئيسي على تردد ساعة المتحكم Crystal Clock source و أصغر قيمة يستطيع المتحكم قياسها هو قيمة تردد الساعة .
f= clock source (Hz).
t= Time Period (sec).

على سبيل المثال , بطاقة الأردوينو Arduino UNO لها كريستالة قيمتها 16,000,000هيرتز , و عليه تكون 

t=1/f = 1/16,000,000 = 62.5ns

من الآن سأتحدث حصراً على المتحكمين AVR ATmega168 /328 , نظراً لشيوعهما في بطاقات الأردوينوArduino Boards .

لنتعرف الآن على أنواع المؤقتات . 

Timer 0: هو مؤقت حجمه 8 bit و اقصى قيمة يستطيع هذا المؤقت الوصول إليها 255 , و هذا المؤقت يستعمل من برنامج الأردوينو لعمل جمل الmillis و delay 

Timer 1: و هذا المؤقت حجمه 16bit و أقصى قيمة يستطيع هذا المؤقت الوصول إليه هو 65535 , و هذا المؤقت يستعمل من برنامج الأردوينو في مكتبة محركات السيرفو Servo Library 

Timer 2هو مؤقت حجمه 8 bit و اقصى قيمة يستطيع هذا المؤقت الوصول إليها 255 , و هذا المؤقت يستعمل من برنامج الأردوينو في انشاء أوامر  ()Tone .

كيفية برمجة المؤقتات :

نستخدم هنا مسجلات في المتحكم الأصغري لتخزين إعدادات المؤقت فيها , هناك مسجلين لضبط الإعدادات و هما TCCRxB و TCCRxA أو ما يعرف اختصاراً ب ( Timer/Counter Control Register ) و قيمة x  هي رقم المؤقت (0,1,2 ) و نحدد قيمة ال Prescaler  من النشرة الفنية Datasheet للمتحكم .
سنأخذ هذا المثال , و فيه سنقوم بإضاءة و أطفاء الLED المربوط مع المخرج D2 في كل مرة يحصل فيها Overflow  لقيمة العداد , و الذي سيعمل بسرعة هزاز المتحكم "16MHz"و سنشغل الISR في كل مرة يحصل فيها Overflow  للعداد .

البرنامج






في حال تطبيق هذا البرنامج فانه سيقوم بإضاءة و اطفاء الLED المربوط مع المدخل D2 بوقت منتظم بغض النظر عن البرنامج الرئيسي .

لكن لو فكرنا بتطبيق البرنامج ستلاحظ شيء مهم , هو أن الTIMER1 سعته 16Bit" اكبر قيمة 65535 
و يصل لقيمة الoverflow في هذا البرنامج سيحتاج 62.5ns لتزيد قيمة العداد 1 و عليه ستصل قيمة العداد لأقصى قيمة و سيحدث ال overflow بعد :


O.F= 65535* 62.5*10^-9 =0.0041s

هذه سرعة عالية جداً و لا يفيدنا بالعديد من التطبيقات العملية , فما العمل لو أردنا عمل مؤقت يقوم بالعملية بشكل منتظم كل ثانية أو عدة ثواني و ليس أجزاء الثانية ! لذلك سنتكلم في الجزء الثاني عن الCTC Timer .

CTC Mode and Prescaling :


في حالة الoverflow يكون الprescaling فيها قيمة اقصاها 1024 وكما اوضحت في الفقرة السابقة فأنه لمؤقت بسرعة 62.5ns فإن للمؤقت دورة مقدارها تقريباً 0.0041 , لذلك هناك طريقة طورها مهندسو شركة اتميل Atmel نمط مؤقت يسمى clear timer or Compare match "CTC , فعوضاً عن انتظار العداد ليصل لقيمته القصوى و من ثم يعود للصفرOverflow يقوم المؤقت بمقارنة قيمة العدّ بقيمة نحددها و تحفظ في المسجل و عندما يصل عدّاد المؤقت  للقيمة التي نحددها للمؤقت , فيقوم المتحكم اما بضبط الflag reg =1 أو بقدح المخارج Output triggering.

كيفية استخدام الCTC Mode :
في البداية يجب ضبط ال (prescale (1,2,8,64,256,1024
و الحسابات المطلوبة هي  :

target time =timer resolution *(Number of timer count +1 ).

timer count = (target time/timer resolution ) - 1 .

target time : هو الوقت الذي نريد المقاطعة عنده 

timer resolution : (1,2,8,64,256,1024) 

سأكتب كود بسيط يقوم باضاءة و اطفاء الباعث الضوئي LED المربوط مع المدخل D13  .
و الكود كالآتي :




Picture for oscillscope wave form 



الاثنين، 12 أغسطس، 2013

اعادة التهيئة الذاتية للمتحكم WatchDog Timer الجزء الثالث


Watchdog Timer





في بعض التطبيقات قد نحتاج لعمل تهيئة"تصفير Reset " للمتحكم الأصغري Micro controller في حالة حدوث عطل في البرنامج Locked Up   او لبدء تنفيذ البرنامج من بدايته .

و الذي دفعني أكثر لكتابة هذه التدوينة ليس فقط إكمال سلسلة وضعية الإسبات في الأردوينو Sleep Mode بل نظراً لأنطباع بعض الأصدقاء عند نيتهم ترك البرمجة في ال PIC Microchip و اتجاهم نحو Arduino AVR بالقول أن الأردوينو " هم يخلطون بين الأردوينو كبيئة عمل متكاملة و بين المتحكم AVR "لا تملك المزايا الموجودة في ال PIC و من أهمها WatchDog Timer  , فجوابي لهم سيكون من خلال ما سأعرضه في هذه التدوينة و التي جوابها بأختصار : بلى يمكنها فعل كل ذلك و أكثر .





بالعودة للنشرة الفنية الخاصة بالمتحكم AVR ATmega328 وجدت كل المعلومات اللازمة عن طرق التصفير و التهيئة فيه و تقسم ل 3 أنواع :

1) التصفير الخارجي الذي عند وضع مدخل ال Reset في الوضع LOW طبعاً هذا هو المعروف لنا في العادة و في الأردوينو توجد كبسة صغيرة Reset button  .


Arduino Uno R3 و كبسة التصفير موجودة في الجهة اليسرى العلوية بالقرب من منفذ ال USB 


2) وضع يسمى "Brown Out Detection "BOD و هو قد يكون جديد على البعض لكنه ذو اهمية كبيرة اذا انه يضع المتحكم الأصغري Microcontroller في وضع التصفير اذا هبطت فولتية التغذية عن فولتية محددة "حسب 3 فولتيات مختلفة 4.3 و  2.7  و 1.8 فولت , في الأردوينو 2.7 فولت و لا يمكن الأستفادة منها فعلياً لعدة أسباب " و اذا سنحت الفرصة سأتحدث عنه في وقت أخر" .

3)وضعية ال Watchdog timer  . و هو ما سنتابع حديثنا عنه من الآن فصاعداً .


باختصار شديد يعمل هذا النظام على توليد نبضة صغيرة تقوم بتفعيل داخلي للتهيئة internal Reset مما يعيد عمل البرنامج من الصفر مجدداً بعد أن تنتهي دورة  التصفير المحددة مسبقاً TimeOut و المخطط الزمني لها كما في الشكل .




يعمل نظام ال Watchdog timer على كريستالة داخلية 128KHz  .



كما أن هتاك ميزة أخرى ألا و هي تحديد عامل prescale  لتحديد زمن دورة  وضع التصفير TimeOut بحيث ممكن ان يحدث التصفير بين 16mS إلى 8Sec و هذا ممتاز جداً إذا ما قارناه بالمؤقتات الداخلية التي لا تتجاوز 4s .

لا يعمل ال 
 Watchdog timer فقط على أعادة تهيئة البرنامج فقط بل يعمل ايضاً على مقاطعة وظيفة محددة و تنفيذها عند انقضاء زمن ال timOut او ممكن أن يقوم بوظيفة التصفير و المقاطعة في آن واحد , قد لا تفهم شيئاً من هذا لأنه موضوع جديد بعض الشيء و استخداماته متقدمة بعض الشيء, لكن أكمل باقي المقال حتى تتضح لك الفكرة بالأمثلة .

سنقوم  أولاً بعمل تهيئة للكود المكتوب بحيث أنه بعد 4 ثواني من تشغيل البرنامج يقوم بعمل تهيئة للبرنامج ليبدأ العمل من جديد .


البرامج بشكل عام و كيفية التعامل معها ستجدها في النشرة الفنية الكاملة ص 56 حيث الكودات مكتوبة بلغة الأسيمبلي و ال C .

كل ما ستحتاجه هو فقط هو بطاقة الأردوينو لهذه التجربة و جهاز كمبيوتر .

الكود الأول سيكون لوضع التهيئة فقط .







سنقوم هنا بجعل المتحكم في حالة سبات sleep mode و ثم عمل ايقاظ له wakeup بواسطة ال watchdog فور انتهاء الزمن المحدد Timeout .


الكود الثاني : وضع التهيئة و المقاطعة  معاً .






في الكود أمر جديد ألا و هو أمر استدعاء التصفير للمؤقت ISR WDT_vector حيث يجب أعادة تصفير ال Register flag بعد كل عملية و هذا يتم داخل جملة المقاطعة للتفاصيل ص67 من النشرة الفنية .
هذه لمحة عن هذا النوع من المؤقتات , و كلما كتبت برامج أكثر فهمت أكثر مدى أهمية هذا النوع من المؤقتات و كيف توظفها في مشاريعك و دوائرك الكهربائية .

هناك مرجع مفيد لهذا الموضوع من اعداد المهندس عبد الله جلول حول عائلة ال AVR و بالتحديد ATMEGA32   باللغة العربية يمكن الأطلاع عليه من خلال الرابط هنا   و هنا 

طبعاً استفدت جداً في كتابة هذا المقال من Donal Morrissey و كتابته الرائعة حول هذا الموضوع 



تحياتي للجميع








الأربعاء، 7 أغسطس، 2013

مقالة جديدة على موقع Instructables

مقالة جديدة على موقع  Instructables 


هذه مقالة جديدة انشرها على موقع Instructables.com بعنوان :




و فيه اعرض ميزات احد اغطية Shield  الأردوينو المخصص لتشغيل الملفات الصوتية من ال SD Card او من ال Flash USB و كيفية برمجته عن طريق الأردوينو .

قراءة ممتعة 

الثلاثاء، 6 أغسطس، 2013

وضع الأسبات Sleep mode الجزء الثاني



في تدوينة سابقة تحدثت عن طريقة الإسبات و الإيقاض للمتحكم الأصغري عن طريق تغيير حالة المدخل خارجياً External Interrupt و هناك طريقة تندرج معها ألا و هي Serial UART WakeUp .

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

هذه الطريقة فعّالة جداً و تطبيقاتها كثيرة .

يمكن تفعيل ذلك من خلال البرمجة أو توصيل مقاومة بين ال Rx و المدخل D2 و عمل مقاطعة خارجية External Interrupt .


لن تحتاج سوى لبطاقة أردوينو و و توصيل مقاومة 1k بين D0 و D2 .




و البرنامج تجدونه هنا .


// 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_SAVE); 
 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() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.setTimeout(500);
delay(100);
pinMode(13,OUTPUT);
pinMode(SwitchPin,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
  
 }
 void serialEvent(){
  digitalWrite(13,HIGH);
 char str[30]={0};
 Serial.readBytesUntil('.',str,30);// read 30 byte or until str[i]='.'
 Serial.println("Wake up !") ;
 //Notice that the str doesn't save the first character .
 delay(50);

 for(int i=0;i<30;i++){
  Serial.print(str[i]);
  delay(20);
 }
 Serial.println(" ");
 Serial.println("Sleep Now ! ");
 delay(50);
 SleepNow();
}


يقوم البرنامج بإيقاظ الأردوينومن حالة الإسبات عندما نرسل لها معلومات عن طريق السيريال فقط , يقوم بعرض النتيجة على الشاشة ثم يدخل في حالة الإسبات مجدداً .


ملاحظة : قد لا يقرأ البرنامج أول قيمة من المدخلات مثلاً اذا كتبنا Mohannad فإن النتيجة المعروضة تكون ohannad يمكن حل المشكلة بترك فراغ قبل كتابة المعلومات .


عند تلقي المعلومات يضيئ ال LED D13 و عند الدخول لوضع الإسبات يطفئ هذا الضوء .



الجمعة، 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 .


التوصيل : 




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


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



تقل الطاقة المصروفة بنسبة 25% في هذه الحالة كما هو مبين بالصورة لقراءة الأميتر Ammeter  .



الخميس، 1 أغسطس، 2013

مقدمة لنمط الإسبات Sleep mode

في كثير من الأجهزة الكهربائية نحتاج دائماً لأن نجعل البطارية التي تشغلها تدوم لمدة أطول "أو حتى الأجهزة التي تعمل على فولتية مترددة  220 فولت لتوفر في فاتورة الطاقة " , لذلك نرى أن هذه الأجهزة مدعمة بوضعيات مختلفة من توفير الطاقة الكهربائية لتوفر لك هذا الخيار .

 حيث نراه في الأجهزة الخلوية و الحواسيب المحمولة و الكاميرات الرقمية و الطابعات و التلفزيونات الحديثة و غيرها الكثير , فهذه المزايا تجعل له فائدة اقتصادية و تسويقية لجذب العملاء نحو هذه المنتجات .


منج لشركة أبل و يشرح فيه مدير الشركة عن مزاياه و التي من ضمنها كفاءة االجهاز في استهلاك الطاقة



في مشاريع الطاقة المتجددة" الشمسية و الرياح " هذا الأمر مهم للغاية خصوصاً اننا نريد رفع الكفاءة أكبر قدر ممكن , لذلك يبرمج النظام الكهربائي ليدخل في وضع توفير الطاقة عند عدم استخدامها لفترة معينة , و أيضاً في مشاريع الطاقة الشمسية نستخدم وضعيات توفير الطاقة و الإسبات للمعدات التي تقوم بتحريك الخلايا الشمسية لتجميع أكبر قدر من الطاقة الشمسية "مشاريع Solar tracker ".


فهل بإمكاننا بناء مشروع ما بواسطة الأردوينو له القدرة على توفير الطاقة ؟ الجواب نعم .

للعلم فإن التيار  الذي  تستهلكه بطاقة الأردوينو Uno تبلغ44 ملي أمبير  في وضع التشغيل العادي , و قد ينخفض هذا التيار إلى حدود 28 ملي امبير تقريباً , قد يكون هذا التيار ضئيل جداً و يدفع البعض للسؤال : لماذا نوفر بضع ملي أمبيرات من خلال الإسبات ؟ و أن هذا التوفير  قليل و قد يكون غير عملي ؟

نعم قد يكون هذا صحيح , لكن لنظام كامل , قد يحتوي على الأيثرنت Ethernet و اجهزة اتصال مثل الRF او البلوتوث و وجود شاشة عرض LCD تتم تغذيتها من 4 بطاريات 1.5 فولت قد تعطي لنظامك وقت عمل أكثر بكثير من الوقت الذي سيستهلكه نظام أخر بدون وضع الأسبات .

أكثر شيء مهم في هذا الموضوع هو أن أكثر الطاقة الضائعة في بطاقة الأردوينو يكون في منظم الجهد Voltage regulater الذي يضيع عليه لوحده نصف الطاقة "أي كفاءة في حدودها القصوى 50% على احسن تقدير ".  





لذلك أختيارك لمصدر تغذية مناسب يحقق كفاءة أعلى للأردوينو بحيث أن استخدام مصدر مثل بطاريات 1.2 فولت *4 = 4.8 فولت يكون أكثر كفاءة من استخدام بطارية 9 فوت عن طريق منظم جهد 7805  .
أيضاً هناك اصدارات مختلفة من الأردوينو تعمل على صرف طاقة منخفض كأردوينو ميني mini و أردوينو نانو nano أفضل بكثير في مجال استهلاك الطاقة من الأردوينو أونو Uno مثلاً .  
الفكرة من سلسلة مقالات و عددها 3 مقالات للحديث عن هذا الموضوع و كيف تبرمج المتحكم الأصغري atmega 328 الموجود في اغلب اصدارات الأردوينو على وضعية الإسبات لتوفير الطاقة .



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