في هذا النشاط سوف نقوم بإعادة النشاط رقم 04 السابق و لكن بتركيب دارة مكونة من مقاومة و صمام لد مع إعادة كتابة البرنامج بطريقة مختلفة.

ler_resistor

 

ما يلزمنا

  • لوحة أردوينو
  • لوحة تجارب
  • مقاومة 220 Ω (أحمر، أحمر، أحمر)
  • صمام لد أحمر
  • أسلاك توصيل.

led-pin10_opt

إنجاز التركيب

  1. قم بانجاز التركيب كما هو موضح في الشكل في الأعلى
  2. قم بوصل صمام لد مع مراعات إيصال قدمها الأطول (القطب الموجب) بالمقاومة.
  3. إيصال القدم الثانية للمقاومة بالمنفذ رقم 10 للوحة أردوينو كما في الشكل التالي
  4. إيصال القدم الصغرى للصمام (القطب السالب) بالقطب السالب للوحة أردوينو GND.
  5. قم بوصل اللوحة مع الحاسوب.

pinled

 

إفتح واجهة التطوير و حرر نص البرنامج التالي:

int led_pin = 10;

void setup() {

pinMode(led_pin, OUTPUT);

}

void loop() {

digitalWrite(led_pin, HIGH);

delay(1000);

digitalWrite(led_pin, LOW);

delay(1000);

}

 

خذ بعض الوقت للتأمل في الفرق بين هذا البرنامج مع برنامج النشاط 04 السابق.

أنقر على الزر فحص verify_opt ما يجعل أرديونو يفحص البرنامج إذا كان صحيح.
أنقر على رفع upload_opt و بها تستقبل اللوحة البرنامج ثم تقوم بتنفيذه.

بعد سطور التعليقات لدينا التعليمة:

int led_pin = 10;

تسمى هذه التعليمة بالتخصيص و علامة يساوي «=» هنا تسمى معامل تخصيص.

في السطر 23 من برنامج النشاط 04 السابق رأينا التعليمة:

pinMode(13, OUTPUT);

و التي تجعل المنفذ رقم 13 مبرمج كمخرج للبيانات. رقم المنفذ 13 استعملناه في عدة أماكن من البرنامج. فإذا أردنا أن نغييره و نستعمل منفذ آخر لنفس العملية، لزمنا البحث على العدد 13 في كل أجزاء البرنامج لتغييره ما قد ينجم عنه أخطاء.

يوجد حل لهذه المسألة و ذلك بتخصيص إسم معين للمنفذ، فإذا أردنا تغيير رقمه فإنه يمكن ذلك من مكان واحد في البرنامج.

إذن قمنا بتسمية المنفذ 10: «led_pin» و هو رمز يمثل مكان مخصص للتخزين في ذاكرة المتحكم الدقيق. المعلومة التي تخزن في هذا المكان تسمى قيمة المتغير.

أكثر الطرق شيوعاً لحصول المتغير على قيمة هي طريقة التخصيص و تكتب:

«متغير = عبارة عددية» أو

variable = expression;

العبارة العددية أو «expression» تقدر قيمتها أولاً ثم تخصص هذه القيمة للمتغير.

العدد المخصص يمكن أن يكون صغير، كبير أو غير محدود ولكن ذاكرة المتحكم الدقيق محدودة. لذا وجب تحديد طول الذاكرة اللازمة لكل عدد.

مثلا يمكن تخصيص 2 بايت (16 بت) للأعداد الصحيحة والتي قيمها بين 32768- و 32767 و يرمز لها في لغة أردوينو «int»، و هو تصغير لكلمة «integer» يمعنى صحيح  في اللغة الانجليزية.

في العبارة السابقة،  قمنا بإنشاء متغير و سميناه «led_pin» و حددنا نوعه ب «int» و خصصنا له قيمة تساوي 10.

int led_pin = 10;

عندما نشغل البرنامج يقوم المتحكم الدقيق باستبدال أي إسم متغير بالقيمة التي أرفقت به.

 

remark

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

 

تخضع أسماء المتغيرات إلى بعض القوانين. منها، تحديد نوعها أي فيما إذا كانت تحمل عدد أو حرف أو مجموعة حروف أو قيمة منطقية إلخ…

تكتب المتغيرات في كلمة واحدة و يجب أن لا يكون فيها فراغ أو مسافة. يمكن أن يُركب إسم المتغير من كلمتين أو أكثر و يجب وصلها بالحرف «_» و لكن يجب أن لا يبدأ بعدد.

مثلا أسماء المتغيرات التالية صحيحة:

temperature

b

_test

numero_un

أسماء المتغيرات التالية غير صحيحة:

Pin 10

2test

برنامج أردوينو يفرق بين الأحرف الكبيرة و الصغيرة. مثلا: temp, Temp و TEMP هي أسماء لمتغيرات مختلفة.

 

أنواع المتغيرات

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

int : الأعداد الصحيحة 16 بت (2 بايت) من 32168- إلى 32767.

مثال

int led_pin = 13;

وصيغتها في المقطع البرمجي :

int variable = valeur;

float : الأعداد العشرية بين -3,402823510 . 10-38  و  +3,402823510 . 10+38

مثال

float myfloat = 1.117;

وصيغتها في المقطع البرمجي :

float variable = valeur;

double : في برنامج أردوينو الذي هو يشبه برنامج C فإن double و float هما نفس الشيئ.

boolean : قيمة منطقية تأخذ قيمتين فقط «true» بمعنى صحيح و «false» بمعنى خطأ.

مثال

boolean froid = true;

وصيغتها في المقطع البرمجي :

boolean variable = valeur;

char : لتعريف الحروف وهي كل الحروف الأبجدية زائد الرموز و الأرقام. تعين الحروف بتطويقها بين فاصلتين علويتين

مثال

char c = ‘a’;

وصيغتها في المقطع البرمجي :

char variable = ‘valeur’;

byte : يسجل عدد في النظام الثنائي مكون من 8 بت، و تكون قيمته بين 0 و 255

«byte» لا يحمل إشارة و بذلك لا يمكنه حفظ الأعداد السالبة.

مثال

byte b = B10010;

الحرف «B» يدل على أن العدد هو ثنائي و قيمته هنا في النظام العشري هي 18.

وصيغتها في المقطع البرمجي :

byte variable = Bvaleur;

 

فوائد المتغيرات

يتم تعيين المتغير في مكان واحد و يمكن تغيير قيمته في أماكن مختلفة من نص البرنامج. و كذلك إذا أردت تغيير المنفذ الخاص بالصمام فيمكن ذلك من موضع واحد فقط.

الدالة ()setup

void setup() {

pinMode(led_pin, OUTPUT);

}

في كل نص برنامج أردويو يجب أن تكون هذه الدالة موجودة و كذلك الدالة ()loop و إلا فلن يشتغل البرنامج.

عمل الدالة ()setup هو عمل بعض الإعدادات التي يحتاجها برنامجك كتعيين المتغيرات المستعملة في البرنامج، تحديد جهة المنافذ كمداخل أو مخارج و كذلك المكتبات المعينة المراد الإستعانة بها؛ و هي عبارة عن برامج كتبها مطورون أخرون.

هذه الدالة لا تُنفذ إلا مرة واحدة خلال عمل البرنامج.

الدالة ()loop و التي تعني الدوران في حلقة، تقوم بتنفيذ ما بداخلها في حلقة دون انقطاع.

لماذا نستعمل الدوال؟

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

الدالة هي مجموعة من المقاطع البرمجية التي نحتاجها في عدة أماكن من نص البرنامج لها إسم تُنادى به. يمكن للدالة أن ترجع بعض المعطيات أو لا. إذا لم ترجع الدالة أي قيم، وجب أن يسبق إسمها التعليمة «void».

مثال

لدينا دالة تقوم بضرب عددين صحيحين a و b و ترجع حاصل الضرب في المتغير result الصحيح.

int multiplication(int a, int b) {
int result ;
result = a*b;
return result ;
}

لاحظ أن للدالة إسم «multiplication» و حاصل الضرب هو عدد صحيح لذا وجب أن يسبق إسم الدالة التعليمة «int».

تحتاج هذه الدالة عددين صحيحين لاجراء العملية، نضعهما بين قوسين مع التعريف بأنهما صحيحين بعد إسم الدالة.

هذه الدالة تقوم بإرجاع حاصل الضرب في المتغير «result» بواسطة التعليمة «return».

في الإعلام الآلي تمثل النجمة * علامة الضرب.

 

remark

إذا لم يكن للدالة متغيرات يجب مع ذلك وضع قوسين فارغين كما هو الحال في الدالة «()loop».

 

تحتوي الدالة «()setup» على التعليمة و التي تعني أن نبرمج المنفذ كمخرج أو « OUTPUT».

pinMode(led_pin, OUTPUT);

led_pin

تحتوي الدالة «()loop» على معظم نص البرنامج و لا ترجع أي قيمة.

هذه الدالة

  1. تجعل أولا قيمة المنفذ 10 «HIGH» أي 1 ما يؤدي إلى حمله توتر قدره 5 فولت و الذي يؤدي إلى جعل صمام لاد يضيئ.
  2. تنتظر 1000 ميلي ثانية ( ما يبقي الصمام مضيء لمدة 1 ثانية)
  3. تجعل بعد ذلك قيمة المنفذ 10 «LOW» أي 0 ما يؤدي إلى حمله توتر قدره 0 فولت و الذي يؤدي إلى جعل صمام لاد ينطفئ.
  4. تنتظر 1000 ميلي ثانية ثم تعود إلى التعليمة 1 و هكذا ما يجعلنا نرى الصمام يومض.
void loop() {
digitalWrite(led_pin, HIGH);
delay(1000);
digitalWrite(led_pin, LOW);
delay(1000);
}

 

يمكننا رسم تغير التوتر على الصمام لاد كما في المخطط التالي.

signal

مجال المتغيرات

عند تعريف متغير نقوم بنفس الوقت و بطريقة آلية تحديد مجاله. فالمتغير يمكن أن يكون مُعرّف و ممكن الحصول على قيمته من أي مكان من نص البرنامج. و إما أن يكون معرف في بعض الأمكنة فقط مثلا داخل دالة أو على العموم في المجال المحصور بين موزدوجتين.

إذا قمنا بتعريف متغير في أعلى نص البرنامج و قبل تعريف الدالة «()setup» فإن هذا المتغير يسمى «شامل» و مجاله يصل إلى كل نقاط البرنامج.

إذا عرّفنا متغير داخل دالة أو بين مزدوجتين نقول أن هذا المتغير «محلي» ولا يمكن الوصول إلى قيمته إلا داخل الدالة أو المجال بين المزدوجتين. هذا يعني أنه يمكن تعريف متغيرات محلية لها نفس الإسم و تحمل قيم مختلفة.

مثال

void setup() {
pinMode(led_pin, OUTPUT);
}
void loop() {
for(int x=0; x<5; x++)
   {
     x   //x متغير محلي متاح هنا فقط
   }
}

 

ملخص عن هيكل نص برنامج أردوينو

sketchdiag

ما تعلمناه

  • ما هو المتغير و كيف يتم تعريفه
  • العبارات و التخصيص
  • أنواع البيانات

int,
float,
double,
boolean,
Char,
Byte.

  • الدوال
  • التعليمة void
  • التعليمة return
  • عمل الدوال
  • setup()
  • مدى أو مجال المتغيرات
  • المتغيرات الشاملة أو العامة
  • المتغيرات المحلية.
  • loop()