علوم الحاسب

[سلسلة تعلم الأردوينو] قراءة الإشارات الرقمية في لوحة الأردوينو

تحدثنا في التدوينة السابقة عن كيفية تحديد نمط المغرز الرقمي كدخل أو خرج وعن كيفية استخدام المغارز الرقمية لإصدار إشارة رقمية وتحكمنا بوميض ديود ضوئي كمثال على ذلك. بتدوينة اليوم سنقوم بقراءة الإشارات الرقمية الموجودة على المغارز الرقمية واستخدام المفتاح الضاغط Push-Button كمثال على ذلك.

قبل البدء، يمكنكم الاطلاع على مقالاتنا السابقة الخاصة بلوحة الأردوينو:

1. الإشارات الرقمية والمجالات المنطقية Digital Signals and Logic Levels

قبل الحديث عن كيفية قراءة الإشارة الموجودة على مغرزٍ رقميّ على لوحة الأردوينو، سيكون من المفيد إجراء مراجعة سريعة لمفهوم الإشارات الرقمية وعلاقته بالمجالات المنطقية. عندما نقول عن إشارةٍ ما أنها “رقمية” فهذا يعني أنه يمكنها أن تأخذ إحدى قيمتين: الصفر أو الواحد، أي أساس نظام العد الثنائي.

نعلم أيضاً أن الجهد الكهربائيّ يمكن أن يأخذ قيماً عديدة ولا نهائية؛ يمكن أن يكون الجهد 1 فولت، أو 1.1 فولت، أو 1.111 فولت، أو 0 فولت، أو 0.1 فولت، أو 0.001 فولت وهكذا. بهذه الصورة، متى نقول عن إشارة جهد أنها “صفر” رقمي أو “واحد” رقمي؟ هذا يقودنا إلى فكرة المجالات المنطقية (التي استعرضناها بشكلٍ مفصل في مقالٍ سابق). المبدأ هنا هو أن الصفر الرقمي هو ليس قيمة واحد بحد ذاتها، وإنما مجال كامل، فإذا كانت قيمة الجهد بين 0 و 1 فولت سنعتبرها صفر رقمي، وإذا كانت بين 4 و 5 فولت سنعتبرها واحد رقمي (أو واحد منطقي).

2. المجالات المنطقية في لوحة الأردوينو Arduino Logic Levels

يقوم صانعو المتحكمات الصغرية والشرائح الإلكترونية بتحديد المجالات المنطقية وشرحها ضمن النشرات الفنية الخاصة بالقطع المختلفة. بحالة لوحة الأردوينو أونو، فهي تعتمد على المتحكم الصغري ATmega328P من شركة مايكروتشيب، وبحسب المواصفات الفنية لهذا المتحكم، يتم تحديد قيم الصفر والواحد الرقمي على المغارز كما يلي:

المجالات المنطقية للمغارز الرقمية في متحكم ATmega328P المستخدم في لوحة أردوينو أونو
  • في حال كانت قيمة الجهد على المغرز ضمن المستوى المنخفض، أي بين 0 و 1.5 فولت، تُعتبر إشارة صفر منطقي
  • في حال كانت قيمة الجهد على المغرز ضمن المستوى المرتفع، أي بين 3 و 5 فولت، تُعتبر إشارة واحد منطقي

3. مقاومات الرفع والخفض Pull-Up & Pull-Down Resistors

ما الذي سيحدث لو كانت قيمة جهد الدخل على أحد المغارز بين المجال 1.5 و 3 فولت، أي:

3 فولت > الجهد على المغرز > 1.5 فولت

لا يوجد مجال منطقي يحدد حالة الجهد بين هاتين القيمتين، وتُعرف هذه المنطقة بالمنطقة العائمة Floating Region حيث لا يمكن اعتبار قيمة الجهد فيها واحد أو صفر منطقي، وبالتالي قد ينجم مشاكل في معالجة البيانات من قبل المتحكم في حال وجود جهد كهربائي على المغرز ضمن هذا المجال. من أجل تفادي هذه المشكلة، يلجأ المصنعون لاستخدام تقنية مقاومات الرفع والخفض.

  • مقاومة الرفع Pull-Up Resistor : أي وصل المغرز بشكلٍ دائم إلى مستوى الجهد المرتفع (جهد التغذية Vcc) عبر مقاومة ذات قيمة معينة، بحيث نضمن أن الإشارة الرقمية على المغرز هي واحد منطقي على الدوام في حال عدم وصله بأي إشارة جهد أخرى
  • مقاومة الخفض Pull-Down Resistor: أي وصل المغرز بشكلٍ دائم إلى الجهد المنخفض (التأريض GND) عبر مقاومة، بحيث نضمن أن الإشارة الرقمية على المغرز هي صفر منطقي على الدوام في حال عدم وصله بأي إشارة جهد أخرى

4. المغارز الرقمية في لوحة أردوينو أونو Digital Pins in Arduino Uno

بما أننا نعتمد على لوحة أردوينو أونو ضمن الأمثلة التي نستخدمها في هذه السلسلة، فإنه من المفيد الاطلاع أيضاً على المغارز الرقمية التي توفرها هذه اللوحة. توفر لوحة أردوينو أونو بشكلٍ أساسيّ 13 مغرز يمكن استخدامها كمداخل ومخارج للإشارات الرقمية، وهذه المغارز تمتلك الأرقام من 0 و حتى 13. عند الاطلاع على المخططات الخاصة بلوحة الأردوينو، سنجد دوماً أن المغارز الرقمية موسومة بالحرف D، وهذا يعني أن المغرز الرقمي رقم واحد هو D1. بالإضافة إلى ذلك، يمكن استخدام المغارز التماثلية (تحمل الأرقام A0 و حتى A5 على لوحة أونو) كمداخل ومخارج رقمية، وهي يجعل إجمالي عدد المغارز التي يمكن استخدامها للإشارات الرقمية 20 مغرز. يجب الانتباه إلى أن بعض المغارز الرقمية يمكن ضبطها لتنفيذ وظائف أخرى، مثل الاستخدام للاتصالات التسلسلية، أو الاستخدام كمخارج لتوليد إشارات تعديل عرض النبضة PWM.

أنواع المغارز في لوحة أردوينو أونو. المغارز الرقمية باللون البرتقالي الغامق وتحمل الحرف D. المغارز التماثلية باللون الأبيض وتحمل الحرف A. حقوق ملكية الصورة: أردوينو – Photo Credit: arduino.cc

5. التعليمات البرمجية لقراءة إشارة الدخل على مغرز رقمي

لقراءة القيمة الموجودة على المغرز الرقمي يجب أن نقوم بخطوتين فقط:

  1. تحديد نمط المغرز الرقمي للقراءة.
  2. قراءة القيمة الموجودة على ذلك المغرز.

من أجل تنفيذ الخطوة الأولى تعلمنا في التدوينة السابقة الأمر:

// Setting type of pin, input or output 
pinMode(pin_num, Mode); 

Pin_num : رقم المنفذ المراد تحديد نمط عمله دخل.

هذه التعليمة تشير إلى أن المنفذ الرقمي Pin_num يعمل كمدخل رقمي .

مع الانتباه لضرورة كتابة أحرف كلمة INPUT وحرف الـ M في تعليمة pinMode  بالقياس الكبير .

ومن أجل تنفيذ الخطوة الثانية سنستخدم التعليمة:

// Read input on digital pin 
digitalRead(pin_num); 

هذه التعليمة تعيد إحدى قيمتين :

  • 0 منطقي (إذا كان الجهد على مغرز الدخل جهد منخفض ضمن مستوى الصفر المنطقي  [0V-1.5V])
  • 1 منطقي (إذا كان الجهد على مغرز الدخل جهد مرتفع ضمن مستوى الواحد المنطقي  [3V-5V])

 و بالتالي يمكن استخدام نمط البيانات البولياني bool  والذي يحمل أحد قيمتين 0 أو 1 منطقي , مثلا إذا كان يوجد جهد 5 فولت على مغرز الدخل فيكون خرج هذه التعليمة هو واحد منطقي .

أما عن المنطقة المحصورة بين 1.5 فولت و 3 فولت تسمى النقطة العائمة floating point اختصارا هي منطقة لا يمكن اعتبارها صفر منطقي ولا يمكن اعتبارها واحد منطقي وللابتعاد عنها حتى لا تحدث مشاكل في تنفيذ الشيفرة البرمجية قد تؤدي إلى أضرار كبيرة في تنفيذ مهمة معينة نستخدم مقاومات الجذب و الرفع .

يؤمن المتحكم Atmega328P الموجود على لوحة الأردوينو مقاومة رفع داخلية قيمتها 10 كيلو أوم، عن طريق التعليمة

// Setting input with internal pull-up resistor 
pinMode(pin_num, INPUT_PULLUP); 

باستخدام أحد هاتين الطريقتين نستطيع تحديد الدخل الرقمي بأحد قيمتين صفر منطقي أو واحد نطقي و بالتالي ابتعدنا عن الحالة العائمة .

6. المفتاح الضاغط Push-Button

وهو أحد أشكال المفاتيح اللحظية فهو مفتاح ينشط عمله عند الضغط عليه بينما يعود لحالته الأساسية عند رفع الإصبع عنه . (مثل جرس الباب الذي يرن أثناء الضغط عليه فقط) , يكون رمزه الالكتروني و شكله في معظم الأحيان كما في الصورة الآتية :

7. مثال تطبيقي – التحكم بإضاءة ثنائي مصدر للضوء عبر مفتاح ضاغط

1.7 شرح عمل الدارة

في كل مرة يتم فيها الضغط على المفتاح تتغير حالة الثنائي المصدر للضوء، أي وبحال كان الثنائي المصدر للضوء يُضيء وتم الضغط على المفتاح، يتوقف الثنائي المصدر للضوء عن العمل، ومع ضغطةٍ جديدة على المفتاح سيعود الثنائي للعمل وهكذا.

2.7 العتاد المستخدم
  • لوحة أردوينو أونو Arduino UNO، أو أي لوحة متوافقة معها .
  • لوحة تجريب إلكترونية.
  • أسلاك توصيل Jumper-Wire.
  • ديود ضوئي LED . و مقاومة أومية 220 أوم.
  • مفتاح ضاغط Push_Button و مقاومة أومية 10K أوم .
3.7 البرامج المستخدمة
  • بيئة التطوير الرسمية الخاصة بلوحات الأردوينو (للتحميل: اضغط هنا )
4.7 توصيل العتاد

يتم توصيل الديود الضوئي مع المقاومة الأومية على المغرز الرقمي 3 (مثلا)

يتم توصيل دارة المفتاح الضاغط (باستخدام مقاومة الرفع Pull-Up ) على المغرز 2 (مثلا)

5.7 الشيفرة البرمجية
/***************************************************************
*               Reading state of Digital Pin 
****************************************************************/ 

int pin_button  = 2;    // Button pin
int pin_led     = 3;    // LED pin 

bool button_status;     // Save button status
bool led_state  = 0;    // Save led state 

void setup() 
{
  pinMode(pin_button, INPUT);
  pinMode(pin_led, OUTPUT);
}

void loop() 
{
  // Read current button status
  button_status = digitalRead(pin_button);

  // Check if button has been pressed
  if (button_status == 0) 
  {
    // Remove debounce effect by time-delay
    delay(150);
   
    // Check button again
    if (button_status == 0)
    {
      // Reverse the state of boolean variable    
      led_state = !led_state;
    }
  }
 
  // Toggle-LED according to current value of variable "led_state" (1 : on, 0 : off)
  digitalWrite(pin_led, led_state );
}
6.7 ملاحظات حول الشيفرة البرمجية
  • التعامل مع المغارز برمجياً يتم عبر رقمها، ولكن يمكن إسناد هذا الرقم إلى متحول من نمط int لتسهيل التعامل مع المغرز، ولذلك نجد في بداية البرنامج تصريح لمتحولين، الأول هو pin_button والذي يمتلك القيمة 2، ما يعني أنه يمثل المغرز الخاص بمفتاح الضغط، بينما نجد المتحول pin_led يمتلك القيمة 3 ما يعني أنه يمثل المغرز الخاص بالديود الضوئي.
  • يمكن استخدام أي اسم للمتحولات الخاصة بالمغارز، ولكن يُفضل أن يكون الاسم معبراً عن وظيفتها. اسم مثل pin_button يعكس وظيفة هذا المتحول، ولكن استخدام اسم مثل i أو x أو a يجعل من عملية قراءة الشيفرة البرمجية صعبة وغير مريحة
  • قيم المتحول البولياني هي واحد أو صفر منطقي و بالتالي فإن عملية Not  للقيمة صفر مثلا هي واحد و العكس صحيح. هذا الأمر مستخدم في التعليمة led_state = !led_state التي تؤدي لعكس حالة المتحول البولياني المستخدم والذي تستخدم قيمته لتشغيل إو إطفاء الديود الضوئي
  • تم إضافة تعليمة التأخير الزمني للتخلص من الأثر الناتج عن الارتداد الميكانيكي للمفتاح الضاغط Debounce-Effect، وهي مشكلة معروفة في المفاتيح الميكانيكية. بالحالة المثالية، فإن الضغط على المفتاح سيؤدي لتوليد نبضة صفر منطقي، وعدم الضغط على المفتاح سيؤدي لتوليد نبضة واحد منطقي. بسبب عدم مثالية التلامسات الميكانيكية في المفتاح نفسه، فإنه وبعض الضغط عليه سيحصل ارتداد للتلامسات عدة مرات قبل أن تستقر على الوضعية الجديدة، وهذا يعني أنه سيتم توليد سلسلة نبضات سريعة وقصيرة بدلاً من الانتقال المثالي من حالة غير مضغوط (أي واحد منطقي) إلى حالة الضغط (0 منطقي) كما هو موضح في الصورة أدناه .

تسبب ظاهرة الارتداد مشاكل في الدارات التناظرية والرقمية التي تمتلك سرعة استجابة عالية، وهذا يعني أن نبضات الارتداد سيتم تفسيرها ومعالجتها من قبل هذه الدارات على أنها بيانات فعلية، في حين أنها في الواقع ضجيج يجب التخلص منه. لا تدوم عملية الارتداد الميكانيكي فترة طويلة (من رتبة الميللي ثانية) ولكنها طويلة بما يكفي ليتم تسجيلها بواسطة المتحكم الصغري. بهذه الصورة، ومن أجل التخلص من هذا التأثير، يمكن استخدام تأخير زمني ضمن البرنامج ثم إعادة القراءة مرة أخرى للتأكد هل المفتاح ما زال مضغوطا أم لا، أما الكترونيا فيتم عن طريق دارات أكثر تعقيدا.

7.7 أفكار تطويرية
  • يمكنك تجريب الشيفرة السابقة بدون إلغاء الارتداد وملاحظة الفرق في الأداء.
  • يمكنك تجريب الشيفرة السابقة باستخدام مقاومة الرفع المدمجة بالمتحكم من دون إضافتها للدارة.
  • يمكنك تجريب المثال السابق باستخدام مقاومة الخفض Pull-Down بدلا من مقاومة الرفع Pull-Up.
  • يمكنك عمل دارة مكونة من مفتاحين ضاغطين أحدهما لتشغيل دايود ضوئي والآخر لإطفائه وملاحظة تطوير لشيفرة البرمجية شيئا فشيء.

8. ملخص

  • تمتلك لوحة أردوينو أونو 14 مغرز يمكن استخدامها كمداخل ومخارج رقمية، بالإضافة إلى إمكانية استخدام المغارز التماثلية الستة كمداخل ومخارج رقمية
  • يتم تعريف الصفر المنطقي في أردوينو أونو على أنه أي جهد دخل بين 0 و 1.5 فولت، بينما الواحد المنطقي هو أي جهد دخل بين 3 و 5 فولت. المجال بين 1.5 و 3 فولت يعرف بالمجال العائم.
  • تستخدم مقاومات الرفع لضمان بقاء حالة المغرز على أنها واحد منطقي (مستوى جهد مرتفع) وتستخدم مقاومات الخفض لضمان بقاء حالة المغرز على أنها صفر منطقي (مستوى جهد منخفض)
  • تعتبر مشكلة الارتداد الميكانيكي Debounce في مفاتيح الضغط سبباً لنشوء نبضات رقمية خاطئة قد تُفسر على أنها بيانات صحيحة. هنالك العديد من الطرق لإصلاح هذه المشكلة، منها توليد إشارة تأخير زمني بعد قراءة قيمة المغرز المتصل مع مفتاح الضغط.

Mouhamad Hadid

مهندس في الالكترونيات و الاتصالات من جامعة دمشق مهتم بعالم الالكترونيات الرقمية و المتحكمات وأنظمة الـ IOT والتيار الخفيف.

مقالات ذات صلة

زر الذهاب إلى الأعلى