الجمعة، 21 فبراير، 2014

مكتبات خاصة في الأردوينو ديو 2 Arduino DUE

Advance Library 2 




في الجزء الأول من المقال تناولت عدة مكتبات خاصة بالأردوينو ديو Arduino DUE و تحدثت عن الإمكانيات الكبيرة التي تتيحها هذه اللوحة الإلكترونية .

الآن نعود لنتحدث عن موضوع سابق عن سؤال كان يطرح علي كثيراً , هل يمكننا ربط عدد كبير من الحساسات و القطع و العمليات الحسابية المختلفة مع  الأردوينو بدون تأخير زمني ملحوظ ؟! تحدثت عن مكتبة Metro التي تعتمد على الأمر millis .


لكن لو كانت هذه العمليات كثيرة و معقدة ؟! كوجود شاشات رسومية و محركات سيرفو او محركات خطوية متعددة او مربوط عدد كبير من الحساسات ! وقتها لن ينفع إلا ان نتجه لاستخدام Arduino DUE ففيها الحل الأمثل لمثل هذه المشاكل .

تتميز الأردوينو ديو Arduino DUE بمعمارية 32bit و قدرة على العمل بوجود 9 مؤقتات و امكانية عمل كل المداخل كمقاطعات Interrupts  ! هذا يجعلها ذات قوة خارقة اذا ما تحدثنا عن سرعة المعالجة ! 


هناك مكتبتان سأتحدث عنهما في هذه التدوينة :

1) مكتبة Scheduler

2) مكتبة DUE Timer



1) مكتبة Scheduler :

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


حسناً كل ما سأقوم به هو تشغيل عدة مهام مختلفة و تشغيلها بنفس الوقت و دون حصول مقاطعة بينهم .

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

1) أردوينو ديو Arduino DUE .
2) بواعث ضوئية  LED عدد 2 .
3) مقاومة ضوئية LDR 
4) مقاومتات 510 اوم عدد 2 و 10كيلو أوم 
5) BreadBoard .
6) اسلاك توصيل 


مخطط التوصيل .

البرنامج :
// Scheduler Library For Arduino Library 
// code written by : Mohannad Rawashdeh
//http://www.genotronex.com
//........................................
#include <Scheduler.h>
int LED1=11;
int LED3=13;
int Sensor=A0;

void setup() {
  // put your setup code here, to run once:
analogReadResolution(12);
Serial.begin(19200);
 pinMode(LED1,OUTPUT);
 pinMode(LED3,OUTPUT);
 Scheduler.startLoop(Geno1);
 Scheduler.startLoop(Geno2);
 Scheduler.startLoop(Geno3);
 delay(1000);
 
}

void loop() {
  // put your main code here, to run repeatedly: 
digitalWrite(LED3,HIGH);
delay(1000);
digitalWrite(LED3,LOW);
delay(1000);
  
}

void Geno1(){
 int sensorValue=analogRead(Sensor);
delay(100);
Serial.print( "Sensor Value : ");
Serial.println(sensorValue);
delay(400);
}
void Geno2(){
digitalWrite(LED1,HIGH);
delay(100);
digitalWrite(LED1,LOW);
delay(100);
}
void Geno3(){
 Serial.println("www.Genotronex.com");
 delay(250);
 Serial.println("Arduino DUE Series");
  delay(250);
    yield();
}
  

2) مكتبة DUE Timer :

 هي مكتبة غير رسمية تمكنك من استخدام المؤقتات ال 9 الموجودة في الأردوينو ديو Arduino DUE بسهولة تامة

يمكن تحميل المكتبة من الرابط :

استخدام المكتبة سهل جداً و سأعرض الأمثلة كأفضل طريقة لاستخدام المؤقتات

// Arduino Due Timer library
// this code written by :Mohannad Rawashdeh
//library source : https://github.com/ivanseidel/DueTimer
//http://www.genotronex.com/

#include <DueTimer.h>

boolean state1=false;
byte integer_number=0;
long Current;
long Previous=0;
long f=1;//-1
void setup(){
 Serial.begin(115200);
        pinMode(13,OUTPUT);
        pinMode(12,OUTPUT);
        analogWriteResolution(8);
 Timer1.attachInterrupt(timer1).start(1E6); // Every 1 sec
 Timer4.attachInterrupt(timer4).start(2E3);//Every 100ms
 Timer5.attachInterrupt(timer5).setFrequency(2);//f=2Hz=500ms
}

void timer1(){ //ISR For Timer1
digitalWrite(12,state1);
state1 =!state1;
}

void timer4(){
 analogWrite(13,integer_number);
 if(integer_number==255){f=-1;}
 if(integer_number==0){f=1;}
 integer_number+=f;
 Serial.print("count :");
 Serial.println(integer_number);
}

void timer5(){
  Serial.println("Hello DUE ");
}

void loop(){
  
     delay(2000);
     Timer5.start();
//after 20 Sec disable timer 5
   Serial.println(" stop timer 5 ");
 delay(2000);
       Timer5.stop(); 
//after 20 Sec disable timer 5
 
 
}

كل ما عليك هو تحديد نوع المؤقت العامل و زمن المؤقت "بالمايكرو ثانية " و من ثم تقوم المكتبة بالذهاب لجملة تنفيذ هذا المؤقت و تنفذها عند وصول العداد الداخلي لزمن المؤقت .

من هنا يتضح أهمية أن تكون الجمل قصيرة داخل جملة المؤقت و زمن تنفيذ المؤقت .

أيضاً هذه المكتبة تعطي أمكانية تحديد المؤقت المستخدم تلقائياً دون الحاجة لتعيينه مسبقاً

هذا البرنامج يوضح تشغيل المؤقتات جميعهم بواسطة الأختيار التلقائي للمؤقت .




المخطط :
البرنامج :
// Arduino Due Timer library
// this code written by :Mohannad Rawashdeh
//library source : https://github.com/ivanseidel/DueTimer
//http://www.genotronex.com/

#include <DueTimer.h>


boolean state=false;
boolean state1=false;
boolean state2=false;
boolean state3=false;


void Sentence1(){
 digitalWrite(13,state);
        state=!state;
}

void Sentence2(){
 digitalWrite(12,state1); state1=!state1;
}

void Sentence3(){
 digitalWrite(11,state2); state2=!state2;
}

void Sentence4(){
 digitalWrite(10,state3); state3=!state3;
}

void Sentence5(){
 int x = random(1, 40), y = random(1,40);
 Serial.print("[    -    ] ");
 Serial.print(x); Serial.print(" x "); Serial.print(y); Serial.print(" = ");
 Serial.println(x*y);
}


void setup(){
 Serial.begin(9600);
        for(int i=10;i<14;i++){
         pinMode(i,OUTPUT); 
        }
 Timer.getAvailable().attachInterrupt(Sentence1).start(1E4); delay(50);
 Timer.getAvailable().attachInterrupt(Sentence2).start(1E5); delay(50);
 Timer.getAvailable().attachInterrupt(Sentence3).start(5E5); delay(50);
 Timer.getAvailable().attachInterrupt(Sentence4).start(1E6); delay(50);
 Timer.getAvailable().attachInterrupt(Sentence5).start(2E6); delay(50);
}

void loop(){
 while(1){
  // ...
 }
}


تعليمات هذه المكتبة سهلة جداً , و لكن كنصيحة يفضل استخدام المكتبة الأولى المدعومة من الأردوينو حتى يتم معالجة بعض المشاكل في المكتبة DUE Timer  .


0 التعليقات :

إرسال تعليق

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