البرمجة باستخدام بطاقة أردوينو - الجزء 4
في الحقيقة، إذا اجتزت الدروس السابقة بنجاح، فالذي يلي ليس إلا تمهيدا للذين لهم مواهب قليلة في البرمجة بشكل عام وشربة ماء للذين يعلمونها لكن لا يعرفون كيف يستخدمونها في عالم الروبوتيك. سنقوم اليوم بتزويدك ببعض أساسيات برمجة البطاقة البرمجية Arduino إضافة الى ما تم طرحه في الاﻷجزاء الاﻷولى من هذه السلسلة.
|
نصيحة من وزارة الصحة هههه
تريد أن تصنع وتبرمج سيارة كالتي في صورة المقال؟ ستقول هذا ما نريده يا حبيبي لكن هذه السلسلة لا تتلاءم مع هذه الصور. وسأقول لك: بل أنت مخطأ، هذه السلسلة هي لب الموضوع، فلن أريك الآن كيف تنجز وتبرمج مثل هذه السيارة لأنك ستجدها صعبة بدون أن تفقه برمجة الروبوتات أولا، فالغاية من هذه السلسلة ليس صنع الروبوت لكن الغاية هو تزويدك وتجهيزك للمشاريع القادمة ان شاء الله، فحاول أن تمحو أولا الطلاسيم التالية من دماغك: "هذا صعب"، "بيننا وبين الدول المتقدمة قرون وقرون"، "أنا غبي"، "أنا فاشل".... واصبر قليلا فنحن نحاول قدر الامكان تبسيط الامر عليك....وخلق الانسان عجولا.....
تقديم
بالنسبة للذي له أو لها دراية بالبرمجة، لا داعي ﻷن تقرأ هذه الفقرة. اقفز الى التي تليها الله يخليك. أما الفقير فيها، انصحك أن تبقى معنا قليلا حتى يغنيك الله من فضله.
أنواع المتغيرات:
تكلمنا فيما سبق عن بعض أنواع المتغيرات لاسيما int و float. يجب أن تعرف أن قدرة الحاسوب محدودة أي أنه لا يستطيع أن يمثل عددا كبيرا جدا جدا مثلا (أعني عددا لا تتخيل كبره وفضاعته في الكبر). كمثال على هذا: العدد التالي لا يستطيع الحاسوب أن يستوعبه بشكل مباشر:
100000000000000000000000000000000000000000000
كل ما يستطيع الحاسوب التعامل معه هي اﻷعداد المحصورة في مجال محدد (بصيغة أخرى مجل محدد يرمز له بـ “نوع المتغيرات”)، وهي كالتالي:
اﻷعداد الصحيحة الطبيعية:
…..... -6, -5, -4, -3, -2, -1 , 0, 1, 2, 3, 4, 5 ,6 , …...
النوع
|
القيمة الدنوى
|
القيمة القصوى
|
byte
|
-128
|
127
|
int
|
-32768
|
32767
|
long
|
-2147483648
|
2147483647
|
اﻷعداد الصحيحة الطبيعية الموجبة: 0, 1, 2, 3, 4, 5 ,6 , …...
النوع
|
القيمة الدنوى
|
القيمة القصوى
|
unsigned byte
|
0
|
255
|
unsigned int
|
0
|
65535
|
unsigned long
|
0
|
4294967295
|
اﻷعداد الحقيقية:
…..... -6.0, -5.23, -4.4, -3.4, -2.8, -1.5 , -0.6, 0.23 , 1.3, 2.2, 3.5, 4.3, 5.3 ,6.5 , …...
النوع
|
القيمة الدنوى
|
القيمة القصوى
|
float
| ||
double
|
المكتبات:
في المكتبات العمومية: تريد كتابا في الرياضيات؟ أو في الفلسفة؟ أو في اﻷديان؟ ستذهب إذن عند أي مكتبة بمدينتكم وتدخل اليها وإذا سألت المسؤول عنها عن كتب الرياضيات فسيقول لك إذهب إلى المكان كذا وكذا وستجد فيه ما تريد. إذا وصلت إلى المكان المحدد من المفترض أن تجد ركنا خاصا بالهندسة مثلا وآخر بالجبر وآخر بالدوال المثلثية وهكذا إذا كانت تلك المكتبة مرتبة بالشكل الجيد.
نفس المبدأ في البرمجة:
تريد ان تستخدم بعضا من دوال الرياضيات، يجب أن تستدعي مكتبة تجمع معظم دوال الرياضيات (هذه المكتبة تسمى math.h).
تريد أن تتواصل مع البطاقة البرمجية بشكل أكبر، توجد مكتبة خاصة بالاتصالات تسمى Serial.
ومكتبات أخرى في مجالات أخرى قد نتطرق إليها كلما دعت الضرورة إلى ذلك.
البرمجة
لا تحتاج ﻷي تركيب إليكتروني اﻷن كما فعلنا في الدروس السابقة. قم فقط بإيصال البطاقة Arduino بالحاسوب ثم قم بكتابة الشيفرة التالية في برنامج Arduino:
/* Hello World! رسالة ترحيب
* الهدف: نريد امتحان طرق الارسال بين الحاسوب والبطاقة
*/
void setup()
{
Serial.begin(9600); // 9600 bps سرعة التحويل
/* أظهر رسالة ترحاب Hello World! ثم ارجع الى السطر*/
Serial.println("Hello world!");
}
void loop()
{
// لا شيء
}
|
الشرح
تنتمي كلا من الدالتين begin و println إلى المكتبة Serial.
ما الذي يعنيه السطر التالي؟
Serial.begin(9600); // 9600 bps سرعةالتحويل
|
نعم، هو يعني سرعة التحويل، لكن تحويل ماذا؟
تعني الكلمة المختصرة bps عدد الوحدات المحولة في الثانية من الحاسوب الى البطاقة.
نعني بالوحدات (جمع وحدة) هنا : 0 أو 1.
وبالتالي نهيء سرعة التحويل حتى تكون 9600 وحدة في الثانية الواحدة.
ربما سمعت أن اللغة السفلية للحواسيب هي النظام الزوجي، أي 0 و 1. في الحقيقة أن كل ما تبرمجه باستعمال أي لغة برمجة كانت، سيقوم برنامج آخر مخفي عنك ويعمل في الكواليس بترجمة الشيفرة الى 0 و 1 فقط حتى يتمكن الحاسوب أو أي عقل اليكتروني من فهم خزعبلاتك. حتى القيميتين 0 و 1 تترجمان الى اشارات كهربائية 0 فولط و5 فولط، على التوالي. على أي، لا داعي لهذا الآن!
الدالة println
Serial.println("Hello world!");
|
بكل بساطة تقوم هذه الدالة بإظهار على الشاشة كل ما هو بين إشارتي الاقتباس " ”. وبالتالي فالرسالة التي ستظهر لنا على الشاشة هي !Hello world
ربما تتساءل أين ستظهر هذه الرسالة وليس على البطاقة Arduino اي شاشة؟؟؟؟؟
نعم هذا صحيح، في الحقيقة سيتم ارسال هذه الرسالة غلى البطاقة Arduino وستتجاوب البطاقة مع الارسال بإشعراك عن طريق وميض. لكن برنامج Arduino يمكنك من رؤية الرسالة على الحاسوب. ما عليك إلا أن تضغط على الزر المبين في الصورة.
بعد أن تنفذ البرنامج Compile/Verify ثم تحول الشيفرة إلى البطاقة، ثم تضغط على الزر أعلاه، يجب أن يظهر لك على الصورة جانبه.
قد يتأخر استعراض الرسالة على الشاشة بعض الثواني فلا يهم. لكن إذا كنت تستعمل بطاقة NG Arduino فتذكر أنه يجب تهيئتها بالضغط على الزر اﻷسود (أو البني) على البطاقة حتى يتم تفعيها.
إذا ضغطت على هذا الزر أكثر من مرة فستظهر العديد من الرسائل على الشاشة بمقدار ما ضغطت، احذر من تكسر بطاقتك بكثرة الضغط فما زلنا نحتاجها لما هو أهم في المستقبل القريب ان شاء الله. نريد منك أن تكون أحد صناديد صناعة الروبوتات في العالم العربي يا حبيبي، ما أحوجنا إلى أمثالك. | |
لنتابع إذن.....
لدي لك بعض الإمتحانات الطفيفة هنا: (اعتبرها من طرف صديق لك وليس أستاذا متعجرفا)
| |
قم بتغيير الشيفرة أعلاه بحيث لا تحتاج لا ﻷن تضغط على زر ولا لشيء آخر، نريد منك أن تعدل الشيفرة بحيث عندما تحولها الى البطاقة تظهر لنا رسائل واحدة تلو اﻷخرى على الشاشة كما هو مبين في الصورة جانبه.
ستظهر الرسائل بسرعة كبيرة. آه، أريد منك تعديل شيء آخر اﻵن!!!! قم بتعديل آخر بحيث تظهر رسالة كل ثانية واحدة (تذكر استعمال الدالة delay كما اشرنا اليها سابقا) آآآآآآآه من الرياضيات، كم هو صعب وثقيل على النفس!!! لا تخف سأعطيك فقط ما قد يقوم به تلميذ في اﻷولى ابتدائي: انجز شيفرة جديدة ثم قم بنسخ التالي فيها، ثم نفذها وحولها الى البطاقة: |
*/ رياضيات يا عباقرة /*
نعرف بعض المتغيرات ونهيئها بأعداد مختلفة //
int a = 5;
int b = 10;
int c = 20;
void setup()
{
Serial.begin(9600); //سرعة التحويل
Serial.println("Salam alaikom: ");
Serial.print("a = "); // أظهر هذه الرسالة
Serial.println(a); // أظهر قيمة هذا المتغير
Serial.print("b = ");
Serial.println(b);
Serial.print("c = ");
Serial.println(c);
Serial.print("a + b = "); // الجمع
Serial.println(a + b);
Serial.print("a * c = "); // الضرب
Serial.println(a * c);
Serial.print("c / b = "); // القسمة
Serial.println(c / b);
Serial.print("b - c = "); // الطرح
Serial.println(b - c);
}
void loop() //لا بد أن تكتب هذه الدالة هنا ولو أنها فارغة
{
}
|
سنبقى مرة أخيرة مع الرياضيات، لكن نريد أن نستعمل دالة حساب الجذر المربع لعدد محدد. هنا يجب استدعاء مكتبة الرياضيات math.h ثم اعمل على راحتك في كتابة باقي الشيفرة.
نريد حساب وتر المثلث القائم الزاوية علما أننا نعلم كلا من قيمتي الضلعين a وb.
رياضيا، لحساب الوتر h نستعمل مبرهنة فيتاغورس التالية (سامحني على التوغل قليلا، لكن اقرأها فقط لا يهمك):
a2+ b2= h2
h =√(a2+ b2)
ستكون الشيفرة كالتالي
|
/*
* التوغل قليلا في الرياضيات
*/
#include "math.h" // استدعاء مكتبة الرياضيات
int a = 3;
int b = 4;
int h;
void setup()
{
Serial.begin(9600); // سرعة التحويل
Serial.println("al-watar h");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
/* حساب الجذر المربع وهذه ما جعلنا نستدعي مكتبة الرياضيات*/
h = sqrt( a*a + b*b );
Serial.print("h = ");
Serial.println(h);
}
void loop() // رغم عدم استغلالها لازم تكون هنا
{
}
|
تطبيق آخر: حساب مساحة القرص الصلب في الحاسوب
جرب التالي وانظر ماذا ترى:
/*
* حساب مساحة القرص الصلب
*/
int drive_gb = 5;
void setup()
{
Serial.begin(9600); //سرعة التحويل
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
}
void loop()
{
}
|
نعم الشيفرة أعلاه تظهر لك مساحة القرص بالوحدة GB، نريد أن نراه بالوحدة MB أيضا. إذن يجب أن نضرب في 1024 ﻷن1GB=1024MB.
/*
* حساب مساحة القرص الصلب
*/
int drive_gb = 100;
/* حاول ان تجرب الفرق بين long و int*/
long drive_mb;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop()
{
}
|