You are on page 1of 426

‫اآلردوينو‬

‫‪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‬‬
‫ما مضى من صالح العيش راجع‬ ‫ْ‬
‫وهل‬ ‫أال يا لقوم ْ‬
‫هل لما ح ّم دافع؟‬

‫بنات الحشا‪ ،‬وانه ّل مني المدامع‬ ‫صرا ً قد َم َ‬


‫ضى فتهافَت ْ‬
‫َت‬ ‫تذ ّك ْرت ع ْ‬

‫وقَــتلى َم َ‬
‫ضـ ْوا فيهــــ ْم نفَ ْي ٌع َو َرافع‬ ‫صـبـــَابـَة َوجـ ْـد ذ ّك َرتني أحـــبّة ً‬
‫َ‬

‫واألرض منهــــ ْم بَالقع‬


‫ْ‬ ‫منازلــــه ْم‬ ‫ْ‬
‫وأوحشت‬ ‫وسعدٌ فأضحوا في الجنان‬

‫ســـــيوف اللّ َوامع‬


‫ظـــالل ال َمنَايَا وال ّ‬ ‫للرسول‪ ،‬وفَ ْوقَهــ ْم‬
‫َوفَ ْوا يَ ْو َم بَدْر ّ‬

‫مـــطيــ ٌع لـــه فــي ك ّل ْأمر وســــامع‬ ‫دعا فأجــــابوه بحــ ّق‪ ،‬وكلهـــــ ْم‬

‫طع اآل َجـــــا َل إالّ ال َم َ‬


‫صـــارع‬ ‫وال َي ْق َ‬ ‫فَما َبدّلوا حت ّـــــى ت ََوافَ ْوا َجمــــا َ‬
‫عة ً‬

‫إذا ل ْم يـــ ْ‬
‫كن إال النبيينَ شـــــافع‬ ‫ألنهم يرجــــونَ منــــه شــــفاعة‬

‫َو َم ْشـــ َهدنا فـــي ه‬


‫َّللا‪ ،‬وال َم ْوت ناقع‬ ‫وذلكَ ‪ ،‬يا خيــــ َر العبـــاد‪ ،‬بالؤنا‬

‫عة ه‬
‫َّللا تَابــــع‬ ‫ألولنــــَا‪ ،‬فـــي َ‬
‫طـــا َ‬ ‫ّ‬ ‫لَنَـــا القَ َدم األولـــى إليكَ ‪َ ،‬وخ َْلفنا‬

‫إن قَ َ‬
‫ضـــــا َء ه‬
‫َّللا ال بـــــدّ َواقــع‬ ‫َو ّ‬ ‫ونعلـــــم ّ‬
‫أن المـــــــلكَ هلل وحــــده‬

‫سان بن ثابت رضي هللا عنه‬


‫ح ّ‬
‫‪6‬‬
‫الفصل األول‪:‬‬

‫مدخل إلى أساسيات األردوينو‬

‫‪7‬‬
‫أساسيات العناصر االلكترونية‪:‬‬
‫سنتعرف في هذا القسم على أه ّم العناصر االلكترونية ووظائفها األساسية التي ته ّمنا في هذه‬
‫ّ‬
‫المرحلة من مراحل تعلّم برمجة األردوينو إذ ال يمكن أن يتقدّم الطالب في البرمجة مالم يرفع‬
‫مستواه العملي في االلكترونيات للوصول لمشاريع احترافية كون مجال البرمجة هنا يتض ّمن قسم‬
‫تطبيقي ‪ Hardware‬مع القسم البرمجي ‪ ....Software‬لنبدأ معا ً مستعينين باهلل‪.‬‬

‫المفاتيح والكباسات‪:‬‬

‫وهي عبارة عن عناصر فصل‪/‬وصل للتيّار الكهربائي وتتوفّر بأشكال مختلفة وطرق عمل‬
‫متعدّدة‪ ،‬نستخدمها في مشاريعنا كعناصر تمرير أوامر لألردوينو وذلك من خالل وصل‪/‬فصل‬
‫إشارة كهربائية نحو األردوينو‪.‬‬

‫‪8‬‬
‫تتوفّر المفاتيح بطرق عمل مختلفة فمنها ما يبقى على وضعيّته الجديدة بعد كل عمليّة ضغط عليه‬
‫كالمفاتيح المتعارف عليها ‪ ،Switch‬ومنها تبقى متغيّرة طالما هناك حالة ضغط عليها وتعود‬
‫لحالتها الطبيعية بعد زوال الضغط عنها وهي ما تعرف بالكبّاسات اللحظيّة ‪،push button‬‬
‫ويختلف ترميزها في الدّارات تبعا ً آللية عملها‪.‬‬

‫‪9‬‬
‫المقاومة الكهربائية‪.‬‬

‫تعتبر العنصر األشهر من بين العناصر الكهربائية تقاس بواحدة األوم ‪ Ohm‬ومضاعفاتها أو‬
‫أجزائها‪ ،‬كما تلعب دور كبير في الحماية وتتمثّل وظيفتها األساسية بكونها محدّد للتّيار ومقسّم‬
‫للجهد‪.‬‬

‫تتوفّر المقاومة الكهربائية بأنواع كثيرة جدا ً ويمكن تقسيمها تبعا ً لنوع ال ّمادة المصنّعة منها أو تبعا ً‬

‫الستطاعتها أو حتى طريقة تركيبها على اللّوحة اإللكترونية‪ ،‬ويمكن القول ّ‬


‫أن أي جسم هو عبارة‬
‫عن مقاومة تختلف قيمته تبعا ً لسماحيته لمرور التّيار الكهربائي‪.‬‬

‫لن نخوض كثيرا ً في أنواع المقاومة الكهربائية وسنكتفي بالتّعرف على أشهرها وهي المقاومة‬
‫الكربونية التي تتوفّر بقيم مختلفة باإلضافة لقدرتها على تح ّمل استطاعات مقبولة وكافية لنا خالل‬
‫تجميع الدّارات اإللكترونية (من األنواع المشهورة أيضا ً هو المقاومات السّلكيّة والتي تتميّز‬
‫بقدرتها على تح ّمل استطاعات عالية لكن تكون بقيم أومية صغيرة)‪.‬‬

‫‪10‬‬
‫لنتعرف معا ً على أشهر القوانين الكهربائية والتي‬
‫ّ‬ ‫قبل المتابعة في الحديث عن المقاومة وعملها‬
‫سنستخدمها خالل دراستنا وأشهرها على اإلطالق قانون أوم الذي يحقّق عالقة ربط بين‬
‫البارامترات الثالثة وهي األوم للمقاومة واألمبير للتيّار وأخيرا ً الفولط لفرق الجهد‪:‬‬

‫‪V=I.R‬‬

‫وأيضا ً من القوانين الكهربائية المه ّمة جدا ً قانون حساب االستطاعة أو القدرة الكهربائية (الطاقة‬
‫المتولّدة من خالل تحويل أو انتقال الطاقة الكهربائية ألشكال أخرى من الطاقة‪:‬‬

‫‪P=V.I‬‬

‫بالعودة للمقاومة الكهربائية وكما ذكرنا فإنّها تلعب دور أساسي في تحديد مقدار األمبير المار‬
‫خاللها‪ ،‬لكن مقدار األمبير الذي تتح ّمله متعلّق باالستطاعة التي ص ّممت لها والذي ينعكس بشكل‬
‫طردي على حجمها أي كلّما زادت استطاعتها زاد حجمها (يمكن أن نجد عدّة مقاومات من نفس‬
‫النوع ومن نفس القيمة لكن تختلف فيما بينها بالحجم بسبب اختالف استطاعة ك ّل منها عن‬
‫األخرى)‪.‬‬

‫‪11‬‬
‫بالعودة للمقاومة الكربونية نجد أنّها تضم عدّة حلقات بألوان مختلفة وتستخدم هذه الحلقات لتحديد‬
‫لنتعرف على ذلك من خالل‬
‫ّ‬ ‫قيمتها فك ّل لون داللة رقميّة ولك ّل حلقة داللة في تحديد القيمة‪....‬‬
‫الجدول التالي‪:‬‬

‫لكل مقاومة مجموعة من الحلقات اللّونية المتقاربة وحلقة لونيّة تكون بعيدة نسبيا ً على طرف‬
‫فأول حلقتين‬
‫المقاومة‪ ،‬الحلقات المتقاربة تحدّد قيمة هذه المقاومة فلو كان لدينا ثالث حلقات متقربة ّ‬
‫من اليسار تحدّدان رقم (لكل لون يقابله رقم كما من الجدول) أ ّما الحلقة اللّونية الثّالثة فتحدّد عامل‬
‫الضرب أو عدد األصفار بعد الرقم السّابق‪ ،‬وأخيرا ً ‪ ...‬الحلقة البعيدة تحدّد نسبة الخطأ التي‬
‫صنعت ضمنها المقاومة وقليالً ما يتم أخذ هذا العامل بعين االعتبار‪.‬‬

‫‪12‬‬
‫أ ّما النوع الذي يضم أربع حلقات فهو لتحديد دقّة أكبر للمقاومة من خالل وجود رقم إضافي في‬
‫القراءة وطريقة القراءة تكون بنفس األسلوب السّابق مع فارق ّ‬
‫أن ّأول ثالث حلقات من اليسار‬

‫تحدّد رقم يمثّل قيمة المقاومة بعد إضافة عدد األصفار المحدّد من الحلقة اللّونية ّ‬
‫الرابعة‪.‬‬

‫أن الحلقة اللّونية التي تحدّد عامل الضرب هي أيضا ً قد تكون عامل قسمة‬
‫ننتبه ألمر مهم وهو ّ‬
‫عندما يكون لونها ذهبي فيجب تقسيم الرقم الناتج على ‪ ،10‬أ ّما إن كانت باللون الفضّي فيجب‬
‫الرقم النّاتج على ‪.100‬‬
‫تقسيم ّ‬

‫يمكن استخدام مقياس الملتيميتر أو اآلفوميتير لقياس قيمة المقاومة‪.‬‬


‫‪13‬‬
‫المقاومة المتغيرة‪:‬‬
‫وهي المقاومة التّي تتغيّر قيمتها األوميّة تبعا ً لعامل فيزيائي خارجي مأثّر عليها‪ ،‬وقد يكون تغيّرها‬
‫خطي (أي كل تغيّر ثابت في المقدار الفيزيائي المطبّق على المقاومة يقابله نفس التغيّر في قيمة‬
‫المقاومة) أو تغيّر غير خطي (ويكون لكل تغيّر فيزيائي على المقاومة هناك تغيّر متزايد أو‬
‫متناقص وعادة ما يمثّل بمنحني لوغاريتمي)‪.‬‬

‫أ ّما المأثّر الفيزيائي فقد يكون تغيير يدوي كما هو الحال في المقاومات المتغيّرة المعروفة‪ ،‬وقد‬
‫يكون ضوئي كالمقاومات الضوئية ‪ ،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‬‬
‫الترانزستور كمفتاح الكتروني‪.‬‬

‫إذا كنت مبتدئا فلعلّك سمعت عن الترانزستور‪ ،‬أ ّما إن كنت صاحب خبرة وتجارب في البرمجة‬
‫وااللكترونيات فمن المؤ ّكد أنّك تعاملت معه بشكل أو بآخر‪....‬‬

‫سيكون حديثنا في هذه الفقرة مختصر جدا ً جدا ً عن الترانزستور ونأخذ منه ما يفيدنا في هذه‬
‫المرحلة التعليمية دون الدّخول في التفاصيل التي تحتاج لشرح كبير ووقت طويل‪.‬‬

‫بالتعريف يعتبر الترانزستور عبارة عن مفتاح الكتروني‪ ...‬ماذا يعني ذلك؟؟‬

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

‫وأولها ظهورا ً هي الترانزستورات ثنائيّة القطبيّة ‪Bipolar‬‬


‫أشهر أنواع الترانزستورات ّ‬
‫األول ‪ NPN‬والثّاني‬
‫‪ BJT:Junction Transistor‬وتقسم من ناحية البنية الدّاخلية لنوعين ّ‬
‫‪ PNP‬ولهذه الترانزستورات ثالثة أطراف خارجية يتم ترميزها بالرموز ‪ ،E , C , B‬ما يه ّمنا‬
‫سنتعرف على طريقة وصل الحمل معه والعناصر‬
‫ّ‬ ‫من هذه الترانزستورات هو النّوع ‪ NPN‬والتي‬
‫المطلوبة لتشغيله وبعض االعتبارات التصميمية‪.‬‬

‫‪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‬أي يكون التّماس وكأنّه مفتاح مغلق ويَفتح عند‬
‫تفعيل الريليه‪ ،‬كما يختلف عددها بين أنواع الريليهات وكذلك األمبير األعظمي الذي‬
‫يمرره التّماس‪.‬‬
‫ّ‬

‫آلية عمل الريليه‪:‬‬


‫يتحول إلى‬
‫ّ‬ ‫عند تغذية طرفي الملف بالتغذية المناسبة له (حسب نوعه كما ذكرنا) فإنّه‬
‫مغناطيس م ّما يسبّب جذب الملفّات المقابلة له وبالتالي تغيير حالتها األساسيّة فالملف الذي‬
‫كان مغلق طبيعيّا ‪ NC‬يصبح مفتوح‪ ،‬أ ّما التّماس المفتوح طبيعيّا ‪ NO‬يصبح مغلق وبالتالي‬
‫تتغيّر حالة الحمل تبعا ً للتوصيل مع الريليه‪.‬‬

‫‪26‬‬
‫بقي النقطة األخيرة في التعامل مع الريليه وهي كيفية تشغيل الملف؟؟‬
‫المستمرة ‪ DC‬أو المتناوبة ‪ ،AC‬ما‬
‫ّ‬ ‫ذكرنا في حديثنا عن الملف أنّه يمكن أن يعمل عند التغذية‬
‫يهمنا هو تلك التي تعمل على التغذية المستمرة فيتم التح ّكم بالملف من خالل ترانزستور كما في‬
‫المخطط التّالي‪:‬‬

‫الديود العكسي الموصول مع ملف الريليه على التّفرع يس ّمى ديود المسار الحر وهو ضروري‬
‫للتخلّص من التيّارات العكسية النّاتجة عن تشغيل وإطفاء الملف‪.‬‬

‫‪27‬‬
‫تتوفّر في األسواق موديوالت تضم الريليه مع كامل العناصر اإلضافية للتح ّكم بها ويمكن أن‬
‫يكون عدد مختلف من الريليهات مع ملحقاتها‪.‬‬

‫‪28‬‬
‫منظمات الجهد‪.‬‬

‫عند تعاملنا مع لوحات األردوينو أو مع المتح ّكمات نجد أنّنا بحاجة لمصادر جهد خا ّ‬
‫صة لكي‬
‫أن بعض هذه اللّوحات تضم في بنيتها ّ‬
‫منظمات‬ ‫تعمل لوحات األردوينو بشكل صحيح‪ ،‬وسنجد ّ‬
‫ّ‬
‫المنظمات وهنا يجب علينا تأمين الفولط المناسب‬ ‫للجهد المستمر‪ ،‬بينما بعضها اآلخر ال تضم هذه‬
‫لعمل األردوينو‪.‬‬

‫تعمل المتح ّكمات الموجودة على لوحات األردوينو في غالبها عند ‪( 5v‬وهو أفضل جهد عمل‪،‬‬
‫كما يوجد أنواع تعمل عند ‪ ،)3.3v‬لكن بالنّظر لمصادر الجهد المستمر المتوفّرة في األسواق‬
‫أن في غالبها يكون ‪ 12v‬أو خاليا ليثيوم وتكون ‪ 3.7v‬أو غير ذلك من‬ ‫صة ّ‬
‫البطاريات سنجد ّ‬ ‫وخا ّ‬
‫مصادر التغذية التي ال يمكن استخدامها بشكل مباشر مع المتح ّكم بل نحتاج لوصلها بطرق مختلفة‬
‫ّ‬
‫لمنظم جهد‪...‬‬ ‫للحصول على الجهد المطلوب ومع ذلك لن تكون القيم مناسبة بل نحتاج عندئذ‬
‫لنتعرف معا ً على طرق الحصول على الجهد المطلوب‪.‬‬
‫ّ‬

‫منظمات الجهد الخطية‪:‬‬


‫ّ‬
‫منظمات جهد تعطي على خرجها فولط ثابت مهما تغيّر فولط الدّخل ضمن المجال‬ ‫وهي‬
‫ّ‬
‫المنظمات العائلة ‪ 78xx‬والتي تتوفّر بعدّة أنماط لتنظيم الخرج‬ ‫المسموح به‪ ،‬وتعتبر أشهر هذه‬
‫لكن أهم ّ‬
‫منظم منها ‪ 7805‬الذي يعطي جهد خرج ثابت ‪.5v‬‬
‫ّ‬
‫الخطية بشكل عام فيجب علينا معرفة أهم األمور التي يجب‬ ‫عند التعامل مع ّ‬
‫منظمات الجهد‬
‫أن يوفّرها منظم الجهد وهي‪:‬‬
‫‪ -‬مقدار جهد الخرج ‪.Vout‬‬
‫‪ -‬مجال جهد الدّخل ‪.Vin‬‬
‫‪ -‬األمبير الذي يستطيع تقديمه ّ‬
‫منظم الجهد‪.‬‬

‫‪29‬‬
‫أما طريقة وصل هذه المنظمات‪:‬‬

‫من مساوئ هذه المنظمات‪:‬‬


‫تحتاج لجهد دخل أكبر من جهد الخرج لكي تعمل بشكل صحيح (تختلف قيمة الحد األدنى‬ ‫‪-‬‬
‫ّ‬
‫المنظمات فمنها من تعمل عند ‪ 6v‬ومنها عند ‪.)7v‬‬ ‫بين أنواع‬
‫‪ -‬يتم تنظيم الجهد عبر تبديد الفارق المطبّق على الدّخل على شكل حرارة (أي لو كان‬
‫ّ‬
‫المنظم لكي يعمل والـ ‪5v‬‬ ‫الدخل ‪ 12v‬فإنه سيتم تقديم ‪ 5v‬على الخرج و ‪ 2v‬يستهلكه‬
‫المتبقّية تصرف على شكل استطاعة حرارية)‪ ،‬وهذا يسبب استهالك زائد غير مرغوب‬
‫فيه‪.‬‬
‫ّ‬
‫المنظمات يعتبر ضعيف نسبيّا ً (يتراوح بين ‪100mA‬‬ ‫‪ -‬األمبير الذي تستطيع تقديمه هذه‬
‫صة في المشاريع التي تضم عدد كبير من ّ‬
‫الطرفيّات وهنا يمكن وصل‬ ‫وحتى ‪ )1.5A‬وخا ّ‬
‫أكثر من ّ‬
‫منظم جهد على الت ّ ّ‬
‫فرع مع بعضها لمضاعفة األمبير على الخرج‪.‬‬

‫‪30‬‬
‫لوحات األردوينو ‪ ....‬النشأة والتطور‬

‫ما هو األردوينو ‪Arduino‬؟؟؟‬

‫‪ :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‬‬
‫لماذا األردوينو ‪ ....‬؟؟؟‬

‫في الحقيقة يوجد الكثير من المتحكمات اإللكترونية ‪ Micro-Controllers‬المتوفرة في السوق‬


‫مثل ‪ Parallax‬و ‪ Basic Stamp‬و ‪ Raspberry Pi‬وكلها تتميز بإمكانيات قوية ولها‬
‫القدرة على التحكم في مختلف القطع اإللكترونية والبرمجيات ‪ Software‬وذلك طبعا بنسبة‬
‫أفضلية متفاوتة لكن ما يميز األردوينو ‪ Arduino‬هو مجموعة من األمور التي تصنع الفارق‬
‫بينه وبين غيره أهمها‪:‬‬

‫البساطة‪ :‬قطعة األردوينو ‪ Arduino‬مصممة لتناسب احتياجات الجميع‪ ،‬محترفين‪،‬‬

‫أساتذة‪ ،‬طالب وهواة اإللكترونيات التفاعلية‪.‬‬

‫الثمـــن‪ :‬لوح األردوينو ‪ Arduino‬أقل ثمنا ً مقارنةً مع األلواح األخرى من نفس النوع‬

‫فثمن أغلى ‪ Arduino‬ال يتجاوز ‪50 $‬‬

‫الـذاتي)‪ :(Self-Assembly‬يمكنـك تحميـل ورقـة البيـانـات ‪Datasheet‬‬ ‫التركيـ‬


‫الخاصة باألردوينو ‪ Arduino‬مجانا ً من الموقع الرسمي وشراء القطع وتركيبه بنفسك‪.‬‬

‫متعدد المنصات‪ :‬برنامج األردوينو له القدرة على العمل على الويندوز‪، windows‬‬

‫‪Mac OS‬واللينكس ‪ Linux‬بينما أغلب المتحكمات اإللكترونية األخرى تعمل فقط على‬
‫الويندوز‪.‬‬

‫بيئة برمجية ســـهلة وبســـيطة‪ :‬البيئة البرمجية ‪Programming Environment‬‬

‫مص ّممة لتكون سهلة للمبتدئين وثابتة وقوية للمحترفين‪.‬‬

‫‪ :Open Source Software‬مكتوب بلغـة ‪ C++‬و متـاح للجميع لتحميلـه و‬

‫بإمكان المبرمجين التعديل عليه وفق احتياجاتهم‪.‬‬

‫‪33‬‬
‫‪ : Open Source Hardware‬اآلردوينو ‪ Arduino‬مصنوع أساسا ً من‬

‫متحكمات ‪ ATMEGA328‬و ‪ ATMEGA168‬و المخططات منشورة تحت ترخيص‬


‫‪ Creative Commons‬مما يتيح إلى مصممي الدارات اإللكترونية ‪Electronic‬‬
‫‪ Circuits‬تصميم داراتهم الخاصة‪.‬‬

‫ماذا نقصد بمفتوح المصدر ‪ Open Source‬؟؟؟‬

‫مخططات تصميم العتاد ‪ Hardware Schema‬الخاصة باألردوينو ‪ Arduino‬متاحة للجميع‬


‫لتحميلها ودراستها لفهم مبدأ عمل القطعة والتعديل عليها وكذلك إمكانية االستفادة منها تجاريا ً‬

‫كذلك الكود المصدري الخاص ببرنامج ‪ Arduino‬مفتوح المصدر ومتوفر بترخيص ‪.GPL‬‬

‫‪34‬‬
‫لوحات األردوينو ‪ ....‬اإلختالف والميزات‬

‫منذ انطالق مشروع األردوينو وحتى وقتنا الحالي تم إنتاج العديد من التصاميم واللوحات والهدف‬

‫من ذلك تأمين احتياجات المشاريع المتعددة وبناء لوحات تتناسب مع التطبيق المطلوب من حيث‬

‫السرعة وعدد المداخل والمخارج والسعر وأمور أخرى لها عالقة بالبنية الداخلية للمتحكم‬

‫‪ Microcontroller‬الموجود على لوحة األردوينو حتى بلغ عدد لوحات األردوينو على ما يزيد‬

‫عن ‪ 40‬نوع بعضها يتشابه في المتحكم ويختلف في الحجم والملحقات المتوفرة على لوحة‬

‫األردوينو نفسها‪ ،‬لكن ما يجمع كل لوحات األردوينو أنها تقسم في بنيتها إلى أربعة أقسام عا ّمة‪:‬‬

‫‪ -‬قسم المتحكم‪ :‬والذي يضم المتحكم وكل ما يلزم لعمل المتحكم بالشكل الصحيح‬

‫(الكرستالة الخارجية مع المكثفات الخاصة بها‪ ،‬كباس إعادة الضبط ‪ ،RESET‬مكثفات‬

‫االستقرار الكهربائي على مداخل التغذية‪ ،‬أرجل أقطاب الدخل والخرج العامة)‪.‬‬

‫‪ -‬قسم االتصال مع الحاسب‪ :‬وهي شريحة لتأمين االتصال بين الحاسب ولوحة األردوينو‬

‫أي بين البروتوكولين ‪( USB < > UART‬غالبا تكون هذه الشريحة إما ‪IC: FTDI‬‬

‫أو متحكم ‪.)ATmega8‬‬


‫‪ -‬قسم التغذية‪ :‬لتأمين وضبط تغذية المتحكم ويتم ذلك عبر ّ‬
‫منظمات جهد لتعطي على لوحة‬

‫األردوينو جهد بقية ‪ 5v & 3.3v‬أو أحد القيم السابقة‪.‬‬

‫‪ -‬ملحقات على لوحة األردوينو‪ :‬كالكبّاسات اللحظية ومداخل قراءة كرت الذاكرة أو‬

‫حساس أو أي نوع آخر وتكون هذه الملحقات لتسهيل التوصيل مع األردوينو‪ ،‬وتتوفر‬

‫هذه الملحقات على لوحات دون غيرها‪.‬‬

‫‪35‬‬
‫استعراض سريع ألشهر لوحات األردوينو‪:‬‬

‫عند التعامل مع لوحات األردوينو سنواجه الكثير من األنواع منها والسؤال الذي سوف يتبادر‬

‫للذهن أي لوحة هي األفضل‪...‬؟؟‬

‫في الحقيقة ال يمكن اختصار اإلجابة بنوع واحد معين وتعميمه على أنّه األفضل‪ ،‬فلكل‬

‫مشروع متطلباته ولكل لوحة ميزات تجعلها هي األنسب لحاالت دون غيرها‪ ،‬ففي حال‬

‫الحاجة ألعداد كثيرة من األرجل الرقمية أو التشابهية نختار لوحات مثل لوحة ‪ MEGA‬أما‬

‫في حالة المشاريع البسيطة اإلنتاجية نختار لوحة ‪ Pro mini‬وفي حال المشاريع اإلنتاجية‬

‫مع ضرورة قراءة بارامترات على الحاسب نختار لوحة ‪ NANO‬وهكذا لكن بالمجمل يجب‬

‫أن يكون لدى المبرمج إطالع على البارامترات األساسية للوحات األردوينو وهي‪:‬‬

‫جهد التغذية الخاص بلوحة األردوينو الحدي واألعظمي‪.‬‬

‫سرعة المعالج والتي تقاس بـ ‪.MHz‬‬

‫عدد األقطاب الرقمية ‪ GPIOs‬وكذلك األقطاب الخاصة بالمبدل التشابهي‪.‬‬

‫عدد قنوات ‪.PWM‬‬

‫عدد قنوات المبدل التشابهي الرقمي ‪.ADC‬‬

‫حجم ذواكر المعالج ‪.Flash ,SRAM,EEPROM‬‬

‫الميزات اإلضافية والتي تشمل الملحقات اإلضافية على اللوحة وأبعاد اللوحة وكذلك‬
‫المميزات الخاصة ببنية المعالج وغير ذلك من األمور‪.‬‬

‫‪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‬‬

‫صة من أجمل مواقع محاكاة األردوينو وهي من تقديم شركة ‪ Autodesk‬صاحبة‬


‫تعتبر هذه المن ّ‬
‫صة ضعفها في محاكاة‬
‫أكبر مجموعة برامج تصميم ثالثية األبعاد‪ ،‬من نقاط ضعف هذه المن ّ‬
‫المشاريع وضعف تخديم العناصر والموديوالت المختلفة لكن نأمل أن يتحسّن أداءها مستقبالً‪.‬‬

‫‪50‬‬
‫برنامج ‪:Fritzing‬‬

‫مشروع مفتوح المصدر لتطوير برمجية للتصميم بمساعدة الحاسوب للمحترفين وهواة تصميم‬
‫الدارات اإللكترونية ويساعد المصممين والفنيين على رسم وتركيب نماذج للدارات اإللكترونية‬
‫بكيفية سهلة مع تصحيح آلي للمسارات ويدعم كذلك الربط على الشبكة للمشروعات المشتركة‪.‬‬
‫تم تطويره في جامعة بوتسدام للعلوم التطبيقية‪.‬‬

‫‪51‬‬
‫برنامج ‪:Proteus‬‬

‫من أقوى برامج المحاكاة للدوائر االلكترونية والذي كان يتميّز سابقا ً في قدرته على محاكاة‬
‫مطوروا البرنامج لمواكبة هذه‬
‫ّ‬ ‫المعالجات والمتح ّكمات‪ ،‬ومع ظهور لوحات األردوينو سارع‬
‫اللوحات وذلك من خالل طرح العديد من المكتبيات التي تدعم عدد من لوحات األردوينو باإلضافة‬
‫إلى عدد كبير من الموديوالت هذا عدا عن العناصر والقطع المختلفة والموجودة أساسا ً في بيئة‬
‫البرنامج‪.‬‬

‫أيضا ً تض ّم بيئة المحاكاة عدد كبير من المقاييس المختلفة ومولّد للنبضات باإلضافة لواجهات‬
‫التخاطب مع بروتوكوالت االتصال المختلفة وغير ذلك من ميّزات المحاكاة التي توفّر الجهد‬
‫والوقت في تنفيذ المشروع‪.‬‬

‫أيضا ً يتميّز البرنامج بقدرته على تحويل المشروع من مخطط المحاكاة دارة مطبوعة ‪BCP‬‬
‫لتجميع المشروع عليها‬

‫إضافة المكتبيات الخاصة باألردوينو‪.‬‬


‫كما ذكرنا ‪ ...‬يتوفر العديد من المكتبيات التي تقدم نماذج محاكاة جاهزة للوحات األردوينو‬
‫المختلفة وهذه المكتبيات متواجدة على العديد من المواقع‪ ،‬وبعد الحصول على هذه المكتبيات نقوم‬
‫بنسخ هذه المكتبيات إلى مجلد المكتبيات ‪Library‬‬
‫الخاص ببرنامج ‪ Proteus‬ثم نعيد تشغيل البرنامج‬
‫فيكون بذلك قد تمت إضافة هذه المكتبيات للبرنامج‬
‫وأصبحت جاهزة للعمل‪.‬‬

‫‪52‬‬
‫بالدخول إلى برنامج ‪ Proteus 8‬نكتب في مكان البحث ‪ Arduino‬فتظهر لدينا لوحات األردوينو‬
‫التي تم إضافتها من المكتبية الخاصة‪.‬‬

‫أشهر اللوحات التي يتم إضافتها هي لوحة ‪ Arduino UNO‬ولوحة ‪ Arduino Mega‬ولوحة‬

‫‪ Arduino Nano‬باإلضافة لحساس األمواج فوق الصوتية ‪ Ultrasonic‬لحساب المسافات‪.‬‬

‫‪53‬‬
‫بعد إضافة مكتبيات األردوينو بقي لدينا خطوة مهمة وهي كيف نحصل على الكود البرمجي الذي‬
‫ت ّمت كتابته في بيئة التطوير ‪ Arduino IDE‬وإضافته للوحة األردوينو على البروتيس‬
‫‪Proteus‬لمحاكاته؟؟؟‬

‫يتعامل برنامج البروتيس مع الملفّات ذات ّ‬


‫الالحقة الثنائية "‪ "code.bin‬أو الالحقة الستّ عشرية‬
‫"‪ "code.hex‬وهذه اللواحق تمثل اللغة التي تفهمها اآللة‪ ،‬وبالتالي فإنّنا نحول الكود الذي نكتبه‬
‫في بيئة التطوير ‪ Arduino IDE‬إلى الصيغة الثنائية (من القائمة ‪ Sketch‬نختار األمر‬
‫‪ Export compiled Binary‬أي تصدير الكود بالصيغة الثنائية والذي سوف يظهر في نفس‬
‫المجلد الذي تم حفظ ورقة العمل فيه بنفس االسم لكن بامتداد الثنائي ‪ )Binary‬وبعد تحويله‬

‫‪54‬‬
‫للصيغة الثنائية يتم جلب هذه الصيغة للوحة األردوينو في بيئة المحاكاة ‪ Proteus 8‬عبر الضغط‬
‫على لوحة األردوينو في برنامج ‪ Proteus 8‬فتظهر نافذة يتم فيها تحديد مكان تواجد الكود‬
‫البرمجي ومن ثم تشغيله ‪.‬‬

‫نالحظ من واجهة خصائص لوحة األردوينو أن تردد عمل المتحكم ‪ 16MHz‬وهو نفس التردد‬
‫الذي تعمل عليه لوحة األردوينو نوع ‪ ،UNO‬فموضوع ضبط التردد في المشاريع التي تتم فيها‬
‫المحاكاة هو أمر مهم جدا جدا ألن اختالف التردد سيؤدي إال نتائج غير متوقعة أو غير مضبوطة‬
‫بالشكل المطلوب وخاصة في المشاريع التي تعتمد على المؤقتات أو على بعض بروتوكوالت‬
‫االتصال‪.‬‬

‫أخيراً‪...‬‬

‫أفضل أسلوب لتعلم برمجة لوحات األردوينو هو التعلم على لوحات األردوينو مباشرة أو البدء‬
‫مع برنامج ‪ Proteus‬كونه أفضل المحاكيات وذلك من خالل التجربة الشخصية‪ ،‬مع عدم إهمال‬
‫الجانب العملي التطبيقي‪.‬‬

‫‪55‬‬
‫بيئة التطوير المتكاملة ‪Arduino IDE‬‬

‫واجهة البرنامج الرئيسية‪:‬‬

‫بيئة التطوير ‪ IDE‬وهي اختصار ‪ Integrated Development Environment‬أي بيئة‬


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

‫‪56‬‬
‫تعتمد بيئة ‪ Arduino IDE‬في أساسها على لغة البرمجة ‪ C/C++‬وتحتوي في بنيتها على‬
‫العديد من المكتبيات الجاهزة والتعليمات التي تختصر الكثير من الوقت والتي تعتبر من أسهل‬
‫لغات البرمجة التي تستخدم في برمجة المتحكمات المصغرة ‪.Microcontroller‬‬

‫تسمى البيئة التطويرية ‪ Arduino IDE‬التي يتم فيها برمجة لوحات األردوينو وكتابة الكود‬
‫البرمجي بـ ‪( Sketch‬التصميم أو المخطط)‪ ،‬وكأي بيئة برمجة تحتوي واجهة البرنامج على‬
‫قوائم وأوامر واختصارات على الواجهة الرئيسية مهمتها تسهيل كتابة الكود البرمجي وتقديم‬
‫الميزات الكبيرة الموجودة في بيئة التطوير ‪ ،Arduino IDE‬سنستعرض هذه القوائم بشكل‬
‫متسلسل مع شرح مبسط عن محتوى كل قائمة‪:‬‬

‫االختصارات على الواجهة الرئيسية‪:‬‬

‫فحص ‪ :Verify‬تفحص الكود من األخطاء البرمجية‪.‬‬ ‫‪o‬‬

‫رفع ‪ :Upload‬تحويل الكود للغة يفهمها المتحكم ومن ثم رفعها للوحة اآلردوينو‪.‬‬ ‫‪o‬‬

‫جديد ‪ :New‬إنشاء صفحة عمل جديدة‪.‬‬ ‫‪o‬‬

‫فتح ‪ :Open‬فتح ملفات موجودة مسبقا أو مشاريع جاهزة للتعديل عليها‪.‬‬ ‫‪o‬‬

‫حفظ ‪ :Save‬حفظ صفحة العمل‪.‬‬ ‫‪o‬‬

‫مراقب المنفذ التسلسلي ‪ :Serial monitor‬لمراقبة األحداث عبر المنفذ التسلسلي‪.‬‬ ‫‪o‬‬

‫‪57‬‬
‫قائمة ملف ‪:File‬‬
‫‪ o‬جديد ‪ :New‬فتح صفحة عمل جديدة‪.‬‬

‫‪ o‬فتح ‪ :Open‬فتح صفحة عمل موجودة سابقا‪.‬‬

‫‪ o‬المممفمتموحممة حممديمثمما ‪ :Open recent‬عـرض‬

‫صفحات العمل األكثر استخداما‪.‬‬

‫‪ o‬كتاب شممميفرة البرمجة ‪ :Sketchbook‬يدل على‬

‫الرسومات المضمنة في مجلد صفحة العمل‪.‬‬

‫‪ o‬أمثلمة ‪ :Example‬يقـدم هـذا الخيـار العـديـد من‬

‫األمثلـة الجـاهزة في بيئـة ‪ Arduino IDE‬وكـذلـك‬

‫المكتبيات الجاهزة‪.‬‬

‫‪ o‬إغالق ‪ :Close‬إغالق نافذة العمل الحالية‪.‬‬

‫‪ o‬حفظ ‪ :Save‬حفظ صفحة العمل الحالية باالسم الحالي‪.‬‬

‫‪ o‬حفظ باسم ‪ :Save as‬حفظ صفحة العمل باسم جديد‪.‬‬

‫‪ o‬إعدادات الصفحة ‪ :Page Setup‬تغيير إعدادات الصفحة للطباعة‪.‬‬

‫‪ o‬طباعة ‪ :Print‬طباعة صفحة العمل‪.‬‬

‫‪ o‬تفضميالت ‪ :Preference‬يتم فتح نافذة يتم من خاللها تحرير إعدادات ورقة العمل منها‬

‫إعدادات اللغة وترقيم أسطر البرنامج وغير ذلك‪.‬‬

‫‪ o‬خروج ‪ :Quite‬إغالق جميع نوافذ البرنامج‪.‬‬

‫‪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‬وحفظها في نفس مكان حفظ الكود البرمجي‪.‬‬

‫تشغيل مراقب المنفذ التسلسلي ‪ :Serial Monitor‬إلرسال واستقبال البيانات من‬


‫لوحة اآلردوينو عبر الحاسب‪.‬‬

‫‪ :Serial Plotter‬فتح نافذة التخاطب مع المنفذ التسلسلي‪.‬‬

‫اللوحة ‪ :Board‬تحديد لوحة اآلردوينو التي يتم التعامل معها‪.‬‬

‫المنفذ ‪ :Port‬تحديد المنافذ التسلسلية الحقيقة واالفتراضية الموجودة على الجهاز‪.‬‬

‫المبرمجة ‪ :Programmer‬يتم من خالل هذا األمر اختيار الطريقة التي سوف يتم من‬
‫خاللها برمجة المتحكم الموجود على اللوحة وفي حال عدم وجود محمل اإلقالع‬
‫‪ Bootloader‬سوف تحتاج لتحديد نوع المبرمجة‪.‬‬

‫‪61‬‬
‫تحميل محمل اإلقالع ‪ :Burn Bootloader‬نستخدم هذا األمر من هذه القائمة عند وضع‬
‫متحكم جديد على لوحة اآلردوينو ونريد تزويد هذا المتحكم بمحمل اإلقالع حيث أن المتحكم‬
‫يأتي بشكل افتراضي خالي من أي برنامج‪ ،‬لكن علينا االنتباه لـ ‪ Fuse Bit‬وضبطها بالشكل‬
‫الصحيح‪.‬‬

‫قائمة األدوات ‪:Tools‬‬

‫في هذه القائمة نجد األوامر المتعلقة بتقديم المساعدة للمبرمج وخاصة الذي يستخدم بيئة برمجة‬
‫اآلردوينو للمرة األولى فنجد األمر ‪ 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‬مسح البيانات الظاهرة في منطقة استقبال البيانات‪.‬‬
‫أهم أمر يجب ضـــــــــبطه عند تشغيل واجهة االتصــــــــــــال‬

‫التســـــلسلي هو مــــعدل النقل والمعروف بـ ‪Baud Rate‬‬

‫ويقاس بواحدة ‪ bps‬أي معدل البايتات المرســـلة في الثانية‪،‬‬

‫تسـتخدم هذه الواجهة نافذة االتصـال التسـلسـلي الغير متزامن‬

‫‪ UART‬والتي لها قطــــــــبين على لوحــــــــــــة اآلردوينو‬

‫همــا ‪ ، RX- TX‬أهم التعليمات المستخدمة هي‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫;)‪Serial.begin(115200‬‬ ‫تحديد معدل نقل البيانات بواحدة ‪ ،bps‬في قسم‬

‫اإلعداد بعد الدالة )(‪.void setup‬‬

‫طباعة (ارسال) بيانات ‪ Val‬من اآلردوينو إلى‬


‫;)‪Serial.println(Val,format‬‬
‫الحاسب بالصيغة التي نختارها ‪،format‬‬

‫ويتم طباعة كل قيمة جديدة في سطر جديد‪.‬‬


‫طباعة (ارسال) بيانات ‪ Val‬من اآلردوينو إلى‬
‫;)‪Serial.print(Val,format‬‬
‫الحاسب بالصيغة التي نختارها ‪،format‬‬

‫ويتم طباعة كل القيم في نفس السطر‪.‬‬

‫‪67‬‬
‫;)(‪Serial.available‬‬ ‫وهي تعليمة تستخدم للتأكد من وصول البيانات‬
‫على المنفذ التسلسلي‪ ،‬ففي حال ورود أي بيانات‬
‫على المنفذ التسلسلي تصبح نتيجة هذه التعليمة‬
‫‪.True‬‬
‫;) (‪Val = Serial.read‬‬ ‫قراءة القيمة المرسلة إلى لوحة اآلردوينو‬
‫واسنادها للمتحول ‪ ،Val‬والقيم التي يتم‬

‫قراءتها من نوع محرفي حصرا‪.‬‬


‫قراءة سالسل محرفية مدخلة على المنفذ ;) (‪Val = Serial.Stringread‬‬

‫التسلسلي‪ ،‬المتحول ‪ val‬من نوع ‪String‬‬

‫يجب االنتباه أن الصيغ المتاحة ‪ format‬هي (‪ )BIN , HEX , DEC , OCT‬وفي الحالة‬

‫صحيحة والعبارات كمحارف‪ ،‬يمكن أن نضع بدل‬


‫االفتراضية يتم طباعة األرقام بالقيم ال ّ‬

‫‪ format‬رقم نختاره وفي هذه الحالة فإن الرقم يعبّر عن عدد الخانات التي نريد طباعتها بعد‬

‫الفاصلة العشرية‪.‬‬

‫يجب االنتباه أيضا أنّه وبمجرد كتابة التعليمة ;)‪ Serial.begin(115200‬يصبح القطبين‬

‫‪ TX , RX‬من لوحة األردوينو محجوزين وغير قابلين للعمل كأقطاب رقمية‪.‬‬

‫هذه جملة من التعليمات يتم استخدامها مع واجهة االتصال التسلسلي وهي فقط استعراض سريع‬

‫لكي نتعلم التعامل مع هذه الواجهة مبدئيا وسنتطرق لبروتوكول االتصال ‪ 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‬قبله أو بعده ال يهم) أما القطب السالب‬

‫فيتم وصله مع سالب لوحة األردوينو ‪.GND‬‬

‫كما نعلم حتى يعمل الـ ‪ 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‬فيبقى ضمنها مادام المعالج في حالة العمل‪ ،‬أي ينفذ أسطر الحلقة‬

‫وعند االنتهاء يبدأ من السطر األول وهكذا‪.‬‬

‫أن سرعة المعالج كبيرة جدا (‪ 16MHz‬وبفرض ّ‬


‫أن كل تعليمة تنفذ بنبضة ساعة واحدة‬ ‫وبما ّ‬

‫فبالتالي يكون المعالج قادر على تنفيذ ‪ 16‬مليون تعليمة في الثانية بشكل تقريبي) ففي بعض‬

‫األحيان تكون هذه السرعة متعبة للمستخدم وال يستطيع أن يالحظ التغيرات التي يقوم بها المعالج‬

‫وهنا ال بد من وجود تعليمات تأخير زمني وظيفتها تجميد المعالج لفترة زمنية محددة لكي نستطيع‬

‫متابعة التغيرات في المشروع‪.‬‬

‫الجدول التالي يستعرض تعليمات التأخير الزمني المستخدمة في بيئة ‪ Arduino IDE‬وهما‬

‫التعليمتين )‪ delayMicroseconds(us), delay(ms‬فاألولى تأخذ قيمها بواحدة‬

‫الميلي ثانية أي كل ‪ 1000‬ميلي ثانية يعادل ‪ 1‬ثانية‪ ،‬بينما تعمل التعليمة‬

‫)‪ delayMicroseconds(us‬بنظام الميكروثانية وتستخدم في التأخيرات الزمنية‬

‫الضئيلة جدا‬

‫‪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++‬بصفة عامة) عدة أنواع للمتحوالت (على عكس‬
‫بعض لغات البرمجة والتي ال تهتم كثيرا بنوع المتحول ألنها ال تهتم بحجم ذاكرة التطبيق على‬
‫الحاسب أو الجوال ) لمراعاة التخزين في الذاكرة ‪ ،‬سنجد أوال تقسيم للمتحوالت من حيث النوع‬
‫هل هو رقمي أم محرفي (حرف أو رمز أو سلسلة أحرف) ثم سنجد في النوع نفسه تقسيم‪ ،‬فلو‬
‫كان رقمي هل هو عدد صحيح أم عدد بفاصلة عشرية‪ ،‬أما إن كان محرفي فهل هو حرف واحد‬
‫أم سلسلة أحرف‪....‬‬

‫لنتعرف على أنواع المتحوالت والحجم الذي يحجزه كل نوع من الذاكرة والمجال القادر على‬
‫استيعابه من خالل الجدول التالي‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫; ‪boolean var‬‬ ‫‪or‬‬ ‫متحول منطقي له حالتين فقط ‪.true or false‬‬
‫; ‪bool var‬‬
‫; ‪byte var‬‬ ‫متحول رقمي بطول ‪ 8Bit‬وقيمته تنتمي ‪.0 ~ 256‬‬

‫‪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‬أي ّ‬
‫أن هذا المتغير للقراءة فقط وال يمكن التعديل على قيمته‪.‬‬

‫أين أعرف المتحول؟؟‬

‫عرفت المتحول قبل الحلقة )(‪void setup‬‬


‫يوجد نوعين من المتحوالت تبعا لمكان تعريفه‪ ،‬فلو ّ‬
‫بشرط أال يكون ضمن أي قوسي مجموعة }{ فعندها يكون من نوع ‪ Global‬أي يمكن أن‬

‫تطلبه في مكان من الكود البرمجي وتستخدمه في أي عملية كما هو موضح في المثال التالي‪:‬‬

‫‪84‬‬
‫أما لو عرفت المتحول ضمن أي قوسي مجموعة }{ فيصبح من النمط ‪ Local‬وال يمكن طلبه‬

‫المعرف ضمنهما وإال ستظهر لنا رسالة خطأ‪:‬‬


‫ّ‬ ‫خارج القوسين‬

‫هذه الجزئية مهمة جدا ً عند التعامل مع المتحوالت ويجب االنتباه لها‪ ،‬األمر بسيط ‪ ...‬مع‬
‫التمارين ستكتسب المهارات الضرورية للعمل بشكل احترافي وستصبح هذه المالحظات‬
‫واضحة ومفهومة‪.‬‬

‫‪85‬‬
‫مـالحــظات‬
‫‪:‬‬
‫✓ عند تعريف أي متحول يجب مراعاة النقاط التالية‪:‬‬
‫‪ o‬ال يجب أن يبدأ اسم المتحول برقم‪.‬‬
‫‪ o‬اختيار نوع المتحول بما يتناسب مع حجم البيانات المسندة إليه‪.‬‬
‫‪ o‬يفضل أن تكون أسماء المتحوالت معبّرة عن الوظيفة المسندة إليها حتى ولو كان‬
‫االسم طويل‪.‬‬
‫‪ o‬في حال كان اسم المتحول مؤلف من كلمتين يفضل كتابة الحرف األول من الكلمة‬
‫الثانية بحرف كبير دون ترك مسافة أو الفصل بين االسمين بـ " _ "‪.‬‬
‫✓ يوجد نقطة مهمة يجب االنتباه إليها عند التعامل مع عدة متحوالت من أنواع مختلفة وهو‬
‫الترقية‪ ،‬فلو كان لدينا عملية حسابية على متحولين من نوعين مختلفين فإن المترجم‬
‫‪ compiler‬يقوم بترقية هذه المتحوالت نحو النوع األكبر بينهما ومن ثم يجري العملية‬
‫الحسابية ويقدم الناتج بما يتوافق مع المتحول األكبر حجما‪ ،‬وهذا قد يسبب مشكلة في النواتج‬
‫وخاصة إذا كان أحد المتحوالت من نوع ‪ float‬وتم ترقيته لنوع أكبر أو أصغر فسيتم حذف‬
‫األرقام التي بعد الفاصلة‪.‬‬

‫‪86‬‬
‫✓ المتحول المنطقي من نوع ‪ Boolean‬له قيمتين فقط ‪ False‬تقابل القيمة ‪ 0‬و ‪ True‬تقابل‬
‫كل القيم عدا الصفر‪.‬‬
‫✓ لو كان لدينا متحول وأسندنا إليه قيمة أكبر من القيمة التي يستطيع تخزينها ماذا سيحدث؟‬
‫سيتم أخذ القيمة المتبقية بعد عملية طفحان المتحول فمثال لو أسندنا القيمة ‪ 300‬للمتحول ‪val‬‬

‫والمعرف بالنوع ‪ byte‬سيكون قيمة المتحول ; ‪ val = 44‬أي أنه تم ملئ المتحول بالقيمة‬
‫‪ 256‬ثم تفريغها ث ّم وضع القيمة المتبقية وهي ‪.44‬‬

‫هذه أهم المالحظات والنقاط الواجب االنتباه لها عند‬


‫التعامل مع المتحوالت‪.‬‬

‫‪87‬‬
‫العمليات الرياضية المختلفة‪:‬‬

‫العمليات الحسابية ‪:Arithmetic Operator‬‬


‫العملية الحسابية‬ ‫شرح العملية‬

‫‪+‬‬ ‫الجمع ‪addition‬‬

‫‪-‬‬ ‫الطرح ‪subtraction‬‬

‫*‬ ‫الضرب ‪multiplication‬‬

‫‪/‬‬ ‫القسمة ‪division‬‬

‫‪%‬‬ ‫تعيد باقي القسمة ‪( modulo‬باقي قسمة عدد صحيح‬


‫على عدد صحيح)‪.‬‬
‫‪val = 5%2 ; // val = 1‬‬

‫=‬ ‫عامل التعيين ‪assignment operator‬‬

‫عمليات المقارنة ‪:Comparison Operator‬‬


‫العملية‬ ‫شرح العملية‬
‫==‬ ‫مساوي لم ‪equal to‬‬

‫=!‬ ‫ال يساوي ‪not equal‬‬

‫<‬ ‫أقل من ‪less than‬‬

‫>‬ ‫أكثر من ‪greater than‬‬

‫=<‬ ‫أقل أو يساوي ‪less than or equal to‬‬

‫=>‬ ‫أكثر من أو يساوي ‪greater than or equal to‬‬

‫تتم هذه التعليمات على أي نوع من المتحوالت لكن النتيجة تكون منطقية ‪،True or False‬‬
‫وتستخدم غالبا مع الجمل الشرطية ‪.‬‬
‫‪88‬‬
‫العمليات المنطقية ‪:Boolean Operator‬‬
‫التعليمة‬ ‫شرح التعليمة‬
‫&&‬ ‫‪and‬‬
‫||‬ ‫‪or‬‬
‫!‬ ‫‪Not‬‬

‫العمليات المركبة ‪:Compound Operators‬‬


‫التعليمة‬ ‫شرح التعليمة‬
‫‪++‬‬ ‫زيادة‬
‫‪--‬‬ ‫إنقاا‬
‫=‪-‬‬ ‫إنقاا من‬
‫‪x -= y‬‬ ‫‪//x=x-y‬‬
‫=‪+‬‬ ‫إضافة إلى‬
‫‪x += y‬‬ ‫‪//x=x+y‬‬
‫=*‬ ‫ضرب إلى‬
‫‪x *= y‬‬ ‫‪//x=x*y‬‬
‫=‪/‬‬ ‫قسمة على‬
‫‪x /= y‬‬ ‫‪//x=x/y‬‬
‫=‪%‬‬ ‫باقي قسمة‬
‫‪x %= y‬‬ ‫‪//x=x%y‬‬

‫العمليات السابقة مهمة في الجمل الشرطية لالختبار والمقارنة أو ربط عدة شروط مع بعضها‬
‫وهذا ما سنتعرف عليه في األقسام التالية‪.‬‬

‫‪89‬‬
‫التعليمات الهندسية للزوايا ‪:Trigonometry‬‬
‫التعليمة‬ ‫شرح التعليمة‬
‫‪val‬‬ ‫;)‪= sin(rad‬‬ ‫حساب جيب الزاوية‪.‬‬
‫‪val‬‬ ‫;)‪= cos(rad‬‬ ‫حساب تجيب الزاوية‪.‬‬
‫‪val‬‬ ‫;)‪= tan(rad‬‬ ‫حساب ظل الزاوية‪.‬‬

‫عند التعامل مع هذه التعليمـــات يجب أن تـــكـــون قـــــيمة الزاوية المراد حســــابها بالراديان‬
‫)‪ radians (float‬أما الناتج فسوف يكون ضمن المجال ‪.-1 ~ 1‬‬

‫‪90‬‬
‫الحلقة الشرطية ‪:if‬‬

‫من أهم العمليات في الكود البرمجي بل ال يخلو كود برمجي من وجود الحلقة الشرطية ‪ if‬لذلك‬

‫سوف نتوسع بشرحها حتى يسهل التعامل معها ضمن الكود البرمجي‪ ،‬لنبدأ من الشكل العام للجملة‬
‫الشرطية ‪ if‬والتي تكون بالشكل التالي‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫)‪if (conditional‬‬ ‫في البداية يجب وضع شرط (أو عدد من‬
‫{‬ ‫الشروط) عند ‪ if‬بحيث إذا تحقق الشرط‬
‫‪// Action A‬‬ ‫فسوف يتم تنفيذ التعليمات الموجودة ضمن }{‪،‬‬

‫}‬ ‫أما لو كان الشرط عند ‪ 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‬والتي يمكن أن‬


‫ّ‬ ‫التعرف على الحلقة الشرطية ‪ if‬نصل‬
‫ّ‬ ‫بعد‬
‫نصنّفها بالمرتبة الثانية من حيث األهمية بعد الجملة الشرطية ‪.if‬‬

‫نستفيد من هذه الحلقة في تكرار تنفيذ جملة من التعليمات دون الحاجة لتكرار كتابتها وبالتالي‬
‫نستفيد في تقليص حجم الكود البرمجي‪ ،‬يكون الشكل العام لهذه الحلقة‪:‬‬

‫)‪for (initialization; condition; increment‬‬


‫{‬
‫)‪//Statement(s‬‬
‫}‬

‫لحلقة ‪ 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‬لماذا نفس المتحول‬

‫في كل حلقة ولماذا عرفناه من النوع ‪ byte‬؟؟‬

‫تم تعريف المتحول ‪ i‬بالنوع ‪ byte‬كون مجال العدّ ال يتجاوز مجال عدّ الـ ‪ byte‬والذي‬

‫كما ذكرنا سابقا ينتمي للمجال ‪ 0 ~ 256‬وبالتالي يكفي هذا النوع مع متحولنا‪.‬‬

‫اآلن لماذا استخدمنا نفس المتحول مع ك ّل الحلقات ‪ ....‬حقيقة األمر ّ‬


‫أن المتغير ‪ i‬مختلف بين‬
‫الحلقات التكرارية فهو كما بينا سابقا طريقة تعريفه من نوع ‪ local‬ألنه مخصص للحلقة ويتم‬
‫استدعاءه ضمن أقواس الحلقة }{ ولو تم استدعاءه خارج األقواس }{ فلن يتم التعرف عليه‬

‫وسيكون لدينا رسالة خطأ‪ ،‬لكن يمكن تغيير االسم لكيال يكون هناك تداخل في األفكار أو لكيال‬
‫يظن المتدرب ّ‬
‫أن االسم الزامي‪.‬‬ ‫ّ‬

‫نصل اآلن لفكرة مهمة يمكن استخدامها مع الحلقة التكرارية ‪( for‬أيضا سنستخدمها ما باقي‬
‫الحلقات التكرارية الحقا) وهي التعليمة ‪ continue‬والتعليمة ‪ break‬والفرق بينهما‪.‬‬

‫لنبدأ بالتعليمة ‪ continue‬والتي تعني االستمرار‪ ،‬مكانها داخل الحلقات التكرارية فقط وال‬

‫يمكن استخدامها خارج هذه الحلقات (‪ )for, while, do…while , switch‬أ ّما وظيفتها‬
‫فعند وصول المعالج لهذه التعليمة سيعود لبداية الحلقة وسيتم إهمال باقي التعليمات التي بعدها‪.‬‬

‫بالعودة للدارة السابقة سنضيف لها كباس لحظي على القطب ‪ A0‬ونعرفّه كقطب دخل مع تفعيل‬
‫الرفع لتصبح القيمة البدائية لهذا القطب كما ذكرنا سابقا هي ‪ 1‬منطقي وعند الضغط على‬
‫مقاومة ّ‬
‫الكباس تنتقل للحالة ‪ 0‬منطقي‪.‬‬

‫‪105‬‬
‫اآلن لنضف التعليمة ‪ continue‬قبل تعليمة التأخير الزمني ‪ delay‬مع شرط بأن ال تعمل‬

‫هذه التعليمة حتى يتم ضغط الكباس اللحظي كما هو واضح ضمن الكود البرمجي ‪...‬‬

‫جرب ‪ ...‬مالذي يحدث؟؟؟‬

‫‪106‬‬
‫بالضغط على الكباس اللحظي سيتم تفعيل التعليمة ‪ continue‬وبالتالي سيتم إهمال كل‬

‫التعليمات التي بعدها‪ ...‬عمليا سيتم اهمال تعليمة التأخير الزمني وكأنها غير موجودة ضمن الكود‬
‫البرمجي وسيتم تشغيل الـ ‪ LEDs‬بسرعة‪ ،‬بينما ستعمل حلقة اإلطفاء بشكل طبيعي بدون أي‬
‫تغيير‪.‬‬

‫هذا بالمجمل وظيفة التعليمة ‪.continue‬‬

‫‪107‬‬
‫أ ّما التعليمة ‪ break‬فعملها مختلف تماما ً عن التعليمة ‪ ،continue‬فبينما كانت وظيفة‬

‫التعليمة ‪ continue‬هي إعادة المعالج ألول الحلقة سنجد أن وظيفة التعليمة ‪ break‬هي‬

‫الخروج من الحلقة نهائيا ومتابعة الكود البرمجي من النقطة التي تلي الحلقة التكرارية‪...‬‬

‫سنعيد التجربة السابقة لكن باستبدال التعليمة ‪ 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‬‬

‫)‪while (expression‬‬
‫{‬
‫‪//statement‬‬
‫}‬

‫تستخدم هذه الحلقة بشكل عام لحصر المعالج بتطبيق جملة من العمليات عند شرط محدد وإيقاف‬
‫تنفيذ باقي التعليمات‪ ،‬سنأخذ مثال بسيط نحاول من خالله تبسيط الفكرة وفهمها‪.‬‬

‫ليكن لدينا الدارة التالية والتي تضم ‪ LEDs‬عدد ‪ 2‬متصلين عالقطب ‪ 2 , 3‬من لوحة األردوينو‪،‬‬
‫ولدينا كباس لحظي متصل على القطب ‪ ،A0‬المطلوب كتابة كود برمجي يتم من خالله تشغيل‬
‫األضواء وإطفائها لمدة ‪ 1‬ثانية‪ ،‬وعند الضغط على الكباس يتم فقط تشغيل الضوء المتصل مع‬
‫القطب ‪ 2‬وإيقافه كل ‪ 1‬ثانية‪ ،‬علما ّ‬
‫أن الكود يعود لعمله السابق بعد توقف الضغط على المفتاح‪.‬‬

‫‪113‬‬
114
‫عمل الكود ببساطة يتلخص بما يلي‪ ...‬في حال عدم الضغط على المفتاح يكون عمل الكود مقتصر‬
‫على المرحلة رقم ‪ ،2‬أ ّما في حال الضغط على الكبّاس يقتصر عمل المعالج على المرحلة ‪1‬‬
‫فقط‪.‬‬

‫ّر‪ ...‬يمكن تطبيق ‪ continue , break‬مع هذه الحلقة‪.‬‬


‫نذك‬

‫‪115‬‬
‫الحلقة الشرطية ‪:do … while‬‬

‫تشترك الحلقة الشرطية ‪ do … while‬مع الحلقة الشرطية ‪ while‬بالصفة األساسية‬

‫وهي بقاء المعالج داخل الحلقة الشرطية في حال تحقق الشرط والخروج منها في حال انتفاء‬
‫الشرط مع فارق واحد فقط‪ ،‬في حالة ‪ while‬كما وجدنا سابقا يتم اختبار الشرط فإن كان‬

‫محققا يتم تنفيذ تعليمات الحلقة‪ ،‬أما في حالة ‪ do…while‬يتم تنفيذ التعليمات الموجودة داخل‬

‫الحلقة ث ّم التأكد من الشرط فإن كان الشرط محققا يبقى المعالج داخل الحلقة ‪ ،‬أما إن كان الشرط‬
‫غير محقق فيتم متابعة تنفيذ باقي تعليمات الكود البرمجي وهكذا في كل مرة يصل المترجم‬
‫‪ compiler‬لهذه الحلقة الشرطية‪.‬‬

‫الشكل العام لها‪:‬‬


‫‪do‬‬
‫{‬
‫‪//statement‬‬
‫}‬
‫;)‪while (test condition‬‬

‫مع االنتباه لوجود الفاصلة المنقوطة ; في آخر هذه الجملة الشرطية‪.‬‬

‫سنأخذ نفس الحالة البرمجية التي تم تنفيذها مع الحلقة الشرطية ‪ while‬مع تبديل العبارة‬

‫‪ while‬بالعبارة ‪ do … while‬ولنرى الفرق في أداء كل واحدة منهما وتأثيره على ناتج‬

‫الكود البرمجي‪.‬‬

‫‪116‬‬
‫هل جربت النتيجة؟؟‬
‫الذي سيحصل هو التالي‪ ...‬في حال عدم الضغط على الكباس اللحظي سيتم تنفيذ جميع الكود‬
‫الموجود داخل الحلقة التكرارية )(‪ void loop‬عمليا سيعمل الـ ‪ LED‬المتصل مع القطب ‪2‬‬
‫مرتين‪ ،‬األولى لوحده والثانية مع الـ ‪ LED‬المتصل مع القطب ‪( 3‬الحالة ‪ ،)2‬أ ّما في حال الضغط‬
‫على الكبّاس اللحظي فسيعمل الـ ‪ LED‬المتصل مع القطب ‪ 2‬لوحده فقط (الحالة ‪.)1‬‬

‫‪117‬‬
‫المداخل التشابهية ‪:Analog Inputs‬‬

‫تطرقنا في قسم سابق من الكتاب للمداخل الرقمية ‪ digital Inputs‬وذكرنا ّ‬


‫أن كل أقطاب‬ ‫ّ‬
‫األردوينو يمكن التعامل معها كأقطاب رقمية (مداخل أو مخارج) وبيّنا ّ‬
‫أن القطب الرقمي يتعامل‬
‫مع قيمتين فقط هما إ ّما ‪ 0‬منطقي (تمثّل األرضي أو ‪ )GND‬أو ‪ 1‬منطقي (تمثّل قيمة ‪Vcc‬‬
‫والتي تكون عادة ‪.)5v‬‬

‫لكن في الحياة العملية األمور تختلف إذ ّ‬


‫أن غالب اإلشارات الفيزيائية هي إشارات تشابهية أي‬
‫تتغير قيمتها مع الزمن فمثال الحرارة‪ ،‬فال يمكن أن نقول ّ‬
‫أن هناك حرارة أو ال يوجد حرارة‬
‫لنمثّلها بالنظام الرقمي ‪ 0 , 1‬فالحرارة تتغير قيمتها ارتفاعا ً وانخفاضا ً مع الزمن‪.‬‬

‫لنفترض ّ‬
‫أن لدينا حساس حرارة يعطي على خرجه قيمة فولط متناسبة مع قيمة الحرارة (وليكن‬
‫مثال لكل درجة حرارة واحدة تقابل ‪ 0.1v‬وبالتالي لو كانت درجة الحرارة قيمتها ‪ 35c‬فسيكون‬
‫خرج الحساس ‪ )3.5v‬فكيف سنتعامل مع هذه القيمة على األقطاب الرقمية؟؟؟ لذلك ت ّم إضافة‬
‫مبدل تشابهي رقمي ضمن متحكمات لوحة األردوينو‪.‬‬

‫تتميز المبدالت التشابهية الرقمية والتي تعرف )‪ADC(Analo to Digital Converter‬‬


‫بميزات تصميمية عديدة ولو أردنا الحديث عن التقنيات المتبعة في التبديل التشابهي إلى رقمي‬
‫الستغرق األمر الكثير من الوقت لذلك سنأخذ أهم الميزات في بحثنا هذا وسنترك التفاصيل للجزء‬
‫الثالث من هذه السلسلة‪.‬‬

‫أهم النقاط التي يجب معرفتها عند التعامل مع المبدل التشابهي الرقمي ‪:ADC‬‬

‫‪ -‬تحمل قنوات المبدّل التشابهي الرقمي الرمز ‪ A‬على لوحات األردوينو ويختلف عددها بين‬
‫لوحات األردوينو‪.‬‬

‫‪118‬‬
‫‪ -‬دقة المبدل التشابهي الرقمي ‪ 10bit‬أي ‪ 210‬وهو ما يساوي ‪ ،1024‬لكن ماذا يعني هذا الرقم؟‬
‫أي أنه تم تحويل مجال الفولط والذي يكون ضمن المجال ‪( 0 ~ Vcc‬وبما ّ‬
‫أن غالب متحكمات‬
‫لوحات األردوينو يتم تغذيتها بالقيمة ‪ 5v‬فيمكن اعتماد المجال ‪ 0 ~ 5v‬مجازاً) ليقابله رقم‬
‫ضمن المجال ‪ 0 ~ 1023‬فلو كان الفولط الداخل عبر المدخل التشابهي قيمته ‪ 5v‬فهذا يعني‬
‫أننا سنحصل على قراءة من المبدل التشابهي الرقمي تقابل ‪ 1023‬بينما لو كانت قيمة الفولط‬
‫على المدخل التشابهي قيمتها ‪ 2.5v‬فهذا يقابل قراءة من المبدل التشابهي الرقمي قيمتها ‪512‬‬
‫وهكذا‪...‬‬
‫‪ -‬الجهد المرجعي االفتراضي ‪ Vref‬هي نفسها تغذية المتحكم وتقابل ‪( 5v‬لكن ندخل في‬
‫تفاصيلها)‪.‬‬
‫‪ -‬سرعة التبديل التشابهي الرقمي يتراوح بين ‪.13 ~ 260 us‬‬

‫طبعا يوجد العديد من الميزات التصميمية لكن سنكتفي بما سبق‪.‬‬

‫كيف نقرأ الفولط على أحد القنوات التشابهية؟؟‬

‫;)‪analogRead(An‬‬ ‫قراءة القيمة المدخلة على القناة التشابهية‬


‫ويكون ناتج هذه التعليمة قيمة تنتمي للمجـال‬
‫‪ 0 ~1023‬لذلك البدّ من إسناد هذه التعليمة‬
‫لمتحول من نوع ‪ int‬لكي نستطيع التعامل‬
‫ما ناتج قراءة المبدّل‪.‬‬
‫نالحظ أننا ال نحتاج لتهيئة القطب وتعريفه كقطب تشابهي كما الحال عند التعامل مع األقطاب‬
‫الرقمية‪ ،‬فقط نستخدم التعليمة السابقة مباشرة لكن بشرط أال يتم استخدام نفس القطب كقطب رقمي‬
‫أي ال يجوز التعامل مع القطب كقطب رقمي وتشابهي في نفس الوقت‪ ،‬فإ ّما أن يكون رقمي أو‬
‫تشابهي‪.‬‬

‫‪119‬‬
‫األول‪ ...‬ليكن لدينا مقسّم جهد (وهو كما ذكرنا سابقا ً عبارة عن مقاومة متغيرة يتم‬
‫لنبدأ بالمثال ّ‬
‫وصل طرفيها مع طرفي التغذية ‪ Vcc & GND‬والمنتصف ‪ -‬يعتبر الخرج ‪ -‬يوصل مع أحد‬
‫األقطاب التشابهية‪ ،‬بتدوير المقاومة نحصل على جهد متغير على القطب التشابهي) يتم ربط خرج‬
‫المقسّم مع القطب التشابهي ‪ ،A0‬نريد اآلن الحصول على قراءة المبدل التشابهي الرقمي وعرض‬
‫الناتج على واجهة االتصال التسلسلي‪.‬‬

‫‪120‬‬
‫نالحظ ّ‬
‫أن القيم الناتجة تكون كما ذكرنا ضمن المجال ‪ 0 ~ 1023‬وكل قيمة تقابل قيمة جهد‪.‬‬
‫‪121‬‬
‫لو أردنا معرفة الفولط المقابل لكل قيمة نستخدم القانون التالي‪:‬‬

‫‪𝑉𝑖𝑛 ∗ 1024‬‬
‫= 𝐶𝐷𝐴‬
‫𝑓𝑒𝑟𝑉‬

‫‪ :Vin -‬الفولط على المدخل التشابهي‪.‬‬


‫‪ :Vref -‬الفولط المرجعي لعملية التبديل وقيمته االفتراضية ‪.)5v(Vcc‬‬
‫‪ :ADC -‬القيمة التي نحصل عليها من المبدل التشابهي الرقمي ;)(‪.analogRead‬‬

‫‪ :1024 -‬تمثّل دقّة المبدّل التشابهي الرقمي ‪( 210‬في بعض لوحات األردوينو يكون ‪.)212 = 4096‬‬

‫بالتبديل في مواقع القيم في القانون السابق يصبح قانون الحصول على الجهد بدل قراءة ‪:ADC‬‬

‫𝑓𝑒𝑟𝑉 ∗ 𝐶𝐷𝐴‬
‫= 𝑛𝑖𝑉‬
‫‪1024‬‬

‫بتعويض القيم المعلومة من القانون يصبح لدينا‪:‬‬

‫‪𝐴𝐷𝐶 ∗ 5‬‬
‫= 𝑛𝑖𝑉‬
‫‪1024‬‬
‫بما ّ‬
‫أن القانون كسري فيجب تعريف المتحول ‪ Vin‬كمتحول عشري من نوع ‪ float‬لكيال يتم‬

‫إهمال القيم العشرية وإال فإنّا سنخسر قيم مهمة من الحساب ولن تكون النتائج دقيقة عند التعامل‬
‫مع الحساسات التشابهية‪.‬‬

‫‪122‬‬
‫لنكتب كود برمجي اآلن نحصل من خالله على الجهد الداخل على القطب التشابهي‪:‬‬

‫نالحظ في الكود البرمجي أنّنا قمنا بتجزئة المعادلة الرياضية الخاصة بعملية الحصول على قيمة‬
‫الفولط بدل قراءة ‪ ADC‬والسبب لعدم فقد القيم العشرية إذ أنه وبدون إجراء العملية السابقة سنفقد‬
‫األرقام التي بعد الفاصلة العشرية (العملية تعني أنه وبعد إجراء عملية الضرب األولى قم بقسمة‬
‫الناتج على القيمة ‪ 1024‬وأعد اسناد القيمة الجديدة للمتحول ‪.)v_in‬‬

‫أ ّما عملية الطباعة على واجهة ‪ Serial‬فاستخدمنا التعليمتين – )(‪Serial.print‬‬

‫)(‪ Serial.println‬للحصول على طريقة الطباعة الظاهرة على واجهة ‪.Serial‬‬

‫يمكن أيضا كتابة رقم القناة التشابهية فقط دون كتابة الرمز ‪ A‬أي يمكن كتابة‬
‫;)‪ analogRead(0‬بدل كتابة ;)‪ analogRead(A0‬فالنتيجة واحدة‪.‬‬

‫‪123‬‬
‫ولنجرب ربط حساس‬
‫ّ‬ ‫لنأخذ تطبيق عملي على كيفية استخدام المبدل التشابهي الرقمي ‪ADC‬‬
‫الحرارة التشابهي ‪ LM35‬والذي يعتبر أشهر حساس حرارة تشابهي والذي يتميز بجملة من‬
‫الميزات الفنية‪:‬‬

‫يضم الحساس ثالثة أرجل ‪ ،Vcc – Vout – GND‬مجال التغذية للحساس ‪ ،4 ~ 30v‬لن نخوض‬
‫كثيرا في الميزات لكن أكثر ما يهمنا هو خرج الحساس على القطب ‪ Vout‬إذ نجد ّ‬
‫أن تغيره خطي‬
‫مع درجة الحرارة وكل درجة حرارة يقابلها ‪ ،0.1v‬سنتفيد من هذه العالقة لمعرفة قيمة الحرارة‬
‫واستخدامها ضمن الكود البرمجي‪ ،‬كل ما علينا هو تعديل الكود البرمجي السابق للحصول على‬
‫درجة الحرارة المقابلة لقيمة الفولط‪.‬‬

‫‪124‬‬
125
‫في المثال السابق تعاملنا مع حساس يعطي خرج خطي متناسب مع قيمة القياس كما وجدنا‪ ،‬اآلن‬
‫لنجرب التعامل مع حساس بخرج مختلف وليكن حساس الحرارة ‪ NTC 100kR‬وهو عبارة‬
‫ّ‬
‫عن مقاومة حرارية تتغير قيمتها بشكل متناقص مع تغير درجة الحرارة‪ ،‬لكن عند التعامل مع‬
‫هذه المقاومة نحتاج لوجود مقاومة ثابتة بنفس القيمة لتشكل مع المقاومة ‪ NTC‬مقسم جهد‪...‬‬

‫في هذا المثال سنحسب قيمة المقاومة ‪ NTC‬تبعا ً للجهد الخارج‬


‫من مقسم الجهد والداخل باتجاه قناة المبدل التشابهي على لوحة‬
‫األردوينو مستخدمين قانون مقسّم الجهد‪:‬‬

‫من المعادلة السابقة نعزل المتغير ‪ R2‬والذي يمثل المقاومة الحرارية ‪ NTC‬لتصبح العالقة‬
‫الرياضية بالشكل التالي‪:‬‬

‫‪ :Vin -‬وهو نفسه ‪ Vcc‬ويساوي ‪.5v‬‬


‫مر معنا سابقا‪.‬‬
‫‪ :Vout -‬الجهد الواصل للقناة التشابهية ويتم حسابه كما ّ‬
‫‪ :R1 -‬المقاومة الثابتة ‪.100kR‬‬
‫‪ :R2 -‬المقاومة الحرارية والتي نريد حسابها لتطبيق قيمتها ضمن القانون التالي لمعرفة درجة‬
‫الحرارة‬
‫))‪T = 1 / (1/To + 1/B In(R/Ro‬‬

‫‪126‬‬
127
‫بما ّ‬
‫أن تغير الحرارة في المقاومة ‪ NTC‬هو تغير غير خطي بل هو تغير لوغريتمي لذلك كان‬
‫لدينا معادلة رياضية تتضمن لوغاريتم مع ثوابت رياضية ت ّم تعويضها للحصول على قيمة‬
‫الحرارة المقابلة لقيمة المقاومة الحرارية‪.‬‬

‫ث ّم ت ّم عرض درجة الحرارة بواحدة السيلسيوس والفهرنهايت باستخدام التحويل الشهير بين‬
‫الواحدتين‪:‬‬

‫‪F = (C * 1.8) + 32‬‬

‫هذا كل ما يهمنا في المبدل التشابهي الرقمي وطريقة التعامل معه أ ّما التعرف على تفاصيل أكبر‬
‫للمبدل التشابهي الرقمي فسوف يتم االستفاضة فيها في الجزء الثالث من سلسلة " األردوينو كما‬
‫لم تعرفه من قبل"‪.‬‬

‫‪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‬؟؟‬

‫;)‪analogWrite(pin , value‬‬ ‫نحدد في هذه التعليمة رقم القطب الذي نريد‬


‫توليد نبضة ‪ PWM‬عليه (طبعا بشرط أن‬
‫يكون بجانب رقم القطب اإلشارة ~ على لوحة‬
‫األردوينو)‪ ،‬ثم نحدد القيمة الفعالة ‪value‬‬
‫وهنا تحدد برقم ينتمي للمجال ‪ 0 ~ 255‬أي‬
‫أن ‪ 100%‬تقابل القيمة ‪ 255‬والقيمة ‪50%‬‬
‫تقابل ‪ 127‬وهكذا‪...‬‬
‫أيضا ننتبه ألمر آخر وهو وجوب تفعيل القطب كقطب خرج حتى يعمل بشكل صحيح في توليد‬
‫لنجرب مثال سريع عن توليد نبضة ‪ PWM‬ولنتحكم بشدة إضاءة ‪ LED‬متصل‬
‫ّ‬ ‫نبضة ‪،PWM‬‬
‫على القطب ‪ 3‬من لوحة األردوينو‪.‬‬

‫سنكتب كود برمجي بسيط يقوم‬


‫بتوليد نبضة ‪ PWM‬متغيرة‬
‫باستخدام الحلقة ‪.for‬‬

‫‪131‬‬
‫نالحظ خالل الكود البرمجي كيف ت ّم تغيير قيمة خرج نبضة ‪ PWM‬من خالل حلقة التكرار‪for‬‬
‫والتي تقوم في كل مرة بالعدّ من الصفر وحتى ‪ 255‬لنحصل على أعلى قيمة خرج لنبضة ‪.PWM‬‬

‫ر ّكزنا في معرض حديثنا عن نبضة ‪ PWM‬على أمر التردد وذكرنا أنه ثابت وال يتغير لكن‬
‫السؤال هنا ‪ ...‬كم هو تردد عمل نبضة ‪PWM‬؟‬

‫في الواقع يوجد ترددي عمل لنبضات ‪ PWM‬سنوضحها من خالل الجدول التالي‪:‬‬

‫‪132‬‬
‫أي الترددات أفضل في العمل؟؟‬

‫األمر متعلق بطبيعة التطبيق المراد استخدام تعديل النبضة معه لكن بالمجمل يفضل الترددات‬
‫العالية في غالب التطبيقات‪.‬‬

‫هل يمكن التعديل في التردد وعرض النبضة ‪ PWM‬معا من خالل لوحة األردوينو؟؟‬

‫صة عند التعامل مع المؤقتات‪/‬العدّادات واالستفادة من الميزات الكبيرة التي‬


‫األمر ممكن وخا ّ‬
‫تقدمها والتي سنتطرق لشرحها بشكل موسع واحترافي خالل الجزء الثالث من هذه السلسلة‬
‫اإلبداعية في تعلم برمجة لوحات األردوينو بأدق تفاصيلها‪.‬‬

‫‪133‬‬
‫العمليات الخاصة بأقطا الدخل‪/‬الخرج العامة ‪:GPIOs‬‬

‫في هذا القسم سنتحدث عن جملة من التعليمات التي تقدم وظائف محددة على أقطاب الدخل‪/‬الخرج‬
‫وتعتمد هذه التعليمات في عملها على المؤقتات‪/‬العدادات الخاصة بالمتحكمات‪ ،‬لنبدأ معا ً‬
‫باستعراض هذه التعليمات‪.‬‬

‫توليد النغمات بالتعليمة )(‪:tone‬‬

‫نستخدم في توليد النغمات على زمور ‪ Buzzer‬متصل مع لوحة األردوينو التعليمة ‪ tone‬والتي‬
‫تكون بالشكل التالي‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫‪tone(pin ,‬‬ ‫توليد أمواج مربعة بترددات محددة على القطب ‪،pin‬‬
‫‪frequency ,‬‬ ‫شرط أال يكون تردد الموجة أقل من ‪ 31Hz‬وال يزيد‬
‫;)‪duration‬‬ ‫عن القيمة ‪.65535‬‬
‫‪ :Frequency‬يمكن أن يعرف كمتحول من نوع‬
‫‪.unsigned int‬‬
‫‪ :Duration‬المدة الزمنية لصدور النغمة‪.‬‬
‫;)‪noTone(pin‬‬ ‫إيقاف توليد النغمات على القطب المحدد‪.‬‬
‫ما يميز هذه التعليمة أنها تعمل مع ك ّل األقطاب الرقمية وتعمل بشكل مستقل عن المعالج (كونها‬
‫تعتمد في عملها على المؤقت‪/‬العداد ‪ )1‬أي ّ‬
‫أن زمن تشغيل الزمور ال يؤثر على سير عمل المعالج‬
‫في أداء وظائفه‪.‬‬

‫أ ّما التعليمة )(‪ noTone‬فتستخدم إليقاف إصدار النغمة‪ ،‬علما ً أنه يمكن ربط أكثر من زمور‬

‫‪ Buzzer‬مع لوحة األردوينو لكن ال يمكن تشغيلها بالنفس الوقت‪ ،‬إذ يشترط عمل زمور واحد‬
‫فقط وقبل تشغيل الزمور اآلخر يجب التأكد من إيقاف األول باستخدام التعليمة )(‪.noTone‬‬

‫‪134‬‬
‫ّر الترّ‬
‫دد أو زمن النغمة ‪ ....‬اكتب تعليمات‬ ‫ّب غي‬
‫جر‬
‫ّ عمل التعليمة ‪tone‬‬
‫داخل الحلقة الرئيسية والحظ كيف أن‬
‫ال يؤثر على عمل المعالج‪.‬‬
‫‪135‬‬
‫قراءة عرض النبضة )(‪:pulseIn‬‬

‫في حاالت برمجية معينة يكون لدينا موجة مربعة يكون القسم الفعّال أو الغير فعّال منها متغيرا ً‬

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

‫والتي ص ّممت لهذه الوظيفة وتكون بالشكل التالي‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫‪pulseIn(pin ,‬‬ ‫تستخدم هذه التعليمة لقراءة عرض النبضة المطبقة على‬
‫;)‪Value‬‬ ‫القطب المحدد ‪ ،pin‬أما القيمة ‪ Value‬فتأخذ إحدى‬
‫القيمتين‪:‬‬
‫‪ :HIGH -‬حيث ينتظر حتى تصبح الموجة الداخلة‬
‫على القطب في حالة ‪ HIGH‬فيبدأ العد حتى تعود‬
‫للقيمة ‪ LOW‬وعندها يتوقف عن العد‪.‬‬
‫‪ :LOW -‬ينتظر حتى تصبح النبضة المطبقة على‬
‫القطب في حالة ‪ LOW‬عندئذ يبدأ بالعد حتى تعود‬
‫لحالة ‪ HIGH‬وعندها يتوقف العد‪.‬‬
‫القيمة التي تعيدها هذه التعليمة بواحدة ‪ ،uSec‬وأعلى قيمة للنبضة ‪ ،65535 uS‬ولكي تعمل‬
‫هذه التعليمة مع القطب المحدد يجب أن يعرف القطب كقطب دخل ‪ ،INPUT‬أيضا عمل هذه‬
‫التعليمة مستقل عن عمل المعالج كونها تعتمد في عملها أيضا على المؤقت‪/‬العداد‪.1‬‬

‫‪136‬‬
‫تعليمات العمليات الحسابية على القيم‪:‬‬

‫من الميزات التي توفرها بيئة التطوير ‪ Arduino IDE‬مجموعة من التعليمات التي يمكن تطبيقها‬
‫على القيم الرياضية بهدف اختصار الوقت والكود البرمجي‪ ،‬لنتعرف معا على أشهر هذه‬
‫التعليمات وطريقة عملها‪.‬‬

‫نبدأ مع التعليمة )(‪ map‬والتي نستطيع من خاللها تغيير مجال تغير متحول ما‪ ،‬لنفترض مثال‬
‫ّ‬
‫أن لدينا متغير قيمته تتغير ضمن المجال ‪ -10 ~ 10‬ونريد أن تصبح قراءة قيمة التحول كنسبة‬
‫مئوية أي تتغير قيمته ‪ ، 0 ~ 100‬عمليا يمكن كتابة كود برمجي يقوم بهذا األمر لكن التعليمة‬
‫)(‪ map‬تختصر عليك ذلك‪....‬‬

‫نستخدم هذه التعليمة للحصول على مجال تغير جديد ‪newValue = map(value,‬‬
‫‪fromLow, fromHigh,‬‬
‫للقيمة ‪ )toLow , toHigh( value‬من المجال‬
‫;)‪toLow, toHigh‬‬
‫القديم (‪ )fromLow , fromHigh‬الذي تتغير‬
‫فيه هذه القيمة‪.‬‬

‫‪137‬‬
‫يمكن للتعليمة )(‪ map‬سحب المجال أو قلب المجال أو تكبير المجال أو تصغير المجال الجديد‬
‫للقيمة األصلية وحتى تعمل بشكل صحيح يجب ادخال مجال تغير القيمة األساسية بشكل صحيح‪.‬‬

‫تعليمة مهمة أيضا ً في العمل البرمجي وهي التعليمة )(‪ constrain‬وتتلخص مهمتها في‬
‫حذف القيم الناتجة والتي تكون خارج النطاق المحدد‪.‬‬

‫;)‪val = constrain(x,a,b‬‬ ‫تعليمة جبر القيمة‪ ،‬حيث تقوم هذه التعليمة‬


‫بجبر قيمة ‪ x‬حسب الحاالت التالية‪:‬‬
‫• ‪ : x < a‬تصبح قيمة ‪.x = a‬‬
‫• ‪ :x > b‬تصبح قيمة ‪.x = b‬‬
‫• ‪ : a < x < b‬تبقى قيمة ‪ x‬كما هي‪.‬‬
‫لنفهم الفكرة ‪ ...‬دعنا نطبق الكود البرمجي التالي‪:‬‬

‫ك ّل قيمة أصغر من ‪ 2‬يعيدها ‪ ،2‬وكل قيمة أكبر من ‪ 7‬يعيدها ‪ 7‬وباقي قيم المجال تبقى نفسها‪.‬‬
‫‪138‬‬
‫أيضا يوجد جملة من التعليمات الحسابية ّ‬
‫نطلع عليها اآلن وسنستعرضها من خالل األمثلة‬
‫والمشاريع مستقبال‪.‬‬

‫;)‪val = min(x, y‬‬ ‫يعيد القيمة األصغر من بين القيمتين‪.‬‬


‫;)‪val = max(x, y‬‬ ‫يعيد القيمة األكبر من بين القيمتين‪.‬‬
‫;)‪val = abs(x‬‬ ‫يعيد القيمة المطلقة للقيمة ‪.x‬‬
‫;)‪val = pow(base, exponent‬‬ ‫للقوة‬ ‫‪base‬‬ ‫)‪(float‬‬ ‫العدد‬ ‫يرفع‬
‫)‪ exponent (float‬ويعيد الناتج ‪val‬‬
‫)‪.(double‬‬
‫;)‪val = sqrt(x‬‬ ‫حساب الجذر التربيعي للعدد ‪.x‬‬
‫;)‪val = sq(x‬‬ ‫حساب مربع العدد ‪.x‬‬
‫; )‪floor(val‬‬ ‫تقريب العدد العشري ألصغر عدد صحيح‪.‬‬
‫; )‪ceil(val‬‬ ‫تقريب العدد العشري ألكبر عدد صحيح‪.‬‬

‫‪139‬‬
‫العدادات الزمنية )( ‪:millis () / micros‬‬

‫التعرف على بيئة التطوير ‪ Arduino IDE‬واجهتنا مشكلة والتي هي الحاجة لعملية‬
‫ّ‬ ‫مع بداية‬
‫تأخير زمني في عمل المعالج إلتاحة المجال لعرض بعض التعديالت وكان هأول مثال لنا هي‬
‫عملية تشغيل وإطفاء ‪ LED‬والتي كانت تتم ك ّل ثانية واستخدمنا حينها التعليمة ;)(‪ delay‬لكن‬
‫المشكلة التي كانت عند استخدام هذه التعليمة هو تجميد عمل المعالج (عمليا ً يتم إدخال المعالج‬
‫في حلقة مفرغة حتى ينتهي الزمن ث هم يتابع عمله بعد انقضاء الوقت) وهذا يعتبر أمر خطير جدا ً‬

‫في بعض المجاالت‪ ،‬فمثال لو حدث خطأ ما وكان المعالج لحظة الخطأ في حالة اشغال زمني فقد‬
‫يسبب ذلك تلف لقطع أو غير ذلك من األمور‪ ،‬لذلك كان ال بده من إيجاد البديل (البديل موجود‬
‫سابقا ً وهو المؤقتات‪/‬العدّادات لكن كون بيئة التطوير ‪ Arduino IDE‬تعتمد على التبسيط في‬
‫لنتعرف على‬
‫ّ‬ ‫المعلومة فكان البديل مختلف نوعا ً ما) وهنا ت هم التعامل مع تعليمات العدّ الزمني‪...‬‬
‫هذه التعليمات وكيفية االستفادة منها ضمن الكود البرمجي‪.‬‬

‫;)(‪millis‬‬ ‫تعيد هذه التعليمة قيم بالميلي ثانية حيث تبدأ العدّ لحظة تشغيل‬
‫لوحة اآلردوينو‪ ،‬وتصل للطفحان (أي لق ّمة العدّ‬
‫‪ 4,294,967,295‬ثم تعود للصفر) بعد حوالي ‪ 50‬يوم‪ ،‬أ ّما‬
‫نوع المتحول المستخدم عند قراءة قيمتها يكون من نوع‬
‫‪ ،unsigned long‬كما ّ‬
‫أن هذه التعليمة لقراءة قيمة العدّ‬

‫فقط وال يمكن تصفير هذا العدّاد برمجيا‪.‬‬


‫;)(‪micros‬‬ ‫تبدأ العدّ مع لحظة اقالع المتحكم وتعيد قيم بالميكرو ثانية‪،‬‬
‫وتصل لحالة الطفحان بعد حوالي ‪ 70‬دقيقة من لحظة تشغيل‬
‫لوحة اآلردوينو (يختلف هذا الرقم من لوحة ألخرى)‬

‫‪140‬‬
‫أه ّم نقطة نبدأ بها ّ‬
‫أن هذه التعليمات للقراءة فقط وال يمكن أن نعدّل عليها‪ ،‬أما كيفية قراءة هذه‬
‫التعليمة فكما هو في المثال التالي‪:‬‬

‫مع ّأول مثال نالحظ كيف ت ّمت عملية قراءة محتوى العملية )(‪ millis‬ك ّل واحد ثانية‬
‫أن العدّ ليس دقيق وهنا يجب أن ننتبه أنّه كلّما زاد عدد أسطر الكود البرمجي‬
‫ونالحظ أيضا ً كيف ّ‬
‫تختلف دقّة قراءة العملية )(‪.millis‬‬

‫لنأخذ مثال آخر ‪ ...‬لدينا ‪ LED‬متصل مع لوحة األردوينو ونريد تشغيله ك ّل ‪ 1‬ثانية وإطفاءه‬
‫بنفس المدة الزمنية ‪....‬‬

‫‪141‬‬
‫عرفنا‬
‫األول من الكود حيث ّ‬
‫سنتعرف في هذا الكود على مهارات برمجية جديدة نبدأها بالسطر ّ‬
‫ّ‬
‫القطب ‪ 3‬الذي ت ّم وصل ‪ LED‬إليه باسم مستعار هو ‪ led‬وبالتالي أي استدعاء لالسم ‪led‬‬

‫يقابله رقم القطب ‪ ،3‬وهذه العملية ضرورية جدا ً عند كتابة برامج تض ّم عددا ً ً‬
‫كبير من المداخل‬
‫فعند ذلك من األفضل إعطاء ك ّل قطب ما يقابله من اسم يتناسب مع الوظيفة المسندة له‪.‬‬

‫نعرف متحول من نوع ‪ unsigned long‬ليستوعب كامل مجال )(‪ millis‬كما‬


‫ّ‬
‫متحول منطقي ‪ ،v‬في حلقة اإلعداد نقرأ قيمة )(‪ millis‬بهدف الحصول على قيمة‬
‫ّ‬ ‫نعرف‬
‫ّ‬
‫بدائية للمتغير ‪ ،duration‬أ ّما في حلقة التكرار نقوم في ك ّل مرة باختبار محتوى‬

‫)(‪ millis‬فإن كان أكبر من قيمة ‪ duration + 1000‬فهذا يعني أنه قد مضى ثانية‬

‫على عمل )(‪ millis‬فيتم داخل ‪ if‬اسناد القيمة الجديدة لـ )(‪ millis‬للمتغير‬

‫‪142‬‬
‫‪ duration‬وتغيير حالة المتغير ‪ ( v‬ك ّل ثانية تتغير حالته بين ‪ 0‬والـ ‪ ،)1‬ث ّم اسناد تشغيل الـ‬

‫‪ LED‬تبعا ً لحالة ‪ v‬المتغيرة‪.‬‬

‫بنفس األسلوب سنتعامل مع التعليمة )(‪ micros‬وسنأخذ مثال عنها‪...‬‬

‫نتيجة الكود ستكون نفس نتيجة الكود عند استخدام التعليمة )(‪ millis‬والسبب أننا غيرنا‬
‫في الشرط القيمة ‪ 1000‬بالقيمة ‪ 1000000‬والتي تعادل ‪1‬ثانية‪.‬‬

‫استخدام التعليمتين )(‪ millis() / micros‬مهم جدا ً في البرامج االحترافية ويعطي‬


‫أريحية في االبتعاد عن استخدام التعليمة )(‪ delay‬ومشاكلها‪.‬‬

‫‪143‬‬
‫العمليات الخاصة بالبت‪:‬‬

‫في هذا القسم سنستعرض فكرة جديدة وهي التعامل مع البتّ ‪ Bit‬والذي هو جزء من البايت‬
‫‪ ،Byte‬قد يكون أغلبنا سبق ودرس نظم العدّ المختلفة والتي أشهرها النظام العشري ‪Decimal‬‬
‫وهو النظام التقليدي في العدّ ومجاله ‪ 0 ~ 9‬وبالتالي عدد خاناته ‪( 10‬ننتبه ألمر مهم جدّا ً وهو ّ‬
‫أن‬
‫العدّ يبدأ دائما من ‪ ) 0‬وكذلك نظام العدّ الثنائي ‪ Binary‬والذي يعتبر أساس النظم الرقمية ويض ّم‬
‫قيمتين فقط ‪ 0 – 1‬وال ننسى النظام الست عشري ‪ Hexadecimal‬والذي يشابه النظام العشري‬
‫لكن مع إضافة ست خانات له ليصبح مجال العدّ له ‪. 1~9,A,B,C,D.E,F‬‬

‫طبعا يوجد نظم عدّ أخرى لكن ليس هذا مبحثنا في هذه الفقرة فللتعامل مع نظم العدّ وطرق‬
‫التحويل بينها والعمليات عليها نحتاج إلفراد وقت طويل جداً‪ ،....‬سنكتفي باستعراض سريع لما‬
‫يهمنا عند التعامل مع المداخل‪/‬المخارج الرقمية مستقبال‪.‬‬

‫لنوضّح بعض النقاط بالنسبة للمبتدئين معنا حتى ال تصعب الفكرة عليهم‪ ،‬ك ّل عدد عشري يمكن‬
‫تمثيله بأي نظام عدّ آخر والعكس كذلك صحيح لكن التحويل بين أنظمة العدّ يحتاج لفهم بعض‬
‫النقاط وسنكتفي باستعراض التحويل من عشري إلى ثنائي كون هذا األمر أكثر ما يه ّمنا حاليا ً‪:‬‬

‫‪0‬‬ ‫‪00000000‬‬ ‫‪5‬‬ ‫‪00000101‬‬


‫‪1‬‬ ‫‪00000010‬‬ ‫‪6‬‬ ‫‪00000110‬‬
‫‪2‬‬ ‫‪00000001‬‬ ‫‪7‬‬ ‫‪00000111‬‬
‫‪3‬‬ ‫‪00000011‬‬ ‫‪8‬‬ ‫‪00001000‬‬
‫‪4‬‬ ‫‪00000100‬‬ ‫‪9‬‬ ‫‪00001001‬‬

‫أن الرقم معرف كـ ‪ byte‬وبالتالي فهو يض ّم ‪ 8 bits‬وكما ذكرنا ّ‬


‫فإن ‪byte‬‬ ‫افترضنا ّ‬

‫عرفنا الرقم كـ ‪ int‬فيصبح بـ ‪ 16 bits‬وهكذا ‪..‬‬


‫يستوعب حتى ‪ 255‬لكن لو ّ‬
‫‪144‬‬
‫وكما ذكرنا سابقا ‪ ...‬فلو كتبنا الرقم بصيغة عشرية أو ثنائية أو غير ذلك فال يهم األمر ّ‬
‫ألن القيمة‬
‫واحدة‪:‬‬

‫نالحظ من المثال السابق كيف قمنا في البداية بإدخال الرقم بالصيغة العشرية ث ّم قمنا بطباعة الرقم‬
‫بالصيغة العشرية والصيغة الثنائية (استخدمنا األمر ‪ BIN‬مع التعليمة ‪ Serial.print‬لطباعة‬
‫الرقم بالصيغة الثنائية‪ ،‬يمكن تبديل األمر للصيغة الست عشرية ‪ HEX‬أو الصيغة الثمانية ‪.OCT‬‬

‫أما القسم الث ّاني فت ّمت العملية بشكل معاكس ‪ ...‬قمنا بكتابة العدد بالصيغة الثنائية (عبر كتابة ‪0b‬‬

‫ثم القيمة الثنائية للعدد‪ ،‬ولو أردنا إدخاله بالصيغة الست عشرية فيمكن ذلك بكتابة ‪ 0x‬ث ّم قيمة‬

‫العدد بالصيغة الست عشرية) ث ّم طبعناه بالصيغة العشرية‪.‬‬

‫‪145‬‬
‫لنستعرض اآلن أهم العمليات على البتّ من خالل بعض األمثلة العملية (قد تكون هذه األمثلة‬
‫حاليا دون فائدة واضحة لك كمبتدأ في تعلّم البرمجة ‪ ...‬اطمئن ‪ ...‬سيأتي الوقت الذي ال تستغني‬
‫به عن هذه العمليات)‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫‪Bitwise and‬‬

‫&‬

‫‪Bitwise or‬‬

‫|‬

‫‪Bitwise xor‬‬

‫^‬

‫‪ ...Bitwise not‬تعكس حالة البت‪.‬‬


‫~‬
‫<<‬ ‫‪....Bitshift left‬اإلزاحة لليسار‪ :‬هي عملية حذف خانة من‬
‫اليسار واالستعاضة عنها بخانة صفرية في اليمين‪.‬‬

‫>>‬ ‫‪....Bitshift right‬اإلزاحة لليمين‪ :‬هي عملية حذف خانة‬


‫من اليمين واالستعاضة عنها بخانة صفرية في اليسار‪.‬‬
‫لنطبّق العمليات السابقة على جملة من المتحوالت مكتوبة بالصيغة الثنائي ولنرى النتائج‪...‬‬

‫‪146‬‬
‫متحول قيمة‬
‫ّ‬ ‫في المثال السابق قمنا في البداية بتعريف متحولين من نوع ‪ byte‬وأسندنا لك ّل‬

‫المتحول‬
‫ّ‬ ‫لألول القيمة ‪ 9‬والتي تمث هل في نظام الثنائي بالشكل ‪ 0b0001001‬أ ّما‬
‫بدائية لتكن ّ‬
‫الثاني فأعطيناه القيمة ‪ 5‬ويعبهر عنه في النظام الثنائي بالشكل ‪ ... 0b00000101‬اآلن لنطبّق‬

‫المتحولين ونسند الناتج للمتغيّر ‪ val‬ونرى معا ً النتائج‪:‬‬


‫ّ‬ ‫العمليات السابقة على هذين‬

‫‪147‬‬
‫في الحالة األولى والتي تمثّل البوابة المنطقية & نتج لدينا الرقم ‪ 1‬أي أنه كل تماثل بالقيمة نضع‬

‫مكانه ‪ 1‬وك ّل حالة غير ذلك ‪ 0‬فكان الناتج ‪ 0b00000001‬وهو نفسه ‪ 1‬في نظام العدّ‬

‫العشري‪.‬‬

‫‪148‬‬
‫أ ّما الحالة الثانية والتي تمثّل البوابة المنطقية | ‪ ،‬الناتج كان ‪ 0b0001101‬أي كل مقارنة‬

‫بين بتّين أحدهما ‪ 1‬نضع في الناتج ‪ 1‬ونضع ‪ 0‬فقط عندما يكون كالهما ‪.0‬‬

‫الحالة الثالثة وتمثّل بوابة الال تماثل ^ أي ّ‬


‫أن أي اختالف بين أحد البتّين نضع القيمة ‪ 1‬في الناتج‬

‫بينما أي تشابه (كال البتين ‪ 1‬أو ‪ )0‬نضع ‪ 0‬في الناتج‪ ،‬ليكون لدينا الناتج ‪.0b00001100‬‬

‫الحالة الرابعة وهي حالة العكس أو القلب ~ ويتم تغيير قيمة ك ّل بيت للحالة المعاكسة له‪ ،‬وبما‬

‫معرفة من النوع ‪ byte‬فيتم أخذ المتمم للرقم ‪( 0b11110110‬المتمم للرقم‬


‫المتحوالت ّ‬
‫ّ‬ ‫ّ‬
‫أن‬

‫‪ 9‬هو ‪ 246‬ليصبح المجموع ‪ 255‬وهي حالة الطفحان للقيمة ‪.)byte‬‬

‫ننتقل للقسم الثاني من الجدول السابق وهي تعليمات اإلزاحة ولنبدأ بإزاحة المتغير األول ‪val_1‬‬

‫والذي قيمته ‪ 9‬بمقدار ‪ 3‬خانات نحو اليسار ونرى الناتج‪...‬‬

‫‪149‬‬
‫نالحظ من المثال السابق كيف ت ّمت عمليّة اإلزاحة نحو اليسار أي باتجاه الخانات األكثر أهمية‬
‫المتحول وتصبح ‪ 72‬ويتم استبدال الخانات الثالث األولى بالقيم ‪.0‬‬
‫ّ‬ ‫‪ MSB‬وبالتالي يزداد قيمة‬

‫لنكرر العملية لكن بشكل معاكس ولنجري العملية باإلزاحة نحو اليمين أي باتجاه الخانات األقل‬
‫ّ‬
‫أهمية ‪ LSB‬لنفس المتغيّر السابق‪..‬‬

‫المتحول ‪ val_1‬بمقدار ثالث خانات نحو اليمين لتتغير‬


‫ّ‬ ‫نالحظ من الحالة السابقة كيف ت ّم إزاحة‬

‫بذلك قيمته وتصبح ‪ 1‬ويقابلها بالعدّ الثنائي ‪.0b00000001‬‬

‫سنترك لك اآلن إمكانية التجريب الحاالت السابقة مع عدد‬


‫من المتحوالت ‪...‬‬

‫‪150‬‬
‫يبقى لدينا مجموعة من التعليمات الخاصة بالتعامل مع البتّ ‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫)‪bitRead(x,bitPosition‬‬ ‫قراءة موقع البت من المتحول ‪.x‬‬
‫)‪bitSet(x, bitPosition‬‬ ‫ضبط قيمة البت المحدد من المتحول بالقيمة ‪.1‬‬
‫ضبط قيمة البت المحدد من المتحول بالقيمة ‪bitClear(x,bitPosition) .0‬‬
‫‪bitWrite(x,‬‬ ‫ضبط القيمة المحددة (‪)value = 0 or 1‬‬
‫)‪bitPosition,value‬‬ ‫للبت المحدد من المتحول ‪.x‬‬

‫لنأخذ المثال الشامل التالي ولنطبق عليه جميع العمليات السابقة‪:‬‬

‫‪151‬‬
‫ننبه ألمر مهم وهو طريقة العدّ‪ ،‬فكما ذكرنا سابقا ّ‬
‫أن العدّ يبدأ دائما من القيمة ‪ 0‬لذلك عندما‬
‫سنكتب الخانة ‪ 3‬مثال فإننا نبدأ العد من الخانة األقل أهمية بـ ‪ 0‬ث ّم نتابع العد لنصل للخانة المطلوبة‪.‬‬

‫المتحول المطلوب فكان الناتج للبت‬


‫ّ‬ ‫لنبدأ بالتعليمة ;)(‪ bitRead‬التي تقرأ البت المحدّد من‬
‫‪ 3‬هو القيمة ‪.0‬‬

‫فنحول من خاللها قيمة البتّ المطلوب للقيمة إ ّما ‪ 1‬أو ‪ ، 0‬وهنا‬


‫ّ‬ ‫أ ّما التعليمة )(‪bitWrite‬‬
‫حولنا البت ‪ 3‬للقيمة ‪ 3‬لتصبح قيمة ‪.val = 0b00111111‬‬
‫ّ‬

‫= ‪val‬‬ ‫التعليمة ;)(‪ bitClear‬من خاللها نضبط أي بت بالقيمة ‪ 0‬فيصبح‬


‫‪.0b00011111‬‬

‫‪val‬‬ ‫=‬ ‫التعليمة ;)(‪ bitSet‬من خاللها نضبط أي بت بالقيمة ‪ 1‬فيصبح‬


‫‪.0b10011111‬‬
‫‪152‬‬
‫المصفوفات ‪:Arrays‬‬

‫عند التعامل مع حجم كبير من البيانات كنا نستخدم الكثير من المتغيرات لتخزين ومعالجة تلك‬

‫البيانات‪ ،‬وذلك ألن كل متحول يحمل قيمة واحدة فقط وهذا ما يجعل البرنامج طويل ومعقد‪ ،‬لكن‬

‫وباستخدام المصفوفة يستطيع المبرمج استعمال متغيرات قليلة وذلك بتقسيم كل متغير إلى عدد‬

‫من العناصر المتسلسلة‪ ،‬كما تسهل المصفوفة التعامل مع جملة من المتحوالت بنفس الوقت دون‬

‫تعقيد وباختصار من الوقت‪ .....‬صحيح أن الكثير من المقبلين على تعلم لغة اآلردوينو لديهم الكثير‬

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

‫من التركيز مع الكثير من التجريب‪.‬‬

‫المصفوفة‪ :‬عبارة عن منطقة محددة من الذاكرة تتكون من عدد محدد (رقم صحيح يستخدم‬

‫لتحديد عدد المواقع المطلوبة من الذاكرة ويسمى هذا الرقم بالدليل ‪ )Index‬ومتجانس (أي أن‬

‫جميع عناصر المصفوفة من نفس نوع البيانات ‪ )Data Type‬من المواقع المتجاورة‪ ،‬ويمكن‬

‫تعريف مصفوفات بعدة أبعاد فمنها ما هو ببعد واحد (سطر واحد بعدة أعمدة أو العكس) ومنها‬

‫ما هو ببعدين فتكون بعدة أسطر وعدة أعمدة ‪ ،‬وهذين النوعين هما نقطة اهتمامنا كما يمكن‬

‫تعريف مصفوفة بثالثة أبعاد وهذا النوع ليس مجال عملنا (يتم عادة استخدام هذه المصفوفات‬

‫للتعامل مع الصور مثال فلكل نقطة من الشاشة ثالثة بارامترات هي األلوان األساسية ‪R G B‬‬

‫وبالتالي لكل بيكسل ثالثة قيم هي قيم هذه األلوان وهنا نحن بحاجة لمصفوفة بثالثة أبعاد وهكذا)‪.‬‬

‫‪153‬‬
‫المصفوفة ذات البعد الواحد‪:‬‬
‫وهي مصفوفة ذات سطر واحد تعرف كما يلي‪:‬‬

‫;]‪Type Name[size‬‬

‫‪ :Type‬نوع متحوالت المصفوفة‪.‬‬

‫‪ :Name‬اسم المصفوفة‪.‬‬

‫‪ :size‬عدد عناصر المصفوفة ‪،‬كل عنصر يأخذ رقم يدل عليه بدء من الرقم ‪ 0‬يسمى ‪.Index‬‬

‫لتعريف مصفوفة بقيمة بدائية هي الصفر نكتبها بالشكل التالي‪:‬‬

‫; } { = ]‪Type Name[size‬‬

‫يمكن كذلك تحديد قيم بدائية لبعض عناصر المصفوفة وترك بقية العناصر دون قيم لتأخذ بذلك‬
‫القيمة صفر كقيمة بدائية‪.‬‬

‫القراءة والكتابة في المصفوفة أحادية البعد‪:‬‬

‫الكتابة‪ :‬وتتم بذكر مؤشــر العنصــر من المصــفوفة المطلوبة وإعطاء هذا العنصــر القيمة التي‬
‫نريدها كقيمة جديدة له‪ ،‬فهنا قمنا بإسناد القيمة ‪ value‬للعنصر الذي ترتيبه ‪ x‬من المصفوفة‬
‫‪.ArrayName‬‬

‫;‪ArrayName [x] = value‬‬

‫القراءة‪ :‬وهي عمليـة معـاكســــة للكتـابـة حيـث نقوم بـإســــنـاد قيمـة العنصــــر الـذي ترتيبـه ‪ x‬من‬
‫المصفوفة ‪ ArrayName‬للمتحول ‪.value‬‬

‫;]‪value = ArrayName [x‬‬

‫‪154‬‬
‫ليكن لدينا المصفوفة التي تحتوي ‪10‬عناصر‪:‬‬

‫} ‪{2 , 8 , 14 , 5 , 3 ,7 , 10 , 12 , 0 , 5‬‬

‫نريد زيادة القيمة ‪ 5‬لكل عنصر من عناصر المصفوفة ومن ثم طباعة قيم المصفوفة الجديدة‬
‫على المنفذ التسلسلي‪ ،‬ونريد تكرار هذه العملية لثالثة مرات‪.‬‬

‫بعد تعريف المصفوفة في بداية الكود ‪ ...‬سيتم في الحلقة التكرارية اختبار الشرط ‪ if‬وفي كل‬
‫مرة يتم تنفيذ جملة الشرط والتي تتضمن زيادة مقدار ‪ 5‬لكل عنصر من عناصر المصفوفة (تتم‬
‫العملية بحلقة ‪ for‬الختصار التكرار في الكود) وبطباعة رقم المرحلة ‪ x‬وزيادة هذا المتحول‬
‫بمقدار ‪ ،1‬وعندما تصبح قيمة هذا المتحول أكبر من ‪ 3‬فلن يتم بعد ذلك تنفيذ الجملة الشرطية ‪if‬‬

‫كون ال يوجد ضمن الكود ما يعيد المتحول ‪ x‬للقيمة ‪ 0‬لكي يتم تنفيذ الشرط ‪ if‬من جديد‪.‬‬
‫‪155‬‬
‫المصفوفة ذات البعدين‪:‬‬

‫وهي مصفوفة لها عدة أسطر ‪ row‬وأعمدة ‪ column‬وتعرف بالشكل التالي‪:‬‬

‫; ]‪Type Name[row size] [column size‬‬

‫‪ :Type‬نوع متحوالت المصفوفة‪.‬‬

‫‪ :Name‬اسم المصفوفة‪.‬‬

‫‪ :row size‬عدد أسطر المصفوفة‪.‬‬

‫‪ :column size‬عدد أعمدة المصفوفة‪.‬‬

‫تكتب عناصر السطر الواحد بي قوسين"} ‪ "{ , ,‬ويفصل بينها بفاصلة ‪ ،‬ويفصل بين األسطر‬
‫كذلك بفاصلة‪.‬‬

‫;}}‪byte array1[2][3] = {{5,3,70},{8,4,0‬‬

‫القراءة والكتابة في المصفوفة ذات البعدين‪:‬‬

‫الكتابة‪ :‬وهنا علينا ذكر مكان العنصـر في المصـفوفة فنذكر مؤشـر العنصـر بالنسـبة للسـطر أوال‬

‫ثم نذكر مؤشر العنصر بالنسبة لألعمدة‪ ،‬ثم نسند للعنصر القيمة التي نريدها كما هو موضح‪.‬‬

‫;‪.ArrayName [x][y] = value‬‬

‫القراءة‪ :‬بعملية معاكســة لما ســبق إذ علينا إســناد قيمة العنصــر الذي مؤشــر األســطر له يحمل‬

‫القيمة ‪ ، x‬بينما مؤشر األعمدة يحمل القيمة ‪ y‬من المصفوفة ‪ ArrayName‬للمتحول ‪.value‬‬

‫;]‪value = ArrayName [x][y‬‬


‫‪156‬‬
‫ليكن لدينا المصفوفة التالية‪:‬‬

‫𝟑‪𝟖𝟓 𝟔𝟔 −‬‬
‫) 𝟓 𝟎𝟏 𝟐‪array = (−‬‬
‫𝟑𝟏 𝟐𝟕 𝟗‬

‫والمطلوب طباعة عناصر المصفوفة على نافذة االتصال التسلسلي وذلك بعد إضافة القيمة ‪5‬‬
‫لكل عنصر من عناصر هذه المصفوفة‪.‬‬

‫ت ّمت العملية السابقة باستخدام حلقتي ‪ for‬األولى (باألحمر) للتنقل بين األسطر فنبدأ بالسطر‪0‬‬
‫ث ّم ننتقل للحلقة الثانية (باألخضر) للتنقل بين عناصر السطر الواحد (أي االنتقال باألعمدة) ‪...‬‬
‫ومع تكرار العملية نكون بذلك قد أضفنا القيمة ‪ 5‬لكل عناصر المصفوفة‪.‬‬

‫‪157‬‬
‫التوابع (الدوال) ‪:Functions‬‬

‫وهو مجموعة من األوامر والبيانات المرت ّبة تحت اسم واحد والتي يمكن استدعاؤها من أماكن‬
‫مختلفة من الكود البرمجي‪ ،‬كما تعرف أيضا بالروتين الثانوي ‪.subroutine‬‬

‫إن استخدام التوابع يقدم العديد من الميزات والخصائص للمبرمج أهمها‪:‬‬

‫▪ اختصار الكود البرمجي‪ ،‬إذ يكتفى باستدعائه باسمه فقط لينفذ العمل المطلوب‪.‬‬
‫▪ تالفي خطوات التكرار في الكود البرمجي‪.‬‬
‫▪ تساعد التوابع في عملية البرمجة نفسها‪.‬‬
‫▪ توفر مساحة من الذاكرة المطلوبة للبرنامج‪.‬‬
‫▪ اختصار عملية البرمجة وتنفيذ البرنامج بأسرع وقت ممكن‪.‬‬
‫▪ تسهيل عملية مراجعة الكود وتصحيح األخطاء والتعديل على الكود‪.‬‬

‫شكل التابع في بيئة اآلردوينو‪:‬‬

‫يكتب التابع ويعرف في بيئة ‪ Arduino IDE‬كما يعرف بلغة ‪ C/C++‬بالشكل التالي‪:‬‬

‫‪Function_Type‬‬ ‫) ‪name ( Parameters‬‬

‫{‬

‫; ‪statement‬‬

‫; ‪return result‬‬

‫}‬

‫‪158‬‬
‫« ‪ :Function_Type‬نوع القيمة التي سوف يرجعها التابع ( ‪int , float ,‬‬
‫‪ )….‬وفي حال لم يكن هناك قيمة سيتم إرجاعها عندها يكون التابع من النوع ‪.void‬‬
‫« ‪ :name‬اسم التابع‪.‬‬
‫« ‪ :Parameters‬القيم المراد تمريرها للتابع‪ ،‬ويمكن أال يكون هناك قيم‪.‬‬
‫« ‪ :statements‬البنية البرمجية للتابع‪.‬‬
‫« ‪ :return result‬القيمة التي سوف يتم إعادتها‪ ،‬حيث أن المتحول ‪result‬‬
‫من نفس نوع التابع وإذا لم يكن هناك قيمة معادة فال حاجة لهذه التعليمة‪.‬‬

‫خطوات تعريف التابع في لغة ‪:C/C++‬‬


‫لبناء أي تابع أو برنامج فرعي نقوم بتحديد بنيته في القسم النّهائي من الكود البرمجي (وهذا‬

‫أفضل مكان لكتابة البرنامج الفرعي‪ ،‬لكن في حاالت معيّنة يكون مكان الت ّابع الفرعي في‬

‫بداية الكود البرمجي نذكرها في وقتها إن شاء هللا)‪ ،‬أما استدعاء التابع فيمكن أن تتم في أي‬

‫نقطة من الكود البرمجي وتتم العملية بذكر اسم التابع;)(‪ name‬وتحديد قيم الدخل له إن‬

‫وجدت‪ ،‬كل هذا ستوضحه األمثلة القادمة‪.‬‬

‫‪159‬‬
‫أنواع التوابع في لغة ‪:C/C++‬‬

‫للت ّوابع أشكال عديدة وتختلف فيما بينها في قيم الدّخل للتابع والناتج الذي سيقدّمه التابع فتقسم‬
‫بذلك الت ّوابع ألربعة أقسام (هذه األقسام اصطالحية من المؤلف لتبسيط الفكرة وتسهيل فهم‬
‫عمل التوابع وليست تقسيم أكاديمي فقد ال تجد أحد يعتمد هذا التقسيم عند تقديم التوابع)‪:‬‬

‫▪ تابع ليس له دخل وليس له خرج‪:‬‬


‫لنكتب تابع برمجي يقوم بإطفاء ‪ LEDs‬المت ّصلة مع لوحة األردوينو على األقطــــاب بين‬
‫‪ 3 ~ 8‬وذلك كلما تم استدعاء الت ّابع‪.‬‬

‫‪160‬‬
‫في هذ التابع نالحظ كيف يتم استدعاء التابع الخاص بعملية إطفاء ‪led_off(); LEDs‬‬
‫في الحلقة األساسية للكود البرمجي‪ ،‬كما نالحظ ّ‬
‫أن التابع ال يعيد أي قيمة رقمية للمستخدم وليس‬
‫له أي قيمة دخل‪.‬‬

‫هذا التابع سيوفّر الكثير من الوقت واألسطر ‪ ...‬ففي أي مكان نريد إطفاء الـ ‪ LEDs‬فقط نستدعي‬
‫التابع‪.‬‬

‫‪161‬‬
‫▪ تابع له دخل وليس له خرج‪.‬‬

‫لنكتب تابع برمجي يتم من خالله اختيار رقم قناة ‪ PWM‬والقيمة المراد إخراجها على القناة‪.‬‬

‫المتحول بأي صنف تبعا‬


‫ّ‬ ‫نالحظ أن لهذا التابع مدخلين من نوع ‪( byte‬طبعا ً يمكن تعريف‬

‫للحاجة ضمن الكود وهنا اخترنا النوع ‪ byte‬كوننا ال نحتاج لحجم ذاكرة أكبر) أحدهما يحدد‬

‫رقم القناة (حصرا ً المخارج ‪ )3-5-6-9-10-11‬والثاني يحدّد القيمة المطلوب إخراجها على القناة‬

‫(‪ ،)0 ~ 255‬أ ّما الت ّابع فنجد أنّه ال يعيد أ ّ‬


‫ي قيمة رقمية للمستخدم‪.‬‬

‫‪162‬‬
‫▪ تابع ليس له دخل لكن له خرج‪.‬‬

‫لنكتب تابع برمجي يتم من خالله قراءة قناة مبدل تشابهي رقمي ‪ A0‬وتحويل القيمة المقروءة‬
‫لقيمة تقابلها من المجال ‪ 0 ~ 255‬وإعادة القيمة للمستخدم‪.‬‬

‫التابع )(‪ read_value‬عبارة عن تابع يتم استدعاءه لمعرفة النتيجة التي هي عبارة‬
‫عن قراءة المدخل التشابهي ‪ A0‬وتحويل الناتج ضمن عملية ‪ map‬ومن ثم يعيد الناتج‬
‫للمتحول ‪.x‬‬
‫ّ‬ ‫للبرنامج وفي النهاية يتم اسناد ناتج حساب التابع (وهو القيمة ‪)a‬‬

‫‪163‬‬
‫▪ تابع له دخل وله خرج‪.‬‬

‫لنعرف تابع مدخله متحولين ‪ x , y‬من النوع ‪ ،int‬أ ّما العملية الحسابية التي تتم داخل‬
‫ّ‬
‫‪ ، 3*x‬أ ّما خرج التابع فمن النوع ‪.int‬‬ ‫التابع فهي‪+ 9*y :‬‬

‫نالحظ ّ‬
‫أن للتابع مدخالت (يمكن أن يكون للمستخدم إمكانية إدخالها مستقبال) وله مخرج حسابي‬
‫ينتج عن العملية الحسابية‪.‬‬

‫هذه جملة من األمثلة البسيطة لتسهيل الفكرة علما ً ّ‬


‫أن البرامج االحترافي تبنى بشكل أساسي على‬
‫التوابع ويبقى دور الحلقة الرئيسية استدعاء التوابع وتنفيذها ضمن الشروط البرمجية‪.‬‬

‫‪164‬‬
‫مالحظات تصميمية وعملية‪:‬‬
‫سنستعرض في هذه الفقرة بعض النقاط التصميمية والعملية المهمة والتي تعترض الطالب أثناء‬
‫توصيل المشروع أو تجريب عمل لوحة األردوينو وهي مالحظات مه ّمة للغاية ننصح الطالب‬
‫بقراءة هذا القسم بتمعّن واالستفادة منه فهو في غالبه إجابة على تساؤالت تصلنا بشكل كبير‪.‬‬

‫االهتزاز الميكانيكي للكباس اللحظي ‪:pushbutton‬‬

‫من المشاكل التي تواجه المتدربين عند التعامل مع الكبّاسات اللحظية هي حالة الال استقرار في‬
‫ّ‬
‫وكأن األمر عبارة عن عدّة‬ ‫أداء الكبّاس اللحظي‪ ،‬فمثالً نريد مع كل ضغطة تنفيذ أمر محدد فنجد‬
‫مرات في نفس الوقت والسبب هو حالة االهتزاز الميكانيكي أو ما يعرف باسم ‪.Bounce‬‬
‫ّ‬

‫أن عملية الضغط ال تتم بشكل سلس بل ّ‬


‫إن حالة من الال استقرار‬ ‫كما نالحظ من المخطط كيف ّ‬
‫تترافق مع العملية م ّما ينتج عنها نموذج مكرر للضغطة الواحدة وللتغلّب على هذه الحالة يمكن‬
‫أن يت ّم األمر برمجيا ً عبر قراءة حالة الكبّاس اللحظي ّأول مرة ث ّم وبعد زمن قصير جدا ً (يقدّر بـ‬

‫‪165‬‬
‫مرة ثانية فإن كانت بنفس القيمة األولى فيتم تنفيذ األمر المتعلّق‬
‫‪ )50ms‬نعيد قراءة حالة المفتاح ّ‬
‫بالكبًاس‪.‬‬

‫يمكن أن تت ّم الطريقة السابقة باستخدام تعليمة )(‪ millis‬لكيال يتم اشغال المعالج‪ ،‬أو يمكن‬
‫وضع تأخير زمني بسيط بعد ك ّل قراءة حالة المفتاح تقدّر بـ ‪ 50ms‬من خالل التعليمة‬
‫;)‪.delay(50‬‬

‫يمكن التخلّص من حالة االهتزاز هذه الكترونيا وذلك بإضافة مكثف على التفرع مع الكبّاس‬
‫مر معنا في شرح المكثّف فإنه ّ‬
‫يمرر اإلشارات المتغيّرة مع الزمن بينما ال‬ ‫لألرضي ‪ GND‬فكما ّ‬
‫المستقرة وبالتالي فإن حالة الال استقرار ستعبر إلى المكثف‪ ،‬وتكون قيمة المكثّف‬
‫ّ‬ ‫يمرر اإلشارة‬
‫ّ‬
‫عند الـ ‪.100nF‬‬

‫‪166‬‬
‫تعريف األردوينو على الحاس ‪:‬‬

‫ذكرنا في بداية الفصل أنه وبتنصيب برنامج ‪ Arduino IDE‬سيتم تعريف لوحة األردوينو‬
‫وتصبح جاهزة للعمل على الحاسب لكن هذا الكالم ليس دقيق بدرجة كبيرة‪.‬‬

‫قبل الدخول في التفاصيل لنوضّح نقطة مهمة على عجالة وهي طريقة الربط بين الحاسب‬
‫والمتح ّكم على لوحة األردوينو فغالب متح ّكمات األردوينو ال تضم واجهة تخاطب خاصة مع‬
‫محول أو ‪ Adapter‬مهمته تسهيل التفاهم‬
‫منفذ ‪ USB‬وللتغلب على هذه المشكلة فقد ت ّم إضافة ّ‬
‫بين البروتوكول ‪( UART‬أقطابه ‪ TX , RX‬وتأخذ األرقام ‪ 0 , 1‬على لوحة األردوينو) على‬
‫متحكم األردوينو وبين ‪ USB‬على الحاسب (بشكل سريع ‪ ...‬هناك العديد من بروتوكوالت‬
‫االتصال تختلف فيما بينها بالكثير من النقاط أهم هذه النقاط هي شكل البيانات وطريقة ارسالها‬
‫وكيفية استقبالها ومدى االتصال وإمكانية التحقّق من صحّتها وعدد األجهزة على ّ‬
‫خط االتصال‬
‫أن األمر معقّد لذلك ستجد فصل كامل من‬
‫وعدد خطوط االتصال وغير ذلك من األمور ‪ ....‬أعلم ّ‬

‫الجزء الثاني من سلسلة "األردوينو كما لم تعرفه من قبل" وظيفته شرح هذه البروتوكوالت‬
‫وطريقة عملها‪ ،‬لكن ما يه ّمنا هنا هو أنّنا نريد ربط بروتوكولين مختلفين عن بعضهما في آلية‬
‫العمل لذلك البدّ من وجود وسيط بينهما وظيفته مترجم للطرفين)‪.‬‬

‫لكن هذا الـ ‪ Adapter‬هو عبارة عن دارة تكاملية تختلف بين نوع وآخر من لوحات األردوينو‬
‫وذلك تبعا ً لجودة لوحة األردوينو بالدرجة األولى‪.‬‬

‫وأفضل هذه الدارات التكاملية هي متحكم ‪ ATmega8‬يحتوي برنامج وظيفته ربط بروتوكولي‬

‫االتصال بين الحاسب ‪ USB‬والمتح ّكم ‪ UART‬وهذا النوع ّ‬


‫يعرف تلقائيا في نسخ ‪Arduino‬‬
‫‪.IDE‬‬

‫‪167‬‬
168
‫ننتقل للنوع الثاني والذي يمكن أن نصنّفه بالدرجة الثانية وهو الدارة التكاملية ‪،FT232‬تتميز هذه‬
‫الدارة بسهولة تعريفها على الحاسب كما أنّه وفي حال وصل أكثر من لوحة أردوينو على الحاسب‬
‫فسيتم إعطاء كل لوحة رقم لمنفذ ‪ COMxx‬مختلف‪.‬‬

‫يجب أن ننتبه أنّه في لوحات األردوينو ‪ Arduino NANO‬يجب تغيير نوع ‪bootloader‬‬
‫للنوع الواضح في الصورة لكي تستطيع رفع الكود البرمجي للوحة األردوينو‪.‬‬

‫‪169‬‬
‫نصل للنّوع األخير وهو األقل جودة بين ما سبق وهو الشريحة الصينية ‪ CH340‬ولألمانة‬
‫وبمجرد وجود هذه الدارة على لوحة األردوينو فأعلم ّ‬
‫أن جودة لوحة األردوينو رديئة وهي من‬ ‫ّ‬
‫النوع التجاري‪....‬‬

‫‪170‬‬
‫هذه الشريحة تحتاج لتعريف حتى تعمل لوحة األردوينو‪ ،‬وفي حاالت معيّنة يجب تغيير‬
‫‪ bootloader‬حتى تعمل لوحة األردوينو بشكل صحيح‪.‬‬

‫عند توصيل لوحة األردوينو (ذات دارة ‪ )FT232 or CH340‬مع الحاسب سيظهر في قسم‬
‫أن الجهاز المتّصل مع الحاسب غير ّ‬
‫معرف‪:‬‬ ‫إدارة األجهزة في جهاز الكمبيوتر ّ‬

‫‪171‬‬
‫نقوم بتحميل ملفّات التعريف الضرورية من النت (‪ )CH340 driver or FTDI‬وتنصيبها على‬
‫الحاسب عندها يظهر لدينا منفذ ‪ COM‬وله رقم‪....‬‬

‫لوحة األردوينو اآلن جاهزة للعمل بشكل صحيح‪....‬‬

‫‪172‬‬
‫تغذية لوحة األردوينو والحصول على أفضل أداء‪:‬‬

‫األول كنّا كثيرا ً ما نذكر القيمة ‪ 5v‬والتي كانت تعبّر عن ‪1‬‬


‫في معرض حديثنا خالل الفصل ّ‬
‫منطقي ويقابلها على الطرف اآلخر القيمة ‪ 0v‬والتي يقابلها ‪ 0‬منطقي لكن هذا األمر كما وضّحنا‬
‫سابقا ً ليس دقيق بشكل كبير وقلنا ّ‬
‫أن قيمة ‪ 1‬من طقي مرتبطة بقيمة تغذية المتح ّكم على لوحة‬
‫األردوينو وليس تغذية لوحة األردوينو ككلّ‪ ،‬لذلك لنتّفق مبدئيا ً ّ‬
‫أن تغذية المتح ّكم أمر وتغذية لوحة‬
‫األردوينو أمر آخر‪.‬‬

‫ولنتعرف على القسم‬


‫ّ‬ ‫لنبدأ بلوحة األردوينو ولنأخذ مثال عنها لوحة األردوينو ‪Arduino UNO‬‬
‫الخاص بتنظيم التغذية على لوحة األردوينو فنجد أنه يبدأ من عند مقبس التغذية الخارجية والذي‬
‫ّ‬
‫المنظم‬ ‫يتيح لنا تغذية لوحة األردوينو بفولط ضمن المجال ‪ ،6 ~ 18 v‬ث ّم نجد ديود حماية لحماية‬
‫ّ‬
‫منظم جهد يعطي على خرجه ‪ 5‬لتغذية المتح ّكم على لوحة‬ ‫من عكس الفولطية‪ ،‬بعد ذلك نجد‬
‫األردوينو‪ ،‬أيضا ً يمكن إدخال التغذية الخارجية من القطب ‪ Vin‬لكن ننتبه ّ‬
‫أن هذا القطب متّصل‬
‫ّ‬
‫المنظم لكن بعد ديود الحماية وبالتالي أي خطأ في التوصيل سيسبّب تلف المنظم‪.‬‬ ‫مع‬

‫‪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‬مع أقطاب األردوينو بشكل مباشر مع مقاومة حماية صغيرة)‬
‫م ّما يسبّب في حاالت كثيرة تلف القطب أو تلف المتح ّكم ككلّ‪.‬‬

‫فإن تغذية المتحـــ ّكم‬ ‫قبل الحديث عن القطب نفسه نودّ الحديث عن المتحـــ ّكم‪ ،‬فكما ّ‬
‫مر معـنا ّ‬

‫‪ ،Vcc = 5v‬لكن ماذا عن األمبير؟؟‬

‫يستهلك المتح ّكم كحدّ أقصى ‪ 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‬سنقدم اآلن عدد من األمثلة‬
‫العملية للتعليمات السابقة‪ ،‬ومن خالل هذه التعليمات سوف نبدأ رحلة التعامل مع لوحات‬
‫األردوينو‪.‬‬

‫لنكتب كود برمجي يتم فيه تشغيل ‪ LED‬متصل مع القطب ‪ 2‬عند‬


‫تمرين ‪:1‬‬
‫ضغط الكباس اللحظي ‪( B1‬متصل مع ‪ )A0‬ويطفئ في حال ضغط‬
‫المفتاح ‪( B2‬متصل مع ‪.)A1‬‬

‫‪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‬وهذا ممكن كونه يستخدم كقطب‬

‫رقمي وبالتالي يكون رقمه ‪ A1( 14‬يقابل ‪ ... 15‬وهكذا)‪.‬‬

‫اشترطنا في عمل الكود البرمجي ّأال يتم قلب حالة الخرج ‪ 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‬‬

‫نريد تطبيق العمليات التالية (المخصصة للبت) على القيم السابقة وطباعة النواتج على نافذة‬
‫االتصال التسلسلي بالصيغة الثنائية‪:‬‬

‫‪E^A‬‬ ‫‪~D‬‬ ‫‪A&B‬‬


‫‪D << 4‬‬ ‫‪)C & D) | E‬‬ ‫‪A&C&D‬‬

‫‪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‬والمطلوب كتابة كود برمجي يكون خرج المجموعة األولى القيم‬
‫التالية‪:‬‬

‫}‪{B1011 , B1001 , B0111 , B0001‬‬

‫أما المجموعة الثانية فتكون نفس القيم السابقة مع عكس حالة البت األول واألخير‪.‬‬

‫‪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‬لقراءة قيمة المقاومـــة المتغيرة وتغيير مجـــال النــــاتج من‬

‫‪ 0 ~1023‬للمجال ‪ 2~11‬ليتناسب مع مخارج التحكم بالـ ‪ ،LEDs‬يبقى لدينا عملية تشغيل‬


‫الـ ‪ LEDs‬بما يتناسب مع نسبة القراءة للمقاومة المتغيرة ‪....‬‬

‫يوجد لدينا التابع )(‪ led_off‬والذي تقتصر وظيفته على إطفاء جميع األضواء‪.‬‬

‫أ ّما التابع )(‪ led_on‬فوظيفته تشغيل األضواء بدءا ً من الضوء المتّصل مع القطب ‪ 2‬وحتى‬

‫القطب ‪ val‬والذي تتناسب قيمته مع مستوى المقاومة المتغيّرة‪.‬‬

‫‪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‬من لوحة األردوينو‪.‬‬

‫المطلوب أن يكون عمل كل ‪ LED‬مرتبط بضغط مفتاح مقابل له من الكباس‪.‬‬

‫‪228‬‬
229
‫في المثال السابق تم تصميم مقسّم جهد لكن هذا المقسّم مؤلّف من عدّة مقاومات متّصلة على‬
‫التسلسل فيما بينها ومه ّمة كل مفتاح تقوم على قصر جزء من المقسّم وبالتالي تغيُّر قيمة خرج‬
‫مقسّم الجهد‪.‬‬

‫بنا ًء على ما سبق فقد قمنا بقراءة خرج المقسّم مع كل عمليّة ضغط على أحد الكبّاسات ث ّم بناء‬
‫جمل شرطية تبعا ً لقيمة المبدّل التشابهي الرقمي لتشغيل األضواء‪.‬‬

‫‪230‬‬
‫الفصل الثاني‪:‬‬
‫المحيطيات (‪)1‬‬

‫‪231‬‬
‫مقدمة‪:‬‬

‫األول من الكتاب على أه ّم العناصر االلكترونية ث ّم تعلّم أساسيات البرمجة‬


‫تعرفنا في الفصل ّ‬
‫بعد ّ‬
‫والتّقنيات المتّبعة في الحلول البرمجية عبر جملة كبيرة من األمثلة والتطبيقات‪ ،‬نتابع في هذا‬
‫التعرف على مجموعة من القطع والموديوالت‬
‫ّ‬ ‫الفصل تطوير مهاراتنا البرمجية وذلك من خالل‬
‫صور واضح وخبرة جيّدة استعدادا ً لبناء مشاريع‬
‫ليتكون بذلك لدينا ت ّ‬
‫ّ‬ ‫وتعلّم طريقة برمجتها‬
‫احترافية مستقبالً‪.‬‬
‫بالتعرف على مفهوم جديد في البرمجة وهو المكتبيات وسنتحدّث عنها بشكل‬
‫ّ‬ ‫سنبدأ هذا الفصل‬
‫تصور عن طريقة عمل المكتبيّات وكيفية االستفادة منها في اختصار بناء‬
‫ّ‬ ‫مجمل لكي يكون لدينا‬
‫وتجميع الكود البرمجي‪.‬‬
‫ث ّم سننتقل لمجموعة من القطع ونتعلّم كيفية ربطها مع األردوينو وكيفية استخدام المكتبيات‬
‫الخاصة بها‪ ،‬وسيكون محور هذا الفصل حول القطع التالية‪:‬‬
‫‪ o‬لوحة المفاتيح الست عشرية ‪.Keypad‬‬
‫‪ o‬شاشة القطع السبع بأنواعها ‪.7 Segment‬‬
‫‪ o‬شاشة العرض الكرستالية المحرفية ‪.LCD‬‬
‫‪ o‬القبضة التشابهية ‪.Joystick‬‬
‫‪ o‬ليد األلوان الثالثة ‪ RGB LED‬وأنواعها المختلفة‪.‬‬
‫ستكون آلية العمل في هذه الفصول هو طرح الطرفية أو المحيطية التي نريد التعامل معها وتقديم‬
‫شرح مبسّط وواضح لهذه الطرفية ثم ننتقل لبيئة األردوينو لنرى كيف تتم برمجة هذه الطرفية‬
‫وكيف يمكن تشغيلها واالستفادة منها في مشاريع الحقة وسيكون هناك مشروع بسيط عن هذه‬
‫الطرفية‪ ،‬وسيكون لنا في نهاية كل فصل جملة من المشاريع التي تربط األفكار مع بعضها وتكون‬
‫مشاريع مفيدة وقابلة للتطوير وهذه المشاريع ستكون جامعة لعدة أفكار‪.‬‬

‫‪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‬‬
‫لنل ّخص خطوات إضافة المكتبية وطريقة التعامل معها ضمن الكود البرمجي بالخطوات التالية‪:‬‬
‫‪ -‬تضمين المكتبية أو المكتبيات الخاصة بتشغيل الطرفية (بعض القطع تتطلّب إضافة عدّة‬
‫مكتبيات حتى تعمل بشكل صحيح)‪.‬‬

‫‪ -‬إنشاء جسم من المكتبية ‪ Object‬والذي يكون لنا ّ‬


‫حرية تسميته باالسم المناسب (ليس كلمة‬
‫محجوزة)‪.‬‬
‫‪ -‬ضبط قيم التشغيل البدائية للطرفية (سرعة العمل أو غير ذلك) أو أقطاب التوصيل والتي‬
‫تكون في حلقة اإلعداد )(‪.void setup‬‬

‫‪ -‬االستفادة من الطرفية وتنفيذ التعليمات المتعلّقة بها والذي يكون في أي مكان من الكود‬
‫البرمجي لكن بشرط أن يكون بعد تسجيل الخطوات السابقة‪.‬‬

‫الخطوات السابقة ستتكرر معنا مستقبالً بشكل كبير وفي ك ّل مرة نضيف مكتبية لتشغيل أي طرفية‬
‫كانت‪ ،‬نكتفي بهذا القدر بالحديث عن المكتبيات ونترك طريقة استخدامها من خالل األمثلة المقبلة‪.‬‬

‫‪238‬‬
‫لــوحــــــــة المـــــفــاتيــــــــح الســـــــــــــــــــــــت عــشــــــــــــــــــــريــة‬
‫‪Key Pad‬‬

‫في كثير من المشاريع نحتاج لعدد كبير من المفاتيح كبناء آلة حاسبة‪ ،‬لوحة مفاتيح إلدخال قيم أو‬
‫لوحـة اتصــــال للهـاتف وغيرهـا من التطبيقـات‪ ،‬وفي هـذه الحـالـة لو أردنـا تنفيـذ األمر بـالشــــكـل‬
‫التقليـدي (أي وصــــل كـل كبـّاس لحظي مع مـدخـل رقمي من لوحـة األردوينو) فســــيكون لـدينـا‬
‫استهالك كبير لألقطاب الرقمية وهذا األمر غير منطقي لذلك ت ّم إيجاد الكثير من البدائل والحلول‬
‫أحد هذه الحلول هو لوحة المفاتيح الست عشرية ‪.keypad‬‬

‫تتألّف لوحة المفاتيح السـت عشـرية من سـتة عشـر كبّاس لحظي‪ ،‬تكون هذه الكبّاسـات مت ّصـلة مع‬
‫بعضها كما في الشكل (المفاتيح التي بجانب بعضها تكون أحد أطرافها متصلة مع بعضها مشكلة‬
‫بذلك صف‪ ،‬أما العامود فيتشكل من المفاتيح التي فوق بعضها وبذلك تتشكل هذه اللوحة)‪:‬‬

‫‪239‬‬
‫يكون لهذه اللّوحة ثمانية أقطاب تمثّل أربعة أســــطر وأربعة أعمدة‪ ،‬يقوم المتحكم بعملية مســــح‬
‫للوحة المفاتيح السـت عشـرية فيتم معرفة المفتاح المضـغوط من خالل معرفة نقطة تقاطع السـطر‬
‫مع العمود‪:‬‬

‫تتوفّر لوحة المفاتيح بعدّة قياســات فقد تكون مؤلّفة من أربعة أســطر بــــــ ثالثة أعمدة وقد تكون‬
‫فإن طريقة البرمجة ال تختلف كثيرا ً‪.‬‬
‫ثالثة أسطر بـ ثالثة أعمدة و‪...‬هكذا لكن بالمجمل ّ‬

‫‪240‬‬
‫بالعودة لبيئة التطوير ‪ Arduino IDE‬نجد ّ‬
‫أن المكتبية الخاصة بتشغيل لوحة المفاتيح الست‬

‫عشرية غير مض ّمنة ويجب إضافتها لبيئة التطوير ‪ Arduino IDE‬وكما تعلّمنا سابقا يتم األمر‬

‫من خالل األمر ‪:Manage Libraries‬‬

‫المكتبية اآلن موجودة في مجلّد مكتبيات البرنامج وجاهزة لالستخدام‪.‬‬


‫‪241‬‬
‫باالطالع على األمثلة المرفقة مع المكتبية والملف الرأسي لها (الملف الذي امتداده ‪ ).h‬نجد ّ‬
‫أن‬

‫التعليمات األساسية لتشغيل المكتبية‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫>‪#include <Keypad.h‬‬ ‫تعليمة تضمين المكتبية‪.‬‬
‫{=]‪char keys[rows][cols‬‬ ‫تحضير تابع تعريف لوحة المفاتيح‬
‫‪{'1','2','3','A'},‬‬ ‫تعريف أبعاد لوحة المفاتيح (عدد‬ ‫•‬
‫‪{'4','5','6','B'},‬‬ ‫األسطر واألعمدة) واألرقام الموجودة‬
‫‪{'7','8','9','C'},‬‬ ‫عليها (األرقام والرموز واألحرف)‪.‬‬
‫;}}'‪{'*','0','#','D‬‬ ‫تحديد األقطاب التي تم توصيل أسطر‬ ‫•‬
‫‪byte‬‬ ‫وأعمدة لوحة المفاتيح إلى لوحة‬
‫;}‪rowPins[rows]={13,12,11,10‬‬
‫اآلردوينو‪.‬‬
‫;}‪byte colPins[cols]={9,8,7,6‬‬
‫التابع‬ ‫لنا‬ ‫يتشكل‬ ‫النهاية‬ ‫في‬ ‫•‬
‫(‪Keypad FKeypad = Keypad‬‬
‫‪ FKeypad‬الذي يضم اسم لوحة‬
‫‪makeKeymap(keys),rowPins‬‬
‫األسطر‬ ‫توصيل‬ ‫‪keys‬‬ ‫المفاتيح‬
‫;)‪,colPins,rows,cols‬‬
‫‪ rowPin‬وتوصيل األعمدة ‪colPin‬‬
‫وعدد األسطر ‪ rows‬وعدد األعمدة‬
‫‪.cols‬‬
‫‪char‬‬ ‫‪B_Key‬‬ ‫قراءة المفتاح المضغوط من لوحة المفاتيح =‬
‫;)(‪FKeypad.getKey‬‬ ‫المعرفة بالتابع ‪ FKeypad‬واسناد القيمة‬
‫المضغوطة للمتحول الحرفي ‪.B_Key‬‬

‫يوجد أيضا ً تعليمات إضافية لكن التعليمات السابقة كافية وأي إضافة نريدها يمكن إجراؤها برمجيا ً‬

‫معتمدين على خبراتنا‪.‬‬

‫‪242‬‬
‫لنقم بربط لوحة المفاتيح ست عشرية مع األردوينو كما في المخطط التالي ولنطبع ناتج ضغط‬
‫أي مفتاح على نافذة السيريل‪.‬‬

‫‪243‬‬
‫باتّباع الخطوات التّي حدّدناها عند التعامل مع المكتبية ‪ ....‬نض ّمنالمكتبية للكود البرمجي في بداية‬
‫الكود‪ ،‬ثم ّنحدّد مصفوفة القيم التي ستعيد قيمها لوحة المفاتيح (طبعا ً يمكن تغيير قيم المصفوفة‬
‫بما يتناسب مع أي مشروع)‪ ،‬ث ّم نحدّد البارامترات األساسية للوحة المفاتيح بعد التعليمة‬
‫‪ Keypad‬وتتضمن أبعادها وأماكن توصيل أقطابها ومصفوفة القيم‪.‬‬
‫أخيرا ً ‪ ...‬يتم قراءة قيمة الكبّاس المضغوط من التعليمة )(‪ getKey‬وبما ّ‬
‫أن مصفوفة القيم‬

‫نعرف متغيّر من نفس‬


‫محارف ‪ char‬فسوف يكون ناتج ضغط أي مفتاح محرف ‪ char‬لذلك ّ‬
‫النوع الستقبال القيمة‪.‬‬
‫‪244‬‬
‫شاشة العرض الكرستالية ‪.LCD1602‬‬
‫شاشة العرض البلوري السائل أو اختصارا ً‬
‫‪،LCD: Display Liquid Cristal‬‬
‫تعتبر شاشة العرض الكرستالية من أهم‬
‫وسائل عرض البيانات المرسلة إليها من‬
‫لوحة األردوينو وتتميز بسهولة التعامل‬
‫وانخفاض التكلفة المادية وإمكانية عرض‬
‫البيانات وبعض الرموز واألشكال‪ ،‬كما‬
‫تحوي بداخلها معالج خاص لتسهيل التعامل معها حيث يكون هو المسؤول عن العمليات المعقدة‬
‫لإلظهار على الشاشة كما تحتوي على ذاكرة لحفظ المحارف المطلوب عرضها على الشاشة‪،‬‬
‫تتوفّر ال ّ‬
‫شاشة بعدّة قياسات و أحجام و تقاس عادة ً هذه الشاشة بعدد األسطر و األعمدة التي تحتويها‬
‫الشاشة‪ ،‬لكن و مهما اختلفت أبعاد الشاشة يبقى لها نفس األقطاب الخارجية للت ّحكم‪:‬‬

‫‪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‬‬

‫تشغيل شاشة ‪ LCD‬مع لوحة اآلردوينو‪:‬‬


‫بالنسبة لتشغيل الشاشة في بيئة التطوير ‪ Arduino IDE‬فال نحتاج إلضافة مكتبية خارجية إذ‬
‫ّ‬
‫أن البرنامج يض ّم مكتبية أساسية لتشغيل الشاشة (يمكن االطالع على األمثلة المرفقة مع المكتبية‬
‫لالطالع على آلية تعريف الشاشة في ‪ ،)Arduino IDE‬أه ّم التّعليمات الواجب معرفتها‪:‬‬

‫التعليمة‬ ‫شرح التعليمة‬


‫تضمين مكتبية تشغيل شاشة العرض >‪#include <LiquidCrystal.h‬‬

‫الكرستالية للكود‪.‬‬
‫‪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.begin(16,2‬استفدنا من تعليمات تشغيل‬

‫الشاشة في طباعة القيم المتغيّرة والعبارات الثابتة مع تغيير موقع الكتابة على الشاشة عبر التعليمة‬
‫)‪.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‬شاشات بأكثر من خانة‬
‫فقد تجد شاشة بخانتين أو ثالثة أو أربعة ‪ ....‬وهكذا ولع ّل ّأول سؤال تبادر لذهنك هو كيف تتم‬
‫عملية البرمجة في هذه الحالة؟؟؟‬

‫حتى نستطيع برمجة الشاشات بأكثر من خانة يجب أن ندرك أوالً بنيتها الداخلية‪ ،‬فلو أخذنا مثالً‬

‫شاشة ‪ 7Segment‬بخانتين سنالحظ ّأول أمر ّ‬


‫أن عدد أرجل الشاشة هو ‪ 10‬فقط ومن هنا ندرك‬
‫االختالف في طريقة تصميمها‪:‬‬

‫‪260‬‬
‫تعتمد الشركات المصنّعة على ربط القطع المتماثلة لجميع الخانات أي ربط القطعة ‪ A‬للشاشة‬
‫األولى مع ‪ A‬للشاشة الثانية وكذلك األمر بالنّسبة لبقية القطع فيصبح المخطط الكهربائي للشاشة‬
‫على النحو التالي (نفس األمر في حال كانت الشاشة ‪ 3‬أو ‪:).... 4‬‬

‫وبالتالي وحتى يعمل ‪ A‬للخانة ‪ 1‬يجب أن نعطيه الموجب من األردوينو باإلضافة للسالب الخاص‬
‫بالخانة ويتم ذلك عادة بالتحكم بقطب الخانة عبر ترانزستور متناسب مع نوع الشاشة (موجب‬
‫مشترك أم سالب مشترك)‪.‬‬
‫لكن كيف يتم عرض رقم مؤلف من خانتين على الشاشة بنفس الوقت؟؟‬
‫األمر يعتمد على الخداع البصري للعين‪ ،‬فكما هو معلوم ّ‬
‫فإن العين البشريّة تصبح عاجزة عن‬
‫إدراك التغيّرات في التردّدات التي تزيد عن ‪ 50Hz‬لذلك يتم تشغيل خانات الشاشات بشكل متتالي‬
‫بتردد ‪ 50Hz‬أو يزيد م ّما يعطي انطباع وكأن جميع الخانات تعمل معاً‪ ،‬سنطرح مثال عن طريقة‬
‫تشغيلها في نهاية الفصل إن شاء هللا‪.‬‬

‫‪261‬‬
‫القبضة التشابهية ذات المحورين ‪X & Y‬‬
‫المرات المقاومة المتغيّرة والتي كانت تقوم مقام مقسّم جهد عند توصيلها‬
‫مر معنا في العديد من ّ‬
‫ّ‬
‫حولنا الطريقة الفيزيائية لتحريك المقاومة‬
‫بشكل محدّد مع أقطاب التغذية ‪ ،Vcc , GND‬ماذا لو ّ‬
‫المتغيّرة ألسلوب قبضة التح ّكم والتي نجدها في التح ّكم بألعاب الفيديو واستفدنا منها في تحريك‬
‫لنتعرف معا ً على قبضة التح ّكم التشابهية‪.‬‬
‫ّ‬ ‫الروبوتات أو الكاميرات أو غير ذلك ‪...‬‬

‫وهي عبارة عن مقاومتين متغيّرتين (بقيمة ‪ )10kR‬متموضعتين بشكل متصالب يتم توصيل كل‬

‫واحدة منهما على شكل مقسم للجهد (للمقاومة المتغيرة ثالثة أقطاب أحد هذه األقطاب يوصل مع‬

‫التغذية واآلخر مع األرضي أما المتغير منهما مع أحد أقطاب التشابهية من لوحة اآلردوينو)‬

‫بحيث تمثّل إحداهما المحور ‪ X‬بينما تعبر الثانية عن المحور ‪ ،Y‬وما يميّز بنيتها وجود نابض‬

‫يعيد القبضة للمنتصف بعد أي عملية تحريك كما تحتوي كباس لحظي يضغط نحو األسفل من‬

‫القبضة‪ ،‬الشكل التالي يبين البنية الداخلية للقبضة التشابهية‪:‬‬

‫والهدف منها تأمين حركة تناظرية على المحورين ‪ X , Y‬م ّما يتيح استخدامها في العديد من‬
‫المحركات‪.‬‬
‫ّ‬ ‫صة عند التعامل مع‬
‫المشاريع وخا ّ‬

‫‪262‬‬
‫‪VDD‬‬ ‫التغذية الموجبة ‪5v‬‬

‫‪GND‬‬ ‫يوصل مع السالب‬

‫‪VRx‬‬ ‫خرج مقسم الجهد للمحور ‪.X‬‬

‫‪VRy‬‬ ‫خرج مقسم الجهد للمحور ‪.Y‬‬

‫‪SW‬‬ ‫خرج الكباس اللحظي‪.‬‬

‫‪263‬‬
‫نصل اآلن لوصل القبضة التشابهية مع لوحة األردوينو‪ ....‬لنصل المخارج التشابهية للقبضة‬
‫مع المداخل التشابهية ‪ A0 , A1‬ولنوصل الكباس اللحظي للقبضة التشابهية مع القطب‬

‫الرقمي ‪.8‬‬

‫‪264‬‬
‫فكرة الكود بسيطة جدا ً وهي عمليّة قراءة المداخل التشابهية وطباعة ناتج التحويل التشابهي‪.‬‬
‫‪265‬‬
‫ليد األلوان الثالثة ‪RGB LED‬‬
‫ليد األلوان الثالثة أو ما يعرف باالختصار‬
‫‪RGB LED: Red Green Blue LED‬‬
‫وهو عبارة عن مجموع ثالثة ‪ LEDs‬في قطعة‬
‫واحدة‪ ،‬ألوان هذه ‪ LEDs‬هي األحمر و األخضر‬
‫و األزرق ويكون لهذه األضواء نوعين حسب‬
‫طريقة تجميع توصيلها‪ ،‬فقد يتم تجميع المهابط‬
‫(‪ )Cathodes‬مع بعضها والتحكم باألضواء يتم‬
‫عبر المصعد (‪ )Anode‬الخاص بكل ‪ LED‬أو يتم تجميع المصاعد (‪ )Anodes‬مع بعضها‬
‫والتحكم باألضواء يتم عبر المهبط (‪ )Cathode‬الخاص بكل ‪ ،LED‬الشكل التالي يبين طريقة‬
‫تجميع هذه ‪:LEDs‬‬

‫ماهي الفائدة التي توفرها ‪...RGB 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‬‬
‫هذه األضواء من خالل األردوينو‪.‬‬

‫مقربة من شريط ‪ LED‬لوجدنا ّ‬


‫أن كل قطعة ‪ LED‬تض ّم في بنيتها الدّاخليّة على‬ ‫لو أخذنا نظرة ّ‬
‫دارة تكامليّة هي دارة القيادة ‪( SW2812B‬يختلف نوع هذه الدّارة بين شريط وآخر) باإلضافة‬
‫لديود اإلصدار الضوئي ثالثي األلوان ‪ ،RGB LED‬ويوجد لك ّل ‪ LED‬قطب دخل للبيانات‬
‫‪ DIN‬وقطب خرج للبيانات ‪( DOUT‬يكون متّصل مع قطب الدّخل لقطعة ‪ LED‬التالية)‪.‬‬

‫نستطيع التح ّكم بأي ديود إصدار ضوئي ‪ LED‬موجود على ال ّ‬


‫شريط من خالل قطب البيانات‬
‫والذي يتم وصله مع األردوينو مع وجود مقاومة صغيرة ‪ 330R‬على التسلسل مع هذا القطب‪.‬‬
‫‪270‬‬
271
‫ننتبه ألمر مهم وهو ّ‬
‫الطاقة المطلوبة لتشغيل هذه األضواء‪ ،‬كما نالحظ ّ‬
‫فإن كل قطعة تضم ثالثة‬
‫ديودات إصدار ضوئي وكل ديود يحتاج لـ ‪ 20mA‬وبالتالي فكل قطعة تحتاج لـ ‪ 60mA‬وفي‬
‫حال استخدام شريط بعدد يفوق الـ ‪ 10‬قطع فسيصبح استهالك األمبير من لوحة األردوينو كبير‬
‫لذلك يجب استخدام منبع جهد خارجي نغذّي من خالله لوحة األردوينو وكذلك شريط األضواء‬
‫ويجب أن يكون ‪ 5v‬كما يجب وضع مكثّف بما ال يقل عن ‪ 100uF‬لالستقرار الكهربائي‪ ،‬أ ّما‬
‫وجود المقاومة فكما ذكرنا فهي أيضا ً مه ّمة لتقليل الضجيج على خط البيانات‪.‬‬

‫لكن كيف يتم التحكم بهذه األضواء في بيئة ‪Arduino IDE‬؟؟‬

‫سنحتاج إلضافة المكتبيّة ‪ FastLED‬والتي تتميّز بسهولة كبيرة في التعامل معها ويتم من خاللها‬
‫التح ّكم بأي ‪ LED‬ودرجة لونه وطريقة عمله‪.‬‬

‫‪272‬‬
‫نضيف المكتبيّة في بداية الكود البرمجي ونحدّد عدد قطع ‪ LEDs‬المستخدمة (وليكن ‪ 20‬قطعة)‪،‬‬
‫ونحدّد قطب التح ّكم على لوحة األردوينو وهنا استخدمنا القطب ‪( 5‬يمكن استخدام أي قطب)‪،‬‬
‫نوجد جسم من المكتبيّة ونسميه مثالً ‪ ،leds‬ث ّم في حلقة اإلعداد يتم ضبط ك ّل البارامترات المتعلّقة‬
‫بتشغيل شريط ‪ LEDs‬وأخيرا يمكن تشغيل أي ‪ LED‬بتحديد عنوانه ودرجة اللون المطلوبة علما ً‬

‫ّ‬
‫أن العنوان يبدء من ‪.0‬‬
‫‪273‬‬
‫لغة ‪ C++‬من جديد‬
‫كنا قد درسنا في الفصل األول المتحوالت وأنواعها المختلفة لكن هناك الكثير من العمليات‬

‫والتحويالت البرمجية التي البد من االطالع عليها لكي يكون للمبرمج أريحية كبيرة في تعديل‬

‫الكود البرمجي والتعامل مع كل الحاالت التي ستقابله أثناء عملية تحضير الكود البرمجي‪ ،‬لذلك‬

‫سنتطرق هنا لبعد العمليات مع شرح بسيط عنها‪.‬‬

‫التحويالت ‪:Conversion‬‬
‫تستخدم هذه التعليمات لتحويل نوع المتحول المطلوب لنوع جديد بما يتناسب مع االحتياجات‬
‫البرمجية‪.‬‬

‫التعليمة‬ ‫الشرح‬
‫)‪byte(x‬‬ ‫تحويل المتحول ‪ x‬إلى النوع ‪byte‬‬

‫)‪char(x‬‬ ‫تحويل المتحول ‪ x‬إلى النوع المحرفي ‪char‬‬

‫)‪float(x‬‬ ‫تحويل المتحول ‪ x‬إلى النوع العشري ‪float‬‬

‫)‪int(x‬‬ ‫تحويل المتحول ‪ x‬إلى النوع الصحيح ‪int‬‬

‫)‪long(x‬‬ ‫تحويل المتحول ‪ x‬إلى النوع الصحيح ‪long‬‬

‫)‪word(x‬‬ ‫تحويل المتحول ‪ x‬إلى النوع الصحيح ‪word‬‬

‫النوع القديم للمتحول ‪ 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‬وال يشترط نوع محدد‬

‫;"‪String val_in = "12ML‬‬


‫لهذا العنصر إذ أنه يتم تحويله لنوع‬
‫;'‪char a = 'A‬‬ ‫محرفي وإضافته لنهاية السلسلة‪.‬‬
‫;‪int x = 12‬‬
‫;)‪val_in.concat(a‬‬
‫;)‪val_in.concat(x‬‬
‫‪Serial.print(val_in); //12LMA12‬‬

‫)‪String1.equals(string2‬‬ ‫للمقارنة بين قيمة سلسلتين‪ ،‬والناتج يكون‬


‫منطقي أي محقق أو غير محقق‪.‬‬
‫)‪stringName.indexOf(val,from‬‬ ‫للبحث عن القيمة ‪( val‬والتي قد تكون‬
‫‪//exp‬‬
‫محرف أو سلسلة) ضمن السلسلة‬
‫; "‪String val_in = "12ML‬‬
‫;"‪String val = "2M‬‬ ‫‪ stringName‬بحيث يتم البحث من‬
‫‪275‬‬
int index ; ‫ أو من أول السلسلة في‬from ‫نقطة محددة‬
index = val_in.indexOf(val);
Serial.print(index); //1
‫ ويعيد‬،‫حال عدم تحديد نقطة بدء البحث‬
//exp2 ‫ ضمن‬val ‫رقم يدل على مكان القيمة‬
String val_in = "12ML" ; ‫ في حال عدم وجود‬-1 ‫السلسلة أو القيمة‬
String val = "M2";
int index ;
.‫هذا العنصر ضمن السلسلة‬
index = val_in.indexOf(val);
Serial.print(index); // -1

stringName.length() ‫للحصول على طول السلسلة (أي عدد‬


//exp
‫عناصر السلسلة) كما يتضمن الفراغات‬
String val_in = " 12 M L";
int n ; .‫الموجودة ضمن السلسلة‬
n = val_in.length();
Serial.print(n); // 7

stringName.remove(index, ‫لحذف قيم معينة من السلسلة بدء من‬


count)
‫ وبعدد محدد من العناصر‬index ‫الموقع‬
//exp
count ‫ وفي حال عدم تحديد قيمة‬count
String val = "12358MLsfr113";
Serial.println(val); .‫يتم الحذف حتى نهاية السلسلة‬
val.remove(5,4);
Serial.println(val); //12358r113
stringN.replace(substring1, ‫ من أجل‬replace ‫تستخدم التعليمة‬
substring2)
‫ من‬substring1 ‫استبدال قسم محدد‬
//exp
‫ بسلسلة‬stringN ‫السلسلة األساسية‬
String val = "12358ML";
Serial.println(val); //12358ML .substring2 ‫أخرى‬
val.replace("358M" , "MS");
Serial.println(val); // 12MSL

276
‫التعريفات والنطاق للمتحوالت ‪:Variable Scope & Qaulifiers‬‬
‫وهي عبارة عن تعليمات تكتب قبل تعريف نوع المتحول وتستخدم لتحدد طبيعة المتحول في‬
‫الكود البرمجي أهم هذه العمليات‪:‬‬

‫التعليمة‬ ‫الشرح‬
‫;‪const type name = value‬‬ ‫تستخدم التعليمة ‪ const‬إلعطاء قيمة ثابتة‬
‫;‪const float pi = 3.14‬‬
‫للمتحول بحيث ال يمكن تغييرها الحقا داخل‬
‫الكود‪ ،‬أي يصبح هذا المتحول للقراءة فقط‪.‬‬
‫;‪static type name‬‬ ‫تستخدم التعليمة ‪ static‬لجعل المتحول‬
‫خاص بتابع معين وبالتالي ال يمكن استدعائه أو‬
‫;‪static int place‬‬
‫إجراء أي عملية عليه خارج التابع الموجود فيه‪.‬‬

‫;‪volatile type name‬‬ ‫تستخدم التعليمة ‪ volatile‬في حاالت‬


‫;‪volatile byte state‬‬
‫خاصة مع المتحوالت التي تحتاج دقة عالية في‬
‫النتيجة حيث يقوم المترجم بتخزين المتحول في‬
‫الذاكرة ‪ RAM‬مباشرة وليس في الذاكرة‬
‫‪ Flash‬وذلك للحصول على أكبر سرعة في‬
‫عملية التغير على المتحول‪.‬‬

‫‪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‬‬
‫مقدمة‪:‬‬

‫المحركات والتي تعتبر القسم الميكانيكي الذي يدعّم المشاريع االلكترونية ويت ّممها‪ ،‬فال بدّ من‬
‫ّ‬
‫وجود أحد أنواع المحركات في مشاريع الروبوتات بأنواعها أو أذرع التح ّكم والنمذجة وغير ذلك‬
‫من األفكار والمشاريع التطويرية‪ ،‬ونظرا ً لتعدّد المهام واختالف طريقة أدائها كان ال بدّ من توفّر‬
‫المحركات واالستفادة من المزايا والخصائص التي يقدّمها كل نوع منها بما‬
‫ّ‬ ‫العديد من أنواع‬
‫يتناسب مع فكرة المشروع المراد تجميعه‪.‬‬

‫محركات التيّار المستمر وطريقة عملها‬


‫ّ‬ ‫صص للحديث عن أشهر أنواع‬
‫سيكون هذا الفصل مخ ّ‬
‫محرك التّيار المستمر ذو الفحمات أو المسفرات ‪ Brush‬مع‬
‫ّ‬ ‫وكيفيّة قيادتها‪ ،‬وستكون البداية مع‬
‫لمحركات السيرفو‬
‫ّ‬ ‫عرف على طريقة التح ّكم به من خالل دارة القيادة ‪ ،L298N‬ث ّم ننتقل‬
‫الت ّ‬
‫والتعرف على بنيتها الداخلية وطريقة تصميمها وكيفية التح ّكم بها من خالل‬
‫ّ‬ ‫‪Servo motor‬‬
‫األردوينو‪.‬‬

‫محركات‬
‫محركات ‪ّ Brushless‬‬
‫ننتقل بعد ذلك لنوع مختلف من حيث البنية وطريقة القيادة وهي ّ‬
‫عديمة الفحمات والتي بدأت تجد رواجا ً واسعا ً في العديد من المجاالت الصناعية وخا ّ‬
‫صة مجل‬
‫السيارات الكهربائية باإلضافة لمجال الطائرات المسيّرة وغير ذلك من المجاالت وسنجيب عن‬
‫المحركات وسبب انتشارها الواسع مؤ ّخراً‪.‬‬
‫ّ‬ ‫كثير من األسئلة عن هذه‬

‫المحرك الخطوي العمود‬


‫ّ‬ ‫المحركات وأحبّها لي وهو‬
‫ّ‬ ‫التعرف على أحد أفضل‬
‫ّ‬ ‫أيضا ً البدّ من‬
‫األساسي والمفصل في أي مشروع تح ّكم حاسوبي كمكنات التحكم الحاسوبي الرقمي ‪CNC‬‬
‫واألذرع الروبوتية وغير ذلك من التطبيقات الكثيرة والتي ال حصر لها‪.‬‬

‫المحركات وأهمية وجود ك ّل نوع منها‬


‫ّ‬ ‫التنوع في‬
‫ّ‬ ‫نجد من هذه المقدّمة السريعة ضرورة هذا‬
‫وسنترك التفاصيل لشرحها في وقتها ‪ ....‬فلنتابع معاً‪.‬‬
‫‪302‬‬
‫محركات التيار المستمر ‪:Brush Motor‬‬
‫محركات التيّار المستمر ‪DC‬‬
‫ّ‬ ‫المحركات الكهربائية وهو‬
‫ّ‬ ‫لنبدأ هذا الفصل بأشهر وأقدم أنواع‬
‫محرك التيّار المستمر في أبسط صوره من قطبين مغناطيسيين ثابتين وفي الوسط‬
‫‪ ،motor‬يتألف ّ‬
‫دوار مرتبط مع مصدر تغذية مستمر‪ ،‬يمر الفيض المغناطيسي في الملف من القطب‬
‫ملف نحاسي ّ‬
‫ّ‬
‫الشمالي للقطب الجنوبي ويتناسب عزم الدوران طردا ً مع زيادة الطيف المغناطيسي للملف كما‬
‫الملف‪.‬‬
‫ّ‬ ‫يتناسب مع شدّة التيّار المار في‬

‫ولكي يستمر الملف الوسطي في الدوران فيلزم عكس التيار فيه كل نصف دورة وهذا يتم بواسطة‬

‫مبادل كهربائي يستمدّ التيار المستمر من المنبع عن طريق فرشتين مو ّ‬


‫صلتين (أو ما تعرف باسم‬
‫تتكون من شرائح من النّحاس) ويوصله للملف‪.‬‬
‫الفحمات ‪ Brush‬والتي ّ‬

‫المحركات‪ ،‬وأداء مستديم‪ ،‬وتح ّكم‬


‫ّ‬ ‫يتميز محرك التيار المستمر بتكلفة قليلة مقارنة بغيره من أنواع‬
‫سهل في سرعة المحرك وجهة دورانه‪ ،‬إال أنّه يحتاج استبدال الفرش وتنظيف أقطاب المبادل‬
‫المحرك‪.‬‬
‫ّ‬ ‫الكهربائي بين حين وآخر‪ ،‬أيضا ً تسبّب الفرش ارتفاع في الحرارة وصدور ضوضاء من‬

‫المحركات التي تعمل بالتّيار المستمر لكن تشترك في غالبها في‬


‫ّ‬ ‫طبعا ً يوجد العديد من أنواع‬
‫الصفات السابقة التي ذكرناها‪.‬‬
‫‪303‬‬
‫المحركات في مشاريعنا للحصول على مشاريع حركيّة كالروبوتات‬
‫ّ‬ ‫اآلن نريد االستفادة من هذه‬
‫أو السيّارات ذاتيّة الحركة (كسيّارات تتبّع المسار أو متفادي العوائق) أو غير ذلك من المشاريع‬
‫المحرك‪ ،‬لكن قبل الخوض في طريقة البرمجة يجب‬
‫ّ‬ ‫التي تعتمد على التح ّكم بسرعة وجهة دوران‬
‫محركات التيار المستمر وأول ما نبدأ به هو كيفية تغيير‬
‫ّ‬ ‫أن نفهم بعض األمور المتعلّقة في قيادة‬
‫المحرك‪.‬‬
‫ّ‬ ‫جهة دوران‬

‫محرك كهربائي مفكوك من أحد ألعاب األطفال وكيف كنّا نو ّ‬


‫صله‬ ‫ّ‬ ‫كلّنا سبق وأن ّ‬
‫جربنا توصيل‬
‫حرك بشكل معاكس لكن كيف سنحقّق‬
‫مع البطارية فيدور وإذا عكسنا أقطاب التوصيل كيف يدو الم ّ‬
‫ذلك الكترونياً؟؟؟‬

‫يتم ذلك عبر ما يعرف بجسر ‪ ... H‬لننظر معا لمخطط التوصيل التالي‪:‬‬

‫للمحرك في الوسط وطرفي التغذية (‪ ،)GND & Vcc‬اآلن‬


‫ّ‬ ‫نالحظ وجود أربع مفاتيح باإلضافة‬
‫المحرك باتجاه مختلف (الي مكن أن نفعّل مفاتيح متقابلة‬
‫ّ‬ ‫لو فعّلنا كل مفتاحين قطريين سيدور‬

‫‪304‬‬
‫المحرك)‪ ،‬اآلن لو استبدلنا المفاتيح الميكانيكية بمفاتيح الكترونية أي‬
‫ّ‬ ‫معا ً وإال فلن يدور‬
‫ترانزستورات (طبعا ً األمر ليس بهذه السهولة ّ‬
‫ألن موقع الترانزستور من الحمل يحدّد نوع‬
‫الترانزستور وبالتالي طريقة تفعيله) وت ّم التح ّكم بهذه المفاتيح االلكترونية عن طريق األردوينو‬
‫المحرك‬
‫ّ‬ ‫المحرك وبهذا نكون فهمنا مبدئيا ً كيف يتم تغيير جهة دوران‬
‫ّ‬ ‫فسوف نتح ّكم بجهة دوران‬

‫وبقي أن نعرف كيف سنتح ّكم بسرعته ‪ ....‬األمر بسيط ‪ّ ...‬‬


‫مرة ثانية نبضات ‪ ،PWM‬من خالل‬
‫ملف‬
‫ّ‬ ‫هذه النّبضات سنتح ّكم بزمن فتح كل مفتاح وبالتالي التح ّكم بالجهد الوسطي على طرفي‬
‫المحرك‪.‬‬
‫ّ‬ ‫المحرك ومنه التح ّكم بسرعة‬

‫بمحرك التيّار المستمر (جهة دوران وسرعة) واضح‪ ،‬ننتقل اآلن لتطبيق‬
‫ّ‬ ‫م ّما سبق أصبح التح ّكم‬
‫هذا األمر والذي سوف يتم من خالل دارات تح ّكم جاهزة (لن نخوض في تفاصيل تصميم دارة‬
‫‪ H – Bridge‬فليس هذا مبحثنا وسنعتمد على الدارات المتوفّرة في السوق)‪.‬‬

‫سنتعرف اآلن على دارة القيادة ‪.L298N‬‬


‫ّ‬

‫‪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‬وذلك من خالل حلقتي‬

‫‪ for‬يتم في األولى زيادة السرعة وفي الثانية إنقاص السرعة‪.‬‬

‫‪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‬محرك في‬

‫لوحة اآلردوينو نوع ‪ ،DUE‬وتعتمد المكتبيّة في عملها على المؤقت‪/‬العدّاد‪.1‬‬

‫المحرك من منبع تغذية مستقلّ‪ ،‬ال ننسى ربط األرضي للمنبع مع لوحة األردوينو‬
‫ّ‬ ‫‪ -‬عند تغذية‬

‫المحرك‪.‬‬
‫ّ‬ ‫حتى يعمل‬

‫‪ -‬في حاالت عمليّة معيّنة يتراكب موجات على النبضات ال ّمارة في أسالك ّ‬
‫محرك السيرفو م ّما‬
‫المحرك‬
‫ّ‬ ‫المحرك وللتغلّب على هذه الحالة نلف أسالك‬
‫ّ‬ ‫يسبّب حالة عدم استقرار في عمل‬
‫فرايت‪.‬‬
‫ضمن حلقة ّ‬

‫محرك السيرفو حالة من الال استقرار الكهربائي في المشروع لذلك ينصح‬


‫ّ‬ ‫‪ -‬قد يسبّب عمل‬
‫محرك السيرفو‪.‬‬
‫ّ‬ ‫بربط مكثّف كبير نسبيا ً (‪ )470 ~ 1000 uF‬على قطبي تغذية‬

‫‪319‬‬
‫المحركات عديمة الفحمات ‪:Brushless‬‬
‫محركات‬
‫ّ‬ ‫تعرفنا في بداية هذا الفصل على‬
‫ّ‬
‫التيّار المستمر ‪ Brush DC motor‬والتّي‬
‫تحتاج في عملها على وجود الفراش أو‬
‫المحرك وتحدّثنا عن‬
‫ّ‬ ‫الفحمات لكي يدور‬
‫السّلبيات التي تسبّبها الفحمات من ارتفاع‬
‫والضوضاء‬ ‫االحتكاك‬ ‫بسبب‬ ‫الحرارة‬
‫باإلضافة للسرعات المحدودة لهذا النوع من‬
‫لمحركات ذات سرعات كبيرة جداً؟‬
‫ّ‬ ‫المحركات‪ ،‬لكن ماذا لو احتجنا‬
‫ّ‬

‫محركات التي تم بناؤها بدون االعتماد على وجود الفحمات والتي سميّت الحقا ً‬
‫ّ‬ ‫الحل في‬
‫المحركات ذات الفحمات‬
‫ّ‬ ‫بالمحركات عديمة الفحمات أو ‪ Brushless motor‬والّتي امتازت عن‬
‫ّ‬
‫بالعزم المرتفع نسبة للوزن وكذلك عزم أكبر مقابل االستطاعة باإلضافة للوثوقية الكبيرة في‬
‫األداء والعمر الطويل وضجيج أقل‪.‬‬

‫المحركات ذات‬
‫ّ‬ ‫محركات ‪ Brushless‬بنية داخلية مختلفة عن تلك التي شاهدناها في‬
‫ّ‬ ‫تمتلك‬

‫الفحمات ويظهر االختالف ّأوالً في القسم ّ‬


‫الدوار ‪ Rotor‬والذي يحتوي على عدد محدّد من قطع‬
‫المغناطيس المتموضعة بشكل متعاكس ومتتالي (أي ّأول مغناطيس يكون الوجه المقابل للملف‬
‫الدوار ‪ Rotor‬أصبح‬ ‫القطب ‪ N‬والثاني يكون القطب ‪ S‬ث ّم ‪ N‬وهكذا‪ )...‬وهنا نالحظ ّ‬
‫أن القسم ّ‬
‫حامل للمغانط‪ ،‬أ ّما القسم الثّابت ‪ Stator‬فهو عبارة عن ثالثة ملفّات مربوطة بشكل متتالي‬

‫بحيث يكون كل ملّف مقابل لمغناطيس من مغانط ّ‬


‫الدوار‪ ،‬وأخيرا ً نالحظ وجود ثالثة أسالك‬
‫المحرك‪.‬‬
‫ّ‬ ‫للمحرك يمكن ترميزها اصطالحا ً ‪ A , B , C‬ولها طريقة في التغذية لكي يدور‬
‫ّ‬

‫‪320‬‬
‫اآلن كيف سنشغل محرك ‪Brushless‬؟؟‬

‫المحرك ‪ Brushless‬متعبة بعض الشيء حيث يحتاج لعملية ضبط لتتابع‬


‫ّ‬ ‫تعتبر عمليّة تشغيل‬
‫الموجب والسالب على الملفّات الثالثة من خالل قلب التغذية وتبديلها للحصول على إشارة تيّار‬
‫المحرك‪ ،‬طبعا ً ال يقصد بالتيّار المتناوب الموجبة الجيبية المعروفة لكن إشارة تيّار‬
‫ّ‬ ‫متناوب لقيادة‬
‫المستمرة) ويتم ذلك من خالل دارة خاصة‬
‫ّ‬ ‫ثنائية االتجاه (أي في الطور السالب والموجب للتغذية‬
‫والتي تسمى ‪.ESC‬‬

‫‪321‬‬
‫دارة قيادة محرك ‪ Brushless‬باستخدام ‪:ESC‬‬

‫تتألف دارة ‪ ESC: Electrical Speed Control‬من عدّة مجموعات من الترانزستورات‬


‫المحرك‪ ،‬أ ّما أسالكها‪:‬‬
‫ّ‬ ‫بحيث يكون كل مجموعة منها مسؤولة عن التح ّكم بأحد ملفّات‬

‫‪Vcc‬‬ ‫تغذية القسم المنطقي الخاا بال ‪ ESC‬وقيمته ‪ 5v‬مع‬


‫العلم أن هذا القطب قد ال يوجد في بعض األنواع‪.‬‬
‫‪GND‬‬ ‫المشترك أو السالب‬
‫‪Control‬‬ ‫قطب التحكم بالموديول‪.‬‬
‫‪P--‬‬ ‫التغذية المستمرة السالبة للمحرك‬
‫‪P++‬‬ ‫التغذية المستمرة الموجبة للمحرك‬
‫‪A/B/C‬‬ ‫أقطاب التوصيل مع ملفات المحرك وال يوجد ال ترتيب محدد‪.‬‬

‫المحرك فقط دون التح ّكم بجهة الدوران‪ ،‬أ ّما تغيير جهة دوران‬
‫ّ‬ ‫تستخدم هذه الدّارة للتح ّكم بسرعة‬
‫صة بها (‪.)A , B , C‬‬
‫المحرك مع األسالك الخا ّ‬
‫ّ‬ ‫المحرك فيكفي تغيير ترتيب توصيل ملفّات‬
‫ّ‬

‫كيف يتم تغيير السرعة إذا؟؟ ‪ ...‬بنفس األسلوب المستخدم في التح ّكم بجهة دوران ّ‬
‫محرك السيرفو‬
‫المحرك من خالل األردوينو‬
‫ّ‬ ‫أي من خالل نفس الموجة ونفس المواصفات وبالتالي فلتشغيل‬
‫محرك السيرفو‪.‬‬
‫ّ‬ ‫سنستخدم نفس المكتبية التي ت ّم استخدامها مع‬

‫‪322‬‬
‫لنقم اآلن بالتحكم بسرعة محرك ‪ Brushless‬من خالل التحكم بعرض النبضة الخارجة لم‬
‫‪ ESC‬عبر القطب ‪ 9‬من لوحة األردوينو‪.‬‬

‫‪323‬‬
‫محركات السيرفو مع االنتباه ألمر مهم‬
‫ّ‬ ‫بنفس األسلوب تماما ً الذي ت ّم استخدامه عند التعامل مع‬
‫المحرك لن يدور ضمن المجال ‪ 0 ~ 100‬ويختلف هذا المجال زيادة أو نقصان باختالف‬
‫ّ‬ ‫وهو ّ‬
‫أن‬
‫أنواع الـ ‪.ESC‬‬

‫‪324‬‬
‫مالحظات عامة‪:‬‬

‫✓ تقاس قوة هذه المحركات بواحدة ‪ KV‬والتي تدل على عدد الدورات التي يدورها المحرك‬

‫عند تغذيته بواحد فولط‪ ،‬وبالتالي فلو تم تغذية المحرك بمنبع تغذية وليكن ‪ 8v‬فإن سرعة‬

‫المحرك سوف تكون القيمة المكتوبة عليه مضروبة بالعدد ‪.8‬‬

‫✓ العالقة بين سرعة ‪ speed‬المحرك وقوة الرفع ‪ thrust‬للمحرك هي عالقة خطية عكسية‪،‬‬

‫فكلما زادت السرعة نقصت قوة الرفع للمحرك والعكس بالعكس‪ ،‬فقد نجد نفس المحرك من‬

‫نفس الشركة ونفس األبعاد لكن بسرعتين األول سرعته عالية وعزم منخفض والثاني قوة‬

‫الرفع له كبيرة مع انخفاض السرعة هذا االختالف مفيد لتحديد طبيعة العمل الذي سيقوم به‬

‫المحرك فللطائرات المجنحة يجب أن تكون قوة الرفع كبيرة وال تهم سرعة المحرك عندئذ‬

‫أما في الطائرات المروحية فيجب مراعات السرعة للمحركات وال يهم عندئذ موضوع الرفع‬

‫للمحرك‪.‬‬

‫‪325‬‬
‫المحركات الخطوية ‪:Stepper Motor‬‬
‫محركات تيّار مستمر لكنها‬
‫ّ‬ ‫وهي عبارة عن‬
‫تتميز بعزوم كبيرة ودقّة في الحركة ويستخدم‬
‫للتح ّكم في اآلالت التي تحتاج للتح ّكم بدقّة في‬
‫صات الليزر ومكنات‬ ‫ّ‬
‫كالطابعات ومق ّ‬ ‫الحركة‬
‫الحفر ‪ CNC‬والعديد من التطبيقات األخرى‪،‬‬
‫وس ّميت بالمحركات الخطوية ألنها قادرة على‬
‫الدوران خطوة خطوة حتى تتم دورة كاملة‬
‫وبالتالي لهذه الخطوات قيم زاوية تقابلها‪.‬‬

‫يختلف عدد الخطوات بين هذه المحركات فمنها من يكون مقدار كل خطوة ‪ 1.8o‬درجة أي حتى‬
‫تتم دورة كاملة ‪ 360o‬فإنها تحتاج لـ ‪ 200‬خطوة‪ ،‬ومنها ما تكون قيمة الخطوة ‪ 3.6o‬أي تحتاج لـ‬
‫‪ 100‬خطوة إلتمام دورة كاملة ‪ ....‬وهكذا‪ ،‬وكلما صغرت قيمة الخطوة ازدادت دقة المحرك‬
‫وتكون قيمة الخطوة وجهد وتيار أطوار المحرك مدونة عليه‪.‬‬

‫لو أردنا تقسيم محركات الخطوة تبعا لمغناطيسيتها الداخلية فسوف نجد لها نوعان هما محركات‬
‫خطويه أحادية القطبية ‪ Unipolar‬ومحركات خطويه ثنائية القطبية ‪ Bipolar‬والخالف بين‬
‫النوعين السابقين فهو في طريقة القيادة وفي العزم الذي يقدمه كل نوع من هذه المحركات أ ّما‬
‫البنية الداخلية فهي نفسها مع اختالف في طريقة التح ّكم في الملفّات الداخليّة‪ ،‬وهذين النوعين هما‬
‫اللذان سيتم دراستهما في بحثنا هذا ولن نتطرق لباقي أنواع المحركات الخطوية‪.‬‬

‫‪326‬‬
‫تتألف المحركات الخطوية ذات المغناطيسية الدائمة (أحادي القطبية وثنائي القطبية) من األقسام‬

‫التالية‪:‬‬

‫▪ القسم الدوار والذي يخرج منه محور المحرك ويتألف من قسمين مغناطيسيين فوق بعضهما‬
‫ول ّكل قسم أخاديد طوليّة كما ّ‬
‫أن هذه األخاديد لكل قسم تتأخر عن التي في القسم التالي بنصف‬
‫المحرك‪.‬‬
‫ّ‬ ‫المسافة أي أنّها ليست متطابقة فوق بعضها‪ ،‬هذه األخاديد هي من تحدّد عدد خطوات‬
‫▪ القسم الثابت ويضم ملفات النحاس التي تقدم المغناطيسية الدائمة ويختلف عدد هذه الملفات‬
‫وطريقة توصيلها‪ ،‬لكن غالب المح ّركات الموجودة في السوق تض ّم ملفّين فقط (في حاالت‬
‫يتم مضاعفة الملفّات بهدف زيادة العزم ليصبح ‪ 4‬ملفات أو ‪ 8‬لكن يمكن دمجها لتصبح ملفّين‬
‫فقط)‬
‫▪ ملحقات كأسالك خرج الملفات وبيليات على طرفي المحور لتسهيل حركة الدوران والغالف‬
‫المعدني الخارجي‪.‬‬

‫تقاس قوة محركات الخطوة بواحدة الـ ‪ kg.cm‬أي الثقل المحدد بواحدة الكيلو غرام الذي يستطيع‬
‫محور المحرك ذو الذراع بـ الطول المحدد بواحدة السنتيمتر تح ّمله‪.‬‬
‫‪327‬‬
‫المحركات الخطوية أحادية القطبية ‪:Unipolar‬‬

‫المحركات الخطوية واستخدامه بكثرة بسبب سهولة‬


‫ّ‬ ‫ت ّم االعتماد في بداية األمر على هذا النوع من‬
‫أن ملفاته الداخلية ص ّممت بطريقة يسهل التح ّكم بها (في كال النوعين ‪Unipolar ,‬‬
‫قيادته إذ ّ‬

‫‪ Bipolar‬يبقى الجزء الدّوار نفسه ولن يطرأ عليه أي تغيير‪ ،‬التغيير في طريقة وصل الملفّات‬
‫ّ‬
‫للمخطط التصميمي التالي‪:‬‬ ‫فقط)‪ ،‬لننظر‬

‫نالحظ وجود ملفّين أساسيين طرفيهما ‪ّ A , A-‬‬


‫لألول و ‪ B , B-‬للثاني‪ ،‬لكن لكل ملف نقطة‬
‫منتصف الهدف من هذه النقطة كما ذكرنا هو تسهيل قيادة الملفات‪ ،‬فلو قمنا بربط نقطة المنتصف‬
‫لكل ملف مع بعضهما (في بعض المحركات تكون منفصالت وفي أنواع أخرى تكون متّصلة)‬
‫ث ّم ربطنا هذه النقطة للتغذية الموجبة ‪ Vcc‬فيكفي اآلن التح ّكم باألطراف ‪( A , A- , B , B-‬من‬
‫خالل ‪ 4‬ترانزستورات) ووصلها مع ‪ GND‬لكي نحصل على المغناطيسية المطلوبة لتدوير‬
‫المحرك بشكل‬
‫ّ‬ ‫المحرك‪ ،‬لكن يجب أن يتحقّق تتابع معيّن في تفعيل األطراف السابقة لكي يدور‬
‫ّ‬
‫سنتعرف على عدّة أنماط لهذا التتابع‪.‬‬
‫ّ‬ ‫صحيح وهنا‬
‫‪328‬‬
‫‪A1‬‬ ‫‪A2‬‬ ‫‪B1‬‬ ‫‪B2‬‬ ‫‪ -‬نمط الملف الواحد‪:‬‬
‫وفي هذا النمط يتم تفعيل ملف واحد فقط (أي أحد‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫األطراف ‪ A , A- , B , B-‬فقط) من بين الملفات‬
‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫األربعة ويتم هذا التفعيل كما في الجدول‪.‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬

‫‪ -‬نمط الملفين‪:‬‬
‫‪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‬‬

‫‪ -‬نمط الخطوة المصغرة ‪:Microstepping‬‬


‫في هذا النمط يتم التح ّكم بكل ملف بشكل جزئي على شكل موجة جيبية م ّما يتيح لنا لتح ّكم‬
‫المحرك بدقّة كبيرة مع توفير في استهالك التيّار‪.‬‬
‫ّ‬ ‫بأجزاء الخطوة وتحريك‬

‫‪330‬‬
‫دارة القيادة ‪:ULN2003‬‬

‫صلة بطريقة‬ ‫باختصار ّ‬


‫فإن هذه الدّارة تض ّم في بنيتها الداخلية مجموعة من الترانزستورات والمو ّ‬
‫محرك‬
‫معيّنة لالستفادة منها كعازل أو غير ذلك من االستخدامات‪ ،‬سنستفيد من هذه الدّارة في قيادة ّ‬
‫بالرقم ‪ 28BYJ - 48‬والذي يعمل عند تغذية‬
‫المحرك المعروف ّ‬
‫ّ‬ ‫خطوي أحادي القطبية وهو‬
‫‪.5v/240mA‬‬

‫بالعودة للدارة التكامليّة ‪ ULN2003‬فإنّها تتوفّر على شكل موديول يحتوي العناصر المطلوبة‬
‫المحرك أحادي الطور‬
‫ّ‬ ‫لتشغيل الدّارة التكامليّة بشكل صحيح‪ ،‬كما ّ‬
‫أن الموديول يضم جاك لوصل‬
‫بشكل مباشر معه‪.‬‬

‫‪331‬‬
‫‪Vcc‬‬ ‫قطب التغذية التي ستصل للمحرك من خالل الموديول‬
‫(يوصل لمنبع تغذية منفصل عن األردوينو)‪.‬‬
‫‪GND‬‬ ‫السالب المشترك‪.‬‬
‫‪IN1 ~ IN4‬‬ ‫مداخل التحكم بالمحرك وتربط مع األقطاب الرقمية‬
‫لألردوينو‪.‬‬
‫‪Motor Connection‬‬ ‫مكان ربط المحرك مع الموديول‪.‬‬

‫لنقم اآلن بربط المحرك مع الموديول ونربط الموديول مع األردوينو لألقطاب الرقمية ‪،8 ~ 11‬‬
‫ولنشغل المحرك من خالل مكتبية ‪ Stepper‬المضمنة مع بيئة التطوير ‪.Arduino IDE‬‬

‫‪332‬‬
‫استخدام المكتبيّة بسيط جدّا ً ‪ ....‬في البداية نضيف المكتبيّة للكود البرمجي‪ ،‬ث ّم نوجد جسم من‬
‫المكتبيّة باسم ‪ myStepper‬نحدّد أماكن ربط أقطاب التح ّكم بالموديول وعدد الخطوات إلتمام‬

‫للمحرك)‪....‬‬
‫ّ‬ ‫الدّورة (نحصل على هذا الرقم من الوثيقة الفنّية‬

‫المحرك مع عقارب الساعة وبسرعة ‪100‬‬


‫ّ‬ ‫األول لتدوير‬
‫حلقة البرنامج الرئيسية تقسم لقسمين‪ّ ،‬‬
‫ونحركه دورة كاملة‪.‬‬
‫ّ‬ ‫خطوة بالدقيقة وهي حركة بطيئة‬

‫القسم الثاني بنفس األسلوب مع زيادة السرعة وتغيير جهة الدوران لعكس عقارب الساعة‪.‬‬

‫‪333‬‬
‫المحركات الخطوية ثنائية القطبية ‪:Bipolar‬‬

‫المحركات الخطوية أحاديّة القطبية وكيفية عملها‪ ،‬نصل اآلن للنوع‬


‫ّ‬ ‫تحدّثنا في الفقرة السابقة عن‬
‫المحركات ثنائية القطبيّة ‪.Bipolar stepper motor‬‬
‫ّ‬ ‫المحركات وهو‬
‫ّ‬ ‫الثّاني من هذه‬

‫المحركات عن سابقاتها في شيء ولكن االختالف هو في طريقة تشغيلها‪ ...‬لننظر‬


‫ّ‬ ‫ال تختلف هذه‬
‫ّ‬
‫للمخطط الداخلي لها نجد أنّه ت ّم إلغاء نقطة منتصف الملف (يمكن أن تكون موجودة ونتجاهلها‬ ‫معا ً‬

‫للمحرك أي سنحصل على ضعف العزم لنفس‬


‫ّ‬ ‫عند التوصيل) والسّبب في ذلك لمضاعفة العزم‬
‫محرك ثنائي القطبية لكن سيكون ذلك بال شك على حساب زيادة‬
‫ّ‬ ‫المحرك عند التعامل معه بأنّه‬
‫ّ‬
‫االستهالك للتيّار الكهربائي وأيضا ً صعوبة إضافية في القيادة‪:‬‬

‫‪334‬‬
‫السؤال اآلن كيف سندور المحرك؟؟‬

‫تعتمد آليّة التح ّكم اآلن على التح ّكم بكال طرفي الملف (بدل ربط طرف بشكل ثابت والتح ّكم‬
‫المحركات أحاديّة القطبية) أي أنّه يجب أن يكون كل طرف في مرحلة مطبّق‬
‫ّ‬ ‫بالطرف اآلخر في‬
‫عليه ‪ Vcc‬وفي مرحلة أخرى يطبّق عليه ‪ GND‬لكن كيف ذلك‪ ...‬نظريا ً األمر بسيط وذلك من‬
‫محركات التيّار المستمر)‪.‬‬
‫ّ‬ ‫وتعرفنا عليها في‬
‫ّ‬ ‫خالل دارتي ‪( H-bridge‬سبق‬

‫المحرك الّتي‬
‫ّ‬ ‫المحركات ثنائيّة القطبيّة تقدّم نفس أنماط دوران‬
‫ّ‬ ‫تتوفّر العديد من موديوالت قيادة‬
‫المحرك أحادي القطبيّة (نمط الخطوة الكاملة – نمط النصف خطوة – نمط‬
‫ّ‬ ‫تعرفنا عليها في‬
‫ّ‬
‫الخطوة المصغّرة) ويمكن أن نل ّخص نقاط عملها في‪:‬‬

‫‪ -‬للتح ّكم بها تحتاج قطب تحديد االتّجاه ‪ DIR‬وقطب التفعيل ‪ EN‬وقطب النبضات ‪PUL‬‬
‫المحرك (تختلف الموديوالت فيما بينها من حيث أعلى تردّد عمل‬
‫ّ‬ ‫والذي يحدّد سرعة دوران‬
‫للنبضات‪.‬‬
‫للمحرك‪ ،‬تقسيمات الخطوة‬
‫ّ‬ ‫‪ -‬تختلف فيما بينها بالدّرجة األولى في األمبير األعظمي المقدّم‬
‫الصغريّة وضبط التيّار الحدّي األعظمي‪.‬‬
‫‪335‬‬
‫دارة القيادة ‪:A4988‬‬

‫ربّما سبق وشاهدت طابعات ثالثيّة األبعاد ‪ 3D Printer‬أو مكنات ‪ CNC‬صغيرة الحجم‪ ،‬لو‬
‫محركاتها يتم من خالل موديوالت صغيرة وقد تكون‬
‫ّ‬ ‫أن التح ّكم في‬
‫فحصت هذه المكنات لوجدت ّ‬

‫هذه الموديوالت تحتوي على الدّارة التكامليّة ‪ A4988‬والتّي ستكون محور حديثنا في هذه الفقرة‪.‬‬

‫يتميز موديول التحكم ‪ A4988‬بالخصائص العامة التالية‪:‬‬

‫• تيار تشغيل مستمر ‪.1A‬‬


‫• حماية من قصر في الحمل‪.‬‬
‫• حماية من الحرارة الزائدة‪.‬‬
‫• جهد تحكم منطقي ضمن المجال ‪.3.3 ~ 5 volt‬‬
‫• جهد تشغيل للمحرك ضمن المجال ‪.8 ~ 35 volt‬‬
‫• تيار تشغيل لكل طور من أطوار المحرك يصل حتى ‪.2Amp‬‬
‫• جدول اختيار للخطوة ( ‪.)1 , 1/2 , 1/4 , 1/8 , 1/16‬‬
‫• ضبط تيار عمل المحرك‪.‬‬

‫‪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‬‬ ‫أقطاب لربط أطراف ملفات المحرك مع الموديول‬

‫جدول تقسيم الخطوة (علما ً ّ‬


‫أن الحالة االفتراضيّة لألقطاب هي ‪:)LOW‬‬

‫ذكرنا ّ‬
‫أن الموديول قادر على تقديم ‪ 2A‬على كل ملف لكن هذا يعتبر التيّار الحدّي وللحصول‬
‫للمحرك والتبريد للموديول بتركيب مشتّت الحرارة‬
‫ّ‬ ‫عليه يجب مراعاة االستقرار الكهربائي‬
‫المرفق مع الموديول‪ ،‬علما ً ّ‬
‫أن‬
‫الموديول يكون في حالة عمل‬
‫مستقرة عند الـ ‪ 1A‬للحمل‪.‬‬
‫ّ‬

‫‪338‬‬
‫من النّقاط المه ّمة أيضا ً عند التعامل مع هذا الموديول هي عمليّة ضبط التيّار الحدّي المقدّم‬
‫المحرك‬
‫ّ‬ ‫المحرك استجراره‪ ،‬وهذا األمر ضروري من جهة‬
‫ّ‬ ‫للمحرك‪ ،‬أي أكبر أمبير يستطيع‬
‫لضمان عدم عمله في حاالت االستجرار الزائد للتيّار والتي تسبّب تلفه ومن جهة الموديول لضمان‬
‫عدم تلفه واستقرار عمله عند تيّار عمل ثابت‪.‬‬

‫تتم عمليّة ضبط التيّار الحدّي من خالل المقاومة المتغيّرة المر ّكبة على الموديول وذلك بتغيير‬
‫قيمة الجهد عليها وتعويض حاصل قراءة الفولط في القانون التالي ومنه نحصل على قيمة التيّار‬
‫الحدّي‪:‬‬

‫‪Current Limit = Vref * 2.5‬‬

‫لنعوض قراءة مقياس الفولط ‪ 0.14v‬في القانون السّابق‪:‬‬


‫ّ‬

‫‪Current Limit = 0.14 * 2.5 = 0.35 A‬‬

‫‪339‬‬
‫اآلن لنجرب قيادة محرك خطوي ثنائي القطبية من خالل الموديول ‪ A4899‬من خالل التحكم‬
‫بالموديول من األردوينو من خالل قطبين رقميين فقط وليكن ‪.2 , 3‬‬

‫‪340‬‬
‫ي مكتبيّة‪ ،‬سنكتب كود نقوم من خالله بتوليد نبضات مربّعة على‬
‫في هذا المثال لن نستخدم أ ّ‬
‫القطب ‪ STEP‬للموديول‪ ،‬والتح ّكم باالتجاه من خالل القطب ‪ dirPin‬وتغيير قيمته مرة‬

‫ومرة ‪ LOW‬لتدويره في كال االتجاهين‪.‬‬


‫ّ‬ ‫‪HIGH‬‬

‫يمكن االعتماد على تعليمة ;)(‪ micros‬لتوليد نبضات مربّعة دون اشغال المعالج أو االعتماد‬

‫على مؤقتات لهذا الهدف (الجزء الثّالث إن شاء هللا)‪.‬‬


‫‪341‬‬
‫لو أردنا استخدام المكتبيّات الجاهزة لوجدنا العديد منها ولك ّل واحدة منها العديد من الميّزات‬
‫كالتح ّكم بالسرعة والتّسارع والتدوير بزاوية وغير ذلك من األمور المطلوبة عند التعامل مع‬
‫‪:accelstepper‬‬ ‫لنجرب معا ً المكتبيّة‬
‫ّ‬ ‫المحركات الخطويّة‪،‬‬
‫ّ‬

‫‪342‬‬
‫بعد إضافة المكتبيّة وتفعيل كائن من المكتبيّة باسم ‪ myStepper‬مع تحديد أقطاب التوصيل‬

‫لالتجاه والنبضات‪ ،‬ث ّم وفي حلقة اإلعداد نقوم بتحديد أهم البارامترات الضرورية كالسرعة‬
‫القصوى والتسارع والسرعة األساسية‪.‬‬

‫في الحلقة الرئيسية بمجرد أن يقوم المحرك بدورة واحدة‪ ،‬فإنه يغير اتجاه الدوران ويستمر في‬
‫وتكرارا‬
‫ً‬ ‫مرارا‬
‫ً‬ ‫فعل ذلك‬

‫‪343‬‬
‫دارة القيادة ‪:DRV8825‬‬

‫تعرفنا في الفقرة السّابقة على الدارة التكامليّة ‪ A4988‬ننتقل لدارة مشابهة لحد كبير معها‬
‫بعد ّ‬

‫سنتعرف على هذه الشريحة والميّزات التّي ّ‬


‫تتفوق بها على‬ ‫ّ‬ ‫وهي الدّارة التكامليّة ‪،DRV8825‬‬
‫الشريحة ‪:A4988‬‬

‫يتميز موديول التحكم ‪ DRV8825‬بالخصائص العامة التالية‪:‬‬

‫• تيار تشغيل مستمر ‪.1A‬‬


‫• حماية من قصر في الحمل‪.‬‬
‫• حماية من الحرارة ّ‬
‫الزائدة‪.‬‬
‫• ال تحتاج لمصدر جهد خاص بالقسم المنطقي‪.‬‬
‫• جهد تشغيل للمحرك ضمن المجال ‪.8.2 ~ 45 volt‬‬
‫• تيار تشغيل لكل طور من أطوار المحرك يصل حتى ‪.2.2Amp‬‬
‫• ستة أنماط اختيار للخطوة ( ‪.)1 , 1/2 , 1/4 , 1/8 , 1/16, 1/32‬‬
‫• ضبط تيار عمل المحرك‪.‬‬
‫• قطب إضافي لمتابعة أي حالة عمل خاطئة للموديول‪.‬‬

‫‪344‬‬
‫لتعرف على األقطاب الموجودة على طرفي الموديول‪:‬‬
‫ّ‬

‫‪GND LOGIC‬‬ ‫قطب األرضي المنطقي ويربط مع لوحة األردوينو‪.‬‬


‫‪VMOT & GND MOT‬‬ ‫أقطاب تغذية ملفات المحرك ‪.8.2 ~ 45v‬‬
‫‪M1/M2/M3‬‬ ‫أقطاب تقسيم الخطوة (كما هو موضح في الجدول)‬
‫‪STEP‬‬ ‫مدخل نبضات للموديول والتي من خاللها نحدد السرعة‬
‫العظمى‪.‬‬
‫‪DIR‬‬ ‫تحديد جهة الدوران (‪ 1‬منطقي مع عقارب الساعة‪ 0 ،‬عكس‬
‫عقارب الساعة)‪.‬‬
‫‪EN‬‬ ‫قطب التفعيل ويعمل عند ‪ 0‬منطقي علما أن قيمته‬
‫االفتراضية ‪ 0‬منطقي‪ ،‬وإليقاف تفعيل الموديول نعطيه ‪1‬‬
‫منطقي‪.‬‬
‫‪SLP‬‬ ‫قطب إدخال الموديول في حالة حفظ الطاقة عند تفعيله بم ‪0‬‬
‫منطقي‪.‬‬
‫‪345‬‬
‫‪RST‬‬ ‫يفعل هذا القطب عند ‪ 0‬منطقي وبالتالي يتم تجاهل النبضات‬
‫على القطب ‪ STEP‬ولن يدور المحرك أما إللغاء دوره‬
‫نربطه مع ‪ 1‬منطقي وال يترك عائم‪.‬‬
‫‪2A/1A/1B/2B‬‬ ‫أقطاب لربط أطراف ملفات المحرك مع الموديول‬
‫‪FAULT‬‬ ‫قطب إضافي يعطي ‪ 0‬منطقي في حاالت الحمل الزائد أو‬
‫حاالت الفصل الحراري‪.‬‬

‫جدول تقسيم الخطوة (علما ً ّ‬


‫أن الحالة االفتراضيّة لألقطاب هي ‪:)LOW‬‬

‫ذكرنا ّ‬
‫أن الموديول قادر على تقديم ‪ 2.2A‬على كل‬
‫ملف لكن هذا يعتبر التيّار الحدّي وللحصول عليه يجب‬
‫للمحرك والتبريد‬
‫ّ‬ ‫مراعاة االستقرار الكهربائي‬
‫للموديول بتركيب مشتّت الحرارة المرفق مع‬
‫الموديول‪ ،‬علما ً ّ‬
‫أن الموديول يكون في حالة عمل‬
‫مستقرة عند الـ ‪ 1.5A‬للحمل‪.‬‬
‫ّ‬

‫‪346‬‬
‫من النّقاط المه ّمة أيضا ً عند التعامل مع هذا الموديول هي عمليّة ضبط التيّار الحدّي المقدّم‬
‫المحرك‬
‫ّ‬ ‫المحرك استجراره‪ ،‬وهذا األمر ضروري من جهة‬
‫ّ‬ ‫للمحرك‪ ،‬أي أكبر أمبير يستطيع‬
‫لضمان عدم عمله في حاالت االستجرار الزائد للتيّار والتي تسبّب تلفه ومن جهة الموديول لضمان‬
‫عدم تلفه واستقرار عمله عند تيّار عمل ثابت‪.‬‬

‫تتم عمليّة ضبط التيّار الحدّي من خالل المقاومة المتغيّرة المر ّكبة على الموديول وذلك بتغيير‬
‫قيمة الجهد عليها وتعويض حاصل قراءة الفولط في القانون التالي ومنه نحصل على قيمة التيّار‬
‫الحدّي‪:‬‬

‫‪Current Limit = Vref * 2‬‬

‫لنعوض قراءة مقياس الفولط ‪ 0.14v‬في القانون السّابق‪:‬‬


‫ّ‬

‫‪Current Limit = 0.175 * 2 = 0.35 A‬‬

‫‪347‬‬
‫اآلن لنجرب قيادة محرك خطوي ثنائي القطبية من خالل الموديول ‪ DRV8825‬من خالل‬
‫التحكم بالموديول من األردوينو من خالل قطبين رقميين فقط وليكن ‪.2 , 3‬‬

‫نفس الكود البرمجي المستخدم مع الموديول ‪ A4988‬وال يوجد أي اختالف‬

‫‪348‬‬
‫مالحظات تصميمية‪:‬‬

‫المحرك ضروري جدا ً جدا ً وعامل مهم لعمل‬


‫ّ‬ ‫المكثّف الذي ربطناه على طرفي أقطاب تغذية‬

‫المحرك بشكل صحيح وتكون قيمته عند ‪ 47uF‬مع مراعاة الفولط الخاص به ويجب أن يكون‬
‫ّ‬
‫المحرك‪.‬‬
‫ّ‬ ‫أكبر من الفولط المار باتجاه‬

‫عند التعامل مع المحركات الخطوية نجد أنها تقاس‬

‫وفق الترميز العالمي ‪ NEMA-xx‬وهي‬

‫‪EMA-National Electric‬‬ ‫اختصار لـ‬

‫‪Manufactures‬‬ ‫‪Association‬‬

‫أكبر جمعية تجارية لمصنعي المعدات الكهربائية في الواليات المتحدة األمريكية‪ ،‬تأسست في‬

‫عام ‪ 1926‬وتحتفظ بمقرها في روسلين‪ -‬فيرجينيا‪ ،‬وتضم حوالي ‪ 450‬شركة عضو في‬

‫التجمع وكلها شركات إلنتاج المعدات الكهربائية‪.‬‬

‫صة في القياس فهي تعتمد واحدة اإلنش في القياس والنيوتن في‬


‫الرابطة واحداتها الخا ّ‬
‫ولهذه ّ‬

‫العزوم وغير ذلك من الواحدات الخاصة بهذه الرابطة‪ ،‬وفي المحركات الخطوية نجد مثال‬

‫محرك بقياس ‪ NEMA 17‬أو غير ذلك من األرقام لكن في النتيجة فإن الرقم يدل على قياس‬

‫قطر المسقط األمامي للمحرك بواحدة اإلنش مقسوما على ‪ 10‬أي أن ‪ 17 = 1.7inch‬وهكذا‪،‬‬

‫ولها أرقام محددة وليست عشوائية فنجد ‪.NEMA23 , 34 ,42‬‬

‫‪349‬‬
‫المشفرات البصرية ‪The Encoder‬‬
‫في بعض التطبيقات التي نستخدم بها المحركات يتطلب هذا التطبيق تحديد جهة دوران المحرك‬
‫ومعرفة سرعته أو معرفة موضع محور المحرك بالنسبة للدائرة (تحديد الزاوية بالنسبة لنقطة‬
‫صفرية على محور المحرك) لذلك نستخدم المشفّر البصري أو (‪ )Encoder‬والذي يكون متصل‬
‫مع محور المحرك‪ ،‬فاالنكودر جهاز له خرج رقمي متغيّر تبعا ً لإلزاحة الدورانية أو الخطية‪.‬‬

‫يوجد نوعين من المشفّرات البصريّة سنستعرضها ونتع ّرف على آليّة عملها معاً‪.‬‬

‫المشفر البصري ال ُمطلق ‪absolute encoder‬‬

‫في هذا النوع يتم تقسيم قرص المشفر البصري إلى ّ‬


‫قطاعات وعند كل قطاع يكون الخرج‬
‫عبارة عن قيمة رقمية تمثل موقع محور المحرك بالنسبة لنقطة مرجعية وهذا ما يوضحه‬
‫الشكل التالي‪:‬‬

‫حيث يظهر لدينا في الشكل التالي مشفر مطلق بثمانية بتات أي أن لدينا ‪ 256‬حالة للخرج‬
‫وكل حالة تمثل موضع معين‪ ،‬وكلما زادت بتات الخرج حصلنا على دقة أكبر لتموضع محور‬
‫المحرك المتصل مع قرص المشفر البصري‪.‬‬

‫‪350‬‬
‫المشفر البصري ال ُمتزايد ‪:The Incremental Encoder‬‬

‫الدوار‬
‫يحول الموضع الزاوي (الدوران) للمحور ّ‬
‫المشفر الدوار أو المتزايد هو مستشعر موضع ّ‬
‫نظرا‬
‫إلى إشارة خرج رقميّة تستخدم لتحديد االتجاه الذي يدور فيه المحور وكذلك السّرعة‪ ،‬و ً‬
‫لتحكمها الرقمي الدقيق يتم استخدامها في العديد من التطبيقات بما في ذلك الروبوتات وآالت‬
‫‪ CNC‬والطابعات‪.‬‬

‫لألول بـ ‪ A‬والثاني بـ ‪ ،B‬أ ّما في‬ ‫يتألّف هذا النوع من المشفّرات البصرية من ّ‬
‫خطي خرج ير ّمز ّ‬
‫دوار عاتم وعليه ثقوب غير عاتمة‪ ،‬أعلى القرص يوجد مصدر ضوئي‬
‫الداخل فيوجد قرص ّ‬
‫(‪ )LED‬بينما أسفل القرص يوجد مستقبلين ضوئيين (ترانزستور ضوئي) هما ‪ A , B‬والمسافة‬
‫الدوار‪.‬‬
‫بينهما نصف المسافة بين ثقبين من الثقوب التي على القرص ّ‬

‫‪351‬‬
‫عند دوران القرص باتجاه عقارب الساعة فسيكون النّبضات ال ّ‬
‫صادرة من الخرج ‪ A‬متقدّمة على‬

‫النّبضات ال ّ‬
‫صادرة من الخرج ‪ B‬بمقدار نصف نبضة (هي نفسها المسافة الفاصلة بين المستقبلين‬
‫الضوئيين التابعين لهما أسفل القرص الدّوار)‪.‬‬

‫أ ّما عند دوران القرص بعكس عقارب الساعة فسيكون النّبضات ال ّ‬


‫صادرة من الخرج ‪ B‬متقدّمة‬

‫على النّبضات ال ّ‬
‫صادرة من الخرج ‪ A‬بمقدار نصف نبضة (هي نفسها المسافة الفاصلة بين‬
‫المستقبلين الضوئيين التابعين لهما أسفل القرص الدّوار)‪.‬‬

‫نستفيد م ّما سبق في معرفة جهة الدّوران‪ ،‬أ ّما حساب السرعة فيتم من خالل عدّ النبضات خالل‬
‫زمن محدّد بعد معرفة العدد الكلّي للنبضات عند إتمام دورة كاملة (يتوفّر منها ‪ 600‬نبضة في‬
‫الدورة و ‪ 1200‬وغير ذلك من القيم)‪.‬‬

‫‪352‬‬
‫لنأخذ االنكودر الدوار التالي ولنجرب عمله مع لوحة األردوينو‪:‬‬

‫‪GND‬‬ ‫األرضي أو المشترك‬


‫‪VCC‬‬ ‫التغذية الموجبة ‪3.3 ~ 5v‬‬
‫‪SW‬‬ ‫خرج الكباس ويعطي ‪ 0‬منطقي عند الضغط عليه‬
‫‪DT / B‬‬ ‫الخرج ‪ B‬من المشفر‪.‬‬
‫‪CLK / A‬‬ ‫الخرج ‪ A‬من المشفر‪.‬‬
‫لنقم بربط المشفّر مع لوحة األردوينو من خالل ربط األقطاب ‪ A , B , SW‬مع األقطاب ‪.2,3,4‬‬

‫‪353‬‬
‫نعرف المتغيّرات التي‬
‫نعرف في بداية الكود األسماء التي سنستخدمها ضمن الكود البرمجي ث ّم ّ‬
‫ّ‬
‫سنحتاجها ضمن الكود البرمجي‪ ،‬أ ّما في حلقة اإلعداد نحدّد طبيعة األقطاب وهي أقطاب دخل‬
‫بدون مقاومة رفع‪ ،‬مع االنتباه لقراءة الحالة البدائية للدخل ‪ CLK‬واسناد حالته للمتغيّر‬

‫‪ lastStateCLK‬والذي سيلعب دور في حلقة البرنامج الرئيسية في معرفة فيما إذا كان‬

‫لدينا عمليّة دوران لمحور اإلنكودر أم ال‪.‬‬

‫‪354‬‬
355
‫في حلقة البرنامج الرئيسية يتم قراءة حالة المدخل ‪ CLK‬وإسناد ناتج القراءة للمتغيّر‬

‫‪ currentStateCLK‬الذي يعبّر عن حالة المدخل الحاليّة‪ ،‬فإن كانت القراءة الحاليّة‬


‫مختلفة عن القراءة السّابقة للمدخل فهذا يد ّل ّ‬
‫أن حالة تدوير تتم على اإلنكودر ننتقل داخل الشرط‬
‫الختبار جديد وهو معرفة جهة الدوران من خالل مقارنة حالة المدخل ‪ CLK‬مع المدخل ‪ DT‬فإن‬

‫كانتا مختلفتين في القيمة فالدّوران بعكس عقارب السّاعة ويتم عندئذ إنقاص قيمة المتغيّر‬
‫‪ counter‬أ ّما إن كانت قيمة المدخلين متشابهتين فإن الدوران يتم مع عقارب السّاعة فعندئذ‬

‫يتم زيادة المتغيّر ‪ counter‬ومن ث ّم طباعة الناتج على واجهة السيريل‪.‬‬

‫القسم الثّاني من الكود متعلّق بقراءة حالة الكبّاس على اإلنكودر الدوراني مع وضع تأخير زمني‬
‫باستخدام التعليمة )(‪ millis‬للتخلّص من حالة االهتزاز الميكانيكي‪.‬‬

‫‪356‬‬
‫تمارين الفصل الثالث‪:‬‬
‫ليكن لدينا محرك خطوي يتم قيادته من خالل الموديول ‪A4988‬‬
‫والذي يتم التحكم فيه من خالل األردوينو عبر القطبين ‪ ،2 ,3‬ولدينا‬ ‫تمرين ‪:1‬‬
‫مشفر دوراني يتم ربط القطبين ‪ A , B‬مع أقطاب األردوينو ‪.9 , 10‬‬

‫المطلوب كتابة كود برمجي يتم من خالله تدوير المحرك تبعا لحركة دوران المشفر الدوراني‪.‬‬

‫‪357‬‬
358
359
‫لدينا محركي سيرفو يتم التحكم بهما من خالل األقطاب ‪ ،10 , 11‬كما‬
‫يوجد لدينا مقاومة متغيرة تشكل مقسم جهد على المدخل التشابهي‬
‫تمرين ‪:2‬‬
‫‪ ،A0‬كما يوجد كباسين لحظيين مربوطين مع األقطاب ‪.A1 , A2‬‬

‫المطلوب كتابة كود برمجي يتم من خالله التحكم بموقع المحرك األول من خالل المقاومة‬
‫المتغيرة بينما يتم التحكم بالمحرك الثاني من خالل الكباسين اللحظيين‪.‬‬

‫‪360‬‬
361
‫عرفنا في بداية الكود البرمجي األقطاب المستخدمة من لوحة األردوينو وأعطيناها أسماء بما‬
‫ّ‬
‫يتناسب مع تمريننا‪.‬‬

‫محرك السيرفو‬
‫ّ‬ ‫محركات السيرفو فيجب إضافة المكتبيّة ال ّخاصة بتشغيل‬
‫ّ‬ ‫وبما أنّنا نتعامل مع‬
‫المحركات وأماكن توصيلها على لوحة األردوينو‪.‬‬
‫ّ‬ ‫تحديد مستلزمات تشغيل هذه‬

‫في حلقة البرنامج األساسي يوجد عندنا تابع فقط هو التّابع ;)(‪ servo_control‬للتح ّكم‬

‫بالمحركين (يمكن االستغناء عن التّابع وكتابة كامل التعليمات في نفس الحلقة الرئيسية لكن لكي‬
‫ّ‬
‫نكتسب خبرة التعامل مع التوابع من خالل التمارين)‪.‬‬

‫بالمحرك األول عن‬


‫ّ‬ ‫األول للتح ّكم‬
‫تابع التح ّكم ;)(‪ servo_control‬يقسم لقسمين ‪ّ ...‬‬
‫بالمحرك الثاني من خالل‬
‫ّ‬ ‫طريق الكبّاسات اللحظية زيادة وإنقاص‪ ،‬أ ّما القسم الثاني فللتح ّكم‬
‫المقاومة المتغيّرة‪.‬‬

‫‪362‬‬
‫لدينا محركي تيار مستمر نريد التحكم بهما من خالل الموديول‬
‫‪ ،L298N‬كما يوجد لدينا قبضة تشابهية يتم وصل مخارجها‬ ‫تمرين ‪:3‬‬
‫التشابهية مع المداخل ‪.A0 , A 1‬‬

‫المطلوب التحكم بسرعة وجهة دوران كل محرك من خالل القبضة التشابهية (كل محور من‬
‫القبضة مسؤول عن تغيير سرعة وعكس دوران)‪.‬‬

‫‪363‬‬
364
365
‫فكرة التّمرين تعتمد على االستفادة من القبضة التشابهية في تحديد جهة الدّوران وكذلك السّرعة‪،‬‬

‫المحركين في حالة توقّف‪ ،‬أ ّما لو ّ‬


‫حركنا القبضة على‬ ‫ّ‬ ‫فعندما تكون القبضة في الوسط يكون كال‬
‫المحرك ‪1‬‬
‫ّ‬ ‫المحور ‪ X‬باتجاه الحصول على أعلى قراءة على المدخل التشابهي فيكون تحريك‬
‫باتجاه اليمين‪ ،‬أ ّما زيادة السّرعة فتتناسب مع زيادة تحريك القبضة باتجاه زيادة قيمة المبدّل ونصل‬
‫ألعظم سرعة عند القيمة ‪.1023‬‬

‫المحرك نحو اليسار وتتزايد سرعة‬


‫ّ‬ ‫بالحالة المعاكسة وعند تحريك القبضة باتجاه ‪ 0‬يكون حركة‬
‫المحرك كلّما اقتربنا من ‪ 0‬لتصل للسرعة العظمى‪.‬‬
‫ّ‬

‫تحرك القبضة التشابهية‪ ،‬ث ّم تحديد‬


‫تتم العمليّة السابقة باستخدام الجمل الشرطية ‪ if‬لتحديد مكان ّ‬
‫المحركين‪.‬‬
‫ّ‬ ‫نسبة السّرعة باستخدام التعليمة )(‪ ، map‬الكود متشابه لكال‬

‫‪366‬‬
‫مشروع الفصل‪ :‬تصميم محرك ‪ Servo‬من محرك ‪DC‬‬
‫فكرة المشروع‪:‬‬

‫الركيزة األساسيّة في مشاريع الروبوتات واألذرع المبرمجة‪ ،‬وسبب ذلك‬


‫محركات السيرفو ّ‬
‫تعتبر ّ‬
‫المحركات هو الكلفة الكبيرة لها‪ ،‬إذ ّ‬
‫أن‬ ‫ّ‬ ‫كما وجدنا الدّقة في الحركة واألداء لكن ما يَعيب هذه‬
‫محركات ‪ Servo‬ذات العزوم العالية تعتبر غالية الثمن فالمحركات التي تتراوح عزومها بين‬
‫ّ‬
‫محرك بعزم قريب من القيمة‬
‫ّ‬ ‫‪ 20 ~ 30 Kg-cm‬تكون أسعارها قريبة من ‪ 30$‬أ ّما لو أردنا‬
‫سعر سوف يرتفع لما يقارب ‪ 600$‬وبالت ّالي فالتكلفة مرتفعة جدا ً‪ ،‬لذلك قمنا‬
‫‪ 120 Kg-cm‬فال ّ‬
‫محرك تيّار مستمر ‪ DC‬للحصول على‬
‫ّ‬ ‫محرك ‪ Servo‬انطالقا ً من‬
‫ّ‬ ‫بطرح فكرة المشروع بناء‬
‫محرك بعزم قوي وأداء قريب جدا ً من أداء محركات ‪ Servo‬المتوفرة في السّوق‪.‬‬

‫‪367‬‬
‫بالعودة آللية بناء محرك ‪ servo‬وجدنا خالل دراسة هذا المحرك أنه يحتوي في بنيته على‬

‫محرك ‪ DC‬مع مسنّنات لتحويل السّرعة لعزم (علبة سرعة)‪ ،‬كما يتضمن وحدة تحكم بالمحرك‬

‫للمحرك ‪ ،)H-bridge‬وال ننسى التغذية‬


‫ّ‬ ‫لتحديد السّرعة واالتجاه (وحدة معالجة ‪ +‬دارة قيادة‬

‫العكسية لمعرفة مكان المحرك الحالي لتحديد جهة دورانه وسرعته للوصول للمكان المحدّد‬

‫وتصحيح الخطأ‪ ،‬أ ّما مصدر هذه التغذية العكسيّة فيمكن أن يكون إما مقمماومة متغيرة مربوطة‬

‫مع محور المـــحرك النهـــائي وكل قيمـــة لهذه المقـــاومة تعبر عن موضــع محدد‪ ،‬أو مشممممفر‬

‫المحرك لمعرفة زاوية الدوران من دقة المشفر‬


‫ّ‬ ‫دوار ‪ Rotary Encoder‬مت ّصل مع محور‬

‫المحرك يتم من خاللها‬


‫ّ‬ ‫نفسه‪ ،‬لنأخذ الحالة األشهر وهي وجود مقاومة متغيّرة مربوطة على محور‬

‫المحرك‪.‬‬
‫ّ‬ ‫تحديد موقع‬

‫أما العناصر المطلوبة إلنجاز هذا المشروع‪:‬‬

‫مزود بعلبة سرعة لتحويل السّرعة لعزم‪.‬‬


‫محرك تيّار مستمر ّ‬
‫ّ‬ ‫‪-‬‬

‫المحرك ولتكن ‪.L298N‬‬


‫ّ‬ ‫للمحرك ‪ H-bridge‬متناسبة مع عزم‬
‫ّ‬ ‫‪ -‬دارة قيادة‬

‫المحرك (سيكون دورها مقسّم جهد متغيّر‬


‫ّ‬ ‫‪ -‬مقاومة متغيّرة قيمتها ‪ 10kR‬لربطها على محور‬

‫المحرك)‪.‬‬
‫ّ‬ ‫تبعا ً لدرجة دوران محور‬

‫المحرك‪.‬‬
‫ّ‬ ‫‪ -‬لوحة أردوينو ‪ Arduino UNO‬لمعالجة قيم التغذية العكسيّة وتوجيه حركة‬

‫المحرك منها‪.‬‬
‫ّ‬ ‫‪ -‬مقاومة متغيّرة إضافيّة لتدوير‬

‫‪368‬‬
‫قبل االنتقال للكود البرمجي يجب االنتباه لبعض النقاط‪:...‬‬
‫المحرك بشكل صحيح في كال‬
‫ّ‬ ‫عند ربط العناصر ببعضها فيجب ّأوالً التأ ّكد من حركة‬ ‫‪-‬‬
‫المحرك نحو اليمين‬
‫ّ‬ ‫االتجاهين (أي ّ‬
‫أن أمر التحريك لليمين من األردوينو صحيح ويدور‬
‫وكذلك بالنسبة لليسار وليس األمر معاكس لما سبق)‪.‬‬
‫المحرك تزداد قيمتها عند الدّوران نحو اليمين وتتناقص‬
‫ّ‬ ‫‪ -‬المقاومة المربوطة على محور‬
‫قيمتها عند الدّوران نحو اليسار (في حال كان خالف ذلك نبدّل طرفي التغذية على المقاومة‬
‫المحرك)‪.‬‬
‫ّ‬ ‫المتغيّرة المربوطة على‬
‫‪ -‬مقاومة التح ّكم تزداد قيمتها عند تدويرها نحو اليمين وتتناقص بالتدوير نحو اليسار‪.‬‬
‫المحرك‪ ،‬أي ال نستخدم كامل‬
‫ّ‬ ‫‪ -‬نهمل بعض القيم من طرفي المقاومة المتغيّرة المر ّكبة على‬
‫مجال المبدّل التشابهي الرقمي ‪ ،0 ~ 1023‬بل علينا إهمال بعض القيم من طرفي المجال‬
‫وليكن مجال العمل ‪ 200 ~ 800‬وسبب ذلك لالبتعاد عن طرفي المقاومة ومخافة حدوث‬
‫أخطاء عند العمل قد تسبّب كسر في المقاومة‪.‬‬
‫المحرك إذ يجب أن تكون ذات‬
‫ّ‬ ‫يجب االنتباه لنوع المقاومة المتغيّرة المر ّكبة على محور‬ ‫‪-‬‬
‫دورة واحدة وتغيّر ّ‬
‫خطي أي قيمة تغيّر الخرج متناسبة مع مقدار االنزياح (يوجد في أنواع‬
‫ذات تغيّر غير خطي والّتي سينتج عنها حركة غير منتظمة أو عدّة دورات والتي تكون بتغيّر‬
‫لوغاريتمي)‪.‬‬

‫‪369‬‬
‫للمحرك يجب أن يكون بسرعة قليلة ويفضّل أن يكون أقل من ‪( 20 rpm‬أقل من ‪20‬‬
‫ّ‬ ‫‪ -‬بالنّسبة‬
‫للمحرك مع تح ّكم دقيق في الموقع وكلّما‬
‫ّ‬ ‫دورة في الدقيقة) وبالتّالي سنحصل على عزم كبير‬
‫زادت السّرعة سنضطر لتخفيضها من خالل تقليل مجال خرج النبضة ‪ PWM‬وبالتالي تقليل‬
‫المحرك‪.‬‬
‫ّ‬ ‫عزم‬

‫‪370‬‬
371
372
‫لمحرك السيرفو لكن بدمج قسم وحدة‬
‫ّ‬ ‫ّ‬
‫المخطط الصندوقي‬ ‫فكرة الكود تقوم باختصار على تنفيذ‬
‫بالمحرك باألردوينو‪.‬‬
‫ّ‬ ‫التح ّكم‬

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

‫‪ -‬التابع ;)(‪ readAndConditionAngle‬وفيه يتم قراءة قيمة المقاومة المر ّكبة‬

‫المحرك وتحديد مجال عملها ‪.200 ~ 800‬‬


‫ّ‬ ‫على محور‬
‫‪ -‬التّابع ;)(‪ readAndConditionRequiredAngle‬وفيه يتم قراءة قيمة‬

‫المحرك‪.‬‬
‫ّ‬ ‫مقاومة التح ّكم وضبط مجال عملها ليتناسب مع مجال المقاومة المر ّكبة على محور‬
‫التابع ;)‪calculateErrorAmount (currentAngle,requiredAngle‬‬ ‫‪-‬‬
‫المحرك ‪currentAngle‬‬
‫ّ‬ ‫والذي يحتوي متغيّرين هما قراءة المقاومة المتغيّرة على‬
‫وقراءة المقاومة المتغيّرة المتح ّكمة بالحركة ‪ ، requiredAngle‬يتم في هذا التابع تحديد‬
‫المحرك من خالل حساب الفرق بين القراءتين وجعل نبضة ‪ PWM‬متناسبة مع‬
‫ّ‬ ‫تسارع‬
‫المحرك مع تناقص التّسارع‬
‫ّ‬ ‫الفرق بين هاتين القيمتين أي كلّما زاد الفرق بينها زادت سرعة‬
‫كلّما اقترب الفرق بينهما بالتناقص‪.‬‬
‫‪373‬‬
‫المحرك عندها عن الحركة فال يمكن تحقيق‬
‫ّ‬ ‫يوجد كما ذكرنا سابقا ً قيمة مهملة يجب توقيف‬
‫التطابق بنسبة ‪ 100%‬لذلك نستخدم المتغيّر‪. acceptableError‬‬
‫المحرك والتي تتم في الجملة ال ّ‬
‫شرطية الموجودة داخل حلقة‬ ‫ّ‬ ‫‪ -‬بقي لدينا تحديد جهة دوران‬
‫البرنامج الرئيسية والتي تعتمد على تحديد جهة الدّوران اعتمادا ً على معرفة أي قيمة مقاومة‬
‫أكبر‪.‬‬

‫‪374‬‬
‫الفصل الرابع‪:‬‬
‫المحيطيات (‪)2‬‬

‫‪375‬‬
‫حساس األشعة تحت الحمراء ‪.PIR‬‬
‫بمجرد مرور أي جسم أمامها‪ ،‬أو‬
‫ّ‬ ‫لعلّك صادفت العديد من األجهزة أو األضواء التي تعمل‬
‫كاميرات مراقبة ترسل رسائل تنبيه عند أي حركة في المكان وغير ذلك من أجهزة الحماية‬
‫واألمان المستخدمة في اآلونة األخيرة بكثرة‪....‬‬

‫لنتعرف معا ً على‬


‫ّ‬ ‫تعتمد هذه األجهزة على حسّاس أشعة تحت الحمراء أو ما يعرف باسم ‪،PIR‬‬
‫هذا الحسّاس وآليّة عمله‪.‬‬

‫لبناء هذه الحسّاسات ت ّم االستفادة من إحدى الخصائص الفيزيائية والتي تفيد ّ‬


‫بأن أي جسم حرارته‬
‫تزيد عن الصفر المطلق (‪ )-273.15C or 0 Kelvin‬تنبعث منها طاقة حراريّة على شكل أشعّة‬
‫قوة انبعاث هذه األشعّة طردا ً مع زيادة درجة حرارة الجسم‪.‬‬
‫تحت حمراء ‪ infrared‬وتتناسب ّ‬

‫‪376‬‬
‫صا الكتشاف مثل هذه المستويات من األشعة تحت الحمراء‪،‬‬
‫تم تصميم مستشعر ‪ PIR‬خصي ً‬
‫تتكون بشكل أساسي من جزأين رئيسيين مستشعر كهربي حراري ‪Pyroelectric Sensor‬‬
‫و ّ‬
‫وعدسة خاصة تسمى عدسة فرينل ‪ Fresnel lens‬التي تركز إشارات األشعة تحت الحمراء‬
‫على المستشعر الكهروحراري‪.‬‬

‫يحتوي المستشعر الكهروحراري على فتحتين مستطيلتين مصنوعتين من مادة تسمح بمرور‬
‫األشعة تحت الحمراء‪ ،‬خلفهما يوجد قطبان منفصالن لمستشعر األشعة تحت الحمراء‪ ،‬أحدهما‬
‫مسؤول عن إنتاج خرج إيجابي واآلخر ناتج سلبي‪ ،‬والسبب في ذلك هو أننا نبحث عن تغيير في‬
‫مستويات األشعة تحت الحمراء وليس مستويات األشعة تحت الحمراء المحيطة‪.‬‬

‫عا أكثر‬
‫يتم توصيل القطبين الكهربائيين بحيث يلغي كل منهما اآلخر فإذا رأى أي نصف إشعا ً‬
‫أو أقل من األشعة تحت الحمراء من اآلخر فسوف يتأرجح خرج العدسة ارتفاعا ً أو منخف ً‬
‫ضا‪،‬‬
‫ويكون المستشعر خامالً عندما ال توجد حركة حول المستشعر وبالتالي فإن كال الفتحتين تتحسّسا‬
‫نفس الك ّمية من األشعة تحت الحمراء‪ ،‬مما ينتج عنه إشارة خرج صفرية‪ ،‬ولكن عندما يمر بها‬
‫جسم دافئ مثل اإلنسان أو الحيوان يؤدي إلى تغيير تفاضلي إيجابي بين النصفين‪ ،‬وعندما يغادر‬

‫الجسم الدافئ منطقة االستشعار‪ ،‬يحدث العكس حيث يولّد ً‬


‫تغيرا تفاضليًا سلبيًا‪ ،‬ومنه سيكون خرج‬
‫الحسّاس الذي سنتعامل معه عند القيمة ‪ 1‬منطقي‪.‬‬

‫‪377‬‬
‫لنتعرف اآلن على أحد أشهر هذه الحسّاسات والتي ستجدها بكثرة وهو الحسّاس ‪HC-SR501‬‬
‫ّ‬
‫والذي يتميّز بسهولة التعامل معه وانخفاض كلفته باإلضافة النخفاض استهالكه ّ‬
‫للطاقة ومتانته‪،‬‬
‫كما أنّه يحتوي على عدسة تعطيه نطاق حساسيّة واسع عند العمل‪.‬‬

‫‪Vcc‬‬ ‫التغذية الموجبة للحساس ويعمل عند ‪4.5 ~ 5.5v‬‬


‫‪OUT‬‬ ‫خرج الحساس ويعطي ‪ 1‬منطقي (‪ )3.3v‬عند مرور‬
‫أي جسم أمام الحساس و ‪ 0‬منطقي في حال عدم‬
‫مرور جسم‪.‬‬
‫‪GND‬‬ ‫سالب الحساس أو األرضي‬

‫‪378‬‬
‫بالنّظر ألسفل الحسّاس سنجد العديد من العناصر منها ّ‬
‫منظم جهد عند ‪ 3v‬كما يوجد ديود حماية‬
‫الربط باإلضافة لمقاومتين متغيّرتين مع عناصر إضافيّة أخرى‬
‫من الوصل العكسي ونقاط ّ‬
‫لنتعرف معا ً على أهم هذه العناصر‪:‬‬
‫ّ‬ ‫ضرورية لعمل الحسّاس بشكل صحيح‪...‬‬

‫▪ مقاومة متغيّرة لضبط الحساسيّة ‪ Sensitivity Adjust‬ويتم من خاللها ضبط مدى استشعار‬
‫الحسّاس ضمن المجال ‪.3 ~ 7m‬‬
‫▪ مقاومة متغيّرة ‪ Time-delay Adjust‬لضبط زمن تفعيل الخرج بعد مرور الجسم أمام‬
‫الحسّاس ويكون الضبط ضمن المجال ‪.300 ~ 3 sec‬‬
‫▪ جسر ربط ويكون لدينا خيارين للربط‪:‬‬

‫‪379‬‬
‫سيستمر الحسّاس بإعطاء خرج طالما هناك حركة أمام‬
‫ّ‬ ‫الربط مع )‪H (Hold‬‬
‫• عند ّ‬
‫الحسّاس‪.‬‬

‫الربط مع )‪ L (No-Repeat‬سيبقى الخرج عند ‪ 1‬للفترة التي حدّدتها مقاومة‬


‫• عند ّ‬
‫ضبط المدّة ّ‬
‫الزمنيّة‪.‬‬

‫‪380‬‬
‫يحتوي الحسّاس على أماكن إلضافة عناصر للحسّاس للحصول على أداء مختلف‪ ،‬فلو نظرنا‬
‫سنجد هناك النّقطتين ‪ RL , RT‬ولكل واحدة منها وظيفة‪ ،‬ففي الموقع ‪ RT‬يمكن إضافة مقاومة‬
‫حراريّة ويؤدي إضافتها لزيادة دقّة عمل الحسّاس في درجات الحرارة المختلفة‪.‬‬

‫أ ّما المنطقة ‪ RL‬فيمكن ربط مقاومة ضوئية ‪ LDR‬لها وبالتالي فلن يعمل الحسّاس إال في الظالم‪.‬‬

‫لنقم اآلن بربط الحساس ‪ HC-SR501‬مع األردوينو علما أن التعامل معه كأنه مفتاح‪..‬‬

‫‪381‬‬
382
‫حساس األمواج فوق الصوتية ‪Ultrasonic Sensor‬‬
‫لعلّك تساءلت يوما ً عن كيفيّة طيران الخفّاش في ّ‬
‫الظالم رغم عدم قدرته على الرؤية ؟؟ أو شاهدّت‬
‫بعض الروبوتات وهي تتفادى العوائق التي في طريقها ودون أن تصطدم بها‪ ،‬لكن كيف يتم ذلك؟‬

‫ببساطة األمر يعتمد على األمواج فوق الصوتيّة والتي ت ّم استخدامها كرادار صغير‪ ،‬لنتابع معا ً‬

‫ساسات المستخدمة مع األردوينو وهو حساس المسافة باألمواج فوق‬


‫التعرف على أحد أشهر الح ّ‬
‫ّ‬
‫الصوتية ‪.HC-SR04‬‬

‫قبل المتابعة لنفهم معا ماذا تعني األمواج فوق الصوتية‪...‬‬

‫تستطيع األذن البشرية سماع األصوات التي تردّدها من ‪ 20Hz‬وحتى أصوات الدبيب ‪20kHz‬‬
‫الرجل والمرأة أيضاً‪ ،‬ومنه‬
‫مع اختالف هذا المجال بين إنسان وآخر بشكل طفيف واختالفه بين ّ‬
‫نستنتج ّ‬
‫أن أي صوت فوق التردّد السابق لن يسمع ويس ّمى بفوق صوتي ‪.Ultrasonic‬‬

‫‪383‬‬
‫ولنتعرف على أهم ميّزاته الفنّية التي ساهمت في انتشاره الواسع‬
‫ّ‬ ‫لنعد للحسّاس ‪HC-SR04‬‬
‫واعتماده في العديد من التطبيقات والمشاريع‪.‬‬

‫▪ جهد تغذية ‪ Vcc = 5 volt‬واستهالك منخفض للتيار يصل حتى ‪.15 mA‬‬
‫▪ تردد عمل الحساس ‪.40 kHz‬‬
‫▪ مجال حساب المسافة للحساس تنتمي للمجال ‪.2cm ~ 4m‬‬
‫▪ زاوية قياس الحساس ‪ 15‬درجة‪.‬‬
‫▪ نبضة قدح الحساس ‪ 10uS‬بمنطق ‪.TTL‬‬
‫▪ خرج نبضة االستقبال متناسبة مع المسافة المدى‪.‬‬

‫‪VCC & GND‬‬ ‫أقطاب تغذية الموديول‬


‫‪Trig‬‬ ‫قطب القدح ليبدأ الحساس بالعمل‬
‫‪Echo‬‬ ‫خرج الحساس ويعطي نبضة مربعة ذات زمن متناسب مع زمن‬
‫ذهاب الموجة الصوتية من الحساس وعودتها له‪.‬‬

‫‪384‬‬
‫كيف يعمل الحساس ‪..‬؟‬
‫يمكن أن نرتّب عمل الحسّاس ضمن الخطوات التّالية‪:‬‬
‫‪ -‬نطبّق على قطب ‪ Trig‬نبضة ‪ 1‬منطقي بزمن ‪( 10uS‬الحدّ األدنى لزمن النبضة)‪.‬‬
‫صوتي المرسل‬
‫يبدأ الحسّاس بالعمل مباشرة فيرسل مجموعة نبضات صوتية من المجهر ال ّ‬ ‫‪-‬‬
‫شكل ونفس التّردّد)‪.‬‬
‫وينتظر حتّى يستقبل نفس النّبضات التي أرسلها (أي نفس ال ّ‬

‫‪ -‬عند استالم هذه النّبضات يخرج الحسّاس نبضة مربّعة على القطب ‪ Echo‬زمنها متناسب‬
‫صوتية من لحظة خروجها من الحسّاس وحتّى عودتها له‪.‬‬ ‫مع ّ‬
‫الزمن الذي استغرقته الموجة ال ّ‬

‫‪385‬‬
‫‪ -‬بعد وصول النّبضة لألردوينو وحساب زمنها يبقى لدينا مجهول واحد من المعادلة الرياضيّة‬
‫التي تربط الزمن بالمسافة مع السرعة‪:‬‬

‫‪Distance = Speed x Time‬‬

‫بالنّسبة لنا فإن سرعة ال ّ‬


‫صوت في الهواء معلومة (‪ 340 m/s‬وبتعديل الواحدات تصبح ‪0.034‬‬
‫‪ cm/uS‬والسّبب في التحويل ألن زمن النبضة سنحصل عليه بواحدة ‪ ،)uS‬أ ّما زمن فيمكن‬
‫حسابه علما ً ّ‬
‫أن الزمن هنا هو زمن ذهاب وعودة الموجة الصوتية ويجب تقسيمه على ‪ ،2‬يبقى‬
‫مجهول واحد من المعادلة السّابقة وهو بعد الجسم عن الحسّاس وبتعويض الزمن والسرعة نحصل‬
‫على المسافة بواحدة ‪.cm‬‬

‫لكن كيف يتم حساب زمن النبضة في األردوينو؟؟‬


‫باستخدام تعليمة ;)(‪ pulseIn‬والتي سبق وتعرفنا عليها في الفصل األول من الكتاب‪ ،‬وفي‬

‫لنجرب اآلن وصل الحسّاس‬


‫ّ‬ ‫حال كان ال يوجد جسم أمام الحسّاس فسيكون الناتج مقارب لـ ‪38ms‬‬
‫مع األردوينو‪.‬‬

‫;)‪pulseIn(pin , Value‬‬ ‫تستخدم هذه التعليمة لقراءة عرض النبضة المطبقة على‬
‫القطب المحدد ‪ ،pin‬أما القيمة ‪ Value‬فتأخذ إحدى‬
‫القيمتين‪:‬‬
‫‪ :HIGH‬حيث ينتظر حتى تصبح الموجة الداخلة‬ ‫‪-‬‬
‫على القطب في حالة ‪ HIGH‬فيبدأ العد حتى تعود‬
‫للقيمة ‪ LOW‬وعندها يتوقف عن العد‪.‬‬
‫‪ :LOW‬ينتظر حتى تصبح النبضة المطبقة على‬ ‫‪-‬‬
‫القطب في حالة ‪ LOW‬عندئذ يبدأ بالعد حتى تعود‬
‫لحالة ‪ HIGH‬وعندها يتوقف العد‪.‬‬
‫‪386‬‬
387
‫بعد تعريف األقطاب المطلوبة لعمل الحساس وهي قطب القدح ‪ TrigPin‬وقطب قراءة‬

‫الصدى ‪ EchoPin‬يتم الدخول في حلقة البرنامج الرئيسي والتي يتم فيها تفعيل نبضة القدح‬

‫لمدة ‪ 10us‬ثم إطفاء نبضة القدح‪ ،‬بعدها يتم قراءة قيمة النبضة الواردة من قطب الصدى وإدخال‬
‫القيمة المقروءة في عملية تحويل رياضي للتوافق بين الواحدات ومن ثم التعويض في قانون‬
‫حساب المسافة مع قسمة الناتج على ‪ 2‬نحصل على القيمة المطلوبة‪.‬‬

‫خالل الحساب قد ال تكون الحسابات دقية والسّبب أنّنا نعتبر سرعة الصوت في الهواء ثابتة لكن‬
‫فإن هذه القيمة عرضة للتغيّر كون الصوت موجة فيزيائية فسوف تتأثّر بحالة الحرارة‬
‫في الواقع ّ‬

‫كذلك نسبة الرطوبة في الجو والشوائب كالغبار الكثيف وغير ذلك من األمور‪ ،‬وفي حال كنت‬
‫تريد أخذ العوامل السّابقة بعين االعتبار يمكن استخدام العالقة التالية لحساب سرعة الصوت في‬
‫الهواء بشكل أكثر دقّة‪.‬‬

‫ننتبه أيضا ً لموقع الح ّ‬


‫ساس من الجسم الذي أمامه إذ يجب أن يكون الحسّاس عامودي قدر‬
‫االستطاعة كما ّ‬
‫أن الجسم يجب أن يكون حجمه جيّد ليعكس الموجة الصوتية‪.‬‬

‫‪388‬‬
‫الموديوالت التي تحوي في بنيتها ‪IC:LM393‬‬
‫في هذا القسم سنتطرق للعديد من الموديوالت والحساسات التي بنيت باالعتماد على دارة مضخم‬

‫العملياتي ذو الرقم ‪ ،LM393‬حيث تم االستفادة من هذا المضخم وبناء دارة مقارن‬

‫‪ Comparator‬بين الجهد الناتج عن الطرفية األساسية (مقاومة ضوئية‪ ،‬مقاومة متغيرة‪،‬‬

‫مستقبل أشعة تحت الحمراء‪ ،‬حساس صوت‪ ،‬حساس رطوبة ‪ )....‬ودرجة الحساسية التي سوف‬

‫يتم ضبطها عبر المقاومة المتغيرة الموجودة على الموديول والتي يتم من خاللها تحديد الدرجة‬

‫التي سوف يبدأ الحساس عندها بالعمل‪.‬‬

‫‪389‬‬
‫لو استعرضنا المخطط النظري لبنية هذا الموديول لوجدنا أنه يتألف من األقسام التالية‪:‬‬

‫‪ -‬الحساس الموجود على الموديول وملحقاته‪ ،‬وغالبا ما يش ّكل الحساس مع مقاومة أخرى‬

‫سم جهد خرجه متصل مع القطب ‪ INA+‬من المقارن‪.‬‬


‫(‪ )R1 = 10k‬مق ّ‬

‫‪ -‬المقارن الذي يحتوي على المدخلين هما المدخل ‪ INA+‬من الحساس والمدخل ‪ IN-‬من‬

‫مقاومة متغيرة لضبط نقطة العمل للحساس‪ ،‬أ ّما الخرج ‪ OUT‬فهو خرج رقمي يعطي القيمة‬

‫‪ 0‬منطقي عندما يكون القيمة على القطب ‪ INA-‬أكبر من القيمة الناتجة من الحساس‪ ،‬بينما‬

‫يعطي ‪ 1‬منطقي عندما يكون القيمة الناتجة عن الحساس أكبر من نقطة الضبط على القطب‬

‫‪.INA-‬‬

‫‪ -‬أقطاب التوصيل وهي أقطاب التغذية )‪ (Vcc & GND‬وقطب الخرج الرقمي ‪OUTA‬‬

‫وقطب الخرج التشابهي ‪ AC‬والذي يكون متصل مباشرة مع نقطة الخرج لمقسم الجهد‬

‫للحساس مع المقاومة ‪ ،10k‬أو قد يكون غير متصل وذلك حسب نوع الحساس الموجود على‬

‫الموديول‪.‬‬

‫‪ -‬ملحقات إضافية‪ :‬كما يوجد على الموديول ‪ LEDs‬للدّاللة على التغذية والخرج الرقمي‬

‫وكذلك بعض المكثفات لالستقرار والتي تكون بقيمة ‪.100nF‬‬

‫لهذا الموديول العديد من األنواع التي تختلف فيما بينها فقط في الحساس الموجود عليها لكن في‬

‫النهاية فإن طريقة العمل واحدة وهي خرج رقمي على الرجل ‪ OUT‬من الموديول‪ ،‬لنأخذ اآلن‬

‫بعض أشهر الحسّاسات والتي تستخدم دارة المقارن السّابق في بنيتها‪.‬‬

‫‪390‬‬
‫حساس الصوت‪:‬‬

‫ّ‬
‫مخطط الموديول السّابق‪ ...‬ت ّم وضع حسّاس للصوت‬ ‫باستخدام دارة المقارن ‪ LM393‬وبنفس‬
‫على الموديول لنحصل بذلك على موديول استشعار للصوت‪ ،‬ومن خالل المقاومة المتغيّرة على‬
‫الموديول نستطيع تحديد نقطة عمل الموديول وإعطائه قيمة على الخرج‪.‬‬

‫سيت ّم التعامل برمجيّا ً مع هذا الموديول كما يتم التعامل مع مفتاح أو كبّاس لحظي حيث يعطي قيمة‬
‫‪ 0‬منطقي عند عمل حسّاس الصوت بينما يكون الخرج عند ‪ 1‬منطقي في حال عدم عمل الحسّاس‪.‬‬

‫أ ّما أقطاب الخرج فهي ثالثة ‪ ...‬اثنان منها للتغذية ‪ VCC & GND‬بينما الثّالث ‪ OUT‬فيمثّل‬
‫خرج رقمي للموديول‪.‬‬

‫‪391‬‬
‫لنجرب اآلن استخدام هذا الحساس في أحد التطبيقات العملية من خالل ربط الموديول مع‬
‫األردوينو والتحكم بالحمل عبر الصوت‪.‬‬

‫‪392‬‬
‫بعد تعريف المداخل‪/‬المخارج المطلوبة يتم في حلقة البرنامج األساسيّة اختبار حالة الدّخل فإن‬
‫كان هناك حالة دخل من الحسّاس (‪ )LOW‬يتم بعد ذلك التأ ّكد من استمرار وجود الدّخل من خالل‬

‫عمليّة انتظار بسيطة باستخدام )(‪ millis‬بعد ذلك يتم قلب حالة الريليه مع كل حالة دخل‬

‫من الحسّاس‪.‬‬

‫ننتبه للضّجيج من البيئة المحيطة بالحسّاس كذلك حالة االهتزاز الميكانيكي للحسّاس تؤثر على‬
‫عمله أيضاً‪.‬‬

‫‪393‬‬
‫حساس رطوبة التربة‪:‬‬

‫في العديد من المشاريع الزراعيّة نحتاج لمتابعة رطوبة التّربة وهذا ما يتيحه لنا هذا الحسّاس‬
‫والذي يعتمد أيضا ً في بنيته على الدّارة التكامليّة ‪ ،LM393‬لكن يضاف هنا لدينا قطب خرج‬
‫تشابهي‪.‬‬

‫مجس وهو عبارة عن مقاومة مص ّممة بطريقة تعطي تغّير في‬


‫ّ‬ ‫يتألف حسّاس التربة بمجمله من‬
‫مقسّم الفولط متناسبة مع تغيّر رطوبة التّربة‪ ،‬أ ّما القسم الثاني فهو الدّارة ‪ LM393‬بنفس التركيب‬
‫وتعرفنا عليه‪.‬‬
‫ّ‬ ‫الذي سبق‬

‫‪394‬‬
‫بمجس‬
‫ّ‬ ‫في تعاملنا مع هذا الموديول سنتجاوز الدّارة التكامليّة ‪ LM393‬واستخدام القسم المتعلّق‬
‫التربة فقط للحصول على خرج تشابهي‪ ،‬يمكن تصميم دارة بسيطة تضم العناصر المطلوبة لعمل‬
‫المجس بشكل صحيح (ت ّم ذلك في المشروع الثّاني من سلسلة خمسون مشروعا ً باستخدام‬
‫ّ‬
‫األردوينو) كما يلي‪:‬‬

‫أن خرج الحسّاس في الت ّربة الجافّة يقابله قراءة على المبدّل التشابهي قدرها ‪،850‬‬
‫بالتجريب نجد ّ‬
‫أ ّما في التربة الرطبة تصل القيمة لـ ‪ ،400‬أي تزداد قيمة خرج المبدّل التشابهي الرقمي كلّما زاد‬
‫جفاف التّربة‪.‬‬
‫‪395‬‬
‫الرقمي ومن ث ّم طباعة نتائج متوافقة مع قيمة القراءة‪،‬‬
‫يتض ّمن الكود قراءة قيمة المبدّل التشابهي ّ‬
‫يمكن لك تغيير مجال القياس في ّأول الكود بما يتناسب مع نتائج التجريب الخاصة بك‪.‬‬

‫نكتفي بهذين المثالين حول الموديول ‪ LM393‬وكيفيّة تبديل الحسّاس فقط للحصول على وظائف‬
‫مختلفة لكن في النتيجة فإن طريقة البرمجة واحدة‪.‬‬

‫‪396‬‬
‫حساس اإلنحناء أو المرونة ‪FlexSensor‬‬
‫المستشعر المرن أو مستشعر االنحناء هو مستشعر منخفض التكلفة وسهل االستخدام مصمم‬
‫صا لقياس مقدار االنحراف أو االنحناء‪ ،‬يستخدم كمقياس الزوايا لتحديد حركة المفصل‪ ،‬أو‬
‫خصي ً‬
‫مستشعر الباب‪ ،‬أو مستشعر الضغط على القابض اآللي‪.‬‬

‫نظرا ألن المقاومة‬


‫المستشعر المرن هو في األساس مقاوم متغير تختلف قيمتها عند االنحناء‪ ،‬و ً‬
‫تتناسب طرديًا مع مقدار االنحناء‪ ،‬فإنها تسمى مقياس الجهد المرن‪ ،‬وتتوفر مستشعرات ‪Flex‬‬
‫بشكل عام بحجمين أحدهما بطول ‪ 2.2‬بوصة (‪ 5.588‬سم) واآلخر ‪ 4.5‬بوصة (‪ 11.43‬سم)‪.‬‬

‫بنظرة أكثر دقّة على البنية سنجد ّ‬


‫أن المادة األساسية هي الفينول مع الريزين والتي تشكل قاعدة‬
‫الربط بينها بحبر ناقل للتيّار الكهربائي‪ ،‬وكل هذه المواد‬ ‫الحسّاس وسنجد أيضا ً قطع مو ّ‬
‫صلة يتم ّ‬
‫تكون مرنة وقابلة لإلنحناء باتجاه واحد فقط وليس في كال االتجاهين وإال سيسبّب ذلك تلف‬
‫الحساس‪.‬‬
‫‪397‬‬
‫تكون قيمة المقاومة في حال عدم تطبيق أي إنحناء عليها عند القيمة ‪ 25kR‬وتختلف قيمة المقاومة‬
‫بشكل متزايد بتزايد قيمة اإلنحناء ‪ ....‬بالتجريب استنتجنا القيم التّالية‪:‬‬

‫اآلن لننتقل للخطوات التالية وهي ربط هذه المقاومة مع مقسّم جهد لنحصل على فولط متغيّر تبعا ً‬

‫إلنحناء هذه المقاومة‪ ،‬أ ّما مكان حسّاس اإلنحناء من مقسّم الجهد‪:‬‬

‫باستخدام هذا القانون سنحصل على جهد على القطب التشابهي من األردوينو متناسب مع انحناء‬
‫الحسّاس‪ ،‬ويكون هذا الفولط متناقص مع زيادة اإلنحناء‪.‬‬

‫‪398‬‬
‫لنجرب اآلن ربط هذا الحساس مع األردوينو ونقرأ قيم التغير في المبدل التشابهي الرقمي على‬
‫األردوينو‪.‬‬

‫‪399‬‬
‫نكرر كتابة القانون مع تعويض‬
‫األول من الكتاب وهنا ّ‬
‫سبق وتعاملنا مع مقسّم الجهد خالل الفصل ّ‬
‫سم‪....‬‬
‫القيم التي تم اعتمادها ضمن المق ّ‬

‫نحول مجال تغيّر المبدّل التشابهي لمجال يقابل اإلنحناء للحسّاس ضمن المجال‬
‫في نهاية الكود ّ‬
‫‪ 0 ~ 90 0‬وطباعة القيم على واجهة االتصال التسلسلي‪.‬‬

‫‪400‬‬
‫المقاومة الحساس للقوة ‪FSR‬‬
‫للقوة ‪ Force Sensitive Resistors‬وتعرف اختصارا ً ‪ FSR‬وهي عبارة‬
‫المقاومة الحسّاسة ّ‬
‫عن مقاومة متغيّرة مص ّممة لتتغيّر قيمتها بتغيّر قوة الضغط الفيزيائي أو الوزن عليها‪ ،‬ولها العديد‬
‫من االستخدامات في مجال أجهزة األلعاب واألجهزة اإللكترونية وأجهزة المحمول وغير ذلك‬
‫من التطبيقات العمليّة‪.‬‬

‫تعتبر خيار رخيص الكلفة الستكشاف وجود ضغط فيزيائي على الجسم أم ال وليس الستكشاف‬
‫مقدار الوزن عليها‪ ،‬شاع استخدامها منذ عام ‪ 1985‬وتتوفّر ضمن العديد من األشكال لكن األكثر‬
‫لنتعرف معا ً على هذه الحسّاسات وربطها مع األردوينو‬
‫ّ‬ ‫شيوعا ً منها ‪،FSR-402 , FSR-406‬‬
‫للحصول على مشاريع أكثر احترافية وتميّز‪.‬‬

‫‪401‬‬
‫مكونة من عدّة طبقات رقيقة ومرنة إحدى‬
‫لننتقل اآلن للبنية الدّاخلية لهذا الحسّاس والتي سنجدها ّ‬
‫هذه ّ‬
‫الطبقات من الكربون وهناك طبقة ناقلة عبارة عن مسارات من الفضّة‪ ،‬كلّما زاد الضغط‬
‫على سطح الحسّاس تالمست طبقة الكربون مع ّ‬
‫الطبقة النّاقلة م ّما يقلّل من مقاومة الحسّاس‪.‬‬

‫تختلف الحسّاسات المتوفّرة في السوق من ناحية الحجم والشكل ومن ناحية أخرى مه ّمة وهي‬
‫مجال الضغط الذي تعمل عليه فلو افترضنا ّ‬
‫أن الحسّاس الذي نعمل عليه يتحسّس مقدار ضغط‬
‫حتى ‪ 1g‬فإن أي ضغط زيادة لن يغيّر في مقدار القراءة بل إن زيادة الضغط عليه قد يسبب تلف‬
‫طبقات الحسّاس الداخلية وفقد قدرته على التحسّس للضغط‪ ،‬لذلك ننتبه لهذا العامل المهم عند‬
‫اختيارنا لهذا الحسّاس ضمن تطبيقاتنا‪.‬‬

‫أ ّما حالة الحسّاس فتكون كأنها مقاومة ال نهائية في حال عدم وجود ضغط عليه‪ ،‬وكلّما زاد الضغط‬
‫عليه انخفضت مقاومته الداخلية‪.‬‬
‫‪402‬‬
‫وكأي حسّاس يعمل بمبدأ المقاومة المتغيّرة ال بدّ من وجود مقاومة معه على التسلسل لتشكل مع‬
‫الحسّاس مقسّم جهد متغيّر في قيمة فولط الخرج للمقسّم وهنا سيكون تغيّر جهد الخرج متعلّق‬
‫بالضّغط الفيزيائي المطبّق على حسّاس ‪.FSR‬‬

‫من قانون مقسّم الجهد السّابق نالحظ ّ‬


‫أن جهد خرج المقسّم سيزداد مع ازدياد الضغط عليه والذي‬
‫يسبب بدوره انخفاض في قيمة مقاومة الحسّاس (من ‪ 2MR‬تقريبا ً في حال عدم وجود ضغط‬
‫على الحسّاس لـ ‪ 250R‬تقريبا ً عند تطبيق أكبر ضغط يتح ّمله الحسّاس)‪.‬‬

‫‪403‬‬
‫ّ‬
‫مخطط مقسّم الجهد السّابق مع لوحة األردوينو على القطب‬ ‫لنجرب اآلن وصل هذا الحسّاس وفق‬
‫ّ‬
‫التّشابهي ‪ A0‬ولنقرأ تغيّر مجال المبدّل تبعا ً لحالة الضغط على الحسّاس‪.‬‬

‫‪404‬‬
‫تمارين الفصل الرابع‬
‫اكتب كود برمجي لحساس أمواج فوق صوتية متصل مع لوحة‬
‫تمرين ‪:1‬‬
‫اآلردوينو‪ ،‬يقوم الحساس وعند تشغيل الكود البرمجي للمرة األولى‬
‫بحساب المسافة البدائية بين الحساس وبين أقرب حاجز يقع ضمن مجال الحساس‪ ،‬ثم يقوم‬
‫بالتحسس ألي جسم جديد سوف يمر بين الحساس والحاجز البدائي فيشغل زمور باستخدام‬
‫التعليمة )(‪.tone‬‬

‫‪405‬‬
406
‫تعتمد فكرة التمرين على قراءة قيم مختلفة لحسّاس المسافة ‪ ،Ultrasonic‬فبعد تعريف األقطاب‬
‫المستخدمة في التمرين وتحديد طبيعة كل قطب إن كان مدخل‪/‬مخرج رقمي في حلقة اإلعداد‪،‬‬
‫نصل لحلقة البرنامج الرئيسية والتي يتم فيها ولمرة واحدة حساب ّأول بعد أقرب حاجز عن‬
‫الحسّاس واعتبارها قيمة بدائية عبر تخزينها بالمتغيّر ‪ old_distance‬وعدم تجديد هذه‬

‫المتحول ‪ flage‬القيمة ‪ 1‬منطقي‪.‬‬


‫ّ‬ ‫القيمة طالما تم إعطاء‬

‫بعد ذلك يتم قراءة بعد أقرب جسم عن الحسّاس‪ ،‬وطالما أنه ال يوجد جسم جديد بين الحسّاس وبين‬
‫وبمجرد مرور جسم أمام الحسّاس فإن المسافة‬
‫ّ‬ ‫الحاجز األولي فلن يتم تفعيل ّ‬
‫الزمور‪ ،‬لكن‬
‫‪ 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
‫في حلقة البرنامج األساسية يوجد لدينا خمسة توابع فرعية يتم في ك ّل واحد منها وظيفة محدّدة‬
‫م ّما يس ّهل فهم الكود وتتبّع المشاكل وتصحيحها أو تطوير األفكار مستقبالً‪ ،‬لنبدأ بشرح هذه‬
‫التوابع‪....‬‬

‫‪ -‬تابع قراءة رطوبة التربة )(‪:soil_moisture‬‬

‫وفيه تتم قراءة رطوبة التّربة وتحويل المجال القراءة لمجال ‪ 0 ~ 10‬ويكون عند ‪ 0‬جاف‬
‫وعند ‪ 10‬رطوبة عالية (يمكن للمبرمج تعديل مجال القراءة والتحويل بما يتناسب مع‬
‫مشروعه)‪ ،‬وفي حال كانت الرطوبة المطلوبة للتربة أكبر من الرطوبة الحالية يتم تشغيل‬

‫مض ّخة ّ‬
‫الري‪.‬‬

‫‪ -‬تابع ضبط درجة الحرارة )(‪:temperature_set‬‬

‫وفيه يتم مقارنة درجة حرارة البيت من الداخل مع درجة الحرارة المطلوبة فإن كانت أصغر‬
‫من القيمة المطلوبة يتم تشغيل السّخان مع شرط أن يكون باب البيت البالستيكي مغلق‪.‬‬

‫‪ -‬تابع التحكم بالباب )(‪:door_set‬‬

‫وفيه يتم التح ّكم بفتح وإغالق الباب بالمقارنة بين درجة الحرارة المطلوبة ودرجة الحرارة‬
‫خارج البيت البالستيكي‪ ،‬فإن كانت درجة الحرارة جيّدة يتم فتح الباب وإعطاء إشعار ّ‬
‫بأن‬
‫المحرك ومفاتيح نهاية ال ّ‬
‫شوط إذ‬ ‫ّ‬ ‫الباب في حالة فتح ليتم إطفاء السّخان (ننتبه عند توصيل‬
‫يجب أن يتوافق التوصيل مع جهة الحركة والموقع الصحيح لحسّاس نهاية الشوط)‪.‬‬

‫‪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‬‬

You might also like