Professional Documents
Culture Documents
ARDUINO
كما لم تعرفه من قبل!!
مقدمة المؤلف:
األول من سلسلة االحتراف " األردوينو
بعد سنوات من إصدار الطبعة األولى للجزء ّ
كما لم تعرفه من قبل" ....وبعد صدور الجزء الثاني أيضاً ،كان لزاما ً العودة لترتيب
األفكار لك ّل السلسلة وإجراء مراجعة شاملة للمحتوى العلمي لها وخاصة الجزء ّ
األول
والذي نعتبره المدخل التأسيسي في مجال برمجة لوحات األردوينو ،فت ّم الوصول
لعدة نقاط مه ّمة يجب تداركها في الطبعة الجديدة معتمدين على النتائج واالستقراء من
األطراف التي اطلعت على الكتاب وعملت به أو من خالل الدروس التي تم تقديمها
فكان ّأول تعديل في طريقة العرض بشكل عام فت ّم تكثيف عدد التمارين البرمجية
بشكل كبير جدا ً ليشمل جوانب كبيرة وأفكار برمجية مختلفة مع االعتماد على من ّ
صة
TINKERCADلرسم وتقديم األمثلة م ّما يس ّهل على الطالب فهم التّوصيل وكيف ّية
ربط القطع ببعضها.
2
مع طرح أهم القوانين التي قد يحتاجها أثناء العمل دون استطراد أكاديمي لكيال نخلق
لدى الطالب خوف من التعلم.
أيضا ً ت ّم دراسة المشاريع الموجودة وتعديلها بما يتناسب كما ذكرنا مع الترتيب العام
لألفكار ضمن أجزاء السلسلة....
ختاما ً أسأل هللا أن يجعل هذا العمل مباركا ً متقبّال وأن يكون كما رسم له سلسلة
احترافية شاملة ممتعة وسهلة في الفهم.
3
إدارة شركة ابتكار للحلول الهندسية لكل الخدمات التي قدمتها في سبيل إتمام هذا العمل
https://www.facebook.com/EptekarENG
https://t.me/eptekar
http://youtube.com/c/Eptekar
4
الطبعة الثانية2021\11\1 :
جميع الحقوق محفوظة للمؤلف وال يحق نشر هذا الكتاب أو تصويره أو بيعه إال بإذن خطي من
المؤلف وتتحمل أي جهة مخالفة المسؤولية أمام هللا أوال ث ّم أمام القضاء ،علما أن ريع الكتاب
مخصص بالدرجة األولى لألبحاث والتطوير العلمي ،ومن أجل العمل على إتمام هذا السلسلة
البرمجية وغيرها من األبحاث والدراسات.
فيسبوك:
https://m.facebook.com/EptekarEDUC
يوتيوب:
/https://www.youtube.com/cابتكارالتعليمية
تلغرام:
https://t.me/EptekarEduc
5
ما مضى من صالح العيش راجع ْ
وهل أال يا لقوم ْ
هل لما ح ّم دافع؟
وقَــتلى َم َ
ضـ ْوا فيهــــ ْم نفَ ْي ٌع َو َرافع صـبـــَابـَة َوجـ ْـد ذ ّك َرتني أحـــبّة ً
َ
مـــطيــ ٌع لـــه فــي ك ّل ْأمر وســــامع دعا فأجــــابوه بحــ ّق ،وكلهـــــ ْم
إذا ل ْم يـــ ْ
كن إال النبيينَ شـــــافع ألنهم يرجــــونَ منــــه شــــفاعة
عة ه
َّللا تَابــــع ألولنــــَا ،فـــي َ
طـــا َ ّ لَنَـــا القَ َدم األولـــى إليكَ َ ،وخ َْلفنا
إن قَ َ
ضـــــا َء ه
َّللا ال بـــــدّ َواقــع َو ّ ونعلـــــم ّ
أن المـــــــلكَ هلل وحــــده
7
أساسيات العناصر االلكترونية:
سنتعرف في هذا القسم على أه ّم العناصر االلكترونية ووظائفها األساسية التي ته ّمنا في هذه
ّ
المرحلة من مراحل تعلّم برمجة األردوينو إذ ال يمكن أن يتقدّم الطالب في البرمجة مالم يرفع
مستواه العملي في االلكترونيات للوصول لمشاريع احترافية كون مجال البرمجة هنا يتض ّمن قسم
تطبيقي Hardwareمع القسم البرمجي ....Softwareلنبدأ معا ً مستعينين باهلل.
المفاتيح والكباسات:
وهي عبارة عن عناصر فصل/وصل للتيّار الكهربائي وتتوفّر بأشكال مختلفة وطرق عمل
متعدّدة ،نستخدمها في مشاريعنا كعناصر تمرير أوامر لألردوينو وذلك من خالل وصل/فصل
إشارة كهربائية نحو األردوينو.
8
تتوفّر المفاتيح بطرق عمل مختلفة فمنها ما يبقى على وضعيّته الجديدة بعد كل عمليّة ضغط عليه
كالمفاتيح المتعارف عليها ،Switchومنها تبقى متغيّرة طالما هناك حالة ضغط عليها وتعود
لحالتها الطبيعية بعد زوال الضغط عنها وهي ما تعرف بالكبّاسات اللحظيّة ،push button
ويختلف ترميزها في الدّارات تبعا ً آللية عملها.
9
المقاومة الكهربائية.
تعتبر العنصر األشهر من بين العناصر الكهربائية تقاس بواحدة األوم Ohmومضاعفاتها أو
أجزائها ،كما تلعب دور كبير في الحماية وتتمثّل وظيفتها األساسية بكونها محدّد للتّيار ومقسّم
للجهد.
تتوفّر المقاومة الكهربائية بأنواع كثيرة جدا ً ويمكن تقسيمها تبعا ً لنوع ال ّمادة المصنّعة منها أو تبعا ً
لن نخوض كثيرا ً في أنواع المقاومة الكهربائية وسنكتفي بالتّعرف على أشهرها وهي المقاومة
الكربونية التي تتوفّر بقيم مختلفة باإلضافة لقدرتها على تح ّمل استطاعات مقبولة وكافية لنا خالل
تجميع الدّارات اإللكترونية (من األنواع المشهورة أيضا ً هو المقاومات السّلكيّة والتي تتميّز
بقدرتها على تح ّمل استطاعات عالية لكن تكون بقيم أومية صغيرة).
10
لنتعرف معا ً على أشهر القوانين الكهربائية والتي
ّ قبل المتابعة في الحديث عن المقاومة وعملها
سنستخدمها خالل دراستنا وأشهرها على اإلطالق قانون أوم الذي يحقّق عالقة ربط بين
البارامترات الثالثة وهي األوم للمقاومة واألمبير للتيّار وأخيرا ً الفولط لفرق الجهد:
V=I.R
وأيضا ً من القوانين الكهربائية المه ّمة جدا ً قانون حساب االستطاعة أو القدرة الكهربائية (الطاقة
المتولّدة من خالل تحويل أو انتقال الطاقة الكهربائية ألشكال أخرى من الطاقة:
P=V.I
بالعودة للمقاومة الكهربائية وكما ذكرنا فإنّها تلعب دور أساسي في تحديد مقدار األمبير المار
خاللها ،لكن مقدار األمبير الذي تتح ّمله متعلّق باالستطاعة التي ص ّممت لها والذي ينعكس بشكل
طردي على حجمها أي كلّما زادت استطاعتها زاد حجمها (يمكن أن نجد عدّة مقاومات من نفس
النوع ومن نفس القيمة لكن تختلف فيما بينها بالحجم بسبب اختالف استطاعة ك ّل منها عن
األخرى).
11
بالعودة للمقاومة الكربونية نجد أنّها تضم عدّة حلقات بألوان مختلفة وتستخدم هذه الحلقات لتحديد
لنتعرف على ذلك من خالل
ّ قيمتها فك ّل لون داللة رقميّة ولك ّل حلقة داللة في تحديد القيمة....
الجدول التالي:
لكل مقاومة مجموعة من الحلقات اللّونية المتقاربة وحلقة لونيّة تكون بعيدة نسبيا ً على طرف
فأول حلقتين
المقاومة ،الحلقات المتقاربة تحدّد قيمة هذه المقاومة فلو كان لدينا ثالث حلقات متقربة ّ
من اليسار تحدّدان رقم (لكل لون يقابله رقم كما من الجدول) أ ّما الحلقة اللّونية الثّالثة فتحدّد عامل
الضرب أو عدد األصفار بعد الرقم السّابق ،وأخيرا ً ...الحلقة البعيدة تحدّد نسبة الخطأ التي
صنعت ضمنها المقاومة وقليالً ما يتم أخذ هذا العامل بعين االعتبار.
12
أ ّما النوع الذي يضم أربع حلقات فهو لتحديد دقّة أكبر للمقاومة من خالل وجود رقم إضافي في
القراءة وطريقة القراءة تكون بنفس األسلوب السّابق مع فارق ّ
أن ّأول ثالث حلقات من اليسار
تحدّد رقم يمثّل قيمة المقاومة بعد إضافة عدد األصفار المحدّد من الحلقة اللّونية ّ
الرابعة.
أن الحلقة اللّونية التي تحدّد عامل الضرب هي أيضا ً قد تكون عامل قسمة
ننتبه ألمر مهم وهو ّ
عندما يكون لونها ذهبي فيجب تقسيم الرقم الناتج على ،10أ ّما إن كانت باللون الفضّي فيجب
الرقم النّاتج على .100
تقسيم ّ
أ ّما المأثّر الفيزيائي فقد يكون تغيير يدوي كما هو الحال في المقاومات المتغيّرة المعروفة ،وقد
يكون ضوئي كالمقاومات الضوئية ،LDRأو حراري كما هو الحال في المقاومات الحرارية
بنوعيها ، PTC , NTCوقد يكون ضغط فيزيائي كحسّاسات ،FSRوغير ذلك من المقاومات
المتغيّرة...
14
مقسم الجهد:
أو ما يعرف أيضا ً بمجزئ الجهد وهي عمليّة توصيل للمقاومات للحصول على جزء من الجهد
األساسي المطبّق على مجموعها ....ليكن لدينا التوصيل التّالي لمقاومتين:
لو كان لدينا قيمة المقاومتين R1 , R2متساويتين فإن جهد الخرج من المجزئ سيكون نصف
قيمة جهد الدخل أي ،2.5vوبتغيير أي قيمة من قيم المقاومتين نحصل على جهد ضمن المجال
0 ~ Vinأي لن يكون هناك جهد خرج أكبر أو أصغر من هذا المجال.
اآلن لنضع بدل إحدى المقاومتين الثابتتين مقاومة متغيّرة وبالتالي سيكون لدينا مقسّم جهد خرجه
متعلّق بهذه المقاومة (كأن نضع مقاومة ضوئية وبالتالي سيكون جهد الخرج من المقسّم متعلّق
بشدّة اإلضاءة على المقاومة ،أو مقاومة حراريّة ....أو غير ذلك من األنواع)
15
المكثف الكهربائي.
يمكن اعتباره العنصر الثّاني األكثر شهرة بعد المقاومة ويمكن اختصار الحديث عنه بذكر أهم
وظائفه إذ يعد عامل استقرار في تغذية الدّارة والعناصر اإللكترونية باإلضافة للعديد من الوظائف
العمليّة األخرى التي يؤديها مع باقي العناصر.
كما المقاومة ...يوجد العديد من أنواع المكثّفات وتقاس بأجزاء الفاراد (ميكرو فاراد – نانو فاراد
– بيكو فاراد) كون واحدة الفاراد كبيرة جدّا ً (لكن ظهر مؤخرا ما يعرف بـ Super capacitor
أن أشهر أنواع المكثّفات التي تستخدم بكثرة في الدّارات
بسعات كبيرة جدا) ولكن يمكن أن نقول ّ
-المكثّفات الكيميائية:
وتعرف أيضا ً بالمكثّفات االلكتروليتيّة وتتواجد بسعات تتراوح من 1uFوحتّى أالف
الميكرو فاراد وتستخدم بشكل كبير في دارات الترشيح ،وهي مكثّفات قطبيّة أي لها قطب
موجب وآخر سالب ،أ ّما قيمتها فتكون مكتوبة عليها بشكل مباشر باإلضافة لرقم الفولط
األعظمي الذي يتح ّمله المكثّف (ستجد مكثّفين بنفس السّعة لكن يختلفان فيما بينها بقيمة
الفولط وبالتالي االختالف في الحجم).
16
-المكثفات السيراميكية:
وتأتي هذه المكثّفات بسعات صغيرة وليس لها قطبيّة وأشهر استخدام لها في مجال
17
الديود .Diode
18
يوجد العديد من أنواع الديودات وتختلف فيما بينها في العديد من العوامل والوظائف ،لكن أهم
العوامل التي يجب مراعاتها عند اختيار الديود:
-التّيار الذي يتح ّمله الديود عند التحييز األمامي (كونه سيكون وكأنّه مفتاح مغلق) وكلّما
زاد تح ّمله للتيّار زاد حجمه.
-الجهد العكسي األعظمي الذي يتح ّمله وذلك عند التحييز العكسي (وهذا الجهد في حال
تجاوزه سينهار الديود ويتلف).
-سرعة استجابة الديود لعمليّة التبديل (أي سرعة االستجابة عند االنتقال بين التحييز
األمامي والعكسي).
-الجهد الذي يستهلكه الديود (يخصم الديود 0.7vمن الجهد الذي يمر فيه في الديودات
المصنوعة من السيليكون ،بينما ينخفض الرقم لـ 0.3vفي الديودات المصنوعة من
الجرمانيوم).
▪ حماية من عكس القطبية في دارات التيّار المستمر ،حيث يمنع الديود مرور التيّار عند
وصل طرفي التّغذية بشكل عكسي (لكن لدينا هنا نقطة سلبيّة وهي ّ
أن الجهد بعد الديود
سيكون أقل بمقدار 0.7vبسبب خصم هذا المقدار من قبل الديود)
الحر ،ويفيدنا في التخلّص من التيّارات
▪ استخدامه كمسار حر ويس ّمى عندها بديود المسار ّ
العكسية والتي تنتج عادة عند تشغيل وإطفاء األحمال التي تضم ملفّات في بنيتها
كالمحركات وملفّات الريليه.
ّ
19
ديود اإلصدار الضوئي .LED
وهو أحد أنواع الدّيودات والذي يصدر فوتونات ضوئية عند تحييزه أماميّاً ،وبما أنّه مماثل للديود
فإن له قطبية ويميّز قطب المصعد عادة ً بأنّه أطول من المهبط.
فبالتالي ّ
يعمل ديود اإلصدار الضوئي كما ذكرنا عند تحييزه أماميّا ً لكن ننتبه أنّه ال يمكن وصله مباشرة
مع مصدر التغذية ّ
وإال سيسبّب ذلك تلفه بسبب مرور أمبير مرتفع خالله ،لذلك يجب وضع
مقاومة معه على التّسلسل قيمتها بحسب األمبير الذي يتح ّمله ويمكن حسابها من خالل قانون أوم،
وبما ّ
أن غالب ديودات اإلصدار الضوئي تستهلك ما يقارب ( 20mAيختلف االستهالك عند نفس
الحجم بتغيّر لون الـ )LEDفيكفي وصل مقاومة 470Rعند الجهد 5vمعه على التسلسل (يمكن
زيادة قيمتها لكن سنتخفض شدّة اإلضاءة لكن يق ّل استهالك التيّار).
20
بدأت ديودات اإلصدار الضوئي LEDاالنتشار منذ زمن بشكل كبير بسبب العديد من الميّزات
العمليّة أه ّمها أنّها تعتبر موفّرة ّ
للطاقة بشكل كبير مقارنة مع باقي األنواع ،وكذلك عمرها طويل
جدا ً وقدرتها على العمل في ظروف بيئية مختلفة ،لذلك دخلت في بنية العديد من أنواع شاشات
العرض المختلفة ولع ّل أشهرها شاشات القطع السّبع 7 Segmentوشاشات العرض النّقطية
Dot matrixوديودات اإلصدار الضوئي ثالثيّة األلوان RGB LEDوغيرها الكثير الكثير.
21
الترانزستور كمفتاح الكتروني.
إذا كنت مبتدئا فلعلّك سمعت عن الترانزستور ،أ ّما إن كنت صاحب خبرة وتجارب في البرمجة
وااللكترونيات فمن المؤ ّكد أنّك تعاملت معه بشكل أو بآخر....
سيكون حديثنا في هذه الفقرة مختصر جدا ً جدا ً عن الترانزستور ونأخذ منه ما يفيدنا في هذه
المرحلة التعليمية دون الدّخول في التفاصيل التي تحتاج لشرح كبير ووقت طويل.
كلّنا نعرف المفاتيح والتي يتم من خاللها تشغيل وإطفاء الحمل ،لكن هذه المفاتيح التّقليدية يتم
تشغيلها من قبل المستخدم بشكل أو بآخر ،لكن ماذا لو أردنا تشغيل وإطفاء األحمال من قبل
الدّارات االلكترونية؟؟ ...هنا نستخدم الترانزستورات كمفاتيح الكترونية (وهذا أحد استخدامات
الترانزستور) لكن كيف نختار الترانزستور المناسب وكيف نتح ّكم به؟؟ حقيقة تتوفّر
الترانزستورات بأنواع كثيرة جدا تختلف فيما بينها في البنية الدّاخلية واالستطاعة العظمى التي
تتح ّملها وكذلك في طريقة تشغيلها وطريقة ربط الحمل معها وغير ذلك من االختالفات لكن ولكيال
نتشتّت سنأخذ نوعين فقط مع ذكر طريقة التوصيل والتشغيل ونترك التوسّع والشرح للطالب لكي
يبحث بنفسه.
22
نالحظ من خالل مخطط التوصيل ما يلي:
-يتم وصل الحمل (الجهاز الذي نريد تشغيله بشرط أن يكون عمله على التّيار المستمر)
بين موجب التّغذية ( Vccقيمة التغذية ليست مشكلة بشرط أن تكون ضمن قدرة عمل
الترانزستور) وبين القطب Cمن الترانزستور.
-يتم وصل القطب Eمباشرة مع سالب التغذية ،GND
-القطب Bهو قطب التحكم بعمل الترانزستور ،فعند تطبيق نبضة موجبة عليه يصبح
الترانزستور وكأنّه مفتاح مغلق ويعمل الحمل ،أ ّما عند تطبيق 0فولط يكون الترانزستور
عندها وكأنّه مفتاح مفتوح ولن يعمل الحمل ،كما يجب وضع مقاومة حماية على قطب
Bوتختلف قيمتها بحسب الفولط المطبّق على هذا القطب (وبما أنّنا نتعامل مع المتح ّكمات
ولوحات األردوينو فيكفي وضع مقاومة ضمن المجال .)1 ~ 4.7kR
23
نقاط عامة عند التعامل مع الترانزستورات:
-تتوفّر الترانزستورات بأشكال وأحجام مختلفة ولها جميعا ً ثالثة أقطاب (وفي حاالت
مكرر).
العناصر السّطحية قد تكون األقطاب أكثر من ذلك لكن يكون أحدها ّ
-ال يوجد توزيع ثابت ألرجل الترانزستور فقد يكون القطب Bفي المنتصف أو على أحد
توزع األقطاب من الوثيقة الفنّية للعنصر .Datasheet
األطراف ويتم معرفة ّ
-أه ّم المعلومات التي يجب معرفتها عن الترانزستور الذي نريد التّعامل معه هي :التيار
األعظمي الذي يسمح الترانزستور بمروره (يسمى في الوثيقة الفنّية ICEألنّه سيمر من
Cإلى ،)Eوالجهد األعظمي الذي يتح ّمله الترانزستور ( ،)VCEوالعنصر األهم هو
االستطاعة التي يتح ّملها الترانزستور (وهو حاصل ضرب التّيار بالفولط وتسمى .)P
نذكر مرة ثانية ....هذه المعلومات سريعة جدّا ً عن الترانزستور وهي فقط لكي ّ
يتعرف الطالب
عليه ،أ ّما المعلومات الكاملة تحتاج لشرح مع ّمق وواضح لذلك ننصح ّ
الطالب بدراسة الترانزستور
بشكل موسّع أكثر في حال يريد تطوير خبراته.
24
الريليه.
والذي يس ّمى في بعض المراجع بالمرحّل ،وهو عبارة عن مفتاح ميكانيكي يتم التحك ّم به كهربائيا ً
لتشغيل األحمال ذات التّيار المستمر أو المتناوب ،وقد شاع استخدامه بكثرة لسهولة التّعامل معه
وكونه غير متعلّق بطبيعة الحمل الذي نريد التح ّكم به (متناوب أو مستمر) باإلضافة لقدرته على
التّعامل مع أحمال ذات أمبير كبير جدا ً ال يمكن للترانزستورات أن تقدّمها وأيضا ً السّعر المناسب.
-ملف نحاسي للتح ّكم بالريليه ويكون له قطبان على الريليه ،تتفعّل الريليه عند تغذية هذا
الملف ،وتختلف قيمة تغذية هذا الملف بين نوع وآخر فهناك أنواع من الملفّات تعمل عند
أحد قيم الجهود المستمرة 12v( DCأو 5vأو 24vأو غير ذلك) وهناك ملفّات تعمل
عند الجهود المتناوبة 120v , 220v( ACأو غير ذلك) ،وقد تكون هذه الملفّات ذات
قطبيّة (ويكون ذلك بوجود ديود عكسي مر ّكب داخل الريليه على الملف وهذه الحالة
تكون قليلة) أو غير قطبي (وهي الحالة ال ّ
شائعة).
25
األول يرمز له NO:
-التماسات وهي نقاط التوصيل في الريليه يوجد منها نوعان ّ
أن التّماس يعبّر عنه بمفتاح مفتوح ويغلق عند تفعيل الريليه ،أ ّما
normally openأي ّ
الثاني فيرمزـ NC: normally closeأي يكون التّماس وكأنّه مفتاح مغلق ويَفتح عند
تفعيل الريليه ،كما يختلف عددها بين أنواع الريليهات وكذلك األمبير األعظمي الذي
يمرره التّماس.
ّ
26
بقي النقطة األخيرة في التعامل مع الريليه وهي كيفية تشغيل الملف؟؟
المستمرة DCأو المتناوبة ،ACما
ّ ذكرنا في حديثنا عن الملف أنّه يمكن أن يعمل عند التغذية
يهمنا هو تلك التي تعمل على التغذية المستمرة فيتم التح ّكم بالملف من خالل ترانزستور كما في
المخطط التّالي:
الديود العكسي الموصول مع ملف الريليه على التّفرع يس ّمى ديود المسار الحر وهو ضروري
للتخلّص من التيّارات العكسية النّاتجة عن تشغيل وإطفاء الملف.
27
تتوفّر في األسواق موديوالت تضم الريليه مع كامل العناصر اإلضافية للتح ّكم بها ويمكن أن
يكون عدد مختلف من الريليهات مع ملحقاتها.
28
منظمات الجهد.
عند تعاملنا مع لوحات األردوينو أو مع المتح ّكمات نجد أنّنا بحاجة لمصادر جهد خا ّ
صة لكي
أن بعض هذه اللّوحات تضم في بنيتها ّ
منظمات تعمل لوحات األردوينو بشكل صحيح ،وسنجد ّ
ّ
المنظمات وهنا يجب علينا تأمين الفولط المناسب للجهد المستمر ،بينما بعضها اآلخر ال تضم هذه
لعمل األردوينو.
تعمل المتح ّكمات الموجودة على لوحات األردوينو في غالبها عند ( 5vوهو أفضل جهد عمل،
كما يوجد أنواع تعمل عند ،)3.3vلكن بالنّظر لمصادر الجهد المستمر المتوفّرة في األسواق
أن في غالبها يكون 12vأو خاليا ليثيوم وتكون 3.7vأو غير ذلك من صة ّ
البطاريات سنجد ّ وخا ّ
مصادر التغذية التي ال يمكن استخدامها بشكل مباشر مع المتح ّكم بل نحتاج لوصلها بطرق مختلفة
ّ
لمنظم جهد... للحصول على الجهد المطلوب ومع ذلك لن تكون القيم مناسبة بل نحتاج عندئذ
لنتعرف معا ً على طرق الحصول على الجهد المطلوب.
ّ
29
أما طريقة وصل هذه المنظمات:
30
لوحات األردوينو ....النشأة والتطور
:Arduinoهو كومبيوتر صغير الحجم بإمكانه الت ّفاعل و التح ّكم في الوسط المحيط به بشكل
أفضل من الكومبيوتر المكتبي Desktopأما تقنيا ً فهو منصة Platformبرمجية مفتوحة
تتكون من متح ّكم إلكتروني Micro-Controlerوبيئة تطويرية تكاملية لكتابة
ّ المصدر
البرمجيات.IDE
قوة األردوينو Arduinoتتجلى في قدرته الكبيرة على التواصل مع القطع اإللكترونية األخرى
ّ
كالمحوالت Switchesأو الحساسات Sensorsواالستفادة منها في الحصول على مختلف
البيانات كدرجة الحرارة والرطوبة أو شدة
اإلضاءة وكذلك فاعليته الكبيرة في التحكم في
المحركات Motorsوديودات اإلصدار
القطع من والكثير LED الضوئي
اإللكترونية.
31
يمكن تشغيل مشاريع األردوينو Arduinoعن طريق وصله بالكومبيوتر وجعله يتعامل مع أحد
البرامج الموجودة على الجهاز أو باإلمكان تشغيله باستقاللية تامة.
تعد لوحات األردوينو Arduinoاألشهر عالميا لما تقدمه من سهولة في التعامل وتنوع األفكار
والمشاريع والبساطة في التطبيق والتكلفة المادية المنخفضة نسبيا لكن كيف ظهرت فكرت هذه
اللوحات وكيف عرفت طريقها للنجاح ....؟؟؟
تبدأ القصة عام 2005في مدينة ايفريا اإليطالية حيث قام كل من ماسيمو بانزي بالتعاون مع
دايفيد كوارتيليس و جاينلوكا مارتينو بإطالق مشروع Arduino of Ivreaوتم تسمية
المشروع باسم أشهر شخصية تاريخية في المدينة وكان الهدف األساسي للمشروع هو عمل بيئة
تطوير للمتحكمات دقيقه بصوره مفتوحه المصدر 100في المئة وتضمن هذا المشروع عمل بيئة
تطوير برمجيه للمتحكمات الدقيقة )Integrated Development Environment(IDE
وتكون مجانيه في ذات الوقت كما تضمن عمل لوحات تطوير Development Boards
صغيره الحجم بتكلفه بسيطة تبلغ حاليا ً قرابة 27دوالر ليتمكن الطالب والهواة التقنين تحمل
سعرها ،وحتى عام 2013تم شحن أكثر من 700ألف لوحة أردوينو.
32
لماذا األردوينو ....؟؟؟
الثمـــن :لوح األردوينو Arduinoأقل ثمنا ً مقارنةً مع األلواح األخرى من نفس النوع
متعدد المنصات :برنامج األردوينو له القدرة على العمل على الويندوز، windows
Mac OSواللينكس Linuxبينما أغلب المتحكمات اإللكترونية األخرى تعمل فقط على
الويندوز.
33
: Open Source Hardwareاآلردوينو Arduinoمصنوع أساسا ً من
كذلك الكود المصدري الخاص ببرنامج Arduinoمفتوح المصدر ومتوفر بترخيص .GPL
34
لوحات األردوينو ....اإلختالف والميزات
منذ انطالق مشروع األردوينو وحتى وقتنا الحالي تم إنتاج العديد من التصاميم واللوحات والهدف
من ذلك تأمين احتياجات المشاريع المتعددة وبناء لوحات تتناسب مع التطبيق المطلوب من حيث
السرعة وعدد المداخل والمخارج والسعر وأمور أخرى لها عالقة بالبنية الداخلية للمتحكم
Microcontrollerالموجود على لوحة األردوينو حتى بلغ عدد لوحات األردوينو على ما يزيد
عن 40نوع بعضها يتشابه في المتحكم ويختلف في الحجم والملحقات المتوفرة على لوحة
األردوينو نفسها ،لكن ما يجمع كل لوحات األردوينو أنها تقسم في بنيتها إلى أربعة أقسام عا ّمة:
-قسم المتحكم :والذي يضم المتحكم وكل ما يلزم لعمل المتحكم بالشكل الصحيح
االستقرار الكهربائي على مداخل التغذية ،أرجل أقطاب الدخل والخرج العامة).
-قسم االتصال مع الحاسب :وهي شريحة لتأمين االتصال بين الحاسب ولوحة األردوينو
أي بين البروتوكولين ( USB < > UARTغالبا تكون هذه الشريحة إما IC: FTDI
-ملحقات على لوحة األردوينو :كالكبّاسات اللحظية ومداخل قراءة كرت الذاكرة أو
حساس أو أي نوع آخر وتكون هذه الملحقات لتسهيل التوصيل مع األردوينو ،وتتوفر
35
استعراض سريع ألشهر لوحات األردوينو:
عند التعامل مع لوحات األردوينو سنواجه الكثير من األنواع منها والسؤال الذي سوف يتبادر
في الحقيقة ال يمكن اختصار اإلجابة بنوع واحد معين وتعميمه على أنّه األفضل ،فلكل
مشروع متطلباته ولكل لوحة ميزات تجعلها هي األنسب لحاالت دون غيرها ،ففي حال
الحاجة ألعداد كثيرة من األرجل الرقمية أو التشابهية نختار لوحات مثل لوحة MEGAأما
في حالة المشاريع البسيطة اإلنتاجية نختار لوحة Pro miniوفي حال المشاريع اإلنتاجية
مع ضرورة قراءة بارامترات على الحاسب نختار لوحة NANOوهكذا لكن بالمجمل يجب
أن يكون لدى المبرمج إطالع على البارامترات األساسية للوحات األردوينو وهي:
الميزات اإلضافية والتي تشمل الملحقات اإلضافية على اللوحة وأبعاد اللوحة وكذلك
المميزات الخاصة ببنية المعالج وغير ذلك من األمور.
36
:Arduino UNO لوحة
37
38
:Arduino Mega لوحة
39
40
:Arduino Gemma لوحة
41
:Arduino Nano لوحة
42
43
:Arduino Ethernet لوحة
44
:Arduino AG101 لوحة
45
:Arduino M0 لوحة
46
:Arduino Pro mini لوحة
47
مالحظة :تحتوي لوحة األردوينو Arduino Pro miniعلى ّ
منظم جهد داخلي للحصول على
،5vوبالتالي يمكننا االستفادة من هذا الجهد لكن يجب االنتباه إال أن أكبر تيار يمكن استجراره
من هذا المنظم هو ،200mAعدم االنتباه لهذا األمر يسبب تلف لوحة األردوينو.
48
:Arduino Tian لوحة
49
محاكاة األردوينو
مع االنتشار الواسع للوحات األردوينو ...قابل ذلك توفر العديد من البرامج والمنصات التي تقدم
خدمة تعليم برمجة لوحات األردوينو ...سنستعرض في هذه الفقرة أهم البرامج والمنصات
التي تقدم إمكانية محاكاة األردوينو.
منصة :TINKERCAD
50
برنامج :Fritzing
مشروع مفتوح المصدر لتطوير برمجية للتصميم بمساعدة الحاسوب للمحترفين وهواة تصميم
الدارات اإللكترونية ويساعد المصممين والفنيين على رسم وتركيب نماذج للدارات اإللكترونية
بكيفية سهلة مع تصحيح آلي للمسارات ويدعم كذلك الربط على الشبكة للمشروعات المشتركة.
تم تطويره في جامعة بوتسدام للعلوم التطبيقية.
51
برنامج :Proteus
من أقوى برامج المحاكاة للدوائر االلكترونية والذي كان يتميّز سابقا ً في قدرته على محاكاة
مطوروا البرنامج لمواكبة هذه
ّ المعالجات والمتح ّكمات ،ومع ظهور لوحات األردوينو سارع
اللوحات وذلك من خالل طرح العديد من المكتبيات التي تدعم عدد من لوحات األردوينو باإلضافة
إلى عدد كبير من الموديوالت هذا عدا عن العناصر والقطع المختلفة والموجودة أساسا ً في بيئة
البرنامج.
أيضا ً تض ّم بيئة المحاكاة عدد كبير من المقاييس المختلفة ومولّد للنبضات باإلضافة لواجهات
التخاطب مع بروتوكوالت االتصال المختلفة وغير ذلك من ميّزات المحاكاة التي توفّر الجهد
والوقت في تنفيذ المشروع.
أيضا ً يتميّز البرنامج بقدرته على تحويل المشروع من مخطط المحاكاة دارة مطبوعة BCP
لتجميع المشروع عليها
52
بالدخول إلى برنامج Proteus 8نكتب في مكان البحث Arduinoفتظهر لدينا لوحات األردوينو
التي تم إضافتها من المكتبية الخاصة.
أشهر اللوحات التي يتم إضافتها هي لوحة Arduino UNOولوحة Arduino Megaولوحة
53
بعد إضافة مكتبيات األردوينو بقي لدينا خطوة مهمة وهي كيف نحصل على الكود البرمجي الذي
ت ّمت كتابته في بيئة التطوير Arduino IDEوإضافته للوحة األردوينو على البروتيس
Proteusلمحاكاته؟؟؟
54
للصيغة الثنائية يتم جلب هذه الصيغة للوحة األردوينو في بيئة المحاكاة Proteus 8عبر الضغط
على لوحة األردوينو في برنامج Proteus 8فتظهر نافذة يتم فيها تحديد مكان تواجد الكود
البرمجي ومن ثم تشغيله .
نالحظ من واجهة خصائص لوحة األردوينو أن تردد عمل المتحكم 16MHzوهو نفس التردد
الذي تعمل عليه لوحة األردوينو نوع ،UNOفموضوع ضبط التردد في المشاريع التي تتم فيها
المحاكاة هو أمر مهم جدا جدا ألن اختالف التردد سيؤدي إال نتائج غير متوقعة أو غير مضبوطة
بالشكل المطلوب وخاصة في المشاريع التي تعتمد على المؤقتات أو على بعض بروتوكوالت
االتصال.
أخيراً...
أفضل أسلوب لتعلم برمجة لوحات األردوينو هو التعلم على لوحات األردوينو مباشرة أو البدء
مع برنامج Proteusكونه أفضل المحاكيات وذلك من خالل التجربة الشخصية ،مع عدم إهمال
الجانب العملي التطبيقي.
55
بيئة التطوير المتكاملة Arduino IDE
56
تعتمد بيئة Arduino IDEفي أساسها على لغة البرمجة C/C++وتحتوي في بنيتها على
العديد من المكتبيات الجاهزة والتعليمات التي تختصر الكثير من الوقت والتي تعتبر من أسهل
لغات البرمجة التي تستخدم في برمجة المتحكمات المصغرة .Microcontroller
تسمى البيئة التطويرية Arduino IDEالتي يتم فيها برمجة لوحات األردوينو وكتابة الكود
البرمجي بـ ( Sketchالتصميم أو المخطط) ،وكأي بيئة برمجة تحتوي واجهة البرنامج على
قوائم وأوامر واختصارات على الواجهة الرئيسية مهمتها تسهيل كتابة الكود البرمجي وتقديم
الميزات الكبيرة الموجودة في بيئة التطوير ،Arduino IDEسنستعرض هذه القوائم بشكل
متسلسل مع شرح مبسط عن محتوى كل قائمة:
رفع :Uploadتحويل الكود للغة يفهمها المتحكم ومن ثم رفعها للوحة اآلردوينو. o
فتح :Openفتح ملفات موجودة مسبقا أو مشاريع جاهزة للتعديل عليها. o
مراقب المنفذ التسلسلي :Serial monitorلمراقبة األحداث عبر المنفذ التسلسلي. o
57
قائمة ملف :File
oجديد :Newفتح صفحة عمل جديدة.
المكتبيات الجاهزة.
oتفضميالت :Preferenceيتم فتح نافذة يتم من خاللها تحرير إعدادات ورقة العمل منها
58
قائمة تحرير :Edit
oتراجع /إعمادة : Undo/Redoيتم من خالل
هــذين األمرين التراجع للخلف خطوة أو التقــدم
لألمام خطوة أثناء تحرير الكود البرمجي.
oقص :Cutإزالة قسم محدد من المحرر ووضعه
في الحافظة.
oنسمم م :Copyنســــخ قســــم محدد من المحرر
ووضعه في الحافظة.
oنسمم م للمنتد :Copy for Forumنســــخ
الكود البرمجي لورقة العمل الخاصــــة بالمبرمج
لموقع المنتدى.
oنسم م كممممممم :Copy as HTMLنســـخ ورقة العمل بامتداد HTMLالمتناســـب مع
صفحات مواقع النت.
oلصق :Pasteوضع محتوى الحافظة في موضع المؤشر في محرر الكود.
oتحديد الكل :Select Allيختار ويحدد جميع محتوى محرر الكود.
oالذهاب للسطر :Go to lineالذهاب للسطر المطلوب والذي له رقم.
oمالحظة/إلغاء المالحظة :Comment/Uncommentوضــع أو إزالة عالمة التعليق
" " //في بداية كل سطر محدد.
oزيمادة /إنقماا المسمممممافمة البمادئمة :Increase/Decrease Indentيتم عبر مفتـاح
.Tab
oإيجاد :Findفتح نافذة يتم من خاللها البحث عن جملة مطلوبة واستبدالها.
59
قائمة الشيفرة البرمجية :Sketch
oتمحمقمق/تمرجممممة :Verify/Compile
لفحص الكود البرمجي وترجمتـه للغـة
يفهمها المتحكم.
oرفمع :Uploadرفـع الـكـود لـلـوحــة
اآلردوينو بعــد تحويلــه للغــة يفهمهــا
المتحكم.
oرفع باسمممتخدام المبرمجة :Upload Using Programmerنســخ الكود البرمجي
عبر مبرمجة للمتحكم ،لكن اســـتخدام هذه اآللية ســـوف تأدي للكتابة فوق محمل اإلقالع
.Bootloader
oتصممممدير الترجمة باللغة الثنائية :Export compiled Binaryيتم تصـــدير الكود
بصـيغة السـت عشـري " " .hexوبالصـيغة الثنائية " " .binالسـتخدامها في تطبيقات
أخرى كالمحاكاة في برنامج .Proteus
oعرض مجلمد ورقمة العممل :Show Sketch Folderيتم فتح المجلـد الـذي تم حفظ
ورقة العمل فيه.
oإضممافة مكتبة :Include Libraryإضــافة مكتبية لورقة العمل وتتم عملية اإلضــافة
بعـد إشـــــارة التضــــمين " ،"#كمـا يتم من خالل هـذا البنـد الوصــــول إلدارة المكتبـات
واستيرادها.
60
قائمة األدوات :Tools
تنسيق تلقائي :Auto Formatيتم من خالل هذا األمر تنسيق النص البرمجي بشكل
تلقائي فيتم ضبط النص وإغالق األقواس المفتوحة.
أرشفة الكود البرمجي :Archive Sketchيتم أرشفة ورقة العمل بنسخة ذات امتداد
zipوحفظها في نفس مكان حفظ الكود البرمجي.
المبرمجة :Programmerيتم من خالل هذا األمر اختيار الطريقة التي سوف يتم من
خاللها برمجة المتحكم الموجود على اللوحة وفي حال عدم وجود محمل اإلقالع
Bootloaderسوف تحتاج لتحديد نوع المبرمجة.
61
تحميل محمل اإلقالع :Burn Bootloaderنستخدم هذا األمر من هذه القائمة عند وضع
متحكم جديد على لوحة اآلردوينو ونريد تزويد هذا المتحكم بمحمل اإلقالع حيث أن المتحكم
يأتي بشكل افتراضي خالي من أي برنامج ،لكن علينا االنتباه لـ Fuse Bitوضبطها بالشكل
الصحيح.
في هذه القائمة نجد األوامر المتعلقة بتقديم المساعدة للمبرمج وخاصة الذي يستخدم بيئة برمجة
اآلردوينو للمرة األولى فنجد األمر Getting Startedلتقديم المساعدة عند الشروع في
تعلم برمجة لوحات اآلردوينو ،أما األمر Environmentفيستعرض بيئة البرمجة واألوامر
الموجودة في القوائم وما إلى ذلك ،بينما يقدم األمر Troubleshootingحلول للمشاكل
التي تواجه المبرمج عبر طرح أجوبة لألسئلة األكثر شيوعا ،أما األمر Referenceفيقدم
مرجعا لجميع األوامر والتعليمات والتوابع الموجودة في بيئة التطوير .Arduino IDE
وفي حال الحاجة لمعرفة آلية عمل أي تعليمة أو تابع ما علينا سوى وضع المؤشر عند التعليمة
المراد معرفة آلية عملها ومن ثم ضغط األمر Find in Referenceإليجاد وشرح التعليمة
المطلوبة.
62
اآلن بقي تحديد لوحة اآلردوينو في برنامج Arduino IDEليتم التعامل معها ويتم ذلك من
قائمة األدوات Toolsثم نختار اللوحة التي تم وصلها مع الحاسب (وهنا تم وصل لوحة آردوينو
)Arduino UNOكما يتم من هذه القائمة أيضا تحديد منفذ COMالذي تم توصيل لوحة
اآلردوينو إليه (في حالتنا هذه رقم المنفذ )COM3وتحديد المنفذ مهم لعملية نقل الكود للوحة
وعملية التخاطب مع اللوحة أثناء عمل الكود ,وبذلك تتم عملية التهيئة وتجهيز لوحة اآلردوينو
63
لغة البرمجة C/C++في بيئة Arduino IDE
كما ذكرنا سابقا فإن بيئة برمجة لوحات اآلردوينو تعتمد على لغة البرمجة ،C++لذلك ولكي
نكون متقنين لبرمجة لوحات اآلردوينو يجب أن يكون لدينا أساس جيد في هذه اللغة ،وبناء عليه
فإننا سنولي أهمية تعريفية بهذه اللغة مع األخذ بعين االعتبار أن هذه اللغة هنا موجهة لبرمجة
األنظمة المدمجة وليس لكتابة برامج بلغة الـ C++في الحواسيب.
64
oالقسم األول :يتم فيه تضمين المكتبيات المطلوبة للمشروع وتعريف األسماء المستعارة
لألقطاب وتعريف المتحوالت المطلوبة والتي تعرف باسم Global Variableويبدأ
األول لورقة العمل.
هذا القسم من السطر ّ
oالقسم الثاني :يكون ضمن الدالة } void setup () {…….وفي هذا القسم
يتم تهيئة المداخل والمخارج ،وتهيئة المكتبيات التي سيتم توصيلها للوحة اآلردوينو.
oالقسم الثالث :وهو ضمن الدالة } void loop () {…….وهي حلقة البرنامج
الالنهائية والتي يتم فيها تكرار العمليات والتعليمات المطلوبة بعدد النهائي من المرات.
oالقسم الرابع :وهو القسم الذي يض ّم التوابع الفرعية التي يتم فيها تنفيذ جزء محدد من
الكود البرمجي وذلك كلما تم استدعاءه من الحلقة الرئيسية.
مـالحــظات
:
✓ إلضافة تعليقات Commentsعلى الكود البرمجي يجب وضع اإلشارة " " //ومن
ثم كتابة التعليق ،أما إذا كان التعليق المطلوب وضعه طويل فيتم وضع اإلشارة " *" /
في بداية التعليق ومن ثم إنهاء التعليق باإلشارة " ." */
✓ المنطقة السوداء الموجودة أسفل منطقة العمل هي منطقة تصحيح األخطاء ،فعند ضغط
مفتاح التأكد من الكود فإنه سوف يتولد في هذه المنطقة رسائل توضح مكان األخطاء
الموجودة في الكود البرمجي.
✓ تعتبر بيئة التطوير Arduino IDEمشتقة من لغة البرمجة C/C++لذلك فهي لغة
حساسة لحالة األحرف (كبيرة أو صغيرة) كما أنها تعطي تنبّأ تلقائي لألقواس وتغيير
لون الكلمات المحجوزة.
✓ كل تعليمة في لغة Arduino IDEيجب أن تنتهي بـ " ; " وإالّ فسوف يتولّد لدينا
رسالة خطأ عند رفع الكود.
65
واجهة االتصال التسلسلي UART
ســنتطرق في هذا القســم ألمر مهم وهو واجهة االتصــال التســلســلية الموجودة في بيئة التطوير
،Arduino IDEهذه الواجهة تؤمن آلية للتواصــــل مع المتحكم أثناء عمله وبالتالي يمكن أن
نزود المتحكم أثناء عمله بأوامر لتوجيهه أو الحصـــول على معلومات وحســـابات معيّنة مطلوبة
ّ
من المتح ّكم أثناء عمله وبالتالي يتوفر لنا آلية جيدة للتأ ّكد من ّ
أن الكود يعمل بشكل صحيح.
نقوم بتوصـــيل لوحة األردوينو للحاســـب ثم نشـــغّل بيئة التطوير ،Arduino IDEبعد ذلك
المعرف عليه اللّوحة.
ّ نضبط في القائمة Toolsنوع اللوحة التي تم توصيلها ورقم منفذ COM
نش ـغّل واجهة االتصــال التســلســلي عبر القائمة Toolsنختار األمر Serial Monitorأو من
مفتاح االختصـار الخاص بواجهة االتصـال التسـلسـلي الذي سـبق وتحدثنا عنه ،فتظهر لنا الواجهة
التالية(لن تظهر هذه النافذة في حال عدم وجود لوحة أردوينو مت ّصلة مع الحاسب):
66
- 1منطقة إظهار البيانات المستقبَلة من لوحة األردوينو.
- 2منطقة ارسال البيانات للوحة األردوينو.
-3ضبط معدّل سرعة نقل البيانات وتكون افتراضيا عند القيمة .9600bps
- 4خيارات متعلقة بطريقة ارسال البيانات للوحة األردوينو.
- 5مسح البيانات الظاهرة في منطقة استقبال البيانات.
أهم أمر يجب ضـــــــــبطه عند تشغيل واجهة االتصــــــــــــال
67
;)(Serial.available وهي تعليمة تستخدم للتأكد من وصول البيانات
على المنفذ التسلسلي ،ففي حال ورود أي بيانات
على المنفذ التسلسلي تصبح نتيجة هذه التعليمة
.True
;) (Val = Serial.read قراءة القيمة المرسلة إلى لوحة اآلردوينو
واسنادها للمتحول ،Valوالقيم التي يتم
يجب االنتباه أن الصيغ المتاحة formatهي ( )BIN , HEX , DEC , OCTوفي الحالة
formatرقم نختاره وفي هذه الحالة فإن الرقم يعبّر عن عدد الخانات التي نريد طباعتها بعد
الفاصلة العشرية.
يجب االنتباه أيضا أنّه وبمجرد كتابة التعليمة ;) Serial.begin(115200يصبح القطبين
هذه جملة من التعليمات يتم استخدامها مع واجهة االتصال التسلسلي وهي فقط استعراض سريع
لكي نتعلم التعامل مع هذه الواجهة مبدئيا وسنتطرق لبروتوكول االتصال UARTبشكل كافي
68
األقطا الرقمية على لوحة األردوينو:
كطالب مبتدأ تريد التعامل مع لوحة األردوينو ستجد في بداية األمر صعوبة كبيرة ،فبالنظر للوحة
األردوينو ستجد أرقام ورموز على اللوحة ...ال تخف ....الموضوع بسيط للغاية ،مبدئيا سنتعامل
مع األقطاب الرقمية ،ما معنى رقمية؟ أي لها قيمتين فقط إما صفر منطقي وتمثل حالة 0فولط
أو واحد منطقي وتمثل حالة 5فولط (كما نعلم فإن المعالجات تتعامل مع قيم رقمية يعبّر عنها بـ
0 1منطقي ،أما عن القيم التشابهية فسيأتي الحديث عليها في وقت الحق) ،وهنا عندنا قاعدة
مهمة وهي أن جميع األقطاب على لوحة األردوينو هي أقطاب رقمية (طبعا باستثناء أقطاب
التغذية وبعض األقطاب التي تكون فقط رقمية كالقطبين A6 / A7على لوحة األردوينو نانو
وغيرها )...وبالتالي يمكن أن يتم تعريفها كأقطاب خرج رقمية أي تعطي إشارات لتشغيل وإطفاء
األحمال على األقطاب ،أو أقطاب دخل تستقبل إشارات رقمية على األقطاب من حساسات أو
مفاتيح رقمية.
69
تعليمات تعريف المداخل والمخارج:
التعليمة شرح التعليمة
;)pinMode (pin, Mode تحديد القطب المطلوب " " Pinكقطب دخل
INPUTأو كخرج OUTPUTأو دخل مع
تفعيل مقاومة الرفع .INPUT_PULLUP
(مكانها حلقة )()void setup
;)digitalWrite(pin ,Mode إعطاء قيمة للقطب المعرف كخرج إما
HIGHأو .LOW
;)digitalRead (pin قراءة قيمة قطب " "Pinمعرف كدخل.
الجدول السابق يض ّم تعليمات التعامل مع األقطاب الرقمية ،سنبدأ بشرحها من خالل األمثلة حتى
ليكن ليدنا LEDنصل القطب الموجب له مع أحد أقطاب لوحة األردوينو الرقمية وليكن القطب
8من لوحة األردوينو (طبعا ال ننس مقاومة الحماية للـ LEDوالتي تتغير قيمتها تبعا لنوع الـ
LEDولتكن ،680Rوتوصل على التسلسل مع الـ LEDقبله أو بعده ال يهم) أما القطب السالب
كما نعلم حتى يعمل الـ LEDفيحتاج أن نغذّيه من طرفيه ،وبما أنّنا وصلناه مع السالب GND
بشكل مباشر فبقي أن نعطيه قيمة فولط موجبة على المصعد حتى يعمل ...كيف نحصل عليها من
األردوينو؟؟
70
سنحدّد في حلقة اإلعداد حصرا )( void setupنمط عمل القطب الرقمي (قطب خرج أم
،هذا ال ;)pinMode(8,OUTPUT دخل) وهنا نعرفه كخرج OUTPUTمن خالل التعليمة
يكفي فيجب بعد ذلك تحديد قيمة الخرج على القطب وتكون في الحالة االفتراضية 0منطقي أو0
فولط ولكي يعمل الـ LEDنحتاج كما ذكرنا 1منطقي ( 5فولط على القطب) والتي نحددها من
التعليمة ;) digitalWrite(8,HIGHكما هو موضح في الكود ،حاليا ال يهم كثيرا موقع كتابة
تعليمة تحديد نوع الخرج لكن مستقبال سنعرف الفروقات في أماكن كتابة التعليمات بشكل أفضل.
71
تهانينا ّ ...أول كود لك على األردوينو يعمل بنجاح ،كرر العملية السابقة بتبديل مكان وصل
القطب الموجب للـ LEDعلى لوحة األردوينو (جرب القطب 3أو القطب A0أو غيره وبدّل
72
في المثال السابق شغلنا LEDلكن كيف نطفئه؟؟
التعليمة ضمن LOW القيمة إلى HIGH القيمة بدّل فقط بسيطة العملية
;) ، digitalWrite(8,HIGHأما عملية تشغيل وإطفاء LEDبفواصل زمنية سنتحدث عنها
بعد التعرف على التعليمات الزمنية.
في المثال السابق تعلمنا كيف نتعامل مع القطب الرقمي كقطب خرج أي يكون هو مصدر
للفولطية ،اآلن األمر عكسي نريد أن يستقبل القطب الرقمي إشارات رقمية ( )0 / 5 vمن حساس
أو مفتاح ،وهنا سنتعرف على الشق الثاني من التعليمة pinModeوالتي سنحدد فيها رقم
القطب الرقمي ثم نحدده كقطب دخل عبر أحد الخيارين إما INPUTأو INPUT_PULLUPلكن
مالفرق بينهما؟
بما أن لوحة األردوينو في هذه الحالة ستكون مدخل لإلشارات الرقمية فمن المتوقع أن تكون
اإلشارة القادمة من الطرفية (حساس أو كباس لحظي أو مفتاح) قيمتها إما 1منطقي أو 0منطقي
وهذا هو الحالة الصحيحة ،هنا نعرف القطب كقطب دخل بالحالة .INPUT
قبل التكلم عن حالة INPUT_PULLUPيجب أن ندرك معلومة في غاية األهمية وهي أن المتحكم
على لوحة األردوينو يعتبر أي إشارة قيمتها 2.8 ~ 5.5vعلى أنها واحد منطقي ،بينما يعتبر
اإلشارات التي تنتمي للمجال 0 ~ 1.7vبأنها تمثل 0منطقي وبالتالي يبقى لدينا مجال ~ 1.8
2.7vهو مجال عدم تعيين أي أن المتحكم قد يعتبر اإلشارة القادمة على أنها واحد منطقي أو أنها
0منطقي وهذا األمر غير مقبول عند البرمجة فال يمكن أن نترك الكود يعمل ضمن احتماالت
غير معروفة لذلك يجب التخلص من هذه الحالة.
73
الكترونيا يمكن التخلص من الحالة السابقة بما يعرف بمقاومة الرفع Pull-upأو مقاومة الخفض
،Pull-downوهي عبارة عن مقاومة قيمتها 10 ~ 150 kRمهمتها إعطاء قيمة بدائية في
حالة الالعمل للطرفية ،فلو تم وصل هذه المقاومة مع األرضي تسمى مقاومة خفض وتكون القيمة
البدائية 0منطقي ،بينما تسمى مقاومة رفع عند اتصالها مع Vccوهنا تعطي 1منطقي كحالة
بدائية.
فلو كانت الطرفية (ولتكن مثال كباس لحظي) عند العمل يعطي واحد منطقي بينما في حالة
التوقف يعطي إشارة غير واضحة نستخدم مقاومة خفض لتحديد حالة الالعمل بـ 0منطقي ،وفي
حالة العكس أي عند عمل الطرفية نحصل على 0منطقي بينما في حالة التوقف تكون الحالة غير
واضحة فهنا نستخدم مقاومة رفع لجعل الحالة البدائية 1منطقي.
74
اآلن نصل للمهم وهو حالة INPUT_PULLUPفي طبيعة تحديد طريقة الدخل على القطب ،ففي
حال اختيار هذا النمط فإننا نقوم بتفعيل مقاومة رفع داخلية في المتحكم وال حاجة إلضافتها
خارجا ،فلو نظرنا للمخطط التالي والذي يمثل البنية الداخلية للقطب نجد أنه يضم الرجل المعدنية
الخارجة من المتحكم pinاما في الداخل فيوجد ديودين عكسيين يعمالن كدارة قص للفولط للحماية
من الفولط الزائد أو المنخفض ،ثم مكثف للتخلص من الشحنات الساكنة وأخيرا ترانزستور لتفعيل
مقاومة الرفع Rpuوالتي يتم تفعيلها عند كتابة األمر INPUT_PULLUPوتعريف القطب كقطب
دخل ،فيتم كما ذكرنا تحديد حالة بدائية على القطب هي 1منطقي وحتى تتغير الحالة يجب أن
يأتي على القطب القيمة 0منطقي.
قد يسأل أحدهم ...هل يوجد مقاومة خفض Pull-downداخل المتحكم؟؟ لألسف فقط مقاومة
رفع وفي حال كان لديك الحالة المعاكسة فعليك وصل مقاومة خفض خارجية.
75
سنجرب التعليمات المتعلقة بالدخل الرقمي ....لنصل مفتاح أو كباس لحظي مع أحد أقطاب
ّ اآلن
األردوينو وليكن القطب ،2من المخطط نجد أن الرجل الثانية للكباس متصلة مع األرضي أي أن
القطب الرقمي لألردوينو سينتقل للحالة 0منطقي عند الضغط على الكباس بينما سيكون في حالة
عائمة (أو غير معينة) عند عدم الضغط على الكباس لذلك وكما ذكرنا سابقا سنفعّل مقاومة الرفع
الداخلية للقطب الرقمي مما يجعل الحالة البدائية للقطب الرقمي 1منطقي وبذلك نكون قد تخلصنا
من الحالة العائمة.
لنشغل في هذا الكود واجهة االتصال التسلسلي UARTونطبع عليها حالة الدخل الرقمي ،سنحدد
في البداية سرعة نقل البيانات في واجهة االتصال التسلسلي UARTعند القيمة 9600ثم نكتب
كود ضمن الحلقة التكرارية يقوم بطباعة حالة الكباس اللحظي.
76
التعليمة باستخدام دخل كقطب المعرف القطب رقم تحديد بعد
التعليمة نستخدم ;)،pinMode(2,INPUT_PULLUP
)) Serial.println(digitalRead(2لطباعة حالة القطب الرقمي على واجهة
77
االتصال التسلسلي ،UARTبعد رفع الكود وفتح واجهة االتصال نجد ّ
أن القيمة المطبوعة هي
1وبمجرد الضغط على الكباس تتغير للقيمة .0
لو افترضنا ّ
أن الطرفية (حساس مثال) تتغير حالته بين 0و 1منطقي فال داعي لتفعيل مقاومة
الرفع ونكتفي بتعريف القطب كدخل فقط ;).pinMode(2,INPUT
هذا كل ما يتعلق باألقطاب الرقمية ما وجود مالحظات عامة نتركها لقسم الحق من الكتاب وحتى
يجيد الطالب التعامل مع لوحة األردوينو.
78
تعليمات التأخير الزمني:
كما ذكرنا سابقا ...تتألف ورقة العمل ضمن بيئة التطوير Arduino IDEمن عدة أقسام ،ما
،voidفمن )(loop وحلقة التكرار الالنهائية )(void setup يهمنا حاليا هو حلقة اإلعداد
المعلوم أن المترجم أو compilerيبدأ بتنفيذ الكود البرمجي سطر سطر(وإن كان السطر يضم
أن تغيير ترتيب التعليمات قد يترتب عليه نتائج مختلفة في الكود البرمجي) إلى أن يصل للحلقة
التكرارية )( void loopفيبقى ضمنها مادام المعالج في حالة العمل ،أي ينفذ أسطر الحلقة
فبالتالي يكون المعالج قادر على تنفيذ 16مليون تعليمة في الثانية بشكل تقريبي) ففي بعض
األحيان تكون هذه السرعة متعبة للمستخدم وال يستطيع أن يالحظ التغيرات التي يقوم بها المعالج
وهنا ال بد من وجود تعليمات تأخير زمني وظيفتها تجميد المعالج لفترة زمنية محددة لكي نستطيع
الجدول التالي يستعرض تعليمات التأخير الزمني المستخدمة في بيئة Arduino IDEوهما
الضئيلة جدا
79
التعليمة شرح التعليمة
;)delay(ms إيقاف عمل البرنامج لمدة محددة بواحدة الميلي
ثانية ( ،)1s = 1000 msتأخذ قيم ضممممن
الممممجممممممممال .0 ~ 4,294,967,295
;)delayMicroseconds(us إيقاف عمل البرنامج لمدة محددة بواحدة
الميكرو ثانية ( ،)1s = 1000000 usتأخمممذ
قيم ضمممن المجمممال . 0 ~ 65535
السؤال الذي سيتبادر للذهن لماذا مجال الزمن بأرقام غريبة ( )65635 , 4294967295؟؟!!!
األمر يتعلق بما يعرف بالمتحوالت والذي سيكون المبحث التالي بعد فقرة تعليمات التأخير
الزمني.
كنا في المثال األول تحدثنا عن طريقة تشغيل القطب الرقمي كقطب خرج وجربنا ذلك مع LED
متصل مع أحد أقطاب األردوينو...
اآلن لنعدّل الكود البرمجي بهدف تشغيل LEDلمدة ثانية وإطفائه لمدة ثانية أيضا وذلك بشكل
متكرر.
80
في البداية حددنا طبيعة القطب كقطب خرج في حلقة اإلعداد )( ،void setupثم وفي حلقة
البرنامج الرئيسية أو حلقة التكرار )( void loopكتبنا كود بسيط لتشغيل الـ LEDوإطفائه
بشكل متتالي كل واحد ثانية.
جربنا كتابة كل الكود السابق في حلقة )( void setupلوجدنا أن LEDسيومض لمرة
لو ّ
واحدة فقط ،وهذا كما ذكرنا سابقا فإن كل ما قبل الحلقة التكرارية ينفذ لمرة واحدة فقط.
جرب اآلن بنفسك ....غيّر رقم القطب ...عدّل الزمن ...بدّل بين ترتيب التعليمات ....ماذا
ّ
تستنتج؟؟
81
المتحوالت :variables
ماذا لو أردنا كتابة معادلة رياضية في بيئة التطوير Arduino IDE؟؟ أو أردنا إجراء أي عملية
حسابية على قراءة أي قيمة قادمة من حساس أو مدخلة من قبل المستخدم؟؟
لنبسّط األمر ....عندنا قيمة رياضية متغيرة كيف ندخلها ضمن بيئة Arduino IDE؟؟ ك ّل ما
عليك هو استخدام أحد أنواع المتغيرات بما يتناسب مع طبيعة القيمة المراد التعامل معها.
أحد نقاط الضعف في المتحكمات هي حجم الذاكرة الضئيل جدا والتي سوف يتم نقل الكود
البرمجي لها ،فمثال متحكم لوحة Arduino UNOهو ATmega328ويضم ذاكرة فالش
بحجم 32kByteوبالتالي نالحظ أننا أمام مشكلة يجب مراعاتها وهي الذاكرة المنخفضة ،لذلك
سنجد في بيئة ( Arduino IDEأو لغة C/C++بصفة عامة) عدة أنواع للمتحوالت (على عكس
بعض لغات البرمجة والتي ال تهتم كثيرا بنوع المتحول ألنها ال تهتم بحجم ذاكرة التطبيق على
الحاسب أو الجوال ) لمراعاة التخزين في الذاكرة ،سنجد أوال تقسيم للمتحوالت من حيث النوع
هل هو رقمي أم محرفي (حرف أو رمز أو سلسلة أحرف) ثم سنجد في النوع نفسه تقسيم ،فلو
كان رقمي هل هو عدد صحيح أم عدد بفاصلة عشرية ،أما إن كان محرفي فهل هو حرف واحد
أم سلسلة أحرف....
لنتعرف على أنواع المتحوالت والحجم الذي يحجزه كل نوع من الذاكرة والمجال القادر على
استيعابه من خالل الجدول التالي:
82
; int var متحول رقمي طبيعي بطول 16Bitقيمته ~ 32768
-32767
;unsigned int var متحول رقمي طبيعي بطول 16Bitغير مؤشر ~ 0
.65535
;long var - لم ينتمي 32Bit بطول رقمي متحول
2,147,483,648. ~ 2,147,483,647.
;unsigned long var متحول رقمي غير مؤشر بطول 32Bitينتمي للمجال
0 ~ 4,294,967,295
;float var متحول رقمي ذو فاصلة عشرية بطول ،32Bitلكن
عدد األرقام بعد الفاصلة يجب أال يتجاوز السبع خانات.
;double var متحول رقمي عشري بطول .64Bit
= integer const var تعريف ثابت رقمي محدد القيمة.
;value
= float const var تعريف ثابت رقمي بفاصلة عشرية محدد القيمة.
;value
; char var متحول محرفي واحد بطول بايت واحد .-128 ~ 127
;'char x = 'a
;String var تعريف متحول محرفي عدد محارفه يحددها المبرمج.
;"String a="Arduino
األمر بسيط فلو كان المتغير قيمة رياضية فهل هو من النوع المنطقي أو الجبر البولياني (له
قيمتين فقط إما 0أو )1عندها نعرفه من نوع ( booleanأو تكتب )boolأما لو كان المتحول
أكبر وتتغير قيمته ضمن المجال 0 ~ 256عندها نعرفه من نوع ،byteلو كان للمتحول تغير
في السالب أو أكبر من 256نعرفه intولو تغيره فقط بالمجال الموجب وأكبر من 32766
83
عندها نعرفه بالنوع unsigned intليصبح مجال العد ،0 ~ 65535ولو كان أكبر من هذا
المجال ننتقل للنوع ،longبينما لو كان عشري (أي بفاصلة عشرية) نختار النوع floatولو
كان بفاصلة عشرية وعدد خانات كبيرة نختار النوع .double
لو كان المتحول من نوع محرفي فيعرف باستخدام المتحول ،charأما لو كان جملة من الحروف
فيعرف بالنوع ( Stringمع االنتباه ّ
أن حرف Sكبير).
في حاالت معينة نريد تعريف ثوابت رقمية مثل الثابت Piفنختار النوع المناسب ونكتب قبله
constأي ّ
أن هذا المتغير للقراءة فقط وال يمكن التعديل على قيمته.
تطلبه في مكان من الكود البرمجي وتستخدمه في أي عملية كما هو موضح في المثال التالي:
84
أما لو عرفت المتحول ضمن أي قوسي مجموعة }{ فيصبح من النمط Localوال يمكن طلبه
هذه الجزئية مهمة جدا ً عند التعامل مع المتحوالت ويجب االنتباه لها ،األمر بسيط ...مع
التمارين ستكتسب المهارات الضرورية للعمل بشكل احترافي وستصبح هذه المالحظات
واضحة ومفهومة.
85
مـالحــظات
:
✓ عند تعريف أي متحول يجب مراعاة النقاط التالية:
oال يجب أن يبدأ اسم المتحول برقم.
oاختيار نوع المتحول بما يتناسب مع حجم البيانات المسندة إليه.
oيفضل أن تكون أسماء المتحوالت معبّرة عن الوظيفة المسندة إليها حتى ولو كان
االسم طويل.
oفي حال كان اسم المتحول مؤلف من كلمتين يفضل كتابة الحرف األول من الكلمة
الثانية بحرف كبير دون ترك مسافة أو الفصل بين االسمين بـ " _ ".
✓ يوجد نقطة مهمة يجب االنتباه إليها عند التعامل مع عدة متحوالت من أنواع مختلفة وهو
الترقية ،فلو كان لدينا عملية حسابية على متحولين من نوعين مختلفين فإن المترجم
compilerيقوم بترقية هذه المتحوالت نحو النوع األكبر بينهما ومن ثم يجري العملية
الحسابية ويقدم الناتج بما يتوافق مع المتحول األكبر حجما ،وهذا قد يسبب مشكلة في النواتج
وخاصة إذا كان أحد المتحوالت من نوع floatوتم ترقيته لنوع أكبر أو أصغر فسيتم حذف
األرقام التي بعد الفاصلة.
86
✓ المتحول المنطقي من نوع Booleanله قيمتين فقط Falseتقابل القيمة 0و Trueتقابل
كل القيم عدا الصفر.
✓ لو كان لدينا متحول وأسندنا إليه قيمة أكبر من القيمة التي يستطيع تخزينها ماذا سيحدث؟
سيتم أخذ القيمة المتبقية بعد عملية طفحان المتحول فمثال لو أسندنا القيمة 300للمتحول val
والمعرف بالنوع byteسيكون قيمة المتحول ; val = 44أي أنه تم ملئ المتحول بالقيمة
256ثم تفريغها ث ّم وضع القيمة المتبقية وهي .44
87
العمليات الرياضية المختلفة:
تتم هذه التعليمات على أي نوع من المتحوالت لكن النتيجة تكون منطقية ،True or False
وتستخدم غالبا مع الجمل الشرطية .
88
العمليات المنطقية :Boolean Operator
التعليمة شرح التعليمة
&& and
|| or
! Not
العمليات السابقة مهمة في الجمل الشرطية لالختبار والمقارنة أو ربط عدة شروط مع بعضها
وهذا ما سنتعرف عليه في األقسام التالية.
89
التعليمات الهندسية للزوايا :Trigonometry
التعليمة شرح التعليمة
val ;)= sin(rad حساب جيب الزاوية.
val ;)= cos(rad حساب تجيب الزاوية.
val ;)= tan(rad حساب ظل الزاوية.
عند التعامل مع هذه التعليمـــات يجب أن تـــكـــون قـــــيمة الزاوية المراد حســــابها بالراديان
) radians (floatأما الناتج فسوف يكون ضمن المجال .-1 ~ 1
90
الحلقة الشرطية :if
من أهم العمليات في الكود البرمجي بل ال يخلو كود برمجي من وجود الحلقة الشرطية ifلذلك
سوف نتوسع بشرحها حتى يسهل التعامل معها ضمن الكود البرمجي ،لنبدأ من الشكل العام للجملة
الشرطية ifوالتي تكون بالشكل التالي:
)else if (conditional
المعالج الختبار العبارة else ifفإن تحقق
الشرط عندها سينفذ التعليمات الموجودة بعدها
{
ضمن }{ ،وفي حال عد تحقق أي من العبارات
//Action B
if , else if ….يتم تنفيذ التعليمات
}
الموجودة بعد elseإن وجدت.
else
{
//Action C
}
حتى يتم استيعاب عمل الحلقة الشرطية بشكل صحيح سنقوم باستعراض عملها على شكل أجزاء
ليسهل معرفة وإدراك دور كل قسم منها وماذا يفعل وجوده من عدمه على الكود البرمجي ،ليكن
لدينا الدارة التالية ،الكباس B1متصل على القطب ، 13بينما يتم وصل القطب الموجب لـ
LEDعلى القطب 6من لوحة األردوينو.
91
لنكتب كود برمجي وظيفته تشغيل الم LEDعند الضغط على المفتاح .... B1
92
سنعرف القطب 13كقطب دخل مع تفعيل
ّ الكباس اللحظي B1متصل على القطب 13لذلك
مقاومة الرفع الداخلية على القطب وبالتالي عند ضغط المفتاح تتغير الحالة على القطب لـ 0
منطقي ،أما LEDفمتصل على القطب 6من لوحة األردوينو لذلك نعرفه كقطب خرج وسيعمل
عندما نطبق القيمة .1
بعد تحديد طبيعة كل قطب في حلقة اإلعداد )( void setupننتقل للحلقة التكرارية لنكتب
ّ
(ألن الجملة الشرطية والتي تتضمن اختبار حالة قطب الدخل فإن كانت قيمة الدخل 0منطقي
الحالة االفتراضية مع وجود مقاومة الرفع كما ذكرنا هي 1منطقي) فسيتم تشغيل LEDمع
االنتباه لتكرار == ألنه هنا شرط واختبار أي هل حالة المفتاح مساوية لـ 0وليس اسناد.
جرب الكود البرمجي ...نعم ...نالحظ بعد تشغيل الكود البرمجي عند ضغط الكباس فسوف يعمل
ّ
LEDولن يطفأ بعد إيقاف الضغط على الكباس والسبب عدم وجود العبارة elseوالتي تعيد
LEDللحالة االفتراضية(مطفئ) وعدم ضغط الكباس...
93
اآلن يصبح الكود كالتالي ....عند ضغط الكباس يعمل LEDوفي حال عدم الضغط على الكباس
يتوقف .LED
لنغير قليال في الدارة ولنضف كباس آخر ...اآلن لنكتب كود برمجي يشغل LEDعند الضغط
على الكباسين معا:
نعرف القطب 12أيضا كقطب دخل مع تفعيل مقاومة الرفع على هذا القطب التغيير في الكود
ّ
سيكون في العبارة الشرطية حيث سنشترط عمل الكباسين معا ولكي يتحقق ذلك سنستخدم الربط
الشرطي و && كما هو موضح في الكود:
94
وهنا لن يعمل LEDإال إذا كان كال الكباسين مضغوطين معا ،لو أردنا أن يعمل LEDبالضغط
على أحد الكباسين نبدّل && بم || أي أو ...
95
لنضف LEDآخر للدارة السابقة على القطب 5لتصبح بالشكل التالي:
لنكتب اآلن كود يتم من خالله التحكم بتشغيل كل LEDمن قبل كباس لحظي (الكباس B1يتحكم
بتشغيل Red LEDبينما يتحكم الكباس B2بتشغيل ،)Green LEDسيكون لدينا طريقتين
ي الطريقتين
لتنفيذ الكود البرمجي ....سنكتب كال الحالتين ونوضح الفرق بين أداء كل كود وأ ّ
أفضل عند كتابة كود برمجي.
طبعا تشترك كال الطريقتين في تعريف المداخل والمخارج ،االختالف في حلقة البرنامج الرئيسية.
96
الطريقة األولى:
في هذه الطريقة سندمج جميع الشروط في حلقة ifواحدة بحيث نفصل بين كل حالة بـ else
ifمع وجود حالة افتراضية elseإلطفاء جميع الـ LEDsفي حال عدم الضغط على أي
مفتاح ،مع خالل الكود سنجد ّ
أن المفتاح B1مسؤول عن تشغيل Red LEDبينما المفتاح B2
مسؤول عن تشغيل .Green LED
جرب الكود البرمجي واكتب مالحظاتك لنرى هل ستجد الفرق مع الحالة الثانية؟؟
ّ
97
الطريقة الثانية:
في هذه الحالة سنكتب لكل حالة جملة شرطية مستقلة وبالتالي سيكون لدينا جملتي شرط ifولكل
منهما حالة افتراضية elseمستقلة عن الثانية ،مع خالل الكود سنجد ّ
أن المفتاح B1مسؤول
عن تشغيل Red LEDبينما المفتاح B2مسؤول عن تشغيل .Green LED
98
مالفرق بين الحالتين السابقتين؟؟
الفرق يكمن عند الضغط على الكباسين بشكل متوالي ،ففي الحالة األولى لو تم الضغط على
الكباس األول ث ّم الضغط على الكباس الثاني فسوف يعمل LEDالمتعلق بالكباس B1ولن يعمل
األول فسيعمل كال LEDs
LEDالمتعلق بالكباس ،B2أ ّما لو تم ضغط الكباس الثاني ث ّم الكباس ّ
نستنتج ّ
أن ترتيب الشروط ضمن الجملة الشرطية ifيعطي أولوية في التنفيذ.
بينما في الحالة الثانية فاألمر مختلف وال يوجد ترابط بين الجمل الشرطية ،فكل جملة شرطية
ي كباس سيتم ضغطه أوال.
مستقلة عن األخرى وال يهم أ ّ
يمكن زيادة عدد الكباسات والـ LEDsلتجريب تأثير الترتيب على أولوية التنفيذ في الجملة
الشرطية ifوأقسامها .else if
✓ في الحلقة الشرطية Ifإذا كان ما بعد تحقق الشرط Actionعبارة عن تعليمة واحدة
فعندئذ يمكن االستغناء عن األقواس " }." {…..
99
الحلقة التكرارية :for
نستفيد من هذه الحلقة في تكرار تنفيذ جملة من التعليمات دون الحاجة لتكرار كتابتها وبالتالي
نستفيد في تقليص حجم الكود البرمجي ،يكون الشكل العام لهذه الحلقة:
لحلقة forثالثة بارامترات ،األول تهيئة initializationيتم فيه وضع قيمة بدائية والتي سوف
يبدأ منها العد ،البارامتر الثاني هو الشرط conditionالذي سيتوقف عنده العد فما دام الشرط
محقق فالحلقة سوف تستمر بالعمل ،أما البارامتر الثالث فهو للزيادة Incrementأو النقصان
.decrement
ليسهل فهم الحلقة التكرارية forسنأخذ عدة أمثلة لفهمها ،نبدأ بالدارة التالية والتي تضم 5من
LEDsمتصلة مع األقطاب 2 ~ 6ونريد تشغيل هذه الـ LEDsمعا وإطفائها معا كل 1ثانية
مبدئيا ً (سنغير بعد ذلك في األفكار لفهم أشمل آللية عملها) .....لنرى كيف سيتم األمر مع حلقة
forوكيف سيتم اختزال الكود البرمجي وتبسيطه.
100
ّ
الطرف السالب لكل LEDمتصل مع األرضي GNDمن لوحة األردوينو ،كما نصل مقاومة
على التسلسل مع LEDولتكن قيمتها .330R
نعرف األقطاب 2 ~ 6كأقطاب خرج في حلقة اإلعداد لكن سنستفيد من حلقة التكرار forحتى
ّ
في مرحلة إعداد ليكون الكود بالشكل التالي:
101
في حلقة اإلعداد )( void setupبدأنا باستخدام حلقة التكرار في تعريف األقطاب كأقطاب
خرج ،فبدل تكرار التعليمة ;) pinMode(n ,OUTPUTوفي كل مرة نضع بدل nرقم القطب
المطلوب ،استخدمنا الحلقة forوالتي تبدأ من القيمة البدائية i = 2أي سنبدأ العدّ من القطب
رقم ، 2وتستمر الحلقة بزيادة القيمة iمع كل دورة حتى تصبح قيمة iأكبر من 6فيصبح
الشرط i < 7منفي وغير محقق فيتم الخروج من الحلقة والمتابعة بالتعليمات التي بعدها.
102
اآلن وضمن الحلقة التكرارية )( void loopنعيد كتابة الحلقة التكرارية forونفس
الطريقة ،بحيث يبدأ تشغيل األضواء من القطب 2وحتى القطب 6ويتم تشغيل ك ّل األضواء ث ّم
االنتظار لمدة ثانية بالتعليمة ) delay(1000ث ّم نعيد الحلقة التكرارية لكن إلطفاء األضواء.
103
اآلن لو افترضنا أننا نريد تشغيل األضواء من القطب 2باتجاه القطب 6ث ّم إطفاءها بشكل معاكس
مع وجود فاصل زمني قدره 1ثانية....
األمر بسيط ...سنغيّر الحلقة التكرارية الثانية لتصبح حلقة تكرارية تنازلية مع تغيير شكل الشرط
لتصبح بالشكل:
نالحظ كيف ت ّم تبديل طريقة عمل الحلقة التكرارية فبدل أن يتم البدء من القيمة 2أصبح البدء من
القيمة 6وبدل أن يتم زيادة قيمة iبمقدار واحد في كل مرة أصبحت العملية إنقاص القيمة ،أيضا
تغير شكل الشرط تبعا لعملية اإلنقاص فأصبح شرط عمل الحلقة أن القيمة iهو .i>=2
104
من الحلقات التكرارية في األمثلة السابقة سيتبادر لنا سؤال حول المتحول ... iلماذا نفس المتحول
تم تعريف المتحول iبالنوع byteكون مجال العدّ ال يتجاوز مجال عدّ الـ byteوالذي
كما ذكرنا سابقا ينتمي للمجال 0 ~ 256وبالتالي يكفي هذا النوع مع متحولنا.
وسيكون لدينا رسالة خطأ ،لكن يمكن تغيير االسم لكيال يكون هناك تداخل في األفكار أو لكيال
يظن المتدرب ّ
أن االسم الزامي. ّ
نصل اآلن لفكرة مهمة يمكن استخدامها مع الحلقة التكرارية ( forأيضا سنستخدمها ما باقي
الحلقات التكرارية الحقا) وهي التعليمة continueوالتعليمة breakوالفرق بينهما.
لنبدأ بالتعليمة continueوالتي تعني االستمرار ،مكانها داخل الحلقات التكرارية فقط وال
يمكن استخدامها خارج هذه الحلقات ( )for, while, do…while , switchأ ّما وظيفتها
فعند وصول المعالج لهذه التعليمة سيعود لبداية الحلقة وسيتم إهمال باقي التعليمات التي بعدها.
بالعودة للدارة السابقة سنضيف لها كباس لحظي على القطب A0ونعرفّه كقطب دخل مع تفعيل
الرفع لتصبح القيمة البدائية لهذا القطب كما ذكرنا سابقا هي 1منطقي وعند الضغط على
مقاومة ّ
الكباس تنتقل للحالة 0منطقي.
105
اآلن لنضف التعليمة continueقبل تعليمة التأخير الزمني delayمع شرط بأن ال تعمل
هذه التعليمة حتى يتم ضغط الكباس اللحظي كما هو واضح ضمن الكود البرمجي ...
106
بالضغط على الكباس اللحظي سيتم تفعيل التعليمة continueوبالتالي سيتم إهمال كل
التعليمات التي بعدها ...عمليا سيتم اهمال تعليمة التأخير الزمني وكأنها غير موجودة ضمن الكود
البرمجي وسيتم تشغيل الـ LEDsبسرعة ،بينما ستعمل حلقة اإلطفاء بشكل طبيعي بدون أي
تغيير.
107
أ ّما التعليمة breakفعملها مختلف تماما ً عن التعليمة ،continueفبينما كانت وظيفة
التعليمة continueهي إعادة المعالج ألول الحلقة سنجد أن وظيفة التعليمة breakهي
الخروج من الحلقة نهائيا ومتابعة الكود البرمجي من النقطة التي تلي الحلقة التكرارية...
ّ
نستنتج من خالل التجربة أن وظيفة التعليمة breakهو خروج قرسي من الحلقة التكرارية.
108
نقطة أخيرة عند التعامل مع الحلقة التكرارية forوهو إمكانية وجود أكثر من متحول وشرط
داخل إعداد الحلقة ،فمثال من خالل األمثلة السابقة كنا نضع متحول واحد ونخضعه لشرط محدد
ولمقدار زيادة أو إنقاص ...اآلن سنجرب إضافة أكثر من متحول وأكثر من عالقة تغير على
المتحوالت (العملية التالية للتنبيه إلمكانية التعامل مع الحلقة التكرارية forوليس بهدف تقديم
كود برمجي مفيد حاليا):
109
الحلقة الشرطية :switch
تعتبر الجملة الشرطية switchمشابهة للجملة الشرطية ifوتعتبر أيضا ً من الجمل الشرطية
األقل استخداما كون الجملة الشرطية ifيمكن أن تقوم بوظائفها ،تأخذ الشكل العام لها:
)switch(var
{
case 1:
// statement
;break
case 2:
//statement
;break
.
.
.
default:
//statement
}
فهي تقوم على اختبار حالة المتحول varوتنفيذ جملة من التعليمات تبعا للحالة caseالتي
عليها المتحول وإال فإن حالة أساسية defaultسوف تنفذ.
كل حالة caseيجب إنهاؤها بالتعليمة breakوإال فإنه سوف ينتقل للحالة التالية لتنفيذها
ولن يتوقف حتى يجد التعليمة .break
وفي حال عدم وجود التعليمة breakيتم تنفيذ أيضا الحالة األساسية defaultثم الخروج
110
لدينا الدارة التــالية وهي عبارة عن خمسة LEDsمتصــلة مع لوحـة األردوينو عبر األقطاب
2 ~ 6ونريد كتابة كود برمجي يتم من خالله تشغيل LEDبإدخال رقمه باستخدام الجملة
الشرطية ( switchسيتم تبديل رقم التشغيل ضمن الكود البرمجي كوننا إلى اآلن لم نتعرف على
طرق إدخال بيانات لألردوينو).
نعرف جميع األقطاب التي ت ّم وصل LEDsلها على أنها أقطاب خرج ،يكون الكود
طبعا ّ
البرمجي بالشكل التالي:
111
نالحظ من خالل الكود السابق كيف يجب إنهاء كل حالة caseبالتعليمة breakحتى ال يتم
في واقع الحال يعتبر استخدام هذه الجملة الشرطية ضعيف مقارنة مع الحلقات السابقة لكن لبد
من التعرف عليها.
112
الحلقة الشرطية :while
في هذه الحلقة الشرطية سنتعرف على أسلوب جديد في األداء مختلف تماما ً عن الحلقات السابقة،
ففي حلقة ifو switchكان المعالج يختبر الشرط فإن كان محقق يقوم بتنفيذ التعليمات
المتعلقة بالشرط وإال يتابع لينفذ الحالة االفتراضية ث ّم يتابع لينفذ بقية الكود البرمجي ،األمر مع
هذه الحلقة مختلف فلو تحقق الشرط المتعلق بالحلقة سيبقى المعالج ضمن هذه الحلقة وينفذ
التعليمات التي بداخلها مادام الشرط محقق (ال يوجد عدد محدد من المرات كما في حلقة )for
وإذا انتفى الشرط فيخرج منها ويتابع تنفيذ بقية الكود البرمجي.
)while (expression
{
//statement
}
تستخدم هذه الحلقة بشكل عام لحصر المعالج بتطبيق جملة من العمليات عند شرط محدد وإيقاف
تنفيذ باقي التعليمات ،سنأخذ مثال بسيط نحاول من خالله تبسيط الفكرة وفهمها.
ليكن لدينا الدارة التالية والتي تضم LEDsعدد 2متصلين عالقطب 2 , 3من لوحة األردوينو،
ولدينا كباس لحظي متصل على القطب ،A0المطلوب كتابة كود برمجي يتم من خالله تشغيل
األضواء وإطفائها لمدة 1ثانية ،وعند الضغط على الكباس يتم فقط تشغيل الضوء المتصل مع
القطب 2وإيقافه كل 1ثانية ،علما ّ
أن الكود يعود لعمله السابق بعد توقف الضغط على المفتاح.
113
114
عمل الكود ببساطة يتلخص بما يلي ...في حال عدم الضغط على المفتاح يكون عمل الكود مقتصر
على المرحلة رقم ،2أ ّما في حال الضغط على الكبّاس يقتصر عمل المعالج على المرحلة 1
فقط.
115
الحلقة الشرطية :do … while
وهي بقاء المعالج داخل الحلقة الشرطية في حال تحقق الشرط والخروج منها في حال انتفاء
الشرط مع فارق واحد فقط ،في حالة whileكما وجدنا سابقا يتم اختبار الشرط فإن كان
محققا يتم تنفيذ تعليمات الحلقة ،أما في حالة do…whileيتم تنفيذ التعليمات الموجودة داخل
الحلقة ث ّم التأكد من الشرط فإن كان الشرط محققا يبقى المعالج داخل الحلقة ،أما إن كان الشرط
غير محقق فيتم متابعة تنفيذ باقي تعليمات الكود البرمجي وهكذا في كل مرة يصل المترجم
compilerلهذه الحلقة الشرطية.
سنأخذ نفس الحالة البرمجية التي تم تنفيذها مع الحلقة الشرطية whileمع تبديل العبارة
الكود البرمجي.
116
هل جربت النتيجة؟؟
الذي سيحصل هو التالي ...في حال عدم الضغط على الكباس اللحظي سيتم تنفيذ جميع الكود
الموجود داخل الحلقة التكرارية )( void loopعمليا سيعمل الـ LEDالمتصل مع القطب 2
مرتين ،األولى لوحده والثانية مع الـ LEDالمتصل مع القطب ( 3الحالة ،)2أ ّما في حال الضغط
على الكبّاس اللحظي فسيعمل الـ LEDالمتصل مع القطب 2لوحده فقط (الحالة .)1
117
المداخل التشابهية :Analog Inputs
لنفترض ّ
أن لدينا حساس حرارة يعطي على خرجه قيمة فولط متناسبة مع قيمة الحرارة (وليكن
مثال لكل درجة حرارة واحدة تقابل 0.1vوبالتالي لو كانت درجة الحرارة قيمتها 35cفسيكون
خرج الحساس )3.5vفكيف سنتعامل مع هذه القيمة على األقطاب الرقمية؟؟؟ لذلك ت ّم إضافة
مبدل تشابهي رقمي ضمن متحكمات لوحة األردوينو.
أهم النقاط التي يجب معرفتها عند التعامل مع المبدل التشابهي الرقمي :ADC
-تحمل قنوات المبدّل التشابهي الرقمي الرمز Aعلى لوحات األردوينو ويختلف عددها بين
لوحات األردوينو.
118
-دقة المبدل التشابهي الرقمي 10bitأي 210وهو ما يساوي ،1024لكن ماذا يعني هذا الرقم؟
أي أنه تم تحويل مجال الفولط والذي يكون ضمن المجال ( 0 ~ Vccوبما ّ
أن غالب متحكمات
لوحات األردوينو يتم تغذيتها بالقيمة 5vفيمكن اعتماد المجال 0 ~ 5vمجازاً) ليقابله رقم
ضمن المجال 0 ~ 1023فلو كان الفولط الداخل عبر المدخل التشابهي قيمته 5vفهذا يعني
أننا سنحصل على قراءة من المبدل التشابهي الرقمي تقابل 1023بينما لو كانت قيمة الفولط
على المدخل التشابهي قيمتها 2.5vفهذا يقابل قراءة من المبدل التشابهي الرقمي قيمتها 512
وهكذا...
-الجهد المرجعي االفتراضي Vrefهي نفسها تغذية المتحكم وتقابل ( 5vلكن ندخل في
تفاصيلها).
-سرعة التبديل التشابهي الرقمي يتراوح بين .13 ~ 260 us
119
األول ...ليكن لدينا مقسّم جهد (وهو كما ذكرنا سابقا ً عبارة عن مقاومة متغيرة يتم
لنبدأ بالمثال ّ
وصل طرفيها مع طرفي التغذية Vcc & GNDوالمنتصف -يعتبر الخرج -يوصل مع أحد
األقطاب التشابهية ،بتدوير المقاومة نحصل على جهد متغير على القطب التشابهي) يتم ربط خرج
المقسّم مع القطب التشابهي ،A0نريد اآلن الحصول على قراءة المبدل التشابهي الرقمي وعرض
الناتج على واجهة االتصال التسلسلي.
120
نالحظ ّ
أن القيم الناتجة تكون كما ذكرنا ضمن المجال 0 ~ 1023وكل قيمة تقابل قيمة جهد.
121
لو أردنا معرفة الفولط المقابل لكل قيمة نستخدم القانون التالي:
𝑉𝑖𝑛 ∗ 1024
= 𝐶𝐷𝐴
𝑓𝑒𝑟𝑉
:1024 -تمثّل دقّة المبدّل التشابهي الرقمي ( 210في بعض لوحات األردوينو يكون .)212 = 4096
بالتبديل في مواقع القيم في القانون السابق يصبح قانون الحصول على الجهد بدل قراءة :ADC
𝑓𝑒𝑟𝑉 ∗ 𝐶𝐷𝐴
= 𝑛𝑖𝑉
1024
𝐴𝐷𝐶 ∗ 5
= 𝑛𝑖𝑉
1024
بما ّ
أن القانون كسري فيجب تعريف المتحول Vinكمتحول عشري من نوع floatلكيال يتم
إهمال القيم العشرية وإال فإنّا سنخسر قيم مهمة من الحساب ولن تكون النتائج دقيقة عند التعامل
مع الحساسات التشابهية.
122
لنكتب كود برمجي اآلن نحصل من خالله على الجهد الداخل على القطب التشابهي:
نالحظ في الكود البرمجي أنّنا قمنا بتجزئة المعادلة الرياضية الخاصة بعملية الحصول على قيمة
الفولط بدل قراءة ADCوالسبب لعدم فقد القيم العشرية إذ أنه وبدون إجراء العملية السابقة سنفقد
األرقام التي بعد الفاصلة العشرية (العملية تعني أنه وبعد إجراء عملية الضرب األولى قم بقسمة
الناتج على القيمة 1024وأعد اسناد القيمة الجديدة للمتحول .)v_in
يمكن أيضا كتابة رقم القناة التشابهية فقط دون كتابة الرمز Aأي يمكن كتابة
;) analogRead(0بدل كتابة ;) analogRead(A0فالنتيجة واحدة.
123
ولنجرب ربط حساس
ّ لنأخذ تطبيق عملي على كيفية استخدام المبدل التشابهي الرقمي ADC
الحرارة التشابهي LM35والذي يعتبر أشهر حساس حرارة تشابهي والذي يتميز بجملة من
الميزات الفنية:
يضم الحساس ثالثة أرجل ،Vcc – Vout – GNDمجال التغذية للحساس ،4 ~ 30vلن نخوض
كثيرا في الميزات لكن أكثر ما يهمنا هو خرج الحساس على القطب Voutإذ نجد ّ
أن تغيره خطي
مع درجة الحرارة وكل درجة حرارة يقابلها ،0.1vسنتفيد من هذه العالقة لمعرفة قيمة الحرارة
واستخدامها ضمن الكود البرمجي ،كل ما علينا هو تعديل الكود البرمجي السابق للحصول على
درجة الحرارة المقابلة لقيمة الفولط.
124
125
في المثال السابق تعاملنا مع حساس يعطي خرج خطي متناسب مع قيمة القياس كما وجدنا ،اآلن
لنجرب التعامل مع حساس بخرج مختلف وليكن حساس الحرارة NTC 100kRوهو عبارة
ّ
عن مقاومة حرارية تتغير قيمتها بشكل متناقص مع تغير درجة الحرارة ،لكن عند التعامل مع
هذه المقاومة نحتاج لوجود مقاومة ثابتة بنفس القيمة لتشكل مع المقاومة NTCمقسم جهد...
من المعادلة السابقة نعزل المتغير R2والذي يمثل المقاومة الحرارية NTCلتصبح العالقة
الرياضية بالشكل التالي:
126
127
بما ّ
أن تغير الحرارة في المقاومة NTCهو تغير غير خطي بل هو تغير لوغريتمي لذلك كان
لدينا معادلة رياضية تتضمن لوغاريتم مع ثوابت رياضية ت ّم تعويضها للحصول على قيمة
الحرارة المقابلة لقيمة المقاومة الحرارية.
ث ّم ت ّم عرض درجة الحرارة بواحدة السيلسيوس والفهرنهايت باستخدام التحويل الشهير بين
الواحدتين:
هذا كل ما يهمنا في المبدل التشابهي الرقمي وطريقة التعامل معه أ ّما التعرف على تفاصيل أكبر
للمبدل التشابهي الرقمي فسوف يتم االستفاضة فيها في الجزء الثالث من سلسلة " األردوينو كما
لم تعرفه من قبل".
128
المخارج التشابهية :analog Outputs
أي أقطاب خاصة من لوحة األردوينو تعطي على خرجها فولط متغير 0 ~ 5 vكحالة معاكسة
للمداخل التشابهية.
األمر بسيط لكن قبل أن نتحدث عن الطريقة والتعليمات المستخدمة يجب أن نوضّح مفهوم مهم
وهو تعديل عرض النبضة أو ما يعرف باسم ،PWM: Pulse Width Modulation
باختصار ....هي عبارة عن نبضات مربعة الشكل ذات تردد ثابت مع إمكانية التحكم بالقسم
الفعّال على حساب القسم الغير فعّال من الموجة ،ينتج عن التغيير في قيمة القسم الفعّال جهد
وسطي متغير تبعا لنسبة القيمة الفعّالة من النبضة المربّعة.
129
بالنظر للمخطط السابق ...في المرحلة األولى نجد ّ
أن قيمة القيمة الفعالة من النبضة معدومة
وخرجنا هذه اإلشارة له فلن يعمل.
ّ وبالتالي سيكون عندنا جهد 0على الخرج فلو كان لدين LED
في المرحلة الثانية رفعنا نسبة القيمة الفعّالة من النبضة المربعة بنسبة 25%على حساب القسم
الغير ف ّعال والذي سيكون 75%مع التأكيد ّ
أن التردد ثابت ال يتغير ،فسيعمل LEDبربع قوته،
ولو قسنا الفولط الناتج ستكون قيمته تقريبا .1.25v
في المرحل الثالثة رفعنا نسبة القسم الفعال لـ 50%ينتج عندنا فولط 2.5vوسيعمل الـ LED
بنصف طاقته.
في المرحلة الرابعة أيضا نرفع نسبة المجال الفعّال لـ 75%لنحصل بذلك على 3.75vمن أصل
.5v
أخيرا وفي المرحلة الخامسة نزيد نسبة القسم الف ّعال لـ 100%لنحصل على 5vعلى الخرج
وسيعمل LEDبكل طاقته.
كل ذلك والتردد ثابت وال تغيير فيه ،وبالتالي نالحظ كيف نحصل على جهد متغير تبعا لنسبة
القسم الفعال من النبضة على حساب القسم الفعال ،ولعملية التعديل النبضي PWMاستخدامات
كثيرة لكن ما يهمنا حاليا هو فهم آلية عملها وكيفية توليدها باستخدام األردوينو وسنتحدث عن
تطبيقاتها في قسم الحق من الكتاب وخاصة عند الحديث عن المحركات.
األمر مماثل تماما ّ ويعبّر عن األقطاب التي يمكن أن تعمل كمخارج تشابهية بالرمز ~ أي كل
قطب بجانبه هذه اإلشارة يمكن تفعيله كمخرج تشابهي ،ويختلف عددها بين لوحة أردوينو
وأخرى.
130
كما نالحظ مكان توزع أقطاب المخارج التشابهية على لوحة األردوينو أونو Arduino UNO
وعددها ستة أقطاب ،اآلن كيف سنفعّل هذه األقطاب في بيئة التطوير Arduino IDE؟؟
131
نالحظ خالل الكود البرمجي كيف ت ّم تغيير قيمة خرج نبضة PWMمن خالل حلقة التكرارfor
والتي تقوم في كل مرة بالعدّ من الصفر وحتى 255لنحصل على أعلى قيمة خرج لنبضة .PWM
ر ّكزنا في معرض حديثنا عن نبضة PWMعلى أمر التردد وذكرنا أنه ثابت وال يتغير لكن
السؤال هنا ...كم هو تردد عمل نبضة PWM؟
في الواقع يوجد ترددي عمل لنبضات PWMسنوضحها من خالل الجدول التالي:
132
أي الترددات أفضل في العمل؟؟
األمر متعلق بطبيعة التطبيق المراد استخدام تعديل النبضة معه لكن بالمجمل يفضل الترددات
العالية في غالب التطبيقات.
هل يمكن التعديل في التردد وعرض النبضة PWMمعا من خالل لوحة األردوينو؟؟
133
العمليات الخاصة بأقطا الدخل/الخرج العامة :GPIOs
في هذا القسم سنتحدث عن جملة من التعليمات التي تقدم وظائف محددة على أقطاب الدخل/الخرج
وتعتمد هذه التعليمات في عملها على المؤقتات/العدادات الخاصة بالمتحكمات ،لنبدأ معا ً
باستعراض هذه التعليمات.
نستخدم في توليد النغمات على زمور Buzzerمتصل مع لوحة األردوينو التعليمة toneوالتي
تكون بالشكل التالي:
أ ّما التعليمة )( noToneفتستخدم إليقاف إصدار النغمة ،علما ً أنه يمكن ربط أكثر من زمور
Buzzerمع لوحة األردوينو لكن ال يمكن تشغيلها بالنفس الوقت ،إذ يشترط عمل زمور واحد
فقط وقبل تشغيل الزمور اآلخر يجب التأكد من إيقاف األول باستخدام التعليمة )(.noTone
134
ّر الترّ
دد أو زمن النغمة ....اكتب تعليمات ّب غي
جر
ّ عمل التعليمة tone
داخل الحلقة الرئيسية والحظ كيف أن
ال يؤثر على عمل المعالج.
135
قراءة عرض النبضة )(:pulseIn
في حاالت برمجية معينة يكون لدينا موجة مربعة يكون القسم الفعّال أو الغير فعّال منها متغيرا ً
تبعا لقيمة فيزيائية معينة وهذا التغير يكون زمني (أشهر مثال عن الحالة هذه هو حساس حساب
المسافة باألمواج فوق الصوتية والذي يعطي على خرجه نبضة مربعة بزمن متناسب مع الزمن
الذي استغرقته الموجة الصوتية ذهابا وإيابا ....سنتطرق لهذا الحساس في وقت الحق من الكتاب)
ونريد حساب الوقت الذي يستغرقه هذا التغير الزمني ،وهنا نستخدم التعليمة )(pulseIn
136
تعليمات العمليات الحسابية على القيم:
من الميزات التي توفرها بيئة التطوير Arduino IDEمجموعة من التعليمات التي يمكن تطبيقها
على القيم الرياضية بهدف اختصار الوقت والكود البرمجي ،لنتعرف معا على أشهر هذه
التعليمات وطريقة عملها.
نبدأ مع التعليمة )( mapوالتي نستطيع من خاللها تغيير مجال تغير متحول ما ،لنفترض مثال
ّ
أن لدينا متغير قيمته تتغير ضمن المجال -10 ~ 10ونريد أن تصبح قراءة قيمة التحول كنسبة
مئوية أي تتغير قيمته ، 0 ~ 100عمليا يمكن كتابة كود برمجي يقوم بهذا األمر لكن التعليمة
)( mapتختصر عليك ذلك....
نستخدم هذه التعليمة للحصول على مجال تغير جديد newValue = map(value,
fromLow, fromHigh,
للقيمة )toLow , toHigh( valueمن المجال
;)toLow, toHigh
القديم ( )fromLow , fromHighالذي تتغير
فيه هذه القيمة.
137
يمكن للتعليمة )( mapسحب المجال أو قلب المجال أو تكبير المجال أو تصغير المجال الجديد
للقيمة األصلية وحتى تعمل بشكل صحيح يجب ادخال مجال تغير القيمة األساسية بشكل صحيح.
تعليمة مهمة أيضا ً في العمل البرمجي وهي التعليمة )( constrainوتتلخص مهمتها في
حذف القيم الناتجة والتي تكون خارج النطاق المحدد.
ك ّل قيمة أصغر من 2يعيدها ،2وكل قيمة أكبر من 7يعيدها 7وباقي قيم المجال تبقى نفسها.
138
أيضا يوجد جملة من التعليمات الحسابية ّ
نطلع عليها اآلن وسنستعرضها من خالل األمثلة
والمشاريع مستقبال.
139
العدادات الزمنية )( :millis () / micros
التعرف على بيئة التطوير Arduino IDEواجهتنا مشكلة والتي هي الحاجة لعملية
ّ مع بداية
تأخير زمني في عمل المعالج إلتاحة المجال لعرض بعض التعديالت وكان هأول مثال لنا هي
عملية تشغيل وإطفاء LEDوالتي كانت تتم ك ّل ثانية واستخدمنا حينها التعليمة ;)( delayلكن
المشكلة التي كانت عند استخدام هذه التعليمة هو تجميد عمل المعالج (عمليا ً يتم إدخال المعالج
في حلقة مفرغة حتى ينتهي الزمن ث هم يتابع عمله بعد انقضاء الوقت) وهذا يعتبر أمر خطير جدا ً
في بعض المجاالت ،فمثال لو حدث خطأ ما وكان المعالج لحظة الخطأ في حالة اشغال زمني فقد
يسبب ذلك تلف لقطع أو غير ذلك من األمور ،لذلك كان ال بده من إيجاد البديل (البديل موجود
سابقا ً وهو المؤقتات/العدّادات لكن كون بيئة التطوير Arduino IDEتعتمد على التبسيط في
لنتعرف على
ّ المعلومة فكان البديل مختلف نوعا ً ما) وهنا ت هم التعامل مع تعليمات العدّ الزمني...
هذه التعليمات وكيفية االستفادة منها ضمن الكود البرمجي.
;)(millis تعيد هذه التعليمة قيم بالميلي ثانية حيث تبدأ العدّ لحظة تشغيل
لوحة اآلردوينو ،وتصل للطفحان (أي لق ّمة العدّ
4,294,967,295ثم تعود للصفر) بعد حوالي 50يوم ،أ ّما
نوع المتحول المستخدم عند قراءة قيمتها يكون من نوع
،unsigned longكما ّ
أن هذه التعليمة لقراءة قيمة العدّ
140
أه ّم نقطة نبدأ بها ّ
أن هذه التعليمات للقراءة فقط وال يمكن أن نعدّل عليها ،أما كيفية قراءة هذه
التعليمة فكما هو في المثال التالي:
مع ّأول مثال نالحظ كيف ت ّمت عملية قراءة محتوى العملية )( millisك ّل واحد ثانية
أن العدّ ليس دقيق وهنا يجب أن ننتبه أنّه كلّما زاد عدد أسطر الكود البرمجي
ونالحظ أيضا ً كيف ّ
تختلف دقّة قراءة العملية )(.millis
لنأخذ مثال آخر ...لدينا LEDمتصل مع لوحة األردوينو ونريد تشغيله ك ّل 1ثانية وإطفاءه
بنفس المدة الزمنية ....
141
عرفنا
األول من الكود حيث ّ
سنتعرف في هذا الكود على مهارات برمجية جديدة نبدأها بالسطر ّ
ّ
القطب 3الذي ت ّم وصل LEDإليه باسم مستعار هو ledوبالتالي أي استدعاء لالسم led
يقابله رقم القطب ،3وهذه العملية ضرورية جدا ً عند كتابة برامج تض ّم عددا ً ً
كبير من المداخل
فعند ذلك من األفضل إعطاء ك ّل قطب ما يقابله من اسم يتناسب مع الوظيفة المسندة له.
)( millisفإن كان أكبر من قيمة duration + 1000فهذا يعني أنه قد مضى ثانية
على عمل )( millisفيتم داخل ifاسناد القيمة الجديدة لـ )( millisللمتغير
142
durationوتغيير حالة المتغير ( vك ّل ثانية تتغير حالته بين 0والـ ،)1ث ّم اسناد تشغيل الـ
نتيجة الكود ستكون نفس نتيجة الكود عند استخدام التعليمة )( millisوالسبب أننا غيرنا
في الشرط القيمة 1000بالقيمة 1000000والتي تعادل 1ثانية.
143
العمليات الخاصة بالبت:
في هذا القسم سنستعرض فكرة جديدة وهي التعامل مع البتّ Bitوالذي هو جزء من البايت
،Byteقد يكون أغلبنا سبق ودرس نظم العدّ المختلفة والتي أشهرها النظام العشري Decimal
وهو النظام التقليدي في العدّ ومجاله 0 ~ 9وبالتالي عدد خاناته ( 10ننتبه ألمر مهم جدّا ً وهو ّ
أن
العدّ يبدأ دائما من ) 0وكذلك نظام العدّ الثنائي Binaryوالذي يعتبر أساس النظم الرقمية ويض ّم
قيمتين فقط 0 – 1وال ننسى النظام الست عشري Hexadecimalوالذي يشابه النظام العشري
لكن مع إضافة ست خانات له ليصبح مجال العدّ له . 1~9,A,B,C,D.E,F
طبعا يوجد نظم عدّ أخرى لكن ليس هذا مبحثنا في هذه الفقرة فللتعامل مع نظم العدّ وطرق
التحويل بينها والعمليات عليها نحتاج إلفراد وقت طويل جداً ،....سنكتفي باستعراض سريع لما
يهمنا عند التعامل مع المداخل/المخارج الرقمية مستقبال.
لنوضّح بعض النقاط بالنسبة للمبتدئين معنا حتى ال تصعب الفكرة عليهم ،ك ّل عدد عشري يمكن
تمثيله بأي نظام عدّ آخر والعكس كذلك صحيح لكن التحويل بين أنظمة العدّ يحتاج لفهم بعض
النقاط وسنكتفي باستعراض التحويل من عشري إلى ثنائي كون هذا األمر أكثر ما يه ّمنا حاليا ً:
نالحظ من المثال السابق كيف قمنا في البداية بإدخال الرقم بالصيغة العشرية ث ّم قمنا بطباعة الرقم
بالصيغة العشرية والصيغة الثنائية (استخدمنا األمر BINمع التعليمة Serial.printلطباعة
الرقم بالصيغة الثنائية ،يمكن تبديل األمر للصيغة الست عشرية HEXأو الصيغة الثمانية .OCT
أما القسم الث ّاني فت ّمت العملية بشكل معاكس ...قمنا بكتابة العدد بالصيغة الثنائية (عبر كتابة 0b
ثم القيمة الثنائية للعدد ،ولو أردنا إدخاله بالصيغة الست عشرية فيمكن ذلك بكتابة 0xث ّم قيمة
145
لنستعرض اآلن أهم العمليات على البتّ من خالل بعض األمثلة العملية (قد تكون هذه األمثلة
حاليا دون فائدة واضحة لك كمبتدأ في تعلّم البرمجة ...اطمئن ...سيأتي الوقت الذي ال تستغني
به عن هذه العمليات):
&
Bitwise or
|
Bitwise xor
^
146
متحول قيمة
ّ في المثال السابق قمنا في البداية بتعريف متحولين من نوع byteوأسندنا لك ّل
المتحول
ّ لألول القيمة 9والتي تمث هل في نظام الثنائي بالشكل 0b0001001أ ّما
بدائية لتكن ّ
الثاني فأعطيناه القيمة 5ويعبهر عنه في النظام الثنائي بالشكل ... 0b00000101اآلن لنطبّق
147
في الحالة األولى والتي تمثّل البوابة المنطقية & نتج لدينا الرقم 1أي أنه كل تماثل بالقيمة نضع
مكانه 1وك ّل حالة غير ذلك 0فكان الناتج 0b00000001وهو نفسه 1في نظام العدّ
العشري.
148
أ ّما الحالة الثانية والتي تمثّل البوابة المنطقية | ،الناتج كان 0b0001101أي كل مقارنة
بين بتّين أحدهما 1نضع في الناتج 1ونضع 0فقط عندما يكون كالهما .0
بينما أي تشابه (كال البتين 1أو )0نضع 0في الناتج ،ليكون لدينا الناتج .0b00001100
الحالة الرابعة وهي حالة العكس أو القلب ~ ويتم تغيير قيمة ك ّل بيت للحالة المعاكسة له ،وبما
ننتقل للقسم الثاني من الجدول السابق وهي تعليمات اإلزاحة ولنبدأ بإزاحة المتغير األول val_1
149
نالحظ من المثال السابق كيف ت ّمت عمليّة اإلزاحة نحو اليسار أي باتجاه الخانات األكثر أهمية
المتحول وتصبح 72ويتم استبدال الخانات الثالث األولى بالقيم .0
ّ MSBوبالتالي يزداد قيمة
لنكرر العملية لكن بشكل معاكس ولنجري العملية باإلزاحة نحو اليمين أي باتجاه الخانات األقل
ّ
أهمية LSBلنفس المتغيّر السابق..
150
يبقى لدينا مجموعة من التعليمات الخاصة بالتعامل مع البتّ :
151
ننبه ألمر مهم وهو طريقة العدّ ،فكما ذكرنا سابقا ّ
أن العدّ يبدأ دائما من القيمة 0لذلك عندما
سنكتب الخانة 3مثال فإننا نبدأ العد من الخانة األقل أهمية بـ 0ث ّم نتابع العد لنصل للخانة المطلوبة.
عند التعامل مع حجم كبير من البيانات كنا نستخدم الكثير من المتغيرات لتخزين ومعالجة تلك
البيانات ،وذلك ألن كل متحول يحمل قيمة واحدة فقط وهذا ما يجعل البرنامج طويل ومعقد ،لكن
وباستخدام المصفوفة يستطيع المبرمج استعمال متغيرات قليلة وذلك بتقسيم كل متغير إلى عدد
من العناصر المتسلسلة ،كما تسهل المصفوفة التعامل مع جملة من المتحوالت بنفس الوقت دون
تعقيد وباختصار من الوقت .....صحيح أن الكثير من المقبلين على تعلم لغة اآلردوينو لديهم الكثير
من التخوف من استخدام المصفوفة لكن نبشرهم بأن الموضوع سهل بإذن هللا ويحتاج فقط للقليل
المصفوفة :عبارة عن منطقة محددة من الذاكرة تتكون من عدد محدد (رقم صحيح يستخدم
لتحديد عدد المواقع المطلوبة من الذاكرة ويسمى هذا الرقم بالدليل )Indexومتجانس (أي أن
جميع عناصر المصفوفة من نفس نوع البيانات )Data Typeمن المواقع المتجاورة ،ويمكن
تعريف مصفوفات بعدة أبعاد فمنها ما هو ببعد واحد (سطر واحد بعدة أعمدة أو العكس) ومنها
ما هو ببعدين فتكون بعدة أسطر وعدة أعمدة ،وهذين النوعين هما نقطة اهتمامنا كما يمكن
تعريف مصفوفة بثالثة أبعاد وهذا النوع ليس مجال عملنا (يتم عادة استخدام هذه المصفوفات
للتعامل مع الصور مثال فلكل نقطة من الشاشة ثالثة بارامترات هي األلوان األساسية R G B
وبالتالي لكل بيكسل ثالثة قيم هي قيم هذه األلوان وهنا نحن بحاجة لمصفوفة بثالثة أبعاد وهكذا).
153
المصفوفة ذات البعد الواحد:
وهي مصفوفة ذات سطر واحد تعرف كما يلي:
;]Type Name[size
:Nameاسم المصفوفة.
:sizeعدد عناصر المصفوفة ،كل عنصر يأخذ رقم يدل عليه بدء من الرقم 0يسمى .Index
; } { = ]Type Name[size
يمكن كذلك تحديد قيم بدائية لبعض عناصر المصفوفة وترك بقية العناصر دون قيم لتأخذ بذلك
القيمة صفر كقيمة بدائية.
الكتابة :وتتم بذكر مؤشــر العنصــر من المصــفوفة المطلوبة وإعطاء هذا العنصــر القيمة التي
نريدها كقيمة جديدة له ،فهنا قمنا بإسناد القيمة valueللعنصر الذي ترتيبه xمن المصفوفة
.ArrayName
القراءة :وهي عمليـة معـاكســــة للكتـابـة حيـث نقوم بـإســــنـاد قيمـة العنصــــر الـذي ترتيبـه xمن
المصفوفة ArrayNameللمتحول .value
154
ليكن لدينا المصفوفة التي تحتوي 10عناصر:
} {2 , 8 , 14 , 5 , 3 ,7 , 10 , 12 , 0 , 5
نريد زيادة القيمة 5لكل عنصر من عناصر المصفوفة ومن ثم طباعة قيم المصفوفة الجديدة
على المنفذ التسلسلي ،ونريد تكرار هذه العملية لثالثة مرات.
بعد تعريف المصفوفة في بداية الكود ...سيتم في الحلقة التكرارية اختبار الشرط ifوفي كل
مرة يتم تنفيذ جملة الشرط والتي تتضمن زيادة مقدار 5لكل عنصر من عناصر المصفوفة (تتم
العملية بحلقة forالختصار التكرار في الكود) وبطباعة رقم المرحلة xوزيادة هذا المتحول
بمقدار ،1وعندما تصبح قيمة هذا المتحول أكبر من 3فلن يتم بعد ذلك تنفيذ الجملة الشرطية if
كون ال يوجد ضمن الكود ما يعيد المتحول xللقيمة 0لكي يتم تنفيذ الشرط ifمن جديد.
155
المصفوفة ذات البعدين:
:Nameاسم المصفوفة.
تكتب عناصر السطر الواحد بي قوسين"} "{ , ,ويفصل بينها بفاصلة ،ويفصل بين األسطر
كذلك بفاصلة.
الكتابة :وهنا علينا ذكر مكان العنصـر في المصـفوفة فنذكر مؤشـر العنصـر بالنسـبة للسـطر أوال
ثم نذكر مؤشر العنصر بالنسبة لألعمدة ،ثم نسند للعنصر القيمة التي نريدها كما هو موضح.
القراءة :بعملية معاكســة لما ســبق إذ علينا إســناد قيمة العنصــر الذي مؤشــر األســطر له يحمل
القيمة ، xبينما مؤشر األعمدة يحمل القيمة yمن المصفوفة ArrayNameللمتحول .value
𝟑𝟖𝟓 𝟔𝟔 −
) 𝟓 𝟎𝟏 𝟐array = (−
𝟑𝟏 𝟐𝟕 𝟗
والمطلوب طباعة عناصر المصفوفة على نافذة االتصال التسلسلي وذلك بعد إضافة القيمة 5
لكل عنصر من عناصر هذه المصفوفة.
ت ّمت العملية السابقة باستخدام حلقتي forاألولى (باألحمر) للتنقل بين األسطر فنبدأ بالسطر0
ث ّم ننتقل للحلقة الثانية (باألخضر) للتنقل بين عناصر السطر الواحد (أي االنتقال باألعمدة) ...
ومع تكرار العملية نكون بذلك قد أضفنا القيمة 5لكل عناصر المصفوفة.
157
التوابع (الدوال) :Functions
وهو مجموعة من األوامر والبيانات المرت ّبة تحت اسم واحد والتي يمكن استدعاؤها من أماكن
مختلفة من الكود البرمجي ،كما تعرف أيضا بالروتين الثانوي .subroutine
▪ اختصار الكود البرمجي ،إذ يكتفى باستدعائه باسمه فقط لينفذ العمل المطلوب.
▪ تالفي خطوات التكرار في الكود البرمجي.
▪ تساعد التوابع في عملية البرمجة نفسها.
▪ توفر مساحة من الذاكرة المطلوبة للبرنامج.
▪ اختصار عملية البرمجة وتنفيذ البرنامج بأسرع وقت ممكن.
▪ تسهيل عملية مراجعة الكود وتصحيح األخطاء والتعديل على الكود.
يكتب التابع ويعرف في بيئة Arduino IDEكما يعرف بلغة C/C++بالشكل التالي:
{
; statement
; return result
}
158
« :Function_Typeنوع القيمة التي سوف يرجعها التابع ( int , float ,
)….وفي حال لم يكن هناك قيمة سيتم إرجاعها عندها يكون التابع من النوع .void
« :nameاسم التابع.
« :Parametersالقيم المراد تمريرها للتابع ،ويمكن أال يكون هناك قيم.
« :statementsالبنية البرمجية للتابع.
« :return resultالقيمة التي سوف يتم إعادتها ،حيث أن المتحول result
من نفس نوع التابع وإذا لم يكن هناك قيمة معادة فال حاجة لهذه التعليمة.
أفضل مكان لكتابة البرنامج الفرعي ،لكن في حاالت معيّنة يكون مكان الت ّابع الفرعي في
بداية الكود البرمجي نذكرها في وقتها إن شاء هللا) ،أما استدعاء التابع فيمكن أن تتم في أي
نقطة من الكود البرمجي وتتم العملية بذكر اسم التابع;)( nameوتحديد قيم الدخل له إن
159
أنواع التوابع في لغة :C/C++
للت ّوابع أشكال عديدة وتختلف فيما بينها في قيم الدّخل للتابع والناتج الذي سيقدّمه التابع فتقسم
بذلك الت ّوابع ألربعة أقسام (هذه األقسام اصطالحية من المؤلف لتبسيط الفكرة وتسهيل فهم
عمل التوابع وليست تقسيم أكاديمي فقد ال تجد أحد يعتمد هذا التقسيم عند تقديم التوابع):
160
في هذ التابع نالحظ كيف يتم استدعاء التابع الخاص بعملية إطفاء led_off(); LEDs
في الحلقة األساسية للكود البرمجي ،كما نالحظ ّ
أن التابع ال يعيد أي قيمة رقمية للمستخدم وليس
له أي قيمة دخل.
هذا التابع سيوفّر الكثير من الوقت واألسطر ...ففي أي مكان نريد إطفاء الـ LEDsفقط نستدعي
التابع.
161
▪ تابع له دخل وليس له خرج.
لنكتب تابع برمجي يتم من خالله اختيار رقم قناة PWMوالقيمة المراد إخراجها على القناة.
للحاجة ضمن الكود وهنا اخترنا النوع byteكوننا ال نحتاج لحجم ذاكرة أكبر) أحدهما يحدد
رقم القناة (حصرا ً المخارج )3-5-6-9-10-11والثاني يحدّد القيمة المطلوب إخراجها على القناة
162
▪ تابع ليس له دخل لكن له خرج.
لنكتب تابع برمجي يتم من خالله قراءة قناة مبدل تشابهي رقمي A0وتحويل القيمة المقروءة
لقيمة تقابلها من المجال 0 ~ 255وإعادة القيمة للمستخدم.
التابع )( read_valueعبارة عن تابع يتم استدعاءه لمعرفة النتيجة التي هي عبارة
عن قراءة المدخل التشابهي A0وتحويل الناتج ضمن عملية mapومن ثم يعيد الناتج
للمتحول .x
ّ للبرنامج وفي النهاية يتم اسناد ناتج حساب التابع (وهو القيمة )a
163
▪ تابع له دخل وله خرج.
لنعرف تابع مدخله متحولين x , yمن النوع ،intأ ّما العملية الحسابية التي تتم داخل
ّ
، 3*xأ ّما خرج التابع فمن النوع .int التابع فهي+ 9*y :
نالحظ ّ
أن للتابع مدخالت (يمكن أن يكون للمستخدم إمكانية إدخالها مستقبال) وله مخرج حسابي
ينتج عن العملية الحسابية.
164
مالحظات تصميمية وعملية:
سنستعرض في هذه الفقرة بعض النقاط التصميمية والعملية المهمة والتي تعترض الطالب أثناء
توصيل المشروع أو تجريب عمل لوحة األردوينو وهي مالحظات مه ّمة للغاية ننصح الطالب
بقراءة هذا القسم بتمعّن واالستفادة منه فهو في غالبه إجابة على تساؤالت تصلنا بشكل كبير.
من المشاكل التي تواجه المتدربين عند التعامل مع الكبّاسات اللحظية هي حالة الال استقرار في
ّ
وكأن األمر عبارة عن عدّة أداء الكبّاس اللحظي ،فمثالً نريد مع كل ضغطة تنفيذ أمر محدد فنجد
مرات في نفس الوقت والسبب هو حالة االهتزاز الميكانيكي أو ما يعرف باسم .Bounce
ّ
165
مرة ثانية فإن كانت بنفس القيمة األولى فيتم تنفيذ األمر المتعلّق
)50msنعيد قراءة حالة المفتاح ّ
بالكبًاس.
يمكن أن تت ّم الطريقة السابقة باستخدام تعليمة )( millisلكيال يتم اشغال المعالج ،أو يمكن
وضع تأخير زمني بسيط بعد ك ّل قراءة حالة المفتاح تقدّر بـ 50msمن خالل التعليمة
;).delay(50
يمكن التخلّص من حالة االهتزاز هذه الكترونيا وذلك بإضافة مكثف على التفرع مع الكبّاس
مر معنا في شرح المكثّف فإنه ّ
يمرر اإلشارات المتغيّرة مع الزمن بينما ال لألرضي GNDفكما ّ
المستقرة وبالتالي فإن حالة الال استقرار ستعبر إلى المكثف ،وتكون قيمة المكثّف
ّ يمرر اإلشارة
ّ
عند الـ .100nF
166
تعريف األردوينو على الحاس :
ذكرنا في بداية الفصل أنه وبتنصيب برنامج Arduino IDEسيتم تعريف لوحة األردوينو
وتصبح جاهزة للعمل على الحاسب لكن هذا الكالم ليس دقيق بدرجة كبيرة.
قبل الدخول في التفاصيل لنوضّح نقطة مهمة على عجالة وهي طريقة الربط بين الحاسب
والمتح ّكم على لوحة األردوينو فغالب متح ّكمات األردوينو ال تضم واجهة تخاطب خاصة مع
محول أو Adapterمهمته تسهيل التفاهم
منفذ USBوللتغلب على هذه المشكلة فقد ت ّم إضافة ّ
بين البروتوكول ( UARTأقطابه TX , RXوتأخذ األرقام 0 , 1على لوحة األردوينو) على
متحكم األردوينو وبين USBعلى الحاسب (بشكل سريع ...هناك العديد من بروتوكوالت
االتصال تختلف فيما بينها بالكثير من النقاط أهم هذه النقاط هي شكل البيانات وطريقة ارسالها
وكيفية استقبالها ومدى االتصال وإمكانية التحقّق من صحّتها وعدد األجهزة على ّ
خط االتصال
أن األمر معقّد لذلك ستجد فصل كامل من
وعدد خطوط االتصال وغير ذلك من األمور ....أعلم ّ
الجزء الثاني من سلسلة "األردوينو كما لم تعرفه من قبل" وظيفته شرح هذه البروتوكوالت
وطريقة عملها ،لكن ما يه ّمنا هنا هو أنّنا نريد ربط بروتوكولين مختلفين عن بعضهما في آلية
العمل لذلك البدّ من وجود وسيط بينهما وظيفته مترجم للطرفين).
لكن هذا الـ Adapterهو عبارة عن دارة تكاملية تختلف بين نوع وآخر من لوحات األردوينو
وذلك تبعا ً لجودة لوحة األردوينو بالدرجة األولى.
وأفضل هذه الدارات التكاملية هي متحكم ATmega8يحتوي برنامج وظيفته ربط بروتوكولي
167
168
ننتقل للنوع الثاني والذي يمكن أن نصنّفه بالدرجة الثانية وهو الدارة التكاملية ،FT232تتميز هذه
الدارة بسهولة تعريفها على الحاسب كما أنّه وفي حال وصل أكثر من لوحة أردوينو على الحاسب
فسيتم إعطاء كل لوحة رقم لمنفذ COMxxمختلف.
يجب أن ننتبه أنّه في لوحات األردوينو Arduino NANOيجب تغيير نوع bootloader
للنوع الواضح في الصورة لكي تستطيع رفع الكود البرمجي للوحة األردوينو.
169
نصل للنّوع األخير وهو األقل جودة بين ما سبق وهو الشريحة الصينية CH340ولألمانة
وبمجرد وجود هذه الدارة على لوحة األردوينو فأعلم ّ
أن جودة لوحة األردوينو رديئة وهي من ّ
النوع التجاري....
170
هذه الشريحة تحتاج لتعريف حتى تعمل لوحة األردوينو ،وفي حاالت معيّنة يجب تغيير
bootloaderحتى تعمل لوحة األردوينو بشكل صحيح.
عند توصيل لوحة األردوينو (ذات دارة )FT232 or CH340مع الحاسب سيظهر في قسم
أن الجهاز المتّصل مع الحاسب غير ّ
معرف: إدارة األجهزة في جهاز الكمبيوتر ّ
171
نقوم بتحميل ملفّات التعريف الضرورية من النت ( )CH340 driver or FTDIوتنصيبها على
الحاسب عندها يظهر لدينا منفذ COMوله رقم....
172
تغذية لوحة األردوينو والحصول على أفضل أداء:
173
الرقم NCP117ST50يمكن أن يقدّم أمبير أعظمي أن ّ
منظم الجهد يحمل ّ ننتبه ألمر مهم وهو ّ
1Aوهنا يكون لدينا مشكلة في بعض المشاريع فقد يكون استهالك المشروع يفوق 1Aوخاصة
ّ
نضطر لربط تغذية خارجية مع القطب Vccقيمتها ( 5vمع محركات السيرفو وهنا
ّ عند تشغيل
نسبة خطأ بسيطة) طبعا ً مع االنتباه لوصل GNDأيضا بين عناصر المشروع المختلفة والتغذية.
ّ
منظم جهد LP2985بخرج أيضا ً تتميّز لوحة Arduino UNOباحتوائها على
3.3v/150mAم ّما يس ّهل التعامل مع بعض أنواع القطع والتي تحتاج فولط ال يتجاوز .3.3v
أن تغذية المتح ّكم Vcc = 5vلكن في بعض لوحات األردوينو تكون تغذية
نالحظ م ّما سبق ّ
المتح ّكم عند (3.2vبعض أنواع لوحات )Arduino Pro miniوالسبب تخفيض االستهالك
الكهربائي لألردوينو مما يجعله مناسبا ً للتطبيقات التي تتطلّب التعامل مع البطاريات (مع االنتباه
أن المتح ّكم نفسه يمكن أن نضبطه بأحد أنماط حفظ الطاقة والتي تجعل من استهالك المتح ّكم
ّ
ضئيل جدا ً وهذا مبحث كامل سيتم استعراضه في الجزء الثالث من سلسلة "األردوينو كما لم
تعرفه من قبل") وهنا يكون Vcc = 3.2vوبالتالي أي حساب يدخل فيه Vccيجب االنتباه
لقيمته الجديدة.
174
المخارج/المداخل الرقمية ...الفولط واألمبير:
من األخطاء الشائعة عند التعامل مع لوحات األردوينو هو استخدام األقطاب الرقمية بشكل خاطئ
(مثالً وصل عدد كبير من LEDsمع أقطاب األردوينو بشكل مباشر مع مقاومة حماية صغيرة)
م ّما يسبّب في حاالت كثيرة تلف القطب أو تلف المتح ّكم ككلّ.
فإن تغذية المتحـــ ّكم قبل الحديث عن القطب نفسه نودّ الحديث عن المتحـــ ّكم ،فكما ّ
مر معـنا ّ
يستهلك المتح ّكم كحدّ أقصى 200mAويمكن لكل قطب رقمي أن يقدّم Vcc/20mAكحد أقصى
بالنسبة للفولط Vccمرتبطة بتغذية المتح ّكم ،أ ّما األمبير فيرتبط بالحمل ،لكن لدينا مثالً على
لوحة األردوينو Arduino UNOما يقارب 18قطب وبحساب بسيط نجد ّ
أن األمبير الكلي
يصل لـ 360mAلكن هذا األمر خاطئ ،فال يجب أن يتجاوز مجموع السحب من األقطاب
،200mAقد يقترح أحدهم أن أجعل القطب طريق لتصريف األمبير (مثال لو كان عندي LED
أصل الموجب مع Vccمباشر بينما أعطي السالب من األردوينو) نفس المبدأ ....األمر لن
يختلف ال يجب أن يتجاوز مجموع سحب أو تصريف األمبير في المتحك ّم الـ .200mA
أن هذه اإلشارات هي إشارات تح ّكم وليست إشارات قدرة وللتغلّب على
يجب أن ندرك أمر وهو ّ
هذا األمر نستخدم المفاتيح االلكترونية بأنواعها (الترانزستورات وغيرها).
175
الهزاز الكرستالي ...السرعة واألداء:
م ّما يميّز لوحات األردوينو اعتمادها على الهزاز الكرستالي الداخلي للمتح ّكم والذي يتطلّب فقط
ربط كرستالة خارجية حتى يكتمل هذا الهزاز ،لكن ما هي وظيفة الهزاز أساساً؟؟؟
تتل ّخص وظيفة أي هزاز للمعالج (بأنواعه المختلفة سوا ًء كان هزاز RCأو LCأو هزاز
كرستالي) في تأمين موجات مربّعة ذات تردّد ثابت أ ّما وظيفة هذه النبضات ضبط إيقاع وسرعة
العمل للمتح ّكم ،فلو قلنا ّ
أن كل نبضة ساعة يتم فيها تنفيذ تعليمة فبالتالي تم تحديد سرعة األداء
من خالل تردّد هذه النبضة وكلّما زاد التردّد زادت السرعة ....األمر له تفاصيل كثيرة جدا ً
بالتعرف على الكرستالة وكيفية ربطها.
ّ ومتقدّمة لذلك سنترك الموضوع للجزء الثالث وسنكتفي
الهزاز الكريستالي:
الكريستال أو الكوارتز وهو عنصر يتألف من ذرتي أوكسجين مع ذرة سيليكون ،SiO2أهم ما
يميز هذا العنصر أنه ذو مفعول ارتدادي فإذا ما تعرض لصدمة ميكانيكية تولد على سطحه جهد
كهربائي والعكس صحيح فإذا ما تعرض الكوارتز لجهد كهربائي ينتج عنه اهتزاز للكوارتز ينتج
عنه رنين أو تذبذب على قطبي الكرستالة ،هذا االهتزاز يمكن التحكم به وذلك حسب أبعاد شريحة
الكوارتز والجهد المطبق عليها.
176
توصيل الكرستالة مع المتحكم:
إن توصيل الكرستالة مع المتحكم يتضمن عناصر إضافية وهي مكثفتين من قيمة 18 ~ 22 pF
ويتم التوصيل بالشكل التالي:
تتميّز ّ
الهزازات الكرستالية عن نظيراتها من هزازات RCأو LCبالدّقة العالية واستقرارية
تتراوح بين ، 0.01 ~ 0.001 %إضافة للجودة العالية لها.
177
تمارين الفصل األول.
بعد استعراض مجموعة من تعليمات بيئة التطوير Arduino IDEسنقدم اآلن عدد من األمثلة
العملية للتعليمات السابقة ،ومن خالل هذه التعليمات سوف نبدأ رحلة التعامل مع لوحات
األردوينو.
178
عرفنا في بداية الكود البرمجي ك ّل األقطاب المستخدمة دخل/خرج بأسماء مستعارة لتسهيل
ّ
صرحنا عن نوع كل قطب ضمن حلقة
ّ التعامل معها باستخدام التعريف ،#defineث ّم
اإلعداد ،وأخيرا ً ...في حلقة البرنامج الرئيسية )( void loopحددنا وظيفة كل كباس
األول إلطفاء الـ LEDوالثاني إلطفائه.
بحيث يكون ّ
179
لدينا ثالثة LEDsمتصلة مع األقطاب 2,3,4وثالثة كباسات
متصلة مع األقطاب ،A0,A1,A2المطلوب كتابة كود برمجي بحيث
تمرين :2
يكون كل كباس لحظي مسؤول عن تشغيل وإطفاء LEDمقابل له.
180
181
نعرف في بداية الكود البرمجي لألقطاب المستخدمة بأسماء مستعارة عبر استخدام
كما أعتدنا ّ ...
نعرف ثالث متغيرات من نوع boolمنطقي والتي سنستخدمها الحقا لتحديد
التعريفات ،ث ّم ّ
حالة المخرج وتغيّره تبعا ً لتغيّر حالة هذا المتغيّر.
في حلقة البرنامج الرئيسية )( void loopنستخدم فيها ثالث جمل شرطية ،ifوكل
جملة شرطية مسؤولة عن عمل ،LEDضمن الحلقة يتم وضع تأخير زمني صغير للتغلب على
حالة االهتزاز الميكانيكي التي ذكرناها سابقا ً ،bounceث ّم مع كل تحقق للشرط نعكس حالة
المتغيّر fnوبالتالي يتم عكس حالة الخرج الرقمي تبعا ً لتغيّر حالة هذا المتغير المنطقي.
يمكن االستغناء عن تعليمة التأخير الزمني ;)( delayلكن سنترك هذا التعديل ألمثلة قادمة...
182
ليكن لدينا LEDمتصل مع القطب 2من لوحة األردوينو ،مع وجود
كباس لحظي على القطب ،A0والمطلوب كتابة كود برمجي يتم
تمرين :3
عكس حالة الم LEDبعد توقف الضغط على الكباس اللحظي.
183
نالحظ في بداية الكود كيف ت ّم تعريف القطب A0بالرقم 14وهذا ممكن كونه يستخدم كقطب
اشترطنا في عمل الكود البرمجي ّأال يتم قلب حالة الخرج 2حتّى يتم رفع الضغط عن الكبّاس
اللحظي وت ّم تحقيق ذلك باستخدام الحلقة الشرطية whileوالتي ستضمن دخول المعالج في
حلقة مفرغة مادام الكبّاس في حالة ضغط وبعد توقّف الضغط على الكبّاس يت ّم االنتقال لبقيّة
التعليمات ضمن الجملة الشرطية ifوالتي تتضمن عكس حالة قطب الخرج.
أما عملية عكس حالة القطب فتمت باستخدام بوابة عدم التماثل ^ بين القيمة 1وقراءة حالة
قطب الخرج نفسه (يمكن استخدام التعليمة )( digitalReadمع أقطاب الخرج أيضا)
وبالتالي يتم عكس حالة القطب مع كل عملية ضغط على الكباس اللحظي.
184
لنكتب كود برمجي يشغل LEDsمتصلة مع األقطاب D0 ~ D7
بشكل متتالي وبفاصل زمني 1secعند عمل المفتاح , S1أما عند
تمرين :4
تشغيل المفتاح S2فيتم إطفاء كل LEDsبدون فاصل زمني.
185
الفكرة األساسية من هذا المثال هي تدريب الطالب على فهم التوابع بشكل عملي فنالحظ من خالل
المثال كيف ت ّم اختزال ك ّل العمليات البرمجية المطلوبة لتشغيل LEDsفي تابع واحد يتم فيه
تحديد زمن العمل وكذلك حالة الخرج وبالتالي يمكن أن يتم التعديل دون تغيير كبير على الكود
البرمجي.
186
لدينا حمل على القطب 11يعمل عبر نبضة ،PWMوالمطلوب كتابة
كود برمجي يقوم المستخدم من خالله بإدخال مستو التشغيل والذي
تمرين :5
يقابل نسبة مئوية من قوة الم PWMضمن خمسة مستويات لتشغيل الحمل.
187
تطبيق عملي عن الجملة الشرطية )( switchوالتي سوف تعطي قيمة لخرج PWMتبعا ً
للمستوى المحدد من المبرمج والذي سيدخل عبر واجهة االتصال التسلسلي ،وكما هو واضح من
ّ
أن التعليمة خالل الكود لدينا الحاالت '0',a,b,c,dوهنا ننتبه ألمر وهو
لمتحول من نوع
ّ )( Serial.readتعيد أحرف فقط وفي حال ت ّم ادخال رقم وت ّم اسناده
رقمي فسيظهر لنا ترميز الـ ASCIIلهذا الرقم وليس الرقم نفسه وهنا سنحتاج للتعامل مع
سنتطرق لها الحقا ً من الكتاب.
ّ مجموعة من التعليمات الخاصة بعملية التحويل والتي
188
لدينا LEDs 2متصلين مع لوحة األردوينو ...األول مع القطب 8
والثاني مع القطب ،9كما يوجد كباس لحظي متصل مع القطب ،3
تمرين : 6
والمطلوب كتابة كود برمجي يتم تغيير حالة LEDاألول كل 5secبينما يتم تغيير حالة الم
LEDالثاني عند ضغط الكباس اللحظي.
189
في هذا المثال عدنا الختبار دور التعليمة )( millisفي التخلص من التأخير الزمني
والتجميد الحاصل للمعالج من استخدام )( ،delayفمن خالل المثال السابق يمكن في أي
لحظة تغيير حالة الـ LEDالثاني ،لكن لو وضعنا ) delay(5000فسيكون لدينا حاالت
تأخير كبيرة جدا ً تبعا ً لحالة )(ّ ....delay
جرب بنفسك واستنتج الفارق.
190
اكتب كود برمجي يتم من خالله التحكم بإنارة LEDمتصل مع لوحة
اآلردوينو على القطب 11عبر الحاسب من خالل النافذة التسلسلية
تمرين :7
.UART
191
مرت معنى في المثال الخامس ....نختبر ورود بيانات من المنفذ التسلسلي
بنفس الطريقة التي ّ
عبر التعليمة )( Serial.availableوفي حال تحقق ورود بيانات ننتقل لعملية التحقق
من محتوى البيانات فإن كانت nنشغّل الـ LEDأ ّما إن كانت fنطفئه وأي بيانات غير ذلك
نطبع .Error
192
لدينا حساس حرارة LM35متصل مع األردوينو مع القطب ،A0
كما يوجد موديول ريليه مزدوج ،والمطلوب كتابة كود برمجي يقوم
تمرين :8
بقراءة قيمة الحرارة ويطبعها على نافذة Serialوفي حال كانت الحرارة أكبر من 35oيتم
تشغيل الريليه األولى ،أما لو كانت الحرارة أقل من 15oيتم تشغيل الريليه الثانية ،بينما يتم
إطفاء الريليهات في غير ذلك.
193
194
تتميّز غالب موديوالت Relayكونها تعمل عند 0منطقي ( )LOWوتتوقف عند 1منطقي
( )HIGHوهنا يجب أن نتعامل مع هذا التغيّر في العمل كون ّ
أن أي قطب يتم تعريفه كقطب
خرج تكون حالته البدائية 0منطقي لذلك علينا ضبط القيمة البدائية عند القيمة 1منطقي ّأول الكود
نعرف نوع القطب في حلقة اإلعداد؟ ...السبب أننا نريد
البرمجي ،لكن لماذا حدّدنا الحالة قبل أن ّ
يمر بالحالة 0نهائيا ً وهذا األمر ممكن التخلص من الزمن الصغير جدا ً ولضمان ّ
أن القطب لن ّ
إذا كتبنا طريقة التعريف كما سبق.
في حلقة البرنامج الرئيسية )( void loopقسّمنا الوظائف لقسمين ...األول لحساب درجة
ومر معنا وهو إجراء أكثر من عملية حسابية بنفس
ننوه ألمر سبق ّ
الحرارة من الحسّاس وهنا ّ
السطر ولكي نضمن نجاح العملية نكتب األرقام الثابتة بشكل عشري (.)1024.0 , 5.0
القسم الثاني وهو تابع التح ّكم بالـ Relaysتبعا ً لدرجة الحرارة وهنا ننتبه ...للتشغيل نعطي
LOWعلى الخرج بينما نعطي HIGHلإلطفاء.
195
لنصمم مقياس مقاومات OHMباستخدام األردوينو على القطب
التشابهي ،A1تتم عملية الحساب مع كل عملية ضغط على الكباس
تمرين :9
المتصل مع القطب .2
196
ومر معنا وبدّلنا من القانون
لتصميم مقياس مقاومات استفدنا من قانون مقسّم الجهد الذي سبق ّ
لنعزل المقاومة المطلوب حسابها على طرف من القانون ....استخدمنا الكبّاس اللحظي لساب
متحول من نوع منطقي
ّ لمرة واحدة فقط عند ضغط المفتاح وت ّمت العملية باستخدام
القيمة ّ
flageتتغير قيمته داخل الشرط للقيمة 1بعد تنفيذ الشرط الثاني المتعلّق به وبالتالي لن نتم ّكن
مرة ثانية.
من الحصول على قراءة جديدة حتى يتم إفالت الكبّاس ث ّم الضغط عليه ّ
197
لنكتب كود برمجي يقوم بعمل مؤقت تصاعدي يعمل عند ضغط مفتاح
البدء المتصل مع القطب 2يتوقف عند الوصول لم 3hويشغل حمل
تمرين :10
متصل مع القطب 6لمدة ،2sويمكن تصفير عمله وإيقافه من نفس كباس العمل
198
نعرف في بداية الكود األقطاب المستخدمة وكذلك المتغيّرات المطلوبة لعمل الكود البرمجي وهي
ّ
متحوالت الزمن ،أ ّما الحلقة الرئيسية فتضم في البداية اختبار لحالة الكبّاس اللحظي وعند أي
عملية ضغط عليه يتم تغيير حالة المتغير ،start_flageبعد ذلك يتم اختبار حالة هذا
المتغيّر فإن كانت تساوي القيمة 1يبدأ المؤقت بالعمل ،أ ّما إن كانت قيمته مساوي للصفر فيتم
تصفير متغيّرات الزمن . second_t , minute_t ,hour_t
199
نالحظ كيف تم كتابة ثالث جمل شرطية بداخل بعضها البعض بهدف تحقيق الزيادة الصحيحة
في متحوالت الزمن.
200
ليكن لدينا المصفوفة التالية:
تمرين :11
}myA [10] = {8 , 33 , 65 , 66 , 89 , 15 , 7 , 85 , 98 , 10
والمطلوب كتابة كود برمجي يتم من خالله استخالا القيمة الكبر من عناصر المصفوفة
وكذلك القيمة الصغر وطباعتها على واجهة االتصال التسلسلي .UART
بعد إدخال قيمة المصفوفة للبرنامج (قد تكون عناصر المصفوفة قيم متغيّرة ناتجة عن معادالت
للمتحولين min_v , max_vلضمان
ّ أو قراءات من حساسات) نسند أول عنصر من المصفوفة
متحول 0وقد يكون هناك قيم سالبة في المصفوفة
ّ ّ
أن المقارنة صحيحة (القيمة االفتراضية ألي
وبالتالي لن تكون النتائج صحيحة عند حساب القيمة الصغرى).
201
ليكن لدينا القيم التالية:
تمرين :12
A = 5,B = 7,C = 11,D = 12, E = 8
نريد تطبيق العمليات التالية (المخصصة للبت) على القيم السابقة وطباعة النواتج على نافذة
االتصال التسلسلي بالصيغة الثنائية:
202
العمليات السابقة تذكير لنفس العمليات التي تم طرحها في فقرة التعامل مع البت.
203
ليكن لدينا خمسة LEDsمتصلة مع أقطاب لوحة اآلردوينو ذات
األرقام ( )3 , 4 , 5 , 6 ,7والمطلوب تشغيل الليدات وفق األنماط
تمرين :13
التالية:
()B01011,B11010,B00100,B01010,B11000,B00001,B11111
204
حلقتين تكراريتين
يتم في األولى قراءة
قيم مصفوفة القيم ث ّم
توزيع بتّات كل
قيمة على المخارج
من خالل الحلقة
الثانية.....
205
ليكن لدينا مجموعتين من ،LEDsالمجموعة األولى متصلة مع
األقطاب } ،{3,8,11,13أما المجمممممموعة الثانية فمتصمملة مع
تمرين :14
األقطممماب } ،{2,6,7,12والمطلوب كتابة كود برمجي يكون خرج المجموعة األولى القيم
التالية:
أما المجموعة الثانية فتكون نفس القيم السابقة مع عكس حالة البت األول واألخير.
206
نالحظ كيف ت ّم في الحلقة التكرارية توزيع القيم على كال مجموعتي األضواء مع تحقيق الشرط
المطلوب وهو عكس قيمتي البتّ .0 , 4
207
لدينا مجموعة من المفاتيح المتصلة مع األقطاب }{2,3 ,4,5
وهذه األقطاب معرفة كأقطاب دخل دون تفعيل مقاومة الرفع بل يتم
تمرين :15
توصيل مقاومة خفض للمفاتيح (وبالتالي فعند ضغط المفتاح تكون حالة الدخل 1منطقي وعند
عدم ضغط المفتاح تكون حالة الدخل 0منطقي) ،المطلوب قراءة حالة المفاتيح وتحويل القيمة
الثنائية التي تمثلها هذه المداخل إلى قيمة عشرية وطباعة النتيجة على نافذة االتصال التسلسلي
.UART
208
209
ليكن لدينا المصفوفة التالية:
}myArray[10]={9,-8,52,87,12,7 ,-6 تمرين :16
المطلوب كتابة كود برمجي يقوم بإضافة القيمة 5لكل عنصر من
عناصر المجموعة لثالث مرات وفي كل مرة نقوم بحساب متوسط عناصر المصفوفة وطباعة
الناتج على النافذة التسلسلية.
ما زلنا مع تمارين التعامل مع الحلقات وطريقة عملها ...مثال جديد نقوم من خالله بإضافة قيمة
ثابتة لكل عناصر المصفوفة من خالل حلقة forاألولى ،ث ّم نحسب المتوسط الحسابي للمصفوفة
من خالل حلقة forالثانية من خالل جمع عناصر المصفوفة ث ّم خارج الحلقة نقسّم القيمة على
عدد العناصر ومن ث ّم نطبع النتيجة.
210
لنكتب كود برمجي لتشغيل ليد LEDمتصل مع القطب 13من لوحة
اآلردوينو بحيث يتم تشغيل وإطفاء الم LEDمن نفس الكباس
تمرين :17
اللحظي والمتصل مع القطب 3على أال تزيد عدد مرات تشغيل LEDعشر مرات فقط ،مع
وجود كباس لحظي آخر متصل مع القطب 2لتصفير عدد المرات التي تم ضغطها.
211
مرات العمل
في حلقة البرنامج الرئيسية يتم في الشرط األول ifاختبار حالة الكبّاس مع عدد ّ
المتحول ،xأ ّما الشرط الثاني else ifفنستخدمه لتصفير المتغيّر .x
ّ المسجّلة ضمن
212
لدينا كباسين لحظيين متصلين مع القطبين 2 , 3األول لزيادة قيمة
المتحول valبمقدار 2والثاني إلنقاا قيمة المتحول valبمقدار
تمرين :18
،1مع المحافظة على قيمة المتحول valضمن المجال (،)-3 , 8
213
مثال عملي عن استخدام التعليمة )( constrainودورها في تحديد المجال.
214
لدينا مقاومة متغيرة موصولة مع القطب التشابهي A0من لوحة
Arduino UNOكما يوجد لدينا LEDs 10متصلة مع األقطاب
تمرين :19
11 ~ 2والمطلوب:
كتابة كود برمجي يقوم بتشغيل LEDsباالعتماد على النسبة المئوية لقيمة المقاومة (أي كل
10 %من قيمة المقاومة يقابلها تشغيل LEDبحيث يكون مجموع LEDsالتي تعمل متناسب
مع النسبة المئوية للمقاومة).
215
216
بعد تعريف المخارج في حلقة اإلعداد باستخدام حلقة التكرار ،forتضم حلقة البرنامج الرئيسية
)( void loopثالثة توابع ....
التابع )( sensoer_readلقراءة قيمة المقاومـــة المتغيرة وتغيير مجـــال النــــاتج من
يوجد لدينا التابع )( led_offوالذي تقتصر وظيفته على إطفاء جميع األضواء.
أ ّما التابع )( led_onفوظيفته تشغيل األضواء بدءا ً من الضوء المتّصل مع القطب 2وحتى
217
لمميكن لممدينا خمممس مقاومممات متغيممرة (تممؤدي هممذه المقاومممات دور
حساسممممات تشممممابهية) هممممذه الحساسممممات متصمممملة مممممع األقطمممماب
تمرين :20
التشممابهية ،A0 ~ A4كممما يوجممد كبمماس لحظممي متصممل مممع القطممب 2مممن أقطمماب لوحممة
اآلردوينو والمطلوب:
كتابممة كممود برمجممي يحممدد فممي كممل مممرة يممتم فيهمما ضممغط المفتمماح القيمممة الكبممر بممين
قراءات المقاومات المتغيرة.
218
219
لدينا مصدر نبضات مربعة ونريد من خالل األردوينو حساب تردد
تمرين :21
هذه النبضات عبر القطب 9وطباعة القيمة على واجهة االتصال
التسلسلي.
220
الكود البرمجي بسيط وهو تطبيق عملي على استخدام تعليمة قراءة النبضات )(pulseIn
وكيف استفدنا منها في حساب تردد النبضات الداخلة إلى المتحكم ،أ ّما التعليمات الحسابية فهي
لتحويل ناتج قراءة التعليمة )( pulseInوالذي يكون بواحدة usلـ secث ّم أخذ مقلوب القيمة
للحصول على التردد بواحدة ،Hzوأخيرا ً طباعة النتيجة على واجهة االتصال التسلسلي.
221
لدينا حمل يتم التحكم به من خالل ترانزستور عبر نبضات PWM
تمرين :22
من األردوينو ،أما نبضات PWMفيتم قيادتها من خالل مقاومة
متغيرة موصولة على القطب .A0
222
ليكن الحمل عبارة عن ضوء LEDونريد التح ّكم بشدة إضاءته أو س ّخان ونريد التح ّكم بشدته أو
أي حمل .... DCالكود بسيط ويتضمن قراءة المخل التشابهي وتحويل مجال التغيّر للقناة
التشابهية 0 ~ 1023لمجال يتناسب مع نبضة 0 ~255 PWMوبعد تخريج النبضة نعيد
تحويل المجال لنسبة مئوية 0 ~ 100ليتم عرضها على واجهة االتصال التسلسلي كل ذلك
متحول واحد .val
ّ باستخدام
223
لدينا مقاومة متغيرة مربوطة مع الدخل التشابهي ،A0المطلوب
تمرين :23
تحويل قراءة المقاومة إلى خانات عددية منفصلة (عرض خانة األحاد
ثم العشرات ثم المئات ثم األالف) على نافذة السيريل.
224
تتل ّخص فكرة المثال السابق في طريقة استخالص خانات أي عدد والهدف من ذلك التعامل مع
هذه الخانات بشكل مستقبلي وخاصة عند التعامل مع شاشات القطع السبع ، 7Segmentأ ّما
الطريقة فهي عمليات حسابية بسيطة تقوم على القسمة وباقي القسمة ألي عدد ....
225
لدينا كباس لحظي متصل مع القطب A0وثالثة LEDsمتصلة مع
تمرين :24
األقطاب ، 2 , 3 ,4لنكتب كود برمجي يتم فيه تشغيل LEDوإطفاء
الباقي بشكل متنقل (أي الضغطة األولى يعمل الضوء األول فقط ،الضغطة الثانية يعمل الثاني
فقط ،أما الضغطة الثالثة فيعمل الثالث وعند الضغطة الرابعة تنطفئ جميع األضواء).
226
المتحول valبمقدار 1مع كل
ّ يمكن أن نقسّم الكود لعدّة مراحل ففي المرحلة األولى نزيد قيمة
زيادة على الكبّاس اللحظي مع االنتباه ّ
أن قيمته البدائية 2ونتأكد أال تزيد قيمته عن ،5المرحلة
الثانية نطفئ جميع األضواء ،المرحلة الثالثة نشغّل الـ LEDالذي وصل له العدّ بشرط ّأال يكون
الرقم 5والذي سيمثّل قيمة عدم عمل وإطفاء الـ .LEDs
حرية التجريب.
يمكن تنفيذ المطلوب بأسلوب آخر ....نترك لكم ّ
227
ليكن لدينا عدد من المفاتيح المتصلة مع القطب التشابهي A0كما
هو مبين من المخطط التالي ،كما يضم المخطط LEDsمتصلة مع تمرين :25
األقطاب 2,3,4من لوحة األردوينو.
228
229
في المثال السابق تم تصميم مقسّم جهد لكن هذا المقسّم مؤلّف من عدّة مقاومات متّصلة على
التسلسل فيما بينها ومه ّمة كل مفتاح تقوم على قصر جزء من المقسّم وبالتالي تغيُّر قيمة خرج
مقسّم الجهد.
بنا ًء على ما سبق فقد قمنا بقراءة خرج المقسّم مع كل عمليّة ضغط على أحد الكبّاسات ث ّم بناء
جمل شرطية تبعا ً لقيمة المبدّل التشابهي الرقمي لتشغيل األضواء.
230
الفصل الثاني:
المحيطيات ()1
231
مقدمة:
232
إضافة مكتبية لبيئة التطوير :Arduino IDE
يمكن أن نقول ّ
أن المكتبية عبارة عن جملة كبيرة من األوامر والتوابع والهياكل التي يتم تجميعها
وكتابتها بهدف تقديم وظيفة أو عدّة وظائف معاً.
فكما وجدنا خالل تعاملنا مع التوابع كيف اختصـــرت علينا الوقت وســ ّهلت متابعة وتدقيق الكود
البرمجي فاألمر ذاته بالنسبة للمكتبيات.
من أين أحصل على المكتبية؟؟
لنبدأ بالمصدر األساسي وهو إدارة المكتبيات :Manage Libraries
233
ليظهر لنا النافذة التالية:
نكتب اسم القطعة (حساس أو موديول )....التي نتعامل معها بهدف البحث عنها ،فيظهر لدينا
مجموعة كبيرة من الخيارات قد يكون بعضها متشابه في الوظيفة مع اختالف في بعض األدوات
وقد يكون العمل مختلف تماما ً والنتائج التي ظهرت متشابهة في اسم البحث فقط.
للتأ ّكد من اختيار المكتبية الصحيحة نضغط األمر More infoوالتي ستنقلنا لصفحة المكتبية
على موقع GitHubالمجاني والمخصص للمطورين والمبرمجين ....تظهر لنا الصفحة الخاصة
بالمكتبية مع شرح كامل عن محتوياتها وميزاتها والقطع التي يمكن التوصيل معها (أردوينو،
234
بعد اختيار المكتبية المطلوبة نضيفها باألمر ... Install
235
أن خيار إدارة المكتبيّات وإضافتها لن يكون كافيا ً في كثير من الحاالت فقد
لكن حقيقة األمر ّ
نضطر للبحث على النت والحصول على المكتبيات المطلوبة وهنا لدينا طريقة ثانية ألضافتها
وهي اختيار األمر Add .ZIP Libraryأي إضافتها من خالل ملف مضغوط بامتداد .ZIP
بعد ذلك نحدّد مسار وجود المكتبية ونختارها فتتم إضافتها لمسار المكتبيات الخاص بالبرنامج مع
االنتباه أنّه في حاالت يجب إعادة تشغيل البرنامج لتتم العمليّة بشكل صحيح.
236
ماذا تضم المكتبية؟؟؟
لو فتحنا مجلّد أي مكتبيّة لوجدنا أنّها تض ّم ملفين أساسين (باإلضافة لملفّات ّ )TEXT
األول
بامتداد"( "name.cppهو ملف شفرة مصدر مكتوب بلغة ، C ++يحتوي على جميع األكواد
لتشغيل الطرفية) والثاني بامتداد "("name.hيحتوي على متغيرات وثوابت ووظائف يتم
الملف ذو االمتداد " ، ".cppيمكن أن نقول أنه مفاتيح تشغيل المكتبية
ّ استخدامها من قبل
وأوامرها).
كما نجد مجلّد باسم examplesوهو مجلّد أمثلة لتعليم تشغيل المكتبية وهو الذي سيكون حجر
األساس عند تعاملنا مع المكتبيات....
وقد نجد أيضا ّ في مجلّد المكتبية األساسي ملفّات بامتداد pdfأو صور وهي في كثير من األحيان
تكون ضرورية جدا ً ويتم من خاللها شرح طريقة توصيل القطعة وتنبيهات عامة عن مشاكل
مستقر للمكتبية لذلك يجب االطالع على جميع محتوى مجلّد
ّ التوصيل التي تسبّب أداء غير
المكتبية عند التعامل معها.
237
لنل ّخص خطوات إضافة المكتبية وطريقة التعامل معها ضمن الكود البرمجي بالخطوات التالية:
-تضمين المكتبية أو المكتبيات الخاصة بتشغيل الطرفية (بعض القطع تتطلّب إضافة عدّة
مكتبيات حتى تعمل بشكل صحيح).
-االستفادة من الطرفية وتنفيذ التعليمات المتعلّقة بها والذي يكون في أي مكان من الكود
البرمجي لكن بشرط أن يكون بعد تسجيل الخطوات السابقة.
الخطوات السابقة ستتكرر معنا مستقبالً بشكل كبير وفي ك ّل مرة نضيف مكتبية لتشغيل أي طرفية
كانت ،نكتفي بهذا القدر بالحديث عن المكتبيات ونترك طريقة استخدامها من خالل األمثلة المقبلة.
238
لــوحــــــــة المـــــفــاتيــــــــح الســـــــــــــــــــــــت عــشــــــــــــــــــــريــة
Key Pad
في كثير من المشاريع نحتاج لعدد كبير من المفاتيح كبناء آلة حاسبة ،لوحة مفاتيح إلدخال قيم أو
لوحـة اتصــــال للهـاتف وغيرهـا من التطبيقـات ،وفي هـذه الحـالـة لو أردنـا تنفيـذ األمر بـالشــــكـل
التقليـدي (أي وصــــل كـل كبـّاس لحظي مع مـدخـل رقمي من لوحـة األردوينو) فســــيكون لـدينـا
استهالك كبير لألقطاب الرقمية وهذا األمر غير منطقي لذلك ت ّم إيجاد الكثير من البدائل والحلول
أحد هذه الحلول هو لوحة المفاتيح الست عشرية .keypad
تتألّف لوحة المفاتيح السـت عشـرية من سـتة عشـر كبّاس لحظي ،تكون هذه الكبّاسـات مت ّصـلة مع
بعضها كما في الشكل (المفاتيح التي بجانب بعضها تكون أحد أطرافها متصلة مع بعضها مشكلة
بذلك صف ،أما العامود فيتشكل من المفاتيح التي فوق بعضها وبذلك تتشكل هذه اللوحة):
239
يكون لهذه اللّوحة ثمانية أقطاب تمثّل أربعة أســــطر وأربعة أعمدة ،يقوم المتحكم بعملية مســــح
للوحة المفاتيح السـت عشـرية فيتم معرفة المفتاح المضـغوط من خالل معرفة نقطة تقاطع السـطر
مع العمود:
تتوفّر لوحة المفاتيح بعدّة قياســات فقد تكون مؤلّفة من أربعة أســطر بــــــ ثالثة أعمدة وقد تكون
فإن طريقة البرمجة ال تختلف كثيرا ً.
ثالثة أسطر بـ ثالثة أعمدة و...هكذا لكن بالمجمل ّ
240
بالعودة لبيئة التطوير Arduino IDEنجد ّ
أن المكتبية الخاصة بتشغيل لوحة المفاتيح الست
عشرية غير مض ّمنة ويجب إضافتها لبيئة التطوير Arduino IDEوكما تعلّمنا سابقا يتم األمر
يوجد أيضا ً تعليمات إضافية لكن التعليمات السابقة كافية وأي إضافة نريدها يمكن إجراؤها برمجيا ً
242
لنقم بربط لوحة المفاتيح ست عشرية مع األردوينو كما في المخطط التالي ولنطبع ناتج ضغط
أي مفتاح على نافذة السيريل.
243
باتّباع الخطوات التّي حدّدناها عند التعامل مع المكتبية ....نض ّمنالمكتبية للكود البرمجي في بداية
الكود ،ثم ّنحدّد مصفوفة القيم التي ستعيد قيمها لوحة المفاتيح (طبعا ً يمكن تغيير قيم المصفوفة
بما يتناسب مع أي مشروع) ،ث ّم نحدّد البارامترات األساسية للوحة المفاتيح بعد التعليمة
Keypadوتتضمن أبعادها وأماكن توصيل أقطابها ومصفوفة القيم.
أخيرا ً ...يتم قراءة قيمة الكبّاس المضغوط من التعليمة )( getKeyوبما ّ
أن مصفوفة القيم
245
VDD التغذية الموجبة 5v
GND يوصل مع سالب الدارة
Vo قطب التحكم بتباين الشاشة وذلك عبر مقسم جهد
(مقاومة متغيرة بهدف تعديل النصوعية تبعا
لبيئة العرض بهدف الحصول على أفضل أداء).
RS قطب اختيار المسجل.
R/W قطب اختيار نمط الكتابة على الشاشة أو القراءة
منها (يربط مع GNDكون استخدامنا هو
عرض فقط أي كتابة ولن نقوم بالقراءة منها)
En قطب تفعيل/إلغاء تفعيل الشاشة وتكون قيمته 1
منطقي في حال تغيير البيانات على الشاشة.
D0 ~ D7 أقطاب دخل للبيانات (سنستخدم األقطاب 4 ~ 7
فقط لتقليل عدد األقطاب المستهلكة من
األردوينو)
A&K أقطاب LEDاإلضاءة الخلفية للشاشة
الضروري لوضوح العرض ،ويتم إضافة مقاومة
حماية له 1kRمع ربط طرفيه مع & Vcc
GNDمن لوحة األردوينو.
246
باالستفادة من المالحظات المتعلّقة بعمل أقطاب الشاشة يكون لدينا توصيل الشاشة مع األردوينو:
247
أن األقطاب المتّصلة مع األردوينو هي أقطاب البيانات D4 ~ D7باإلضافة لقطب التفعيل
نالحظ ّ
ENوقطب اختيار المسجّل ،RSكما ننتبه لوجوب ربط القطب R/Wمع األرضي ،GNDكما
يفضّل ربط باقي األقطاب من الشاشة مع األرضي .GND
الكرستالية للكود.
LiquidCrystal تحديد األقطاب التي تم توصيل الشاشة إليها
;)lcd(RS,E,D4,D5,D6,D7 على لوحة األردوينو مع المحافظة على هذا
الترتيب لألقطاب (يمكن استخدام أي قطب
رقمي وال يوجد توصيل محدد).
تحديد أبعاد الشاشة في قسم التهيئة ،وذلك
;)lcd.begin(cols,rows بتحديد عدد األعمدة colsواألسطر .rows
;) (lcd.print طباعة البيانات على الشاشة ،متحوالت
وعبارات.
;) (lcd.write طباعة العبارات فقط على الشاشة.
248
;)lcd.setCursor(col,row وضع مؤشر الكتابة في الموضع المحدد
بالسطر والعمود على اعتبار أن السطر
األول والعامود األول يحمالن الرقم .0
;) (lcd.clear مسح الشاشة.
;) (lcd.blink جعل المؤشر في حالة خفقان.
;) (lcd.noBlink إيقاف خفقان مؤشر الكتابة.
;) (lcd.cursor تشغيل المؤشر.
;) (lcd.display تشغيل الشاشة.
;) (lcd.noDisplay إطفاء الشاشة.
;) (lcd.rightToLeft تحديد جهة الكتابة من اليمين إلى اليسار.
;) (lcd.leftToRight تحديد جهة الكتابة من اليسار إلى اليمين.
;) (lcd.autoscroll تمرير النص خانة نحو اليمين.
;))(lcd.write(Serial.read طباعة البيانات التي تصل من النافذة
التسلسلية على شاشة العرض الكرستالية.
بعد عرض جملة التعليمات السابقة نكون قد وصلنا لدرجة كافية من معرفة عمل الشاشة وتشغيلها
واالستفادة الكاملة من كل خصائصها وتسخيرها الحقا في مشاريعنا ،وسندعم هذه التعليمات
بجملة من األمثلة التي توضح آلية عمل هذه التعليمات.
249
لنكتب كود برمجي نشغل من خالله الشاشة الموصلة بالمخطط السابق ونعرض عليها بعض
العبارات والمتغيرات.
ض ّمنا المكتبية في بداية الكود البرمجي ث ّم أوجدنا جسم من الشاشة باالسم ( lcdاالسم اختياري)
وحدّدنا أقطاب ربط الشاشة مع لوحة األردوينو ،أ ّما في حلقة اإلعداد )(void setup
الشاشة في طباعة القيم المتغيّرة والعبارات الثابتة مع تغيير موقع الكتابة على الشاشة عبر التعليمة
).lcd.setCursor(y,x
250
لننتقل لفكرة جديدة وهي طريقة بناء رموز وأشكال ث ّم عرضها على الشاشة ،لكن بداية لو نظرنا
للشاشة عن قرب لوجدنها بالشكل التالي:
251
ّأول خطوة نقوم بها هي تحويل الرمز المطلوب تشكيله لمصفوفة قيم وكما نالحظ يجب أن تكون
معرفة بالنوع ،byteوتكتب قبل حلقة اإلعداد....
المصفوفة بـ 8عناصر ّ
بعد ذلك ننشأ رمز عبر التعليمة ;) lcd.createChar(n, ArrayNameوالتي
تضم متغيّرين األول nيعبّر عن رقم الرمز المنشأ ويكون ضمن المجال ( 1 ~ 8أي لدينا
الصالحية بتشكيل ثمانية رموز فقط) ،بينما القيمة الثانية فتمثّل شكل الرمز الذي تحويله لمصفوفة
قيم (نكتب اسم المصفوفة فقط).
آخر عملية وهي استدعاء الرمز تكون باستخدام التعليمة ;) lcd.write(nوالتي نكتب
داخلها فقط رقم الرمز ،ويجب أن يحدّد مكان طباعة الرمز قبل االستدعاء عبر التعليمة
) lcd.setCursor(y,xوإال فلن يظهر الرمز.
252
يتوفر في الســوق نوع جديد من شــاشــة العرض الكرســتالية يكون على الشــاشــة قطعة يتم من
خاللها مخاطبة الشـاشـة عبر البروتوكول ( I2Cوالذي سـوف نتحدث عنه الحقا في الجزء الثاني
من ســلســلة "األردوينو كما لم تعرفه من قبل") والذي يختزل عدد األقطاب الواجب وصــلها مع
لوحـة اآلردوينو من 6أقطـاب في الطريقـة التقليـديـة إلى قطبين فقط ( SDL & SCLوهمـا
أقطاب البروتوكول )I2Cوهذا التوصـــيل الجديد أعطى للشـــاشـــة ميزة جديدة وهي تقليل عدد
أقطاب التوصيل.
253
شاشة القطع السبع 7 Segment
تعتبر شــــاشــــات القطع الســــبع إحـدى أبرز
الشــاشــات اســتخداما ً في المشــاريع الصــناعية
والتجـاريـة بســــبـب كفـاءتهـا في العمـل وعمرها
الطويـل بـاإلضـــــافـة لقـدرتهـا على العمـل في
العـديـد من ظروف العمـل الصــــعبـة كـدرجـات
الحرارة العــاليــة أو العمــل في ظروف بيئيــة
متغيّرة ،أيضــــا ً تعتبر رخيصــــة جـدا ً وتتوفّر
بأشكال وأحجام مختلفة.
بـاالنتقـال لطريقـة برمجتهـا وربطهـا مع األردوينو فتعتبر ذات صــــعوبـة أكبر من نـاحيـة البرمجـة
مقارنة بغيرها من الشـاشـات كما تقدّم خيارات محدودة جدا ً في العرض فهي تسـتطيع فقط عرض
األرقام 0 ~ 9باإلضافة لبعض األحرف والرموز األخرى.
بما ّ
أن البنية األساسية لشاشات القطع السبع هي LEDsلذلك نجد نوعين لهذه الشاشات هما:
▪ مهبط مشترك :تكون مهابط LEDsموصولة مع بعضها ويتم التح ّكم بـ المصاعد.
▪ مصعد مشترك :تكون مصاعد LEDsموصولة مع بعضها ويتم التحكم بـ المهابط.
254
ومعرفة نوعية الشــاشــة المســتخدمة شــيء ضــروري وذلك لكتابة الكود البرمجي ،فعندما تكون
الشــاشــة مهبط مشــترك ال تعمل الشــاشــة إال إذا تم تغذية القطب المشــترك 0منطقي وإعطاء 1
منطقي للقطعة المطلوب تشـغيلها ،أما إذا كانت مصـعد مشـترك فيجب تغذية القطب المشـترك 1
منطقي حتى تعمل الشـاشـة وإعطاء 0المنطقي للقطعة المراد تشـغيلها ويتم الكشـف عن ذلك عبر
مقياس الفولط واختبار الشاشة أو بالعودة للوثيقة الفنية للشاشة عبر الرقم المطبوع عليها.
نالحظ أيضا ً كيف ت ّم ترميز كل LEDبحرف بدءا ً من الحرف aوانتها ًء بـ gمع وجود الفاصلة
العشـرية والتي تر ّمز أحيانا ً بــــ ـ ،hهذا الترميز اصـطالحي لتسـهيل التعامل مع قطع الشـاشـة،
ســنســتخدم هذه الرموز للداللة على القطعة التي تعمل من التي ال تعمل من أجل الحصــول على
األرقام والرموز على الشاشة.
255
لنفترض أنّنا نتعامل مع شاشة ذات مهبط مشترك ( أي يجب أن نغذّي الـ LEDبـ 1منطقي حتى
يعمل) وبالتالي وحتى تظهر لدينا األرقام على الشاشة يجب أن نضيء القطع بالترتيب التالي:
256
اآلن لنجرب تشغيل شاشة 7segment – comon cathodمع لوحة األردوينو لعرض
األرقام بشكل متتالي ،وليكن توصيل األقطاب كما هو واضح في المخطط التالي:
257
258
فكرة الكود تقوم على عمل حلقتي forمتداخلتين ،حيث تقوم األولى باستدعاء القيمة المطلوب
عرضها على الشاشة من مصفوفة القيم ] ،seg_val[iبينما تقوم المصفوفة الثانية بتوزيع
بتّات هذه القيمة على المخارج الرقمية والتي تمثّل أقطاب الشاشة فتقوم بتشغيل LEDالمطلوب
وإطفاء LEDsالغير مطلوبة ليت ّم بذلك عرض القيم على الشاشة.
تعتبر شاشة العرض 7 segmentتطبيق عملي عن استخدام تعليمات التعامل مع البتّ (سبق
وطرحنا أمثلة مشابهة لكن كان الخرج عبارة عن LEDsعشوائي أ ّم هنا فأصبح العمل ذو فائدة).
نالحظ وجود مقاومات على أقطاب الشاشة وهذه المقاومات ضرورية لحماية ديودات اإلصدار
الضوئي للشاشة من طرف ولحماية األقطاب الرقميّة من طرف آخر ،أ ّما عن قيمة هذه المقاومة
فتتعلّق بحجم الشاشة وك ّمية استهالك كل LEDلألمبير ،ففي الشاشات الصغيرة تمثّل كل خانة
بـ LEDواحد بينما في الشاشات الكبيرة تمثّل كل خانة بعدد من الـ LEDsوبالتالي يصبح
االستهالك أكبر للتيار الكهربائي وال يمكن وصلها بشكل مباشر مع لوحة األردوينو بل نحتاج
للتح ّكم بكل خانة من خانات الشاشة بترانزستور.
بما أننا نتعامل مع شاشات صغيرة فيكفي تركيب مقاومة قيمتها 250Rعلى كل قطب من أقطاب
الشاشة ،لك ن قد تجد في بعض التجارب وصل مقاومة واحدة على القطب المشترك بقيمة كبيرة
قوة إضاءة الشاشة ستختلف تبعا ً لعدد القطع التي تعمل نسبيا ً هذا األمر ممكن لكن من السلبيات ّ
أن ّ
معا ً وال أنصح باستخدام هذه الطريقة في المشاريع التجارية أ ّما مخبريا ً فال بأس بذلك.
بالنسبة للتوصيل السابق نجد ّ
أن الشاشة كانت من نوع سالب مشترك لكن ماذا لو أردنا تغيير
الشاشة للنوع موجب مشترك؟؟
األمر بسيط ...بالنسبة للتوصيل ننقل فقط وصل القطب المشترك من GNDإلى Vccأ ّما برمجيا ً
فاألمر أكثر بساطة ،نضيف عمليّة عكس لحالة المتغيّر bit_valقبل إدخاله للتعليمة
)( digitalWrite(display_pin[j], bit_valالحظ كيف ت ّم تعليق عملها في
الكود السابق).
259
لعلّك صادفت خالل بحثك أو دراستك لشاشة القطع السبع 7 Segmentشاشات بأكثر من خانة
فقد تجد شاشة بخانتين أو ثالثة أو أربعة ....وهكذا ولع ّل ّأول سؤال تبادر لذهنك هو كيف تتم
عملية البرمجة في هذه الحالة؟؟؟
حتى نستطيع برمجة الشاشات بأكثر من خانة يجب أن ندرك أوالً بنيتها الداخلية ،فلو أخذنا مثالً
260
تعتمد الشركات المصنّعة على ربط القطع المتماثلة لجميع الخانات أي ربط القطعة Aللشاشة
األولى مع Aللشاشة الثانية وكذلك األمر بالنّسبة لبقية القطع فيصبح المخطط الكهربائي للشاشة
على النحو التالي (نفس األمر في حال كانت الشاشة 3أو :).... 4
وبالتالي وحتى يعمل Aللخانة 1يجب أن نعطيه الموجب من األردوينو باإلضافة للسالب الخاص
بالخانة ويتم ذلك عادة بالتحكم بقطب الخانة عبر ترانزستور متناسب مع نوع الشاشة (موجب
مشترك أم سالب مشترك).
لكن كيف يتم عرض رقم مؤلف من خانتين على الشاشة بنفس الوقت؟؟
األمر يعتمد على الخداع البصري للعين ،فكما هو معلوم ّ
فإن العين البشريّة تصبح عاجزة عن
إدراك التغيّرات في التردّدات التي تزيد عن 50Hzلذلك يتم تشغيل خانات الشاشات بشكل متتالي
بتردد 50Hzأو يزيد م ّما يعطي انطباع وكأن جميع الخانات تعمل معاً ،سنطرح مثال عن طريقة
تشغيلها في نهاية الفصل إن شاء هللا.
261
القبضة التشابهية ذات المحورين X & Y
المرات المقاومة المتغيّرة والتي كانت تقوم مقام مقسّم جهد عند توصيلها
مر معنا في العديد من ّ
ّ
حولنا الطريقة الفيزيائية لتحريك المقاومة
بشكل محدّد مع أقطاب التغذية ،Vcc , GNDماذا لو ّ
المتغيّرة ألسلوب قبضة التح ّكم والتي نجدها في التح ّكم بألعاب الفيديو واستفدنا منها في تحريك
لنتعرف معا ً على قبضة التح ّكم التشابهية.
ّ الروبوتات أو الكاميرات أو غير ذلك ...
وهي عبارة عن مقاومتين متغيّرتين (بقيمة )10kRمتموضعتين بشكل متصالب يتم توصيل كل
واحدة منهما على شكل مقسم للجهد (للمقاومة المتغيرة ثالثة أقطاب أحد هذه األقطاب يوصل مع
التغذية واآلخر مع األرضي أما المتغير منهما مع أحد أقطاب التشابهية من لوحة اآلردوينو)
بحيث تمثّل إحداهما المحور Xبينما تعبر الثانية عن المحور ،Yوما يميّز بنيتها وجود نابض
يعيد القبضة للمنتصف بعد أي عملية تحريك كما تحتوي كباس لحظي يضغط نحو األسفل من
والهدف منها تأمين حركة تناظرية على المحورين X , Yم ّما يتيح استخدامها في العديد من
المحركات.
ّ صة عند التعامل مع
المشاريع وخا ّ
262
VDD التغذية الموجبة 5v
263
نصل اآلن لوصل القبضة التشابهية مع لوحة األردوينو ....لنصل المخارج التشابهية للقبضة
مع المداخل التشابهية A0 , A1ولنوصل الكباس اللحظي للقبضة التشابهية مع القطب
الرقمي .8
264
فكرة الكود بسيطة جدا ً وهي عمليّة قراءة المداخل التشابهية وطباعة ناتج التحويل التشابهي.
265
ليد األلوان الثالثة RGB LED
ليد األلوان الثالثة أو ما يعرف باالختصار
RGB LED: Red Green Blue LED
وهو عبارة عن مجموع ثالثة LEDsفي قطعة
واحدة ،ألوان هذه LEDsهي األحمر و األخضر
و األزرق ويكون لهذه األضواء نوعين حسب
طريقة تجميع توصيلها ،فقد يتم تجميع المهابط
( )Cathodesمع بعضها والتحكم باألضواء يتم
عبر المصعد ( )Anodeالخاص بكل LEDأو يتم تجميع المصاعد ( )Anodesمع بعضها
والتحكم باألضواء يتم عبر المهبط ( )Cathodeالخاص بكل ،LEDالشكل التالي يبين طريقة
تجميع هذه :LEDs
إن طريقة بناء هذه األضواء يوفّر العديد من الميزات ففي حاالت معينة قد نضطر الستخدام عدة
LEDsبعدة ألوان فتقوم هذه الليدات بتوفير مساحة على البورد مع تقديم نفس الوظيفة المطلوبة،
266
وليس هذا فقط بل يمكن توليد العديد من األلوان وذلك بتشغيل ليدين معا فنحصل على ألوان
إضافية أو الحصول على اللون األبيض عند تشغيل الليدات الثالثة ،كما يمكن الحصول على
ألوان أخرى متعددة من خالل استخدام خاصية التحكم بعرض النبضة أو ما يعرف باالختصار
PWM: Pulse Width Modulationحيث يتم توليد نبضات بنسب متفاوتة على أقطاب
الليدات والذي ينتج عنه ألوان بتدرجات مختلفة تبعا لعرض النبضة المطبقة.
لتشغيل الـ LEDال ننس توصيل مقاومة حماية على أقطاب الليدات تكون قيمتها 220Rوذلك
عند توصيلها بشكل مباشر مع لوحات اآلردوينو.
267
ليكن لدينا RGB LEDمتصل مع األقطاب 11 , 10 , 9من لوحة األردوينو ،لنكتب كود
برمجي يتحكم بعرض النبضة للتحكم باأللوان على .LEDs
268
يضم الكود تابع فرعي )( setColorله ثالث قيم دخل ...هذه القيم ّ
توزع على مخارج
PWMللتحكم بدرجة لون الضوء.
269
األضواء RGB LEDذات العنوان المتحكم به.
تعرفنا في الفقرة السّابقة على RGB LEDوكيفيّة استخدامها في توليد أضواء ذات ألوان متعدّدة
ّ
لتشكيل جميع ألوان ّ
الطيف المرئي اعتمادا ً على درجة مزج نسبة كل لون من هذه األلوان ،اآلن
ستعرف على تطوير لهذه األضواء من ناحية التح ّكم وهي استخدام دارة متكاملة موجودة بداخل
ّ
كل RGB LEDليتم التحك ّم بعمل كل قطعة RGB LEDعلى حدا وذلك من خالل خط بيانات
واحد فقط ،يوجد أنواع متعدّدة وتختلف فيما بينها في نوع دارة التح ّكم الموجودة ضمن RGB
ونتعرف على طريقة عمل
ّ ،LEDسنأخذ النّوع الذي يحتوي على الدّارة التكامليّة WS2812B
هذه األضواء من خالل األردوينو.
سنحتاج إلضافة المكتبيّة FastLEDوالتي تتميّز بسهولة كبيرة في التعامل معها ويتم من خاللها
التح ّكم بأي LEDودرجة لونه وطريقة عمله.
272
نضيف المكتبيّة في بداية الكود البرمجي ونحدّد عدد قطع LEDsالمستخدمة (وليكن 20قطعة)،
ونحدّد قطب التح ّكم على لوحة األردوينو وهنا استخدمنا القطب ( 5يمكن استخدام أي قطب)،
نوجد جسم من المكتبيّة ونسميه مثالً ،ledsث ّم في حلقة اإلعداد يتم ضبط ك ّل البارامترات المتعلّقة
بتشغيل شريط LEDsوأخيرا يمكن تشغيل أي LEDبتحديد عنوانه ودرجة اللون المطلوبة علما ً
ّ
أن العنوان يبدء من .0
273
لغة C++من جديد
كنا قد درسنا في الفصل األول المتحوالت وأنواعها المختلفة لكن هناك الكثير من العمليات
والتحويالت البرمجية التي البد من االطالع عليها لكي يكون للمبرمج أريحية كبيرة في تعديل
الكود البرمجي والتعامل مع كل الحاالت التي ستقابله أثناء عملية تحضير الكود البرمجي ،لذلك
التحويالت :Conversion
تستخدم هذه التعليمات لتحويل نوع المتحول المطلوب لنوع جديد بما يتناسب مع االحتياجات
البرمجية.
التعليمة الشرح
)byte(x تحويل المتحول xإلى النوع byte
النوع القديم للمتحول xغير مهم في عمليات التحويل السابقة ،فلن تواجهنا أي مشكلة عند التحويل
بين األنماط الرقمية المختلفة ،أ ّما وعند التحويل من قيمة محرفية لقيمة رقمية فسوف يكون الناتج
هو رقم يدل على قيمة ASCIIللقيمة المحرفية التي تم تحويلها للقيمة الرقمية وهنا نحن بحاجة
لتعليمات تحويل جديدة.
274
تعليمات خاصة بالتحويل المحرفي للرقمي وبالعكس:
التعليمة شرح التعليمة
)(stringName.toInt لتحويل السلسلة لرقم صحيح بشرط أن
//exp تكون قيم السلسلة أرقام حصرا ،أما ناتج
;"String val_in = "125
;long v
التحويل فهو من نوع .long
;)(v = val_in.toInt أما إذا كانت السلسة تبدأ بأرقام وتنتهي
;v = v + 205
بأحرف فإن هذه التعليمة تعيد فقط األرقام
Serial.print(v); // 330
التي في بداية السلسلة.
)stringName.charAt(n للحصول على محتوى العنصر nمن
//exp السلسة ،stringNameعلما أن n
;"String val_in = "12ML
;))Serial.println(val_in.charAt(2
يبدأ من القيمة ،0أما الفراغ spaceفيأخذ
// M بعين االعتبار أيضا.
للسلسلة ;)stringName.concat(parameter ما عنصر إلضافة
//exp
stringNameوال يشترط نوع محدد
276
التعريفات والنطاق للمتحوالت :Variable Scope & Qaulifiers
وهي عبارة عن تعليمات تكتب قبل تعريف نوع المتحول وتستخدم لتحدد طبيعة المتحول في
الكود البرمجي أهم هذه العمليات:
التعليمة الشرح
;const type name = value تستخدم التعليمة constإلعطاء قيمة ثابتة
;const float pi = 3.14
للمتحول بحيث ال يمكن تغييرها الحقا داخل
الكود ،أي يصبح هذا المتحول للقراءة فقط.
;static type name تستخدم التعليمة staticلجعل المتحول
خاص بتابع معين وبالتالي ال يمكن استدعائه أو
;static int place
إجراء أي عملية عليه خارج التابع الموجود فيه.
277
تمارين الفصل الثاني
لدينا لوحة مفاتيح keypadمتصلة مع لوحة األردوينو من األقطاب
،2 ~ 9كما يوجد شاشة LCDمتصلة مع األردوينو من خالل تمرين :1
األقطاب ،A0 ~ A5والمطلوب كتابة كود برمجي يتم من خالله طباعة
قيمة المفتاح المضغوط على الشاشة.
278
تصور عن كيفية تشغيل أكثر من محيطية مع لوحة
ّ من خالل هذا الكود نكون قد بدأنا نبني
األردوينو إذ أنّنا في المثال السابق دمجنا خطوات تشغيل لوحة المفاتيح keypadمع شاشة LCD
حولنا طباعة قيمة المفتاح باتجاه الشاشة مع الطباعة على واجهة السيريل.
وفي النهاية ّ
279
لدينا RGB-LEDمتصل مع لوحة األردوينو عبر األقطاب
( 9,10,11أقطاب ،)PWMكما يوجد لدينا قبضة تشابهية متصلة تمرين :2
مع المدخلين التشابهين A0 , A1باإلضافة للكباس الخاا بالقبضة
فمتصل مع القطب .A2
المطلوب كتابة كود برمجي نستطيع من خالل المداخل الثالثة ( A0 , A1التشابهين وA2
الرقمي) التحكم بدرجة كل لون من ألوان RGB-LEDللحصول على مزيج لوني (كل مدخل
مسؤول عن مخرج.)...
280
األول لقراءة المقاومات المتغيّرة على
في الحلقة الرئيسية يوجد تابعين أساسيّين لعمل الكودّ ،
القبضة التشابهية مع حالة الكبّاس اللحظي ،أ ّما التابع ;)( setColorفيتم من خالله التح ّكم
بدرجة كل لون عبر نبضات PWMمتح ّكم بها من خالل القبضة التشابهية.
281
لدينا لوحة مفاتيح keypadمتصلة مع لوحة األردوينو من األقطاب
،2 ~ 9باإلضافة لمجموعة من LEDsمتصلة مع المخارج الرقمية تمرين :3
،10 ~ 19المطلوب كتابة كود برمجي بحيث يكون كل رقم من لوحة
المفاتيح الست عشرية مسؤول عن تشغيل LEDمقابل له ،أما األمر * فمسؤول عن تشغيل
كل األضواء واألمر #إلطفائها.
282
283
بعد إضافة المكتبية الخاصة بتشغيل لوحة المفاتيح ،keypadث ّم إضافة كل التعليمات المطلوبة
لعملها بشكل صحيح.
في حلقة البرنامج الرئيسية يتم اختبار حالة لوحة المفاتيح ومن ث ّم تشغيل الـ LEDsتبعا ً للقيمة
المستقبلة من لوحة المفاتيح باستخدام الجملة الشرطية )(. switch
284
لدينا حساس حرارة LM35متصل خرجه مع القطب A0من لوحة
األردوينو ،كما يوجد لدينا موديول ريليه مزدوج متصل مع القطبين
تمرين :4
،6 , 7وأخيرا لدينا شاشة LCDمربوطة مع لوحة األردوينو عبر األقطاب ،2~5,11,12
المطلوب كتابة كود برمجي يتم فيه عرض درجة الحرارة على الشاشة وفي حال كانت الحرارة
أكبر من 35يتم تشغيل Relay_1مع التنبيه على الشاشة ،أما إذا كانت درجة الحرارة أصغر
من 15oفيتم تشغيل Relay_2مع التنبيه على الشاشة.
285
286
األول لكن مع إضافة شاشة عرض كرستالية
فكرة الكود ت ّم طرحها في المثال الثامن من الفصل ّ
وعرض درجة الحرارة عليها ،ت ّم تعريف متغيّرين flage_H , flage_Lتتغير حالتهما
تبعا ً لعمل الريليه والتي بدورها متعلّقة بتغير درجة الحرارة.
287
ليكن لدينا شاشة 7segmentبخانتين من نوع سالب مشترك يتم
توصيل أقطاب القطع مع األقطاب ،2 ~ 9بينما يتم التحكم بالخانة
تمرين :5
األولى من القطب 10والتحكم بالخانة الثانية من القطب ،11أيضا يوجد كباسين لحظيين
متصلين مع القطبين A0 , A1والمطلوب:
كتابة كود برمجي يتم من خالله زيادة أو إنقاا الرقم ضمن المجال 0 ~ 99وعرضه على
الشاشة.
288
ي كود سابق ....نقوم في بداية الكود بتعريف أماكن وصل أقطاب الشاشة م ّما يس ّهل عمليّة
كأ ّ
التعديل على الكود في حال تبديل الشاشة ،ث ّم نضيف مصفوفة ألقطاب قطع الشاشة ومصفوفة
لألرقام التي ستعرض على الشاشة لكن بالصيغة الثنائية ،مع تعريف متغيّرات سنحتاجها ضمن
الكود البرمجي الحقاً.
289
نحدّد ضمن حلقة اإلعداد طبيعة كل قطب رقمي مستخدم في التجربة مع تفعيل واجهة االتصال
التسلسلي.
األول )(buttons_control
أ ّما حلقة الكود الرئيسي فتضم تابعين رئيسيين فقطّ ...
المتحول valزيادة أو إنقاص تبعا ً للكبّاس المضغوط،
ّ لقراءة حالة الكبّاسات وبالتالي تغيير قيمة
أ ّما التابع الثاني )( display_workفيتم من خالله عرض خانات الرقم على الشاشة.
290
291
مشروع الفصل :مؤقت تنازلي بأربع خانات باستخدام شاشة
7segment
تقوم فكرة المشروع على بناء مؤقت تنازلي يبدأ العد عند الضغط على مفتاح SET / START
وعند الوصول لنهاية العد يقوم بتشغيل الحمل لمدّة محدّدة ثم يتوقف ،الهدف من هذا المشروع
هو تعلم كيفية التعامل مع شاشات القطع السبع ذات الخانات المتعدّدة وكيفية العرض عليها،
فالتعامل مع هذه الشاشات يتطلب بالدرجة األولى فهم البنية الداخلية للشاشات المراد تشغيلها ،ثم
فهم كيفية ربطها مع المتحكم للحصول على أفضل أداء.
الشكل التالي يبين كيفية توصيل الشاشة مع األردوينو (يمكن فصل األقطاب لقسمين األول تحكم
والذي من خالله نحدد الشاشة التي تعمل من الشاشة التي ال تعمل والثاني للعرض والذي من
خالله نحدد الرقم الذي نريد عرضه ،أما ترتيب األقطاب فليس مشكلة ألن أمر العرض والتح ّكم
يتم برمجيا وبالتالي ال داعي ألن تكون التوصيالت متسلسلة) ،كما يوجد ثالثة كبّاسات لحظية
للتح ّكم حيث سيكون أحدها للضبط ولبدء التشغيل بينما الكباسين المتبقّيين فلزيادة القيمة أو إنقاصها
عند الضبط.
سنعرض على أول خانتين من الشاشة (األقل أهمية) الثواني بينما سيتم عرض الدقائق على
الخانتين المتبقيتين وبالتالي سيكون أقل وقت هو دقيقة واحدة وأكبر وقت هو 99دقيقة.
يمكن إضافة زمور Buzzerمع أحد األقطاب المتبقّية من لوحة األردوينو وضبطه ليعطي صوت
مع كل ثانية وللعمل المستمر عند تشغيل الحمل في نهاية الوقت أو ممكن أن نجعله يعكي صوت
في الثّواني األخيرة من العدّ للتنبيه ّ
بأن العد وصلة للنهاية.
لنتابع معا ً كيفيّة بناء وتجميع هذا المشروع ولنتعلّم معا ً طريقة التفكير لح ّل الفكرة وتحويلها لكود
برمجي.
292
ّ
مخطط التوصيل أنّنا استخدمنا ترانزستورات نوع NPNللتح ّكم بخانات الشاشة على نالحظ من
ننوه ألمر مه ّم وهو ّ
توزع أقطاب اعتبار ّ
أن الشاشة التي نتعامل معها من نوع سالب مشترك ،كما ّ
الشاشة فقد تختلف طريقة توزيع بعض األقطاب بين أنواع الشاشات المتوفّرة في السوق لذلك
يجب التأ ّكد قبل استخدام الشاشة حتّى يعمل المشروع بشكل سليم.
293
الكود البرمجي:
عرفنا في بداية الكود البرمجي أماكن توصيل أقطاب الشاشة إلى لوحة األردوينو وكذلك توصيل
ّ
صة بالشاشة باإلضافة إلى كبّاسات التح ّكم ،كما أضفنا مصفوفة قيم تمثّل األرقام التّي
الخانات الخا ّ
سيت ّم عرضها على الشاشة مع التنبيه ّ
أن هذه المصفوفة تعرض الرقم دون تشغيل الفاصلة
العشرية.
294
نكرر المصفوفة السابقة مع تفعيل البتّ الخاص بتشغيل الفاصلة العشرية ،ث ّم نكتب جملة من
ّ
المتغيّرات التي سنحتاجها ضمن الكود البرمجي...
في حلقة اإلعداد نحدّد طبيعة أقطاب المشروع مع تفعيل واجهة االتصال التسلسلي واالستفادة منه
في اختبار أقسام الكود المختلفة.
295
األول لضبط الوقت
ّ نصل لحلقة البرنامج الرئيسية والتي تضم ثالثة توابع رئيسية
)( set_timeالثاني لتشغيل المؤقت )( timer_workبينما وظيفة الثالث هو عرض
قيمة الوقت على الشاشة )(.display_work
كما تض ّم الحلقة الرئيسية عمليّة تجزئة قيم الوقت إلى خانات مستقلّة لتسهيل عمليّة توزيع الخانات
على الشاشة.
نبدأ بتابع تشغيل الوقت وهو تابع يغيّر متغيّرات الزمن ك ّل ثانية.
296
297
تابع ضبط الوقت يتم من خالله ضبط قيمة الدقائق المطلوبة عبر كباسات الزيادة واإلنقاص ،مع
حصر قيمة الدقائق ضمن المجال ].[1 - 99
298
299
في التابع )( display_workيتم تشغيل الخانات بالتتالي بفارق زمني قدره 5msوالهدف
من هذا الفاصل ّ
الزمني القصير هو تأمين خداع بصري لخداع العين البشريّة ولكي نعطي انطباع
شاشات تعمل كلّها بنفس الوقت.
بصري بأن ال ّ
300
الفصل الثالث:
محركات التيار المستمر ...أنواعها ...التحكم بها
301
مقدمة:
المحركات والتي تعتبر القسم الميكانيكي الذي يدعّم المشاريع االلكترونية ويت ّممها ،فال بدّ من
ّ
وجود أحد أنواع المحركات في مشاريع الروبوتات بأنواعها أو أذرع التح ّكم والنمذجة وغير ذلك
من األفكار والمشاريع التطويرية ،ونظرا ً لتعدّد المهام واختالف طريقة أدائها كان ال بدّ من توفّر
المحركات واالستفادة من المزايا والخصائص التي يقدّمها كل نوع منها بما
ّ العديد من أنواع
يتناسب مع فكرة المشروع المراد تجميعه.
محركات
محركات ّ Brushless
ننتقل بعد ذلك لنوع مختلف من حيث البنية وطريقة القيادة وهي ّ
عديمة الفحمات والتي بدأت تجد رواجا ً واسعا ً في العديد من المجاالت الصناعية وخا ّ
صة مجل
السيارات الكهربائية باإلضافة لمجال الطائرات المسيّرة وغير ذلك من المجاالت وسنجيب عن
المحركات وسبب انتشارها الواسع مؤ ّخراً.
ّ كثير من األسئلة عن هذه
ولكي يستمر الملف الوسطي في الدوران فيلزم عكس التيار فيه كل نصف دورة وهذا يتم بواسطة
يتم ذلك عبر ما يعرف بجسر ... Hلننظر معا لمخطط التوصيل التالي:
304
المحرك) ،اآلن لو استبدلنا المفاتيح الميكانيكية بمفاتيح الكترونية أي
ّ معا ً وإال فلن يدور
ترانزستورات (طبعا ً األمر ليس بهذه السهولة ّ
ألن موقع الترانزستور من الحمل يحدّد نوع
الترانزستور وبالتالي طريقة تفعيله) وت ّم التح ّكم بهذه المفاتيح االلكترونية عن طريق األردوينو
المحرك
ّ المحرك وبهذا نكون فهمنا مبدئيا ً كيف يتم تغيير جهة دوران
ّ فسوف نتح ّكم بجهة دوران
بمحرك التيّار المستمر (جهة دوران وسرعة) واضح ،ننتقل اآلن لتطبيق
ّ م ّما سبق أصبح التح ّكم
هذا األمر والذي سوف يتم من خالل دارات تح ّكم جاهزة (لن نخوض في تفاصيل تصميم دارة
H – Bridgeفليس هذا مبحثنا وسنعتمد على الدارات المتوفّرة في السوق).
305
دارة القيادة :L298N
تتميّز الدارة التكاملية L298Nبالعديد من الميّزات الفنّية والتصمي ّمة إذ تض ّم في بنيتها الدّاخلية
دارتي H-Bridgeمع عدّة أنماط حماية ،نالحظ األقطاب الكثيرة لهذه الدّارة التكامليّة ولو اطلعنا
على الوثيقة الفنّية لها لوجدنا أنّها تحتاج العديد من القطع لكي تعمل بشكل صحيح.
ولسهولة التعامل معها أصبحت تتوفّر على شكل موديول يحتوي على مجموعة ديودات حماية
المحرك كما يض ّم الموديول ّ
منظم جهد لتأمين 5vللقسم ّ من التّيارات العكسية الناتجة عن ملف
المنطقي في الدارة ،L298Nأيضا ً يوجد مجموعة مكثّفات لالستقرار العام في الموديول
وعناصر إضافية لعمل الموديول.
306
Vcc جهد التغذية للمحرك 5 ~ 35vباإلضافة لمصدر جهد
لمنظم الجهد الداخلي والذي سيؤمن مصدر 5vللقسم
المنطقي من الموديول.
GND األرضي المشترك
5v يكون خرج 5vفي حال كان الجسر الخاا به موصول،
أما لو كان غير متصل فيكون قطب دخل 5vمن األردوينو
لتغذية القسم المنطقي من الموديول.
ENA تفعيل الخرج OUT1 & OUT2إما بنبضات PWM
أو من خالل التحكم المنطقي ( 1يعمل 0ال يعمل).
307
IN1 & IN2 مداخل تحكم بالمحرك Aوالتي سنتحكم من خاللها بجهة
دوران المحرك ،فإن كان أحد هذه األقطاب 1منطقي
والثاني 0سيدور المحرك بأحد االتجاهات ،أما لو كان
كالهما 1أو 0فلن يدور المحرك.
IN3 & IN4 مداخل تحكم بالمحرك Bوالتي سنتحكم من خاللها بجهة
دوران المحرك ،فإن كان أحد هذه األقطاب 1منطقي
والثاني 0سيدور المحرك بأحد االتجاهات ،أما لو كان
كالهما 1أو 0فلن يدور المحرك.
ENB تفعيل الخرج OUT3 & OUT4إما بنبضات PWM
أو من خالل التحكم المنطقي ( 1يعمل 0ال يعمل).
OUT1 & OUT2 مخارج قدرة للمحرك .A
OUT3 & OUT4 مخارج قدرة للمحرك .B
بالمحرك يتح ّمل مرور 2Aأي ّ
أن الموديول يعطي 4Aعلى خرجه. ّ كل مخرج تح ّكم
ننبّه ألمر مهم وهو الفولط المستهلك داخل الموديول والذي يعتبر رقم كبير نسبيا ً إذ يصل حتى 2
المحرك على الموديول.
ّ فولط ،لذلك ننتبه لهذه الجزئية عند تشغيل
308
نصل اآلن لربط موديول L298Nمع األردوينو والتحكم من خالل هذا الموديول بمحركي تيار
مستمر كما في المخطط التالي:
309
في بداية الكود البرمجي حدّدنا أقطاب التوصيل للموديول والتي هي في الواقع مجموعتين األولى
بالمحرك ،Bمع االنتباه ّ
أن األقطاب الخاصة بـ & enA ّ بالمحرك Aبينما الثانية للتح ّكم
ّ للتح ّكم
المحرك ،أ ّما باقي
ّ enBيجب أن تكون مخارج لنبضات PWMالستخدامها في التح ّكم بسرعة
األقطاب فهي أقطاب رقميّة ...في حلقة اإلعداد نحدّد جميع األقطاب كأقطاب خرج.
310
المحرك مباشرة بدون التح ّكم
ّ األول لتحريك
في حلقة البرنامج الرئيسة يوجد تابعين أساسيينّ ،
بالسرعة وهو التابع )( directionControlوفيه نعطي األقطاب enA & enB
أعلى قيمة مباشرة بهدف الحصول على أعلى سرعة مع التحريك 2secباتجاه اليمين ومثلها نحو
المحركين.
ّ محرك ،بعد ذلك نوقف كال
ّ اليسار لك ّل
311
المحرك من خالل
ّ التّابع الثاني )( speedControlيتم من خالله التح ّكم بسرعة دوران
تغيير عرض النّبضة PWMالمطبّقة على األقطاب enA & enBوذلك من خالل حلقتي
312
محركات السيرفو :Servo Motor
محركات السيرفو :Servo motorعبارة عن محركات تيار مستمر DCمج ّهز بدارة
محركات
ّ الكترونية بداخله للتحكم بدقة في اتجاه الدوران وتوضّعه (للتنويه نحن نتحدّث هنا عن
المحركات الصناعية
ّ hoppy servoالتي تستخدم في الطائرات والسيارات الصغيرة وليس عن
التي تستخدم في مكنات .)CNC
لو نظرنا للبنية الدّاخلية للمحرك لوجدنا أنّه يضم األقسام التالية:
313
كيف يعمل محرك السيرفو؟؟؟
يأتي األمر باالنتقال للموقع الجديد من المتحكم (معالج صغري أو لوحة أردوينو أو حتى دارة
محرك السيرفو والّتي
555قادرة على توليد اإلشارة المطلوبة) إلى وحدة التحكم الموجودة داخل ّ
بدورها تقارن الموقع المطلوب االنتقال إليه بالموقع الحالي والقادم من المقاومة المتغيرة
أ ّما سرعة االنتقال للموقع المطلوب فال تتم بنفس السرعة ...فلو كان الموقع الجديد بعيدا ً عن
الموقع الحالي فيبدأ االنتقال بتسارع كبير ...ينخفض التسارع كلّما اقترب من الوصول للموقع
الجديد ،فالتسارع البدائي يتناسب مع فرق البعد بين الموقع المطلوب والموقع الجديد (ننتبه
محرك تيّار مستمر).
ّ محرك سيرفو من
ّ للمالحظات السابقة بشكل جيّد فسوف تفيدنا عند تصميم
314
كيف يتم التخاطب بين المتحكم وبين وحدة التحكم ضمن محرك السيرفو؟؟
أن أمر الموقع يصل من المتح ّكم لكن ما هي طبيعة هذا األمر ،وجد
ذكرنا في الفقرة السّابقة ّ
أن أفضل طريقة للتخاطب هي عبر نبضة PWMمتح ّكم بها ذات تردّد ثابت عند
المص ّممون ّ
مر معنا في قسم PWMوالتردّدات العالية للمخارج) ومجال تغيّر محدّد من
( 50Hzليس كما ّ
النبضة أي ال يتم تغيير عرض النبضة على كامل المجال ،فلو أردنا نقل ذراع السيرفو للموقع 0
المحرك للموقع 900فيجب
ّ فيجب علينا إرسال نبضة بعرض ،1msأ ّما لو أردنا تحريك ذراع
المحرك للموقع
ّ إرسال نبضة عرضها ،1.5msبينما نحتاج نبضة بعرض 2msلنقل ذراع
،1800وتتغيّر قيمة الزاوية ضمن المجال 0 ~ 1800تبعا ً لعرض النبضة (1 ~ 2 msمع االنتباه
ّ
أن مجال تغيّر النبضة قد يختلف مع بعض العالمات التجارية ليصبح .)0.5 ~ 2.5 ms
315
GND سالب مشترك أو األرضي
قطب الموجب من التغذية ويختلف مجاله بين أنواع المحركات
Vcc المتوفرة في السوق وهذا االختالف ينتج عنه اختالف في
العزم المقدم من المحرك.
غالب المحركات ذات مجال .4.5 ~7.5v
Control قطب التحكم بزاوية تموضع المحرك.
المحرك
ّ محرك السيرفو بواحدة kg.cmأي الوزن kgالذي يستطيع ذراع
يقاس العزم الذي يقدّمه ّ
رفعه ويبعد عن محور الدوران ،1cmوكلّما زاد بعد الجسم عن محور الدوران نقص الوزن.
يتوفّر في السوق ّ
محركات بعزوم تصل لـ 40kg.cmوأكثر مع زيادة طردية وكبيرة في السعر.
316
محرك سيرفو مع
ّ محرك السيرفو من خالل لوحة األردوينو ...لنقم بوصل
ّ وصلنا لطريقة قيادة
بمحرك السيرفو مع أي قطب وال يوجد أقطاب خاصة
ّ لوحة األردوينو (يمكن ربط قطب التح ّكم
للتح ّكم به).
317
بمحركات السيرفو،
ّ تتميّز بيئة التطوير Arduino IDEباحتوائها على مكتبية جاهزة للتح ّكم
أن التعامل مع هذه المكتبيّة بسيط جداً....
وكما سبق في تعاملنا مع المكتبيات سنجد ّ
نضيف المكتبية في بداية الكود البرمجي ث ّم ننشأ جسم من المكتبية ونعطيه اسم اختياري وليكن
بالمحرك على لوحة األردوينو ،وأخيرا
ّ ،servoفي حلقة اإلعداد نحدّد مكان ربط قطب التح ّكم
يتم االنتقال من خالل قيمة الزاوية المطلوبة ضمن التعليمة ;).servo.write(angle
318
مالحظات تصميمية:
-تتميز المكتبية الخاصة بتشغيل محركات السيرفو بقدرتها على تشغيل 12محرك سيرفو في
لوحة اآلردوينو UNOو 45محرك مع لوحة MEGAويصل العدد حتى 60محرك في
المحرك من منبع تغذية مستقلّ ،ال ننسى ربط األرضي للمنبع مع لوحة األردوينو
ّ -عند تغذية
المحرك.
ّ حتى يعمل
-في حاالت عمليّة معيّنة يتراكب موجات على النبضات ال ّمارة في أسالك ّ
محرك السيرفو م ّما
المحرك
ّ المحرك وللتغلّب على هذه الحالة نلف أسالك
ّ يسبّب حالة عدم استقرار في عمل
فرايت.
ضمن حلقة ّ
319
المحركات عديمة الفحمات :Brushless
محركات
ّ تعرفنا في بداية هذا الفصل على
ّ
التيّار المستمر Brush DC motorوالتّي
تحتاج في عملها على وجود الفراش أو
المحرك وتحدّثنا عن
ّ الفحمات لكي يدور
السّلبيات التي تسبّبها الفحمات من ارتفاع
والضوضاء االحتكاك بسبب الحرارة
باإلضافة للسرعات المحدودة لهذا النوع من
لمحركات ذات سرعات كبيرة جداً؟
ّ المحركات ،لكن ماذا لو احتجنا
ّ
محركات التي تم بناؤها بدون االعتماد على وجود الفحمات والتي سميّت الحقا ً
ّ الحل في
المحركات ذات الفحمات
ّ بالمحركات عديمة الفحمات أو Brushless motorوالّتي امتازت عن
ّ
بالعزم المرتفع نسبة للوزن وكذلك عزم أكبر مقابل االستطاعة باإلضافة للوثوقية الكبيرة في
األداء والعمر الطويل وضجيج أقل.
المحركات ذات
ّ محركات Brushlessبنية داخلية مختلفة عن تلك التي شاهدناها في
ّ تمتلك
320
اآلن كيف سنشغل محرك Brushless؟؟
321
دارة قيادة محرك Brushlessباستخدام :ESC
المحرك فقط دون التح ّكم بجهة الدوران ،أ ّما تغيير جهة دوران
ّ تستخدم هذه الدّارة للتح ّكم بسرعة
صة بها (.)A , B , C
المحرك مع األسالك الخا ّ
ّ المحرك فيكفي تغيير ترتيب توصيل ملفّات
ّ
كيف يتم تغيير السرعة إذا؟؟ ...بنفس األسلوب المستخدم في التح ّكم بجهة دوران ّ
محرك السيرفو
المحرك من خالل األردوينو
ّ أي من خالل نفس الموجة ونفس المواصفات وبالتالي فلتشغيل
محرك السيرفو.
ّ سنستخدم نفس المكتبية التي ت ّم استخدامها مع
322
لنقم اآلن بالتحكم بسرعة محرك Brushlessمن خالل التحكم بعرض النبضة الخارجة لم
ESCعبر القطب 9من لوحة األردوينو.
323
محركات السيرفو مع االنتباه ألمر مهم
ّ بنفس األسلوب تماما ً الذي ت ّم استخدامه عند التعامل مع
المحرك لن يدور ضمن المجال 0 ~ 100ويختلف هذا المجال زيادة أو نقصان باختالف
ّ وهو ّ
أن
أنواع الـ .ESC
324
مالحظات عامة:
✓ تقاس قوة هذه المحركات بواحدة KVوالتي تدل على عدد الدورات التي يدورها المحرك
عند تغذيته بواحد فولط ،وبالتالي فلو تم تغذية المحرك بمنبع تغذية وليكن 8vفإن سرعة
✓ العالقة بين سرعة speedالمحرك وقوة الرفع thrustللمحرك هي عالقة خطية عكسية،
فكلما زادت السرعة نقصت قوة الرفع للمحرك والعكس بالعكس ،فقد نجد نفس المحرك من
نفس الشركة ونفس األبعاد لكن بسرعتين األول سرعته عالية وعزم منخفض والثاني قوة
الرفع له كبيرة مع انخفاض السرعة هذا االختالف مفيد لتحديد طبيعة العمل الذي سيقوم به
المحرك فللطائرات المجنحة يجب أن تكون قوة الرفع كبيرة وال تهم سرعة المحرك عندئذ
أما في الطائرات المروحية فيجب مراعات السرعة للمحركات وال يهم عندئذ موضوع الرفع
للمحرك.
325
المحركات الخطوية :Stepper Motor
محركات تيّار مستمر لكنها
ّ وهي عبارة عن
تتميز بعزوم كبيرة ودقّة في الحركة ويستخدم
للتح ّكم في اآلالت التي تحتاج للتح ّكم بدقّة في
صات الليزر ومكنات ّ
كالطابعات ومق ّ الحركة
الحفر CNCوالعديد من التطبيقات األخرى،
وس ّميت بالمحركات الخطوية ألنها قادرة على
الدوران خطوة خطوة حتى تتم دورة كاملة
وبالتالي لهذه الخطوات قيم زاوية تقابلها.
يختلف عدد الخطوات بين هذه المحركات فمنها من يكون مقدار كل خطوة 1.8oدرجة أي حتى
تتم دورة كاملة 360oفإنها تحتاج لـ 200خطوة ،ومنها ما تكون قيمة الخطوة 3.6oأي تحتاج لـ
100خطوة إلتمام دورة كاملة ....وهكذا ،وكلما صغرت قيمة الخطوة ازدادت دقة المحرك
وتكون قيمة الخطوة وجهد وتيار أطوار المحرك مدونة عليه.
لو أردنا تقسيم محركات الخطوة تبعا لمغناطيسيتها الداخلية فسوف نجد لها نوعان هما محركات
خطويه أحادية القطبية Unipolarومحركات خطويه ثنائية القطبية Bipolarوالخالف بين
النوعين السابقين فهو في طريقة القيادة وفي العزم الذي يقدمه كل نوع من هذه المحركات أ ّما
البنية الداخلية فهي نفسها مع اختالف في طريقة التح ّكم في الملفّات الداخليّة ،وهذين النوعين هما
اللذان سيتم دراستهما في بحثنا هذا ولن نتطرق لباقي أنواع المحركات الخطوية.
326
تتألف المحركات الخطوية ذات المغناطيسية الدائمة (أحادي القطبية وثنائي القطبية) من األقسام
التالية:
▪ القسم الدوار والذي يخرج منه محور المحرك ويتألف من قسمين مغناطيسيين فوق بعضهما
ول ّكل قسم أخاديد طوليّة كما ّ
أن هذه األخاديد لكل قسم تتأخر عن التي في القسم التالي بنصف
المحرك.
ّ المسافة أي أنّها ليست متطابقة فوق بعضها ،هذه األخاديد هي من تحدّد عدد خطوات
▪ القسم الثابت ويضم ملفات النحاس التي تقدم المغناطيسية الدائمة ويختلف عدد هذه الملفات
وطريقة توصيلها ،لكن غالب المح ّركات الموجودة في السوق تض ّم ملفّين فقط (في حاالت
يتم مضاعفة الملفّات بهدف زيادة العزم ليصبح 4ملفات أو 8لكن يمكن دمجها لتصبح ملفّين
فقط)
▪ ملحقات كأسالك خرج الملفات وبيليات على طرفي المحور لتسهيل حركة الدوران والغالف
المعدني الخارجي.
تقاس قوة محركات الخطوة بواحدة الـ kg.cmأي الثقل المحدد بواحدة الكيلو غرام الذي يستطيع
محور المحرك ذو الذراع بـ الطول المحدد بواحدة السنتيمتر تح ّمله.
327
المحركات الخطوية أحادية القطبية :Unipolar
Bipolarيبقى الجزء الدّوار نفسه ولن يطرأ عليه أي تغيير ،التغيير في طريقة وصل الملفّات
ّ
للمخطط التصميمي التالي: فقط) ،لننظر
-نمط الملفين:
A1 A2 B1 B2
وفي هذا النمط يتم تفعيل ملفين معا ً (أي طرفين من األطراف
0 1 0 1
0 1 1 0 A , A- , B , B-معاً) من بين الملفات األربعة ويتم هذا
1 0 1 0 التفعيل كما في الجدول ،ما يميّز هذا األسلوب هو مضاعفة
1 0 0 1
العزم.
329
-نمط النصف خطوة :Half step
سابقين معا ً لنحصل على مضاعفة في عدد الخطوات الالزمة
وهي عمليّة دمج النّمطين ال ّ
A1 A2 B1 B2 إلتمام دورة كاملة.
0 0 0 1
0 1 0 1
0 1 0 0
0 1 1 0
0 0 1 0
1 0 1 0
1 0 0 0
1 0 0 1
330
دارة القيادة :ULN2003
بالعودة للدارة التكامليّة ULN2003فإنّها تتوفّر على شكل موديول يحتوي العناصر المطلوبة
المحرك أحادي الطور
ّ لتشغيل الدّارة التكامليّة بشكل صحيح ،كما ّ
أن الموديول يضم جاك لوصل
بشكل مباشر معه.
331
Vcc قطب التغذية التي ستصل للمحرك من خالل الموديول
(يوصل لمنبع تغذية منفصل عن األردوينو).
GND السالب المشترك.
IN1 ~ IN4 مداخل التحكم بالمحرك وتربط مع األقطاب الرقمية
لألردوينو.
Motor Connection مكان ربط المحرك مع الموديول.
لنقم اآلن بربط المحرك مع الموديول ونربط الموديول مع األردوينو لألقطاب الرقمية ،8 ~ 11
ولنشغل المحرك من خالل مكتبية Stepperالمضمنة مع بيئة التطوير .Arduino IDE
332
استخدام المكتبيّة بسيط جدّا ً ....في البداية نضيف المكتبيّة للكود البرمجي ،ث ّم نوجد جسم من
المكتبيّة باسم myStepperنحدّد أماكن ربط أقطاب التح ّكم بالموديول وعدد الخطوات إلتمام
للمحرك)....
ّ الدّورة (نحصل على هذا الرقم من الوثيقة الفنّية
القسم الثاني بنفس األسلوب مع زيادة السرعة وتغيير جهة الدوران لعكس عقارب الساعة.
333
المحركات الخطوية ثنائية القطبية :Bipolar
334
السؤال اآلن كيف سندور المحرك؟؟
تعتمد آليّة التح ّكم اآلن على التح ّكم بكال طرفي الملف (بدل ربط طرف بشكل ثابت والتح ّكم
المحركات أحاديّة القطبية) أي أنّه يجب أن يكون كل طرف في مرحلة مطبّق
ّ بالطرف اآلخر في
عليه Vccوفي مرحلة أخرى يطبّق عليه GNDلكن كيف ذلك ...نظريا ً األمر بسيط وذلك من
محركات التيّار المستمر).
ّ وتعرفنا عليها في
ّ خالل دارتي ( H-bridgeسبق
المحرك الّتي
ّ المحركات ثنائيّة القطبيّة تقدّم نفس أنماط دوران
ّ تتوفّر العديد من موديوالت قيادة
المحرك أحادي القطبيّة (نمط الخطوة الكاملة – نمط النصف خطوة – نمط
ّ تعرفنا عليها في
ّ
الخطوة المصغّرة) ويمكن أن نل ّخص نقاط عملها في:
-للتح ّكم بها تحتاج قطب تحديد االتّجاه DIRوقطب التفعيل ENوقطب النبضات PUL
المحرك (تختلف الموديوالت فيما بينها من حيث أعلى تردّد عمل
ّ والذي يحدّد سرعة دوران
للنبضات.
للمحرك ،تقسيمات الخطوة
ّ -تختلف فيما بينها بالدّرجة األولى في األمبير األعظمي المقدّم
الصغريّة وضبط التيّار الحدّي األعظمي.
335
دارة القيادة :A4988
ربّما سبق وشاهدت طابعات ثالثيّة األبعاد 3D Printerأو مكنات CNCصغيرة الحجم ،لو
محركاتها يتم من خالل موديوالت صغيرة وقد تكون
ّ أن التح ّكم في
فحصت هذه المكنات لوجدت ّ
هذه الموديوالت تحتوي على الدّارة التكامليّة A4988والتّي ستكون محور حديثنا في هذه الفقرة.
336
لتعرف على األقطاب الموجودة على طرفي الموديول:
ّ
VDD & GND أقطاب تغذية القسم المنطقي في الموديول .3.3 ~ 5.5v
VMOT & GND أقطاب تغذية ملفات المحرك .8 ~ 35v
MS1/MS2/MS3 أقطاب تقسيم الخطوة (كما هو موضح في الجدول)
STEP مدخل نبضات للموديول والتي من خاللها نحدد السرعة
العظمى.
DIR تحديد جهة الدوران ( 1منطقي مع عقارب الساعة 0 ،عكس
عقارب الساعة).
EN قطب التفعيل ويعمل عند 0منطقي علما أن قيمته االفتراضية
0منطقي ،وإليقاف تفعيل الموديول نعطيه 1منطقي.
SLP قطب إدخال الموديول في حالة حفظ الطاقة عند تفعيله بم 0
منطقي.
337
RST يفعل هذا القطب عند 0منطقي وبالتالي يتم تجاهل النبضات
على القطب STEPولن يدور المحرك أما إللغاء دوره نربطه
مع 1منطقي وال يترك عائم.
1B/1A/2A/2B أقطاب لربط أطراف ملفات المحرك مع الموديول
ذكرنا ّ
أن الموديول قادر على تقديم 2Aعلى كل ملف لكن هذا يعتبر التيّار الحدّي وللحصول
للمحرك والتبريد للموديول بتركيب مشتّت الحرارة
ّ عليه يجب مراعاة االستقرار الكهربائي
المرفق مع الموديول ،علما ً ّ
أن
الموديول يكون في حالة عمل
مستقرة عند الـ 1Aللحمل.
ّ
338
من النّقاط المه ّمة أيضا ً عند التعامل مع هذا الموديول هي عمليّة ضبط التيّار الحدّي المقدّم
المحرك
ّ المحرك استجراره ،وهذا األمر ضروري من جهة
ّ للمحرك ،أي أكبر أمبير يستطيع
لضمان عدم عمله في حاالت االستجرار الزائد للتيّار والتي تسبّب تلفه ومن جهة الموديول لضمان
عدم تلفه واستقرار عمله عند تيّار عمل ثابت.
تتم عمليّة ضبط التيّار الحدّي من خالل المقاومة المتغيّرة المر ّكبة على الموديول وذلك بتغيير
قيمة الجهد عليها وتعويض حاصل قراءة الفولط في القانون التالي ومنه نحصل على قيمة التيّار
الحدّي:
339
اآلن لنجرب قيادة محرك خطوي ثنائي القطبية من خالل الموديول A4899من خالل التحكم
بالموديول من األردوينو من خالل قطبين رقميين فقط وليكن .2 , 3
340
ي مكتبيّة ،سنكتب كود نقوم من خالله بتوليد نبضات مربّعة على
في هذا المثال لن نستخدم أ ّ
القطب STEPللموديول ،والتح ّكم باالتجاه من خالل القطب dirPinوتغيير قيمته مرة
يمكن االعتماد على تعليمة ;)( microsلتوليد نبضات مربّعة دون اشغال المعالج أو االعتماد
342
بعد إضافة المكتبيّة وتفعيل كائن من المكتبيّة باسم myStepperمع تحديد أقطاب التوصيل
لالتجاه والنبضات ،ث ّم وفي حلقة اإلعداد نقوم بتحديد أهم البارامترات الضرورية كالسرعة
القصوى والتسارع والسرعة األساسية.
في الحلقة الرئيسية بمجرد أن يقوم المحرك بدورة واحدة ،فإنه يغير اتجاه الدوران ويستمر في
وتكرارا
ً مرارا
ً فعل ذلك
343
دارة القيادة :DRV8825
تعرفنا في الفقرة السّابقة على الدارة التكامليّة A4988ننتقل لدارة مشابهة لحد كبير معها
بعد ّ
344
لتعرف على األقطاب الموجودة على طرفي الموديول:
ّ
ذكرنا ّ
أن الموديول قادر على تقديم 2.2Aعلى كل
ملف لكن هذا يعتبر التيّار الحدّي وللحصول عليه يجب
للمحرك والتبريد
ّ مراعاة االستقرار الكهربائي
للموديول بتركيب مشتّت الحرارة المرفق مع
الموديول ،علما ً ّ
أن الموديول يكون في حالة عمل
مستقرة عند الـ 1.5Aللحمل.
ّ
346
من النّقاط المه ّمة أيضا ً عند التعامل مع هذا الموديول هي عمليّة ضبط التيّار الحدّي المقدّم
المحرك
ّ المحرك استجراره ،وهذا األمر ضروري من جهة
ّ للمحرك ،أي أكبر أمبير يستطيع
لضمان عدم عمله في حاالت االستجرار الزائد للتيّار والتي تسبّب تلفه ومن جهة الموديول لضمان
عدم تلفه واستقرار عمله عند تيّار عمل ثابت.
تتم عمليّة ضبط التيّار الحدّي من خالل المقاومة المتغيّرة المر ّكبة على الموديول وذلك بتغيير
قيمة الجهد عليها وتعويض حاصل قراءة الفولط في القانون التالي ومنه نحصل على قيمة التيّار
الحدّي:
347
اآلن لنجرب قيادة محرك خطوي ثنائي القطبية من خالل الموديول DRV8825من خالل
التحكم بالموديول من األردوينو من خالل قطبين رقميين فقط وليكن .2 , 3
348
مالحظات تصميمية:
المحرك بشكل صحيح وتكون قيمته عند 47uFمع مراعاة الفولط الخاص به ويجب أن يكون
ّ
المحرك.
ّ أكبر من الفولط المار باتجاه
Manufactures Association
أكبر جمعية تجارية لمصنعي المعدات الكهربائية في الواليات المتحدة األمريكية ،تأسست في
عام 1926وتحتفظ بمقرها في روسلين -فيرجينيا ،وتضم حوالي 450شركة عضو في
العزوم وغير ذلك من الواحدات الخاصة بهذه الرابطة ،وفي المحركات الخطوية نجد مثال
محرك بقياس NEMA 17أو غير ذلك من األرقام لكن في النتيجة فإن الرقم يدل على قياس
قطر المسقط األمامي للمحرك بواحدة اإلنش مقسوما على 10أي أن 17 = 1.7inchوهكذا،
349
المشفرات البصرية The Encoder
في بعض التطبيقات التي نستخدم بها المحركات يتطلب هذا التطبيق تحديد جهة دوران المحرك
ومعرفة سرعته أو معرفة موضع محور المحرك بالنسبة للدائرة (تحديد الزاوية بالنسبة لنقطة
صفرية على محور المحرك) لذلك نستخدم المشفّر البصري أو ( )Encoderوالذي يكون متصل
مع محور المحرك ،فاالنكودر جهاز له خرج رقمي متغيّر تبعا ً لإلزاحة الدورانية أو الخطية.
يوجد نوعين من المشفّرات البصريّة سنستعرضها ونتع ّرف على آليّة عملها معاً.
حيث يظهر لدينا في الشكل التالي مشفر مطلق بثمانية بتات أي أن لدينا 256حالة للخرج
وكل حالة تمثل موضع معين ،وكلما زادت بتات الخرج حصلنا على دقة أكبر لتموضع محور
المحرك المتصل مع قرص المشفر البصري.
350
المشفر البصري ال ُمتزايد :The Incremental Encoder
الدوار
يحول الموضع الزاوي (الدوران) للمحور ّ
المشفر الدوار أو المتزايد هو مستشعر موضع ّ
نظرا
إلى إشارة خرج رقميّة تستخدم لتحديد االتجاه الذي يدور فيه المحور وكذلك السّرعة ،و ً
لتحكمها الرقمي الدقيق يتم استخدامها في العديد من التطبيقات بما في ذلك الروبوتات وآالت
CNCوالطابعات.
لألول بـ Aوالثاني بـ ،Bأ ّما في يتألّف هذا النوع من المشفّرات البصرية من ّ
خطي خرج ير ّمز ّ
دوار عاتم وعليه ثقوب غير عاتمة ،أعلى القرص يوجد مصدر ضوئي
الداخل فيوجد قرص ّ
( )LEDبينما أسفل القرص يوجد مستقبلين ضوئيين (ترانزستور ضوئي) هما A , Bوالمسافة
الدوار.
بينهما نصف المسافة بين ثقبين من الثقوب التي على القرص ّ
351
عند دوران القرص باتجاه عقارب الساعة فسيكون النّبضات ال ّ
صادرة من الخرج Aمتقدّمة على
النّبضات ال ّ
صادرة من الخرج Bبمقدار نصف نبضة (هي نفسها المسافة الفاصلة بين المستقبلين
الضوئيين التابعين لهما أسفل القرص الدّوار).
على النّبضات ال ّ
صادرة من الخرج Aبمقدار نصف نبضة (هي نفسها المسافة الفاصلة بين
المستقبلين الضوئيين التابعين لهما أسفل القرص الدّوار).
نستفيد م ّما سبق في معرفة جهة الدّوران ،أ ّما حساب السرعة فيتم من خالل عدّ النبضات خالل
زمن محدّد بعد معرفة العدد الكلّي للنبضات عند إتمام دورة كاملة (يتوفّر منها 600نبضة في
الدورة و 1200وغير ذلك من القيم).
352
لنأخذ االنكودر الدوار التالي ولنجرب عمله مع لوحة األردوينو:
353
نعرف المتغيّرات التي
نعرف في بداية الكود األسماء التي سنستخدمها ضمن الكود البرمجي ث ّم ّ
ّ
سنحتاجها ضمن الكود البرمجي ،أ ّما في حلقة اإلعداد نحدّد طبيعة األقطاب وهي أقطاب دخل
بدون مقاومة رفع ،مع االنتباه لقراءة الحالة البدائية للدخل CLKواسناد حالته للمتغيّر
lastStateCLKوالذي سيلعب دور في حلقة البرنامج الرئيسية في معرفة فيما إذا كان
354
355
في حلقة البرنامج الرئيسية يتم قراءة حالة المدخل CLKوإسناد ناتج القراءة للمتغيّر
كانتا مختلفتين في القيمة فالدّوران بعكس عقارب السّاعة ويتم عندئذ إنقاص قيمة المتغيّر
counterأ ّما إن كانت قيمة المدخلين متشابهتين فإن الدوران يتم مع عقارب السّاعة فعندئذ
القسم الثّاني من الكود متعلّق بقراءة حالة الكبّاس على اإلنكودر الدوراني مع وضع تأخير زمني
باستخدام التعليمة )( millisللتخلّص من حالة االهتزاز الميكانيكي.
356
تمارين الفصل الثالث:
ليكن لدينا محرك خطوي يتم قيادته من خالل الموديول A4988
والذي يتم التحكم فيه من خالل األردوينو عبر القطبين ،2 ,3ولدينا تمرين :1
مشفر دوراني يتم ربط القطبين A , Bمع أقطاب األردوينو .9 , 10
المطلوب كتابة كود برمجي يتم من خالله تدوير المحرك تبعا لحركة دوران المشفر الدوراني.
357
358
359
لدينا محركي سيرفو يتم التحكم بهما من خالل األقطاب ،10 , 11كما
يوجد لدينا مقاومة متغيرة تشكل مقسم جهد على المدخل التشابهي
تمرين :2
،A0كما يوجد كباسين لحظيين مربوطين مع األقطاب .A1 , A2
المطلوب كتابة كود برمجي يتم من خالله التحكم بموقع المحرك األول من خالل المقاومة
المتغيرة بينما يتم التحكم بالمحرك الثاني من خالل الكباسين اللحظيين.
360
361
عرفنا في بداية الكود البرمجي األقطاب المستخدمة من لوحة األردوينو وأعطيناها أسماء بما
ّ
يتناسب مع تمريننا.
محرك السيرفو
ّ محركات السيرفو فيجب إضافة المكتبيّة ال ّخاصة بتشغيل
ّ وبما أنّنا نتعامل مع
المحركات وأماكن توصيلها على لوحة األردوينو.
ّ تحديد مستلزمات تشغيل هذه
في حلقة البرنامج األساسي يوجد عندنا تابع فقط هو التّابع ;)( servo_controlللتح ّكم
بالمحركين (يمكن االستغناء عن التّابع وكتابة كامل التعليمات في نفس الحلقة الرئيسية لكن لكي
ّ
نكتسب خبرة التعامل مع التوابع من خالل التمارين).
362
لدينا محركي تيار مستمر نريد التحكم بهما من خالل الموديول
،L298Nكما يوجد لدينا قبضة تشابهية يتم وصل مخارجها تمرين :3
التشابهية مع المداخل .A0 , A 1
المطلوب التحكم بسرعة وجهة دوران كل محرك من خالل القبضة التشابهية (كل محور من
القبضة مسؤول عن تغيير سرعة وعكس دوران).
363
364
365
فكرة التّمرين تعتمد على االستفادة من القبضة التشابهية في تحديد جهة الدّوران وكذلك السّرعة،
366
مشروع الفصل :تصميم محرك Servoمن محرك DC
فكرة المشروع:
367
بالعودة آللية بناء محرك servoوجدنا خالل دراسة هذا المحرك أنه يحتوي في بنيته على
محرك DCمع مسنّنات لتحويل السّرعة لعزم (علبة سرعة) ،كما يتضمن وحدة تحكم بالمحرك
العكسية لمعرفة مكان المحرك الحالي لتحديد جهة دورانه وسرعته للوصول للمكان المحدّد
وتصحيح الخطأ ،أ ّما مصدر هذه التغذية العكسيّة فيمكن أن يكون إما مقمماومة متغيرة مربوطة
مع محور المـــحرك النهـــائي وكل قيمـــة لهذه المقـــاومة تعبر عن موضــع محدد ،أو مشممممفر
المحرك.
ّ تحديد موقع
المحرك).
ّ تبعا ً لدرجة دوران محور
المحرك.
ّ -لوحة أردوينو Arduino UNOلمعالجة قيم التغذية العكسيّة وتوجيه حركة
المحرك منها.
ّ -مقاومة متغيّرة إضافيّة لتدوير
368
قبل االنتقال للكود البرمجي يجب االنتباه لبعض النقاط:...
المحرك بشكل صحيح في كال
ّ عند ربط العناصر ببعضها فيجب ّأوالً التأ ّكد من حركة -
المحرك نحو اليمين
ّ االتجاهين (أي ّ
أن أمر التحريك لليمين من األردوينو صحيح ويدور
وكذلك بالنسبة لليسار وليس األمر معاكس لما سبق).
المحرك تزداد قيمتها عند الدّوران نحو اليمين وتتناقص
ّ -المقاومة المربوطة على محور
قيمتها عند الدّوران نحو اليسار (في حال كان خالف ذلك نبدّل طرفي التغذية على المقاومة
المحرك).
ّ المتغيّرة المربوطة على
-مقاومة التح ّكم تزداد قيمتها عند تدويرها نحو اليمين وتتناقص بالتدوير نحو اليسار.
المحرك ،أي ال نستخدم كامل
ّ -نهمل بعض القيم من طرفي المقاومة المتغيّرة المر ّكبة على
مجال المبدّل التشابهي الرقمي ،0 ~ 1023بل علينا إهمال بعض القيم من طرفي المجال
وليكن مجال العمل 200 ~ 800وسبب ذلك لالبتعاد عن طرفي المقاومة ومخافة حدوث
أخطاء عند العمل قد تسبّب كسر في المقاومة.
المحرك إذ يجب أن تكون ذات
ّ يجب االنتباه لنوع المقاومة المتغيّرة المر ّكبة على محور -
دورة واحدة وتغيّر ّ
خطي أي قيمة تغيّر الخرج متناسبة مع مقدار االنزياح (يوجد في أنواع
ذات تغيّر غير خطي والّتي سينتج عنها حركة غير منتظمة أو عدّة دورات والتي تكون بتغيّر
لوغاريتمي).
369
للمحرك يجب أن يكون بسرعة قليلة ويفضّل أن يكون أقل من ( 20 rpmأقل من 20
ّ -بالنّسبة
للمحرك مع تح ّكم دقيق في الموقع وكلّما
ّ دورة في الدقيقة) وبالتّالي سنحصل على عزم كبير
زادت السّرعة سنضطر لتخفيضها من خالل تقليل مجال خرج النبضة PWMوبالتالي تقليل
المحرك.
ّ عزم
370
371
372
لمحرك السيرفو لكن بدمج قسم وحدة
ّ ّ
المخطط الصندوقي فكرة الكود تقوم باختصار على تنفيذ
بالمحرك باألردوينو.
ّ التح ّكم
ت ّم تجزئة فكرة العمل لعدّة أقسام ضمن الكود البرمجي ،فيعد تعريف حالة كل قطب مستخدم في
الكود البرمجي وتعريف المتغيّرات التي سوف نستخدمها ضمن الكود البرمجي نصل لحلقة
البرنامج الرئيسية والتي تحتوي على ثالثة توابع أساسيّة وجملة شرطية ....
المحرك.
ّ مقاومة التح ّكم وضبط مجال عملها ليتناسب مع مجال المقاومة المر ّكبة على محور
التابع ;)calculateErrorAmount (currentAngle,requiredAngle -
المحرك currentAngle
ّ والذي يحتوي متغيّرين هما قراءة المقاومة المتغيّرة على
وقراءة المقاومة المتغيّرة المتح ّكمة بالحركة ، requiredAngleيتم في هذا التابع تحديد
المحرك من خالل حساب الفرق بين القراءتين وجعل نبضة PWMمتناسبة مع
ّ تسارع
المحرك مع تناقص التّسارع
ّ الفرق بين هاتين القيمتين أي كلّما زاد الفرق بينها زادت سرعة
كلّما اقترب الفرق بينهما بالتناقص.
373
المحرك عندها عن الحركة فال يمكن تحقيق
ّ يوجد كما ذكرنا سابقا ً قيمة مهملة يجب توقيف
التطابق بنسبة 100%لذلك نستخدم المتغيّر. acceptableError
المحرك والتي تتم في الجملة ال ّ
شرطية الموجودة داخل حلقة ّ -بقي لدينا تحديد جهة دوران
البرنامج الرئيسية والتي تعتمد على تحديد جهة الدّوران اعتمادا ً على معرفة أي قيمة مقاومة
أكبر.
374
الفصل الرابع:
المحيطيات ()2
375
حساس األشعة تحت الحمراء .PIR
بمجرد مرور أي جسم أمامها ،أو
ّ لعلّك صادفت العديد من األجهزة أو األضواء التي تعمل
كاميرات مراقبة ترسل رسائل تنبيه عند أي حركة في المكان وغير ذلك من أجهزة الحماية
واألمان المستخدمة في اآلونة األخيرة بكثرة....
376
صا الكتشاف مثل هذه المستويات من األشعة تحت الحمراء،
تم تصميم مستشعر PIRخصي ً
تتكون بشكل أساسي من جزأين رئيسيين مستشعر كهربي حراري Pyroelectric Sensor
و ّ
وعدسة خاصة تسمى عدسة فرينل Fresnel lensالتي تركز إشارات األشعة تحت الحمراء
على المستشعر الكهروحراري.
يحتوي المستشعر الكهروحراري على فتحتين مستطيلتين مصنوعتين من مادة تسمح بمرور
األشعة تحت الحمراء ،خلفهما يوجد قطبان منفصالن لمستشعر األشعة تحت الحمراء ،أحدهما
مسؤول عن إنتاج خرج إيجابي واآلخر ناتج سلبي ،والسبب في ذلك هو أننا نبحث عن تغيير في
مستويات األشعة تحت الحمراء وليس مستويات األشعة تحت الحمراء المحيطة.
عا أكثر
يتم توصيل القطبين الكهربائيين بحيث يلغي كل منهما اآلخر فإذا رأى أي نصف إشعا ً
أو أقل من األشعة تحت الحمراء من اآلخر فسوف يتأرجح خرج العدسة ارتفاعا ً أو منخف ً
ضا،
ويكون المستشعر خامالً عندما ال توجد حركة حول المستشعر وبالتالي فإن كال الفتحتين تتحسّسا
نفس الك ّمية من األشعة تحت الحمراء ،مما ينتج عنه إشارة خرج صفرية ،ولكن عندما يمر بها
جسم دافئ مثل اإلنسان أو الحيوان يؤدي إلى تغيير تفاضلي إيجابي بين النصفين ،وعندما يغادر
377
لنتعرف اآلن على أحد أشهر هذه الحسّاسات والتي ستجدها بكثرة وهو الحسّاس HC-SR501
ّ
والذي يتميّز بسهولة التعامل معه وانخفاض كلفته باإلضافة النخفاض استهالكه ّ
للطاقة ومتانته،
كما أنّه يحتوي على عدسة تعطيه نطاق حساسيّة واسع عند العمل.
378
بالنّظر ألسفل الحسّاس سنجد العديد من العناصر منها ّ
منظم جهد عند 3vكما يوجد ديود حماية
الربط باإلضافة لمقاومتين متغيّرتين مع عناصر إضافيّة أخرى
من الوصل العكسي ونقاط ّ
لنتعرف معا ً على أهم هذه العناصر:
ّ ضرورية لعمل الحسّاس بشكل صحيح...
▪ مقاومة متغيّرة لضبط الحساسيّة Sensitivity Adjustويتم من خاللها ضبط مدى استشعار
الحسّاس ضمن المجال .3 ~ 7m
▪ مقاومة متغيّرة Time-delay Adjustلضبط زمن تفعيل الخرج بعد مرور الجسم أمام
الحسّاس ويكون الضبط ضمن المجال .300 ~ 3 sec
▪ جسر ربط ويكون لدينا خيارين للربط:
379
سيستمر الحسّاس بإعطاء خرج طالما هناك حركة أمام
ّ الربط مع )H (Hold
• عند ّ
الحسّاس.
380
يحتوي الحسّاس على أماكن إلضافة عناصر للحسّاس للحصول على أداء مختلف ،فلو نظرنا
سنجد هناك النّقطتين RL , RTولكل واحدة منها وظيفة ،ففي الموقع RTيمكن إضافة مقاومة
حراريّة ويؤدي إضافتها لزيادة دقّة عمل الحسّاس في درجات الحرارة المختلفة.
أ ّما المنطقة RLفيمكن ربط مقاومة ضوئية LDRلها وبالتالي فلن يعمل الحسّاس إال في الظالم.
لنقم اآلن بربط الحساس HC-SR501مع األردوينو علما أن التعامل معه كأنه مفتاح..
381
382
حساس األمواج فوق الصوتية Ultrasonic Sensor
لعلّك تساءلت يوما ً عن كيفيّة طيران الخفّاش في ّ
الظالم رغم عدم قدرته على الرؤية ؟؟ أو شاهدّت
بعض الروبوتات وهي تتفادى العوائق التي في طريقها ودون أن تصطدم بها ،لكن كيف يتم ذلك؟
ببساطة األمر يعتمد على األمواج فوق الصوتيّة والتي ت ّم استخدامها كرادار صغير ،لنتابع معا ً
تستطيع األذن البشرية سماع األصوات التي تردّدها من 20Hzوحتى أصوات الدبيب 20kHz
الرجل والمرأة أيضاً ،ومنه
مع اختالف هذا المجال بين إنسان وآخر بشكل طفيف واختالفه بين ّ
نستنتج ّ
أن أي صوت فوق التردّد السابق لن يسمع ويس ّمى بفوق صوتي .Ultrasonic
383
ولنتعرف على أهم ميّزاته الفنّية التي ساهمت في انتشاره الواسع
ّ لنعد للحسّاس HC-SR04
واعتماده في العديد من التطبيقات والمشاريع.
▪ جهد تغذية Vcc = 5 voltواستهالك منخفض للتيار يصل حتى .15 mA
▪ تردد عمل الحساس .40 kHz
▪ مجال حساب المسافة للحساس تنتمي للمجال .2cm ~ 4m
▪ زاوية قياس الحساس 15درجة.
▪ نبضة قدح الحساس 10uSبمنطق .TTL
▪ خرج نبضة االستقبال متناسبة مع المسافة المدى.
384
كيف يعمل الحساس ..؟
يمكن أن نرتّب عمل الحسّاس ضمن الخطوات التّالية:
-نطبّق على قطب Trigنبضة 1منطقي بزمن ( 10uSالحدّ األدنى لزمن النبضة).
صوتي المرسل
يبدأ الحسّاس بالعمل مباشرة فيرسل مجموعة نبضات صوتية من المجهر ال ّ -
شكل ونفس التّردّد).
وينتظر حتّى يستقبل نفس النّبضات التي أرسلها (أي نفس ال ّ
-عند استالم هذه النّبضات يخرج الحسّاس نبضة مربّعة على القطب Echoزمنها متناسب
صوتية من لحظة خروجها من الحسّاس وحتّى عودتها له. مع ّ
الزمن الذي استغرقته الموجة ال ّ
385
-بعد وصول النّبضة لألردوينو وحساب زمنها يبقى لدينا مجهول واحد من المعادلة الرياضيّة
التي تربط الزمن بالمسافة مع السرعة:
;)pulseIn(pin , Value تستخدم هذه التعليمة لقراءة عرض النبضة المطبقة على
القطب المحدد ،pinأما القيمة Valueفتأخذ إحدى
القيمتين:
:HIGHحيث ينتظر حتى تصبح الموجة الداخلة -
على القطب في حالة HIGHفيبدأ العد حتى تعود
للقيمة LOWوعندها يتوقف عن العد.
:LOWينتظر حتى تصبح النبضة المطبقة على -
القطب في حالة LOWعندئذ يبدأ بالعد حتى تعود
لحالة HIGHوعندها يتوقف العد.
386
387
بعد تعريف األقطاب المطلوبة لعمل الحساس وهي قطب القدح TrigPinوقطب قراءة
الصدى EchoPinيتم الدخول في حلقة البرنامج الرئيسي والتي يتم فيها تفعيل نبضة القدح
لمدة 10usثم إطفاء نبضة القدح ،بعدها يتم قراءة قيمة النبضة الواردة من قطب الصدى وإدخال
القيمة المقروءة في عملية تحويل رياضي للتوافق بين الواحدات ومن ثم التعويض في قانون
حساب المسافة مع قسمة الناتج على 2نحصل على القيمة المطلوبة.
خالل الحساب قد ال تكون الحسابات دقية والسّبب أنّنا نعتبر سرعة الصوت في الهواء ثابتة لكن
فإن هذه القيمة عرضة للتغيّر كون الصوت موجة فيزيائية فسوف تتأثّر بحالة الحرارة
في الواقع ّ
كذلك نسبة الرطوبة في الجو والشوائب كالغبار الكثيف وغير ذلك من األمور ،وفي حال كنت
تريد أخذ العوامل السّابقة بعين االعتبار يمكن استخدام العالقة التالية لحساب سرعة الصوت في
الهواء بشكل أكثر دقّة.
388
الموديوالت التي تحوي في بنيتها IC:LM393
في هذا القسم سنتطرق للعديد من الموديوالت والحساسات التي بنيت باالعتماد على دارة مضخم
مستقبل أشعة تحت الحمراء ،حساس صوت ،حساس رطوبة )....ودرجة الحساسية التي سوف
يتم ضبطها عبر المقاومة المتغيرة الموجودة على الموديول والتي يتم من خاللها تحديد الدرجة
389
لو استعرضنا المخطط النظري لبنية هذا الموديول لوجدنا أنه يتألف من األقسام التالية:
-الحساس الموجود على الموديول وملحقاته ،وغالبا ما يش ّكل الحساس مع مقاومة أخرى
-المقارن الذي يحتوي على المدخلين هما المدخل INA+من الحساس والمدخل IN-من
مقاومة متغيرة لضبط نقطة العمل للحساس ،أ ّما الخرج OUTفهو خرج رقمي يعطي القيمة
0منطقي عندما يكون القيمة على القطب INA-أكبر من القيمة الناتجة من الحساس ،بينما
يعطي 1منطقي عندما يكون القيمة الناتجة عن الحساس أكبر من نقطة الضبط على القطب
.INA-
-أقطاب التوصيل وهي أقطاب التغذية ) (Vcc & GNDوقطب الخرج الرقمي OUTA
وقطب الخرج التشابهي ACوالذي يكون متصل مباشرة مع نقطة الخرج لمقسم الجهد
للحساس مع المقاومة ،10kأو قد يكون غير متصل وذلك حسب نوع الحساس الموجود على
الموديول.
-ملحقات إضافية :كما يوجد على الموديول LEDsللدّاللة على التغذية والخرج الرقمي
لهذا الموديول العديد من األنواع التي تختلف فيما بينها فقط في الحساس الموجود عليها لكن في
النهاية فإن طريقة العمل واحدة وهي خرج رقمي على الرجل OUTمن الموديول ،لنأخذ اآلن
390
حساس الصوت:
ّ
مخطط الموديول السّابق ...ت ّم وضع حسّاس للصوت باستخدام دارة المقارن LM393وبنفس
على الموديول لنحصل بذلك على موديول استشعار للصوت ،ومن خالل المقاومة المتغيّرة على
الموديول نستطيع تحديد نقطة عمل الموديول وإعطائه قيمة على الخرج.
سيت ّم التعامل برمجيّا ً مع هذا الموديول كما يتم التعامل مع مفتاح أو كبّاس لحظي حيث يعطي قيمة
0منطقي عند عمل حسّاس الصوت بينما يكون الخرج عند 1منطقي في حال عدم عمل الحسّاس.
أ ّما أقطاب الخرج فهي ثالثة ...اثنان منها للتغذية VCC & GNDبينما الثّالث OUTفيمثّل
خرج رقمي للموديول.
391
لنجرب اآلن استخدام هذا الحساس في أحد التطبيقات العملية من خالل ربط الموديول مع
األردوينو والتحكم بالحمل عبر الصوت.
392
بعد تعريف المداخل/المخارج المطلوبة يتم في حلقة البرنامج األساسيّة اختبار حالة الدّخل فإن
كان هناك حالة دخل من الحسّاس ( )LOWيتم بعد ذلك التأ ّكد من استمرار وجود الدّخل من خالل
عمليّة انتظار بسيطة باستخدام )( millisبعد ذلك يتم قلب حالة الريليه مع كل حالة دخل
من الحسّاس.
ننتبه للضّجيج من البيئة المحيطة بالحسّاس كذلك حالة االهتزاز الميكانيكي للحسّاس تؤثر على
عمله أيضاً.
393
حساس رطوبة التربة:
في العديد من المشاريع الزراعيّة نحتاج لمتابعة رطوبة التّربة وهذا ما يتيحه لنا هذا الحسّاس
والذي يعتمد أيضا ً في بنيته على الدّارة التكامليّة ،LM393لكن يضاف هنا لدينا قطب خرج
تشابهي.
394
بمجس
ّ في تعاملنا مع هذا الموديول سنتجاوز الدّارة التكامليّة LM393واستخدام القسم المتعلّق
التربة فقط للحصول على خرج تشابهي ،يمكن تصميم دارة بسيطة تضم العناصر المطلوبة لعمل
المجس بشكل صحيح (ت ّم ذلك في المشروع الثّاني من سلسلة خمسون مشروعا ً باستخدام
ّ
األردوينو) كما يلي:
أن خرج الحسّاس في الت ّربة الجافّة يقابله قراءة على المبدّل التشابهي قدرها ،850
بالتجريب نجد ّ
أ ّما في التربة الرطبة تصل القيمة لـ ،400أي تزداد قيمة خرج المبدّل التشابهي الرقمي كلّما زاد
جفاف التّربة.
395
الرقمي ومن ث ّم طباعة نتائج متوافقة مع قيمة القراءة،
يتض ّمن الكود قراءة قيمة المبدّل التشابهي ّ
يمكن لك تغيير مجال القياس في ّأول الكود بما يتناسب مع نتائج التجريب الخاصة بك.
نكتفي بهذين المثالين حول الموديول LM393وكيفيّة تبديل الحسّاس فقط للحصول على وظائف
مختلفة لكن في النتيجة فإن طريقة البرمجة واحدة.
396
حساس اإلنحناء أو المرونة FlexSensor
المستشعر المرن أو مستشعر االنحناء هو مستشعر منخفض التكلفة وسهل االستخدام مصمم
صا لقياس مقدار االنحراف أو االنحناء ،يستخدم كمقياس الزوايا لتحديد حركة المفصل ،أو
خصي ً
مستشعر الباب ،أو مستشعر الضغط على القابض اآللي.
اآلن لننتقل للخطوات التالية وهي ربط هذه المقاومة مع مقسّم جهد لنحصل على فولط متغيّر تبعا ً
إلنحناء هذه المقاومة ،أ ّما مكان حسّاس اإلنحناء من مقسّم الجهد:
باستخدام هذا القانون سنحصل على جهد على القطب التشابهي من األردوينو متناسب مع انحناء
الحسّاس ،ويكون هذا الفولط متناقص مع زيادة اإلنحناء.
398
لنجرب اآلن ربط هذا الحساس مع األردوينو ونقرأ قيم التغير في المبدل التشابهي الرقمي على
األردوينو.
399
نكرر كتابة القانون مع تعويض
األول من الكتاب وهنا ّ
سبق وتعاملنا مع مقسّم الجهد خالل الفصل ّ
سم....
القيم التي تم اعتمادها ضمن المق ّ
نحول مجال تغيّر المبدّل التشابهي لمجال يقابل اإلنحناء للحسّاس ضمن المجال
في نهاية الكود ّ
0 ~ 90 0وطباعة القيم على واجهة االتصال التسلسلي.
400
المقاومة الحساس للقوة FSR
للقوة Force Sensitive Resistorsوتعرف اختصارا ً FSRوهي عبارة
المقاومة الحسّاسة ّ
عن مقاومة متغيّرة مص ّممة لتتغيّر قيمتها بتغيّر قوة الضغط الفيزيائي أو الوزن عليها ،ولها العديد
من االستخدامات في مجال أجهزة األلعاب واألجهزة اإللكترونية وأجهزة المحمول وغير ذلك
من التطبيقات العمليّة.
تعتبر خيار رخيص الكلفة الستكشاف وجود ضغط فيزيائي على الجسم أم ال وليس الستكشاف
مقدار الوزن عليها ،شاع استخدامها منذ عام 1985وتتوفّر ضمن العديد من األشكال لكن األكثر
لنتعرف معا ً على هذه الحسّاسات وربطها مع األردوينو
ّ شيوعا ً منها ،FSR-402 , FSR-406
للحصول على مشاريع أكثر احترافية وتميّز.
401
مكونة من عدّة طبقات رقيقة ومرنة إحدى
لننتقل اآلن للبنية الدّاخلية لهذا الحسّاس والتي سنجدها ّ
هذه ّ
الطبقات من الكربون وهناك طبقة ناقلة عبارة عن مسارات من الفضّة ،كلّما زاد الضغط
على سطح الحسّاس تالمست طبقة الكربون مع ّ
الطبقة النّاقلة م ّما يقلّل من مقاومة الحسّاس.
تختلف الحسّاسات المتوفّرة في السوق من ناحية الحجم والشكل ومن ناحية أخرى مه ّمة وهي
مجال الضغط الذي تعمل عليه فلو افترضنا ّ
أن الحسّاس الذي نعمل عليه يتحسّس مقدار ضغط
حتى 1gفإن أي ضغط زيادة لن يغيّر في مقدار القراءة بل إن زيادة الضغط عليه قد يسبب تلف
طبقات الحسّاس الداخلية وفقد قدرته على التحسّس للضغط ،لذلك ننتبه لهذا العامل المهم عند
اختيارنا لهذا الحسّاس ضمن تطبيقاتنا.
أ ّما حالة الحسّاس فتكون كأنها مقاومة ال نهائية في حال عدم وجود ضغط عليه ،وكلّما زاد الضغط
عليه انخفضت مقاومته الداخلية.
402
وكأي حسّاس يعمل بمبدأ المقاومة المتغيّرة ال بدّ من وجود مقاومة معه على التسلسل لتشكل مع
الحسّاس مقسّم جهد متغيّر في قيمة فولط الخرج للمقسّم وهنا سيكون تغيّر جهد الخرج متعلّق
بالضّغط الفيزيائي المطبّق على حسّاس .FSR
403
ّ
مخطط مقسّم الجهد السّابق مع لوحة األردوينو على القطب لنجرب اآلن وصل هذا الحسّاس وفق
ّ
التّشابهي A0ولنقرأ تغيّر مجال المبدّل تبعا ً لحالة الضغط على الحسّاس.
404
تمارين الفصل الرابع
اكتب كود برمجي لحساس أمواج فوق صوتية متصل مع لوحة
تمرين :1
اآلردوينو ،يقوم الحساس وعند تشغيل الكود البرمجي للمرة األولى
بحساب المسافة البدائية بين الحساس وبين أقرب حاجز يقع ضمن مجال الحساس ،ثم يقوم
بالتحسس ألي جسم جديد سوف يمر بين الحساس والحاجز البدائي فيشغل زمور باستخدام
التعليمة )(.tone
405
406
تعتمد فكرة التمرين على قراءة قيم مختلفة لحسّاس المسافة ،Ultrasonicفبعد تعريف األقطاب
المستخدمة في التمرين وتحديد طبيعة كل قطب إن كان مدخل/مخرج رقمي في حلقة اإلعداد،
نصل لحلقة البرنامج الرئيسية والتي يتم فيها ولمرة واحدة حساب ّأول بعد أقرب حاجز عن
الحسّاس واعتبارها قيمة بدائية عبر تخزينها بالمتغيّر old_distanceوعدم تجديد هذه
بعد ذلك يتم قراءة بعد أقرب جسم عن الحسّاس ،وطالما أنه ال يوجد جسم جديد بين الحسّاس وبين
وبمجرد مرور جسم أمام الحسّاس فإن المسافة
ّ الحاجز األولي فلن يتم تفعيل ّ
الزمور ،لكن
new_distanceستصبح أصغر من القراءة old_distanceكون الجسم سيصبح
وضعنا قيمة 5ضمن شرط المقارنة واعتبرناها نسبة خطأ يجب إهمالها مع كل قراءة لناتج
الحسّاس ويمكن تغييرها.
407
لدينا حساس رطوبة تربة متصل مع القطب A0ولدينا مضخة ماء
تمرين :2
يتم التحكم بها من خالل موديول ريليه من القطب ،8المطلوب كتابة
كود برمجي يقوم بتشغيل المضخة عند انخفاض رطوبة التربة.
408
409
لدينا ثالثة حساسات PIRمتموضعة بحيث يغطي كل منها قطاع
تمرين :3
زاوي قدره 60درجة ،كما يوجد محرك سيرفو وعليه كاميرا،
والمطلوب كتابة كود برمجي يقوم بتحريك الكاميرا باالتجاه الذي يتحسس عنده أحد الحساسات.
410
411
لدينا خمسة حساسات إنحناء متموضعة على قفاز ويمثل انحناء كل
واحدة منها حركة أحد األصابع ،ولدينا خمسة محركات سيرفو كل
تمرين :4
محرك تتعلق حركته بحساس إنحناء.
المطلوب كتابة كود برمجي لتحريك محركات السيرفو تبعا إلنحناء الحساسات.
412
413
نعرف أيضا ً المتغيّرات
نعرف في بداية الكود البرمجي األقطاب المستخدمة في التمرينّ ،
ّ
محركات السيرفو عبر المصفوفة
ّ المستخدمة في المشروع وهي متغيّرات لقيم حركة
;}{ = ] ،servo_val[5وكذلك ثوابت سوف نستخدمها في حسابات مقسّم الجهد
(هذه الثّوابت يمكن أن تتغيّر تبعا ً لمعطيات التجربة لذلك يجب االنتباه لها) ،ث ّم في حلقة اإلعداد
محركات السيرفو ومكان ربطها على لوحة األردوينو.
ّ نضبط أقطاب
في حلقة البرنامج األساسيّة )( void setupنكتب تابع واحد ;)(read_move
يض ّم التّابع ;)( read_moveحلقة forويتم في كل دورة قراءة قيمة مدخل تشابهي ث ّم
إجراء عمليّة حساب قيمة مقاومة حسّاس اإلنحناء ث ّم تحويل مجال تغيّر المقاومة لما يناسبه من
محركات السيرفو ،بعد الحلقة forيتم تحديث زوايا
ّ زاوية وإسناد هذه القيم لمصفوفة قيم زوايا
محرك.
ّ حركة كل
414
مشروع الفصل الرابع :البيت البالستيكي
الزراعة والمشهورة جدّا ً هي البيوت البالستيكية أو ما تعرف باسم Greenhouse
أحد جوانب ّ
والتي تستخدم لتأمين ظروف بيئيّة مناسبة تساعد على نمو النّبات وإثماره في غير موسمه ،سنأخذ
هذه الفكرة لكن بشكل مبسّط لتكون مشروعنا في هذا الفصل (ت ّم طرح هذه الفكرة بشكل موسّع
جدا ً في المشروع الثاني من سلسلة 50مشروعا ً باستخدام األردوينو ...يمكنك االطالع عليه على
قناة ابتكار التعليمية على اليوتيوب).
-الحرارة وسيكون لدينا ضبط للحرارة عند قيمة يحدّدها المستخدم ،كما سيكون لدينا مقياسين
للحرارة أحدهما لقياس درجة الحرارة داخل البيت البالستيكي واآلخر لقياس الحرارة خارج
البيت البالستيكي ،وفي حال كانت درجة الحرارة منخفضة يتم رفعها من خالل السّخان
المتح ّكم به عبر ريليه.
باب قابل للفتح واإلغالق من قبل لوحة التح ّكم تبعا ً لقراءات درجة الحرارة فإن كانت حرارة -
الجو مناسبة سيتم إطفاء السّخان داخل البيت البالستيك وفتح الباب وذلك للتوفير الكهربائي
في التسخين.
أ ّما رطوبة التّربة فسيتم قياسها من خالل مقياس رطوبة التّربة وبناء على قيمة الضبط سيتم -
تشغيل مض ّخة الماء.
وأخيرا ً سيضم المشروع شاشة عرض LCDلعرض قيمة الحرارة والرطوبة المضبوطة -
وكذلك قيم الحرارة داخل وخارج البيت البالستيكي ورطوبة التربة الحاليّة ،وبما ّ
أن
المتغيّرات التي نريد عرضها كثيرة فسوف نستخدم شاشة عرض LCD 2004بحجم أربعة
أسطر وعشرين عامود.
415
416
لننتقل لتوصيل قطع المشروع مع بعضها:
417
كما اعتدنا ...نبدأ الكود البرمجي بالتعريفات المطلوبة لتحديد أسماء األقطاب المستخدمة ضمن
المتحوالت المستخدمة ضمن المشروع ،أيضا ً
ّ نعرف
الكود البرمجي ليسهل التعامل معها ،كذلك ّ
نضيف المكتبيّة المطلوبة لتشغيل المكتبيّة الخاصة بشاشة العرض وكل ما يتعلّق بتشغيل ال ّ
شاشة،
وفي حلقة اإلعداد نضبط طبيعة أقطاب لوحة األردوينو الدّخل منها والخرج.
418
419
في حلقة البرنامج األساسية يوجد لدينا خمسة توابع فرعية يتم في ك ّل واحد منها وظيفة محدّدة
م ّما يس ّهل فهم الكود وتتبّع المشاكل وتصحيحها أو تطوير األفكار مستقبالً ،لنبدأ بشرح هذه
التوابع....
وفيه تتم قراءة رطوبة التّربة وتحويل المجال القراءة لمجال 0 ~ 10ويكون عند 0جاف
وعند 10رطوبة عالية (يمكن للمبرمج تعديل مجال القراءة والتحويل بما يتناسب مع
مشروعه) ،وفي حال كانت الرطوبة المطلوبة للتربة أكبر من الرطوبة الحالية يتم تشغيل
مض ّخة ّ
الري.
وفيه يتم مقارنة درجة حرارة البيت من الداخل مع درجة الحرارة المطلوبة فإن كانت أصغر
من القيمة المطلوبة يتم تشغيل السّخان مع شرط أن يكون باب البيت البالستيكي مغلق.
وفيه يتم التح ّكم بفتح وإغالق الباب بالمقارنة بين درجة الحرارة المطلوبة ودرجة الحرارة
خارج البيت البالستيكي ،فإن كانت درجة الحرارة جيّدة يتم فتح الباب وإعطاء إشعار ّ
بأن
المحرك ومفاتيح نهاية ال ّ
شوط إذ ّ الباب في حالة فتح ليتم إطفاء السّخان (ننتبه عند توصيل
يجب أن يتوافق التوصيل مع جهة الحركة والموقع الصحيح لحسّاس نهاية الشوط).
420
-تابع عمل الكباسات اللحظية )(:button_work
وفي هذا التّابع يتم قراءة حالة الكبّاسات اللحظية ،لنبدأ بالمفتاح الخاص بالضبط والذي مع
كل ضغطة تتغير قيمته ضمن المجال 0 ~ 3فإن كان عند الحالة االفتراضية 0فعندها نكون
في الصفحة األولى على ال ّ
شاشة ،أ ّما إن كان عند القيمة 1فننتقل عندها للصفحة الثانية ،وعند
القيمة 2يكون هناك إمكانية لتعديل قيمة الحرارة المطلوبة زيادة أو إنقاص من خالل الكبّاسين
اآلخرين ،أ ّما القيمة 3فيمكن عندها تغيير قيمة رطوبة التربة زيادة أو إنقاص أيضا ً من
الكبّاسين اآلخرين ث ّم تعود للصفر أي لصفحة العرض األساسيّة.
421
422
-تابع العرض على الشاشة )(:display_work
صفحة األولى يتم عرض البارامترات
يمكن أن نقسم شاشة العرض لصفحتين ...ففي ال ّ
األساسية وهي الحرارة داخل وخارج البيت البالستيكي وكذلك رطوبة التربة الحالية وحالة
الباب.
صفة التالية فيتم عرض القيم التي يمكن ضبطها وهي الحرارة داخل البيت البالستيكي
أ ّما ال ّ
وكذلك رطوبة التربة وعند اختيار القيمة التي نريد ضبطها يظهر بجانب االسم سهم صغير
للداللة على القيمة التي يتم تغييرها.
تم تطوير هذا المشروع بشكل كبير وإضافة العديد من األفكار ...نشر على قناة ابتكار
التعليمية.
423
المحتويات
مقدّمة المؤلف2 ............................................................................................................................... :
األول7 ................................................................................................................................ :
الفصل ّ
مدخل إلى أساسيات األردوينو7 .............................................................................................................
أساسيّات العناصر االلكترونية8 ....................................................................................................... :
المفاتيح والكبّاسات8 ................................................................................................................. :
المقاومة الكهربائية10............................................................................................................... .
المكثّف الكهربائي16................................................................................................................ .
الديود 18.................................................................................................................... .Diode
ديود اإلصدار الضوئي 20................................................................................................. .LED
الترانزستور كمفتاح الكتروني22................................................................................................. .
الريليه25.............................................................................................................................. .
منظمات الجهد29.................................................................................................................... . ّ
لوحات األردوينو ....النشأة والتطور 31..............................................................................................
ما هو األردوينو Arduino؟؟؟ 31.................................................................................................
لماذا األردوينو ....؟؟؟33...........................................................................................................
لوحات األردوينو ....اإلختالف والميّزات 35........................................................................................
استعراض سريع ألشهر لوحات األردوينو36...................................................................................:
محاكاة األردوينو 50......................................................................................................................
صة 50...................................................................................................... :TINKERCAD
من ّ
برنامج 51................................................................................................................ :Fritzing
برنامج 52................................................................................................................ :Proteus
إضافة المكتبيات الخاصة باألردوينو52...........................................................................................
بيئة التطوير المتكاملة 56.......................................................................................... Arduino IDE
واجهة البرنامج الرئيسية56........................................................................................................ :
لغة البرمجة ++C/Cفي بيئة 64................................................................................. Arduino IDE
واجهة االتصال التسلسلي 66............................................................................................ UART
األقطاب الرقمية على لوحة األردوينو69........................................................................................ :
تعليمات التأخير الزمني79......................................................................................................... :
المتحوالت 82......................................................................................................... :variables
العمليات الرياضيّة المختلفة88.....................................................................................................:
424
الحلقة الشرطية 91............................................................................................................. :if
الحلقة التكرارية 100........................................................................................................ :for
الحلقة الشرطية 110...................................................................................................... :switch
الحلقة الشرطية 113....................................................................................................... :while
الحلقة الشرطية 116............................................................................................. :do … while
المداخل التشابهية 118....................................................................................... :Analog Inputs
المخارج التشابهية 129.....................................................................................:analog Outputs
العمليات الخاصة بأقطاب الدخل/الخرج العامة 134................................................................ :GPIOs
تعليمات العمليات الحسابية على القيم137....................................................................................... :
العدّادات الزمنية 140...............................................................................:)( millis )( / micros
العمليات الخاصة بالبت144....................................................................................................... :
المصفوفات 153.......................................................................................................... :Arrays
التّوابع (الدوال) 158................................................................................................ :Functions
مالحظات تصميميّة وعمليّة165...................................................................................................... :
االهتزاز الميكانيكي للكبّاس اللحظي 165......................................................................:pushbutton
تعريف األردوينو على الحاسب167.............................................................................................. :
تغذية لوحة األردوينو والحصول على أفضل أداء173........................................................................ :
المخارج/المداخل الرقميّة ...الفولط واألمبير175............................................................................. :
الهزاز الكرستالي ...السرعة واألداء176....................................................................................... :
األول178............................................................................................................... .
تمارين الفصل ّ
الفصل الثاني :المحيطيات (231........................................................................................................ )1
إضافة مكتبية لبيئة التطوير 233................................................................................. :Arduino IDE
لـوحـــة المــفـاتيـــح الســــــــت عـشـــــــريـة 239................................................................. Key Pad
شاشة العرض الكرستالية 245........................................................................................ .LCD1602
شاشة القطع السبع 254................................................................................................. Segment 7
القبضة التشابهية ذات المحورين 262...................................................................................... X & Y
ليد األلوان الثالثة 266.................................................................................................. RGB LED
األضواء RGB LEDذات العنوان المتح ّكم به270.............................................................................. .
لغة ++Cمن جديد 274...............................................................................................................
تمارين الفصل الثاني278................................................................................................................
مشروع الفصل :مؤقت تنازلي بأربع خانات باستخدام شاشة 292................................................ 7segment
425
محركات التيّار المستمر ...أنواعها ...التح ّكم بها 301..............................................................
ّ الفصل الثّالث:
محركات التيّار المستمر 303..................................................................................... :Brush Motor
ّ
دارة القيادة 306.......................................................................................................... :L298N
محركات السيرفو 313............................................................................................. :Servo Motor
ّ
المحركات عديمة الفحمات 320....................................................................................... :Brushless
ّ
محرك Brushlessباستخدام 322........................................................................... :ESC
ّ دارة قيادة
المحركات الخطوية 326........................................................................................ :Stepper Motor
ّ
المحركات الخطويّة أحاديّة القطبيّة 328........................................................................... :Unipolar
ّ
دارة القيادة 331..................................................................................................... :ULN2003
المحركات الخطويّة ثنائيّة القطبيّة 334.............................................................................. :Bipolar
ّ
دارة القيادة 336........................................................................................................... :A4988
دارة القيادة 344..................................................................................................... :DRV8825
المشفرات البصرية 350............................................................................................ The Encoder
المشفّر البصري المطلق 350............................................................................ absolute encoder
المشفّر البصري المتزايد 351............................................................ :The Incremental Encoder
تمارين الفصل الثالث357.............................................................................................................. :
مشروع الفصل :تصميم محرك Servoمن محرك 367.................................................................... DC
الفصل الرابع :المحيطيات (375....................................................................................................... )2
حساس األشعّة تحت الحمراء 376...............................................................................................PIR
حساس األمواج فوق الصوتية 383....................................................................... Ultrasonic Sensor
الموديوالت التي تحوي في بنيتها 389............................................................................... IC:LM393
صوت391................................................................................................................. :
حسّاس ال ّ
حسّاس رطوبة التّربة394.......................................................................................................... :
حسّاس اإلنحناء أو المرونة 397..................................................................................... FlexSensor
للقوة 401..................................................................................................... FSR
المقاومة الحسّاس ّ
الرابع 405...............................................................................................................
تمارين الفصل ّ
الرابع :البيت البالستيكي 415........................................................................................
مشروع الفصل ّ
426