بوابات الدخل و الخرج في دارات أردوينو

تتضمن دارة SYRDUINO NG ثمانية عشر بوابة دخل و خرج للتحكم بدارات المستخدم التي يتم وصلها بها , الشكل التالي يبين أقطاب الدارة وهي :المداخل و المخارج الرقمية D0 إلى D13 و المداخل التمثيلية A0 إلى A5 .


أولاً:وظائف أقطاب Arduino :

 
  1. مخارج رقمية: حيث تأخذ المخارج إحدى الحالتين المنطقيتين 0” أي جهد 0 فولت و 1” أي 5 فولت بحيث يمكن تشغيل و إطفاء العناصر الموصولة به مثلاً :

    الثنائيات المضيئة LEDs

    شاشات الثنائيات المضيئة 7Segment

    سبيكرات التيار المستمر DC buzzers

    محركات التيار المستمر الصغيرة Dc motors

  2. مداخل رقمية:حيث يمكن للبوابات قراءة الحالة المنطقية المطبقة عليها من الخارج أي إما 1” أو 0” لتحقيق عدة وظائف مثلاً:
    قراءة المفاتيح و حساسات الاصطدام (للروبوتات مثلاً)
    قراءة لوحات المفاتيح
  3. مخارج تمثيلية:حيث يمكن لبعض أقطاب الدارة أن تولد إشارة كهربائية يستطيع المستخدم تغيير قيمة جهدها المتوسطة ما بين 0 و 5 فولت تستخدم للتحكم بعدة أشياء مثلاً:
    التحكم بشدة إضاءة ثنائي مضيء LED التحكم بسرعة محرك تيار مستمر صغير
  4. مداخل تمثيلية:يمكن استخدام المداخل التمثيلية لقياس الجهد الكهربائي المطبق عليها من الخارج و لهذا تطبيقات كثيرة منها :
    قراءة حساسات الحرارة و الإضاءة و الرطوبة. قراءة الإشارات الصوتية
  5. وظائف متقدمة : و هما وظيفتان يمكن تحقيقهما بتعليمات بسيطة في لغة Arduino C و هما :
    توليد النغمات قياس النبضات و العمل كمسجل إزاحة

ثانياً:برمجة أقطاب Arduino :

1.المداخل و المخارج الرقمية :

يمكن برمجة أي من أقطاب دارة Arduino الرقمية D0 إلى D13 لتعمل كمداخل أو مخارج , طبعاً لابد في البداية من تحديد اتجاه البوابة باستخدام التابع :

pinMode(اتجاه البوابة,رقم البوابة);

معامل التابع اتجاه البوابة , و يمكن أن يأخذ واحدة من ثلاثة قيم :

OUTPUT لتعريف البوابة كمخرج مثلاً :

pinMode(3,OUTPUT);

INPUT أو INPUT_PULLUP لتعريف البوابة كمدخل (و سيتم شرح الفارق بينهما لاحقاً):

pinMode(4,INPUT);

pinMode(5,INPUT_PULLUP);

بعد تحديد اتجاه البوابة كمخرج : يمكن تحديد حالة المخرج باستخدام التابع:

digitalWrite(حالة البوابة,رقم البوابة);

حالة البوابة يمكن أن تأخذ إحدى القيمتين HIGH أو LOW

مثلاً:

digitalWrite(3,HIGH);

digitalWrite(3,LOW);

ملاحظة : إن كيفية توصيل العنصر الذي تتحكم به بوابة المخرج هي التي تحدد عند أي حالة يتم تفعيل العنصر .

مثلاً عند التحكم بثنائي مضيء كما هو مبين في الشكل التالي توجد حالتان :

الثنائي LED1 يعمل عندما تعطي البوابة رقم 3 مستوى منخفض لأن طرفه الآخر موصول مع جهد 5 فولت , أما الثنائي LED2 فيعمل عندما تعطي البوابة رقم 2 مستوى عالي لأن طرفها الآخر موصول مع أرضي الدارة GND أى جهد 0 فولت .

أما عند تحديد اتجاه البوابة كمدخل فيمكن قراءة حالة البوابة (المطبقة عليها من الخارج) باستخدام التابع :

digitalRead(رقم البوابة);

و لتوضيح كيفية استخدام التابع سنقوم بكتابة برنامج صغير يقوم بتشغيل ثنائي مضيء عند الضغط على مفتاح موصولين بدارة SYRDUINO NG حسب الشكل التالي :


int led = 2;
int button=3;

void setup() {                
    pinMode(led, OUTPUT); 
    pinMode(button,INPUT);  
}

void loop() {
  if (digitalRead(button)==LOW)
    digitalWrite(led,HIGH);
  else
    digitalWrite(led,LOW);
}

ملاحظة:عند قراءة بوابة دخل غير موصولة بشيء سنحصل على قيم عشوائية , و هذه الغاية من المقاومة R3 الموصولة على المفتاح و على جهد التغذية 5 فولت(كما هو مبين في الشكل السابق) التي تجعل قطب الدارة بحالة 1” عندما لايكون المفتاح مضغوطاً .

يمكن الاستغناء عن المقاومة الموصولة مع المفتاح باستخدام القيمة INPUT_PULLUP عند تعريف البوابة مدخل أي كما يلي :

pinMode(2,INPUT_PULLUP)

أخيراً : يمكن استخدام المداخل التمثيلية في دارة SYRDUINO NG وهي الأقطاب A0-A6 كمداخل و مخارج رقمية مثلاً :

   pinMode(A1, OUTPUT); 
    digitalWrite(A1,HIGH);

2.المداخل التمثيلية:

الإشارة التمثيلية هي الإشارة هي الإشارة التي تأخذ مجالاً مستمراً من القيم على عكس الإشارة الرقمية التي تأخذ قيمتين 1” و 0” كقيم درجات الحرارة فيمكن أن تكون 25° و 25٫01° و 26٫1° و 27° و 60° .

طبعاً لا يمكن لدارات Arduino أن تقيس الحرارة مباشرة و لذلك فإننا تحتاج إلى حساس يحول درجة الحرارة إلى جهد كهربائي يمكن للدارة أن تقيسه عند وصل الحساس إلى أحد المداخل التمثيلية في الدارة A0 إلى A6 .
يمكن لدارة Arduino أن تحول الجهد الكهربائي الموجود على أحد مداخلها التمثيلية إلى قيمة رقمية تتراوح ما بين 0 إلى 1023 باستخدام دارة داخلية يطلق عليها اسم "المبدل التمثيلي الرقمي" Analog to Digital Converter و لهذه الدارة عدة أقطاب و هي:
المداخل التمثيلية : و هي الأقطاب التي يتم وصل الإشارات المراد قياسها إليها و في حالة دارات Arduino يجب أن يكون الجهد المطبق مابين 0 فولت و 5 فولت .
مدخل الجهد المرجعي Analog reference :

قيمة الجهد المطبق على على هذا المدخل تحدد قيمة الجهد الأعظمي الذي يقيسه مبدل الدارة,فإذا كان الجهد المرجعي 2٫5 فولت تصبح القيمة العظمى لنتيجة التبديل وهي 1023 مقابلة لجهد 2٫5 فولت أي أن كل تدريجة للمبدل تقابل 2٫5/1023=2٫5 ميلي فولت , أما إذا كانت قيمة الجهد المرجعي 5 فولت تصبح القيمة العظمى لنتيجة التبديل وهي 1023 مقبلة للجهد 5 فولت و تصبح كل تدريجة للمبدل مقابلة لـ 5 ميللي فولت أي أن الدقة أصبحت أقل .
و لتبسيط الأمر يمكن أن نشبه المبدل التمثيلي الرقمي بمسطرة مطاطية مدرجة بـ 1024 تدريجه و الجهد المرجعي هو طول المسطرة فعند تغير طول المسطرة تتغير دقتها.
لحسن الحظ لستَ مضطراً دائماً لوصل جهد خارجي إلى مدخل الجهد المرجعي إذ يوجد احتمالان آخران للجهد المرجعي و هما:
استخدام جهد التغذية 5 فولت كجهد مرجعي داخلي و هي الحالة الافتراضية .
استخدام جهد مرجعي داخلي قيمته 2٫56 فولت .
و يمكن اختيار الجهد المرجعي باستخدام التابع :

analogReference(نوع الجهد)

نوع الجهد يمكن أن يأخذ واحدة من ثلاثة قيم :DEFAULT:جهد التغذية 5 فولت .INTERNAL: جهد داخلي 2٫56 فولت .EXTERNAL:قيمة الجهد المطبق على قطب الدارة Aref .ملاحظة هامة : عند استخدام الخيارين الأولين يجب وضع مكثف قيمته 10uF بين مدخل الجهد المرجعي و الأرضي .و لقراءة المداخل التمثيلية نستخدم التابع

analogRead(رقم المدخل)

رقم المدخل هنا يأخذ القيم : A0 إلى A5 .و المثال التالي يوضح كيفية قراءة قيمة المدخل التمثيلي رقم A0 و تشغيل المخرج رقم 2 عند تجاوز الجهد المطبق عليه 2٫5 فولت :

int sensorPin = A0; 
int sensorValue;
int ledPin = 2;
float voltage;

void setup() {
  pinMode(ledPin, OUTPUT);  
}

void loop() {
  sensorValue=analogRead(sensorPin);
  voltage=map(sensorValue,0,1023,0,5);  
  if (voltage>2.5)
    digitalWrite(ledPin,HIGH);                  
  else
    digitalWrite(ledPin,LOW);
}

يلاحظ في البرنامج استخدام التابع map الذي يحول القيمة المقروءة من المدخل التمثيلي sensorValue من المجال 0-1024 إلى المجال 0-5 لتحويل القيمة المقروءة إلى جهد لأن القيمة الافتراضية للجهد المرجعي هي 5 فولت كما أسلفنا .

3. المخارج التمثيلية :
في الحقيقة لا تقوم دارات Arduino بتوليد إشارة تمثيلية فعلية ( أي جهد مستمر ) و إنما تستخدم هذه الدارات تقنية تعديل عرض النبضة Pulse Width Modulation و ذلك بتوليد نبضات بتردد مرتفع عادة (490Hz في حالة دارات Arduino) بحيث يتم تغيير زمن القسم المرتفع من النبضة (لأن كل نبضة تتألف من مستوى عالي 1” وآخر منخفض 0”)و عند ذلك ستتغير القيمة المتوسطة لجهد النبضات كما هو مبين في الشكل :

لا يمكن استخدام جميع أقطاب دارات SYRDUINO كمخارج تمثيلية و إنما فقط الأقطاب الرقمية رقم 9 و 10 و 11 في الدارات المزودة بالمتحكم ATmega8A و الأقطاب الرقمية رقم 3 و 5 و 6 و 9 و 10 و 11 في الدارات المزودة بالمتحكم ATmega328 .

التعامل مع المخارج التمثيلية برمجياً يتم من خلال تابع واحد :

analogWrite(قيمة الخرج,رقم المخرج)

قيمة المخرج يجب أن تكون بين 0 و 255 لتوليد نبضات بعرض بين 0% و 100% و المثال التالي يوضح كيفية التحكم بإضاءة ثنائي مضيء بحيث تزداد و تنخفض إضاءته تدريجياً و هو موجود ضمن الأمثلة الجاهزة في بيئة Arduino IDE :

/*
 Fading
  This example shows how to fade an LED using the analogWrite() function.
  The circuit:
 * LED attached from digital pin 9 to ground.
  Created 1 Nov 2008
 By David A. Mellis
 modified 30 Aug 2011
 By Tom Igoe
  http://arduino.cc/en/Tutorial/Fading
  This example code is in the public domain.
  */
int ledPin = 9;    // LED connected to digital pin 9
void setup()  { 
  // nothing happens in setup void loop()  { 
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}

4. توليد النغمات في دارات Arduino :

لتوليد النغمات الموسيقية (البسيطة طبعاً) من أقطاب الدخل و الخرج يمكن استخدام التابع tone الذي يمكن استخدامه بشكلين :

tone(تردد النغمة,رقم القطب)

tone(زمن النغمة,تردد النغمة,رقم القطب)

و لإيقاف توليد النغمات نستخدم التابع noTone كما يلي:

noTone(رقم القطب)

لا يمكن توليد النغمات من أكثر من قطب واحد معاً .
النغمات التي يتم توليدها باستخدام التابع السابق هي عبارة عن إشارة مربعة و ليست كإشارة الآلات الموسيقية الحقيقية و إنما بتغيير تردد الإشارة السابقة يمكن تغيير حدة النغمة .


و الشكل التالي يوضح كيفية ربط دارة SYRDUINO NG بمجهار عادي ذو ممانعة 8 أوم :

و المثال التالي يوضح كيفية توليد النغمات الموسيقية من النغمة "دو" إلى "سي" :

const int speakerPin = 9; // connect speaker to pin 9

unsigned int frequencies[] = {262,294,330,349,392,440,494};

void setup() { }

void loop() {

    for (int i = 0; i < 7; i++) { tone(speakerPin, frequencies[i], 300); }

    delay(4000); // wait four seconds before repeating the song

    }

التعليقات  

# فاضل الظفيري 2014-12-28 16:59
اشكركم على هذه المعلومات المفيدة
رد | رد مع اقتباس | اقتباس

أضف تعليق

كود امني
تحديث