50% found this document useful (2 votes)
2K views153 pages

Arduino Book PDF

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
50% found this document useful (2 votes)
2K views153 pages

Arduino Book PDF

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 153

‫األردوينو من البداية وحتى االحتراف‬

‫(مستوى المبتدئ)‬

‫د‪.‬م‪ .‬حسام الوفائي‬


‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫يتناول كتاب األردوينو من البداية وحتى االحتراف – مستوى المبتدئ – ما يلي‪:‬‬

‫‪-1‬البنية االلكترونية للوحات األردوينو ومزايا وخواص أشهر لوحات األردوينو‪.‬‬

‫‪-2‬بيئة التطوير المتكاملة لألردوينو ‪ Arduino IDE‬التي من خاللها يتم برمجة لوحة األردوينو‪.‬‬

‫‪-3‬مجموعة من التطبيقات العملية‪:‬‬

‫‪ ‬التحكم بالثنائيات الضوئية ‪.LEDs‬‬

‫‪ ‬التحكم بالسبع قطع ضوئي ‪.7-Segment‬‬

‫‪ ‬التحكم بمصفوفة ثنائيات ضوئية ‪.LED matrix‬‬

‫‪ ‬التحكم بشاشة اإلظهار الكريستالية السائلة ‪.LCD‬‬

‫‪ ‬التحكم بلوحة المفاتيح ‪.keypad‬‬

‫‪ ‬قراءة إشارة الحساسات التشابهية‪.‬‬

‫‪ ‬التحكم بالمحركات (المستمرة‪ ،‬الخطوية‪ ،‬السيرفو)‪.‬‬

‫‪ ‬تشغيل األجهزة التي تعمل بجهد ‪.220V‬‬

‫‪ ‬نقل البيانات وفق بروتوكول االتصال التسلسلي ‪.UART‬‬


‫إلبداء المالحظات والمساعدة يرجى التواصل على البريد االلكتروني‪:‬‬

‫‪[email protected]‬‬
‫مالحظة‪ :‬يسمح باالستفادة العلمية من الكتاب والنسخ منه مع اإلشارة إلى المصدر‪ ،‬ويمنع استخدامه‬

‫تجاريا‪.‬‬

‫حمص ‪2118/8/1‬‬

‫د‪.‬م‪ .‬حسام الوفائي‬

‫‪1‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الفهرس‬
‫الفهرس ‪2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫الفصل األول ‪8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫لمحة عامة عن لوحة األردوينو ‪8 . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Board Overview‬‬

‫‪-1-1‬مقدمة ‪8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-1‬المتحكم الصغري ‪8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-1‬لوحة األردوينو أونو ‪11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino UNO‬‬

‫‪-1-3-1‬المتحكم الصغري ‪ AVR ATmega328‬الرئيسي ‪11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-3-1‬المتحكم الصغري ‪ ATmega16U2‬الثانوي ‪12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-3-1‬منظم جهد ‪ ،5V‬ومنظم جهد ‪12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3V‬‬

‫‪-4-3-1‬مجموعة من الثنائيات الضوئية ‪13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-5-3-1‬منفذ ‪14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . USB‬‬

‫‪-6-3-1‬مقبس الطاقة ‪14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-7-3-1‬زر إعادة التشغيل ‪14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-8-3-1‬دارة متكاملة ‪15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LM358‬‬

‫‪-9-3-1‬منفذ برمجة تسلسلي )‪15 . . . . . . . . . . . . . . . . In-Circuit Serial Programming (ICSP‬‬

‫‪-11-3-1‬منافذ االستطاعة ‪16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-11-3-1‬منافذ دخل تشابهية ‪17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-12-3-1‬منافذ دخل وخرج رقمية ‪17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4 -1‬لوحات ‪19 . . . . . . . . . Arduino MEGA ADK - Arduino MEGA 2560 - Arduino MEGA‬‬

‫‪-5-1‬لوحة األردوينو ‪22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Due‬‬

‫‪ -6-1‬لوحة األردوينو ليوناردو ‪24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Leonardo‬‬

‫‪-7-1‬لوحة األردوينو ميكرو ‪25 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino micro‬‬

‫‪-8-1‬لوحة األردوينو نانو ‪27 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Nano‬‬

‫‪ -9-1‬لوحة األردوينو ‪28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Mini‬‬

‫‪2‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ – 11-1‬لوحة ‪29 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Pro‬‬

‫‪ – 11-1‬لوحة ‪31 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Pro mini‬‬

‫‪-12-1‬لوحة أردوينو ليلي باد ‪31 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Lilypad‬‬

‫الفصل الثاني ‪33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫بيئة التطوير المتكاملة لألردوينو ‪33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino IDE‬‬

‫‪-1-2‬مقدمة ‪33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-2‬تحميل بيئة التطوير المتكاملة لألردوينو ‪33 . . . . . . . . . . . . . . . . . . . . . . . . Arduino IDE‬‬

‫‪ -3-2‬بيئة التطوير المتكاملة لألردوينو ‪33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino IDE‬‬

‫‪-1-3-2‬شريط أدوات القوائم ‪34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -2-3-2‬شريط أدوات وظائف عامة ‪36 . . . . . . . . . . . . . . . . . . . . common functions toolbar‬‬

‫‪ -3-3-2‬محرر النص ‪36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . text editor‬‬

‫‪-4-3-2‬منطقة الرسالة ‪37 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . message area‬‬

‫‪ -5-3-2‬لوحة مراقبة النص ‪37 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . text console‬‬

‫‪ -4-2‬خطوات تحميل الشيفرة البرمجية إلى لوحة األردوينو ‪37 . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -1-4-2‬وصل لوحة األردوينو إلى الحاسب عن طريق منفذ ‪37 . . . . . . . . . . . . . . . . . . . . . . .USB‬‬

‫‪-2-4-2‬كتابة الشيفرة البرمجية ‪39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-4-2‬تحميل الشيفرة البرمجية إلى لوحة األردوينو ‪39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-4-2‬تشغيل الدارة ‪41 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-5-2‬مبادئ كتابة الشيفرة البرمجية في بيئة التطوير ‪41 . . . . . . . . . . . . . . . . . . . . Arduino IDE‬‬

‫‪-1-5-2‬هيكلة كتابة الشيفرة البرمجية ‪41 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -2-5-2‬التصريح عن المتغيرات والمصفوفات والثوابت ‪41 . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -1-2-5-2‬التصريح عن المتغيرات ‪41 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-2-5-2‬التصريح عن المصفوفات ‪42 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-2-5-2‬التصريح عن الثوابت ‪43 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-5-2‬كتابة األعداد الصحيحة ‪44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪3‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-4-5-2‬بنى التحكم ‪44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-4-5-2‬الحلقات‪44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :‬‬

‫‪ -1-1-4-5-2‬حلقة ‪44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for‬‬

‫‪ -2-1-4-5-2‬حلقة ‪45 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : while‬‬

‫‪-2-4-5-2‬تعليمة ‪ IF‬الشرطية ‪45 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -3-4-5-2‬تعليمة القفز ‪46 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . goto‬‬

‫‪ -5-5-2‬التعليقات ‪46 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comments‬‬

‫‪-6-5-2‬تعليمة التأخير الزمني ‪46 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -7-5-2‬البرنامج الفرعي ‪47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -1-7-5-2‬البرامج الفرعية على شكل إجرائية ‪47 . . . . . . . . . . . . . . . . . . . . . . . . . . Procedure‬‬

‫‪ -2-7-5-2‬البرامج الفرعية على شكل تابع ‪47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . function‬‬

‫الفصل الثالث‪ :‬التطبيقات العملية ‪49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫الثنائيات الضوئية ‪49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LEDs‬‬

‫‪-1-1-3‬مقدمة ‪49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-1-3‬تعليمات الدخل والخرج الرقمية ‪49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Digital I/O‬‬

‫‪ -3-1-3‬التطبيقات العملية ‪51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-3-1-3‬تشغيل وإطفاء ثنائي ضوئي بشكل متكرر ‪51 . . . . . . . . . . . . . . . . . . . . Blinking LED‬‬

‫‪-1-1-3-1-3‬الكود البرمجي ‪51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-1-3-1-3‬محاكاة تشغيل وإطفاء ثنائي ضوئي من خالل برنامج ‪51 . . . . . . . . . . . . . . Proteus‬‬

‫‪ -2-3-1-3‬تشغيل وإطفاء مجموعة ثنائيات ضوئية ‪51 . . . . . . . . . . . . . . . . . . . . . . . . . . . LEDs‬‬

‫‪-1-2-3-1-3‬الكود البرمجي ‪52 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-2-3-1-3‬محاكاة تشغيل وإطفاء مجموعة ثنائيات ضوئية من خالل برنامج ‪53 . . . . . . . Proteus‬‬

‫‪-3-3-1-3‬التحكم بثنائيات ضوئية من خالل مفاتيح الكترونية ‪53 . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-3-3-1-3‬الكود البرمجي ‪54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-3-3-1-3‬محاكاة التحكم بثنائيات ضوئية من خالل مفاتيح الكترونية من خالل برنامج ‪Proteus‬‬
‫‪55 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪4‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫السبع قطع الضوئية ‪56 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-Segment‬‬

‫‪-1-2-3‬مقدمة ‪56 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-2-3‬إظهار األرقام على السبع قطع ضوئية ذات نمط مهبط مشترك ‪56 . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-2-2-3‬الكود البرمجي ‪58 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-2-2-3‬محاكاة إظهار أرقام على سبع قطع ضوئية باستخدام برنامج ‪59 . . . . . . . . . . . .Proteus‬‬

‫‪-3-2-3‬إظهار أرقام من خالل عدة أجزاء سبع قطع ضوئية ‪61 . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-3-2-3‬الكود البرمجي ‪61 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫مصفوفة الثنائيات الضوئية ‪67 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Led Matrix‬‬

‫‪-1-3-3‬مقدمة ‪67 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-3-3‬ربط مصفوفة الثنائيات الضوئية مع لوحة األردوينو أونو ‪68 . . . . . . . . . . . . . . . . . . . . . . .‬‬

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

‫‪-4-3-3‬محاكاة مصفوفة الثنائيات الضوئية من خالل برنامج ‪71 . . . . . . . . . . . . . . . . . . Proteus‬‬

‫شاشة الكريستال السائلة ‪72 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . LCD‬‬

‫‪-1-4-3‬مقدمة ‪72 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-4-3‬ربط شاشة الكريستال السائل مع لوحة األردوينو أونو ‪73 . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -3-4-3‬الكود البرمجي ‪73 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-4-3‬محاكاة شاشة الكريستال السائل من خالل برنامج ‪76 . . . . . . . . . . . . . . . . . . . . Proteus‬‬

‫لوحة المفاتيح ‪77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keypad‬‬

‫‪-1-5-3‬مقدمة ‪77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-5-3‬ربط لوحة المفاتيح مع لوحة األردوينو ‪79 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-5-3‬الكود البرمجي ‪81 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-5-3‬محاكاة لوحة المفاتيح من خالل برنامج ‪83 . . . . . . . . . . . . . . . . . . . . . . . . . . . Proteus‬‬

‫‪-5-5-3‬تطبيق على شاشة ‪ LCD‬ولوحة المفاتيح ‪83 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-6-5-3‬الكود البرمجي ‪84 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-5-3‬محاكاة لوحة المفاتيح وشاشة ‪ LCD‬من خالل برنامج ‪86 . . . . . . . . . . . . . . . . . . Proteus‬‬

‫‪5‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫قراءة إشارة الحساسات التشابهية ‪87 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -1-6-3‬مقدمة ‪87 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -2-6-3‬ربط الحساسات التشابهية مع لوحة األردوينو ‪89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-6-3‬الكود البرمجي ‪91 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-6-3‬محاكاة ربط حساس درجة الحرارة من من خالل برنامج ‪92 . . . . . . . . . . . . . . . . Proteus‬‬

‫‪ -5-6-3‬نماذج لحساسات تشابهية ورقمية ‪92 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫التحكم بمحركات التيار المستمر‪ ،‬والخطوية‪ ،‬والسيرفو ‪93 . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -1-7-3‬مقدمة ‪93 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -2-7-3‬محرك التيار المستمر ‪93 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DC motor‬‬

‫‪ -1-2-7-3‬الدارة المتكاملة ‪93 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L293‬‬

‫‪-1-1-2-7-3‬التحكم بالمحرك المستمر من خالل لوحة األردوينو مع استخدام لدارة القيادة ‪95 . L293‬‬

‫‪-2-2-7-3‬وحدة التحكم بالمحركات ‪96 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L298N‬‬

‫‪-1-2-2-7-3‬التحكم بالمحرك المستمر من خالل لوحة األردوينو مع استخدام للوحة التحكم ‪99L298N‬‬

‫‪-3-2-7-3‬الكود البرمجي ‪111 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-2-7-3‬محاكاة التحكم بمحرك مستمر ‪ dc‬من خالل برنامج ‪111 . . . . . . . . . . . . . . . . . Proteus‬‬

‫‪-5-2-7-3‬التحكم بسرعة المحرك المستمر من خالل لوحة األردوينو ‪112 . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-5-2-7-3‬لكود البرمجي ‪115 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -3-7-3‬المحركات الخطوية ‪116 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -1-3-7-3‬المحرك الخطوي أحادي القطبية ‪117 . . . . . . . . . . . . . . . . Unipolar Stepper Motor‬‬

‫‪ -1-1-3-7-3‬الدارة المتكاملة ‪111 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ULN2003‬‬

‫‪-2-1-3-7-3‬التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خالل لوحة األردوينو ‪112 . . . . . .‬‬

‫‪-3-1-3-7-3‬الكود البرمجي ‪114 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-4-1-3-7-3‬محاكاة التحكم بمحرك أحادي القطبية من خالل برنامج ‪116 . . . . . . . . . . . . . Proteus‬‬

‫‪ -2-3-7-3‬المحرك الخطوي ثنائي القطبية ‪116 . . . . . . . . . . . . . . . . . . Bipolar Stepper Motor‬‬

‫‪-1-2-3-7-3‬التحكم بالمحرك الخطوي ثنائي القطبية وسرعته من خالل لوحة األردوينو ‪119 . . . . . . .‬‬

‫‪6‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-2-2-3-7-3‬الكود البرمجي ‪122 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-2-3-7-3‬محاكاة التحكم بمحرك ثنائي القطبية من خالل برنامج ‪123 . . . . . . . . . . . . . .Proteus‬‬

‫‪ -4-7-3‬محرك السيرفو ‪123 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servo Motor‬‬

‫‪-1-4-7-3‬التحكم بالمحرك السيرفو من خالل لوحة األردوينو ‪126 . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-4-7-3‬الكود البرمجي ‪127 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-4-7-3‬محاكاة التحكم بمحرك السيرفو من خالل برنامج ‪128 . . . . . . . . . . . . . . . . . . Proteus‬‬

‫التحكم باألجهزة التي تعمل بجهود عالية ‪129 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1-8-3‬مقدمة ‪129 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-2-8-3‬ربط المرحل مع لوحة األردوينو ‪131 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-3-8-3‬الكود البرمجي ‪132 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -4-8-3‬محاكاة التحكم بمصباح باستخدام المرحل في برنامج ‪133 . . . . . . . . . . . . . . . . Proteus‬‬

‫‪ -5-8-3‬ملحقات ‪133 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫نقل المعلومات وفق بروتوكول االتصال التسلسلي ‪134 . . . . . . . . . . . . . . . . . . . . . . . . . UART‬‬

‫‪ -1-9-3‬مقدمة ‪134 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪ -2-9-3‬بروتوكول االتصال التسلسلي ‪136 . . . . . . . . . . . (recommended standard ) RS-232‬‬

‫‪-3-9-3‬نقل المعطيات ما بين لوحة األردوينو والطرفيات األخرى من خالل بروتوكول االتصال ‪UART‬‬
‫‪139 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫‪-4-9-3‬الكود البرمجي ‪143 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫الملحق (‪151 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . )1‬‬

‫برامج محاكاة األردوينو ‪151 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬

‫‪-1‬برنامج ‪151 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proteus‬‬

‫‪-2‬برنامج ‪151 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VirtualBreadboard‬‬

‫‪7‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الفصل األول‬

‫لمحة عامة عن لوحة األردوينو ‪Arduino Board Overview‬‬


‫‪-1-1‬مقدمة‬
‫لوحة األردوينو هي عبارة عن لوحة الكترونية تم تصميمها لتساعدك على بناء وإنشاء الدارات‬
‫والمشاريع االلكترونية المختلفة بكل سهولة‪ .‬تتسم هذه اللوحة بكونها قابلة للبرمجة‬
‫‪ ،programmable board‬وهذا يعني أنه يتم برمجتها من قبل المستخدم لتؤدي الغرض المطلوب‬
‫منها‪ .‬لهذا كلما أتقنت برمجة لوحة األردوينو كلما استطعت تنفيذ دارات احترافية أكثر‪ .‬لغة البرمجة‬
‫المستخدمة هي ‪ ،Arduino C‬وهي لغة بسيطة‪ ،‬متوفرة بشكل مجاني‪ ،‬ومفتوحة المصدر ‪open‬‬
‫‪ source‬بحيث أنه يمكنك االطال ع على الشيفرة البرمجية للبرامج وتعديلها وتطويرها‪ .‬في البداية‬
‫لنلقي نظرة سريعة على قلب لوحة األردوينو وهو المتحكم الصغري ‪ ،microcontroller‬بعد ذلك‬
‫سنبين في هذا الفصل البنية االلكترونية ألحد أشهر اللوحات المستخدمة وهي لوحة ‪Arduino‬‬
‫‪ ،UNO‬وأخيرا سنعرض مزايا بقية اللوحات‪.‬‬

‫‪-2-1‬المتحكم الصغري‬
‫المتحكم الصغري عبارة عن حاسوب صغير على شكل دارة متكاملة ‪Integrated Circuit‬‬
‫)‪ ،(IC‬يتكون من العناصر المدمجة التالية كما هو موضح في الشكل (‪:)1-1‬‬
‫‪-1‬ذاكرة برنامج ‪ :program memory‬يخزن في هذه الذاكرة الشيفرة أو التعليمات البرمجية والتي‬
‫تم كتابتها من قبل المبرمج‪ .‬تحدد هذه التعليمات اآللية التي سيعمل من خاللها المتحكم الصغري‪،‬‬
‫والنتائج التي سيتم الحصول عليها‪ .‬على سبيل المثال قد تكون هذه التعليمات قراءة إشارة حساس‬
‫حرارة‪ ،‬وتفحص فيما إذا زادت عن قيمة محددة‪ ،‬وتشغيل وإطفاء أجهزة‪ ،‬وهكذا‪ .‬ذاكرة البرنامج‬
‫تكون من نو ع ‪ ROM‬أو ‪ EEPROM‬أو ‪ ،Flash‬بحيث عند عدم تطبيق تغذية كهربائية على المتحكم‬
‫لن تفقد الذاكرة بياناتها (أي برنامج عمل المتحكم)‪ .‬يمكن لذواكر ‪ EEPROM‬أو ‪ Flash‬حذف البرنامج‬
‫وتحميل برنامج آخر‪.‬‬
‫‪-2‬معالج ‪ :processor‬عبارة عن دارة الكترونية تعمل على تنفيذ التعليمات البرمجية المخزنة في‬
‫ذاكرة البرنامج‪ .‬فمثال عندما يحضر المعالج تعليمة قراءة إشارة حساس الحرارة فإنه يفعل الدارة‬
‫التي يمكن من خاللها قراءة هذه اإلشارة‪ ،‬ويعمل على مقارنة اإلشارة الناتجة مع القيمة التي حددها‬
‫المصمم في برنامجه‪ ،‬ليفعل استنادا لذلك نافذة خرج محددة تكون متصلة مع جهاز ما بحيث يتم‬
‫تشغيله أو إيقافه عن العمل‪.‬‬
‫‪-3‬ذاكرة معطيات من نو ع ‪ RAM‬لتخزين بيانات مختلفة بشكل مؤقت‪ .‬هذه الذاكرة تفقد بياناتها مع‬
‫انقطا ع التغذية الكهربائية عن المتحكم الصغري‪ .‬يمكن على سبيل المثال تخزين قيمة درجة الحرارة‬

‫‪8‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫فيها الناتجة عن الحساس‪ ،‬وغير ذلك‪ .‬قد يحتوي المتحكم الصغري أيضا على ذاكرة معطيات أخرى‬
‫من نو ع ‪ EEPROM‬بحيث إذا قطعت التغذية الكهربائية عن المتحكم تبقى محتفظة ببياناتها‪،‬‬
‫كتخزين كلمة سر على سبيل المثال‪.‬‬
‫‪-4‬نوافذ دخل وخرج‪ :‬تسمح هذه النوافذ بأن يتصل المتحكم الصغري مع الدارات االلكترونية‬
‫المحيطة به الخارجية‪ ،‬وهي التي تبدو ظاهرة في المتحكم ويتم التعامل معها‪ .‬من الممكن على سبيل‬
‫المثال وصل حساس درجة الحرارة معها‪ ،‬أو ثنائيات ضوئية‪ ،‬ومفاتيح الكترونية وغير ذلك‪.‬‬
‫‪-5‬ملحقات أخرى‪ :‬بعض المتحكمات الصغرية تحتوي أيضا ضمن بنيتها الداخلية على وحدات‬
‫الكترونية إضافية‪ :‬مثل المبدل التمثيلي الرقمي )‪ ،Analog Digital Converter (ADC‬مؤقتات‬
‫‪ ،Timers‬وحدات اتصال تسلسلية ‪ ، Ethernet، CAN، SPI، I2C،UART‬وغير ذلك‪.‬‬

‫معالج – ذاكرة البرنامج‪-‬‬


‫ملحقات‬ ‫ذاكرة معطيات ‪-‬ملحقات‬

‫نوافذ الدخل والخرج‬ ‫معالج‬ ‫ذاكرة معطيات‬

‫ذاكرة البرنامج‬
‫نوافذ الدخل‬
‫والخرج‬

‫الشكل (‪ :)1-1‬مخطط صندوقي لبنية المتحكم الصغري‪.‬‬


‫تختلف المتحكمات الصغرية فيما بينها بسعة ذاكرة البرنامج‪ ،‬وذاكرة ‪ ،RAM‬وبنية المعالج‬
‫وسرعته‪ ،‬وبعدد نوافذ الدخل والخرج‪ ،‬وبالملحقات الداخلية‪ ،‬وتبعا لذلك سيختلف سعرها‪ ،‬ويتم‬
‫اختيار المتحكم المناسب حسب التطبيق العملي الذي يتم تنفيذه‪.‬‬
‫يوجد العديد من الشركات المصنعة للمتحكمات الصغرية أشهرها ‪ Microchip‬التي تنتج‬
‫متحكمات تعرف بـ ‪ ،PIC‬وشركة ‪ Atmel‬التي تنتج متحكمات تعرف بـ ‪ .AVR‬يوضح الشكل (‪)2-1‬‬
‫نماذج مختلفة للمتحكمات الصغرية‪.‬‬
‫اللغة األساسية التي يتم بها برمجة المتحكم الصغري هي لغة التجميع ‪ ،assembly‬وهي عبارة‬
‫عن مجموعة من التعليمات التي يفهمها المعالج ويستطيع فك تشفيرها وتنفيذها‪ ،‬ولكل معالج‬
‫مجموعة التعليمات الخاصة به‪ .‬لغة التجميع معقدة نسبيا وال يتم اللجوء إليها غالبا‪ ،‬وإنما تستخدم‬
‫لغات عالية المستوى كلغة ‪ C‬مثال‪ ،‬ويستخدم برنامج مترجم ‪ compiler‬يحول لغة ‪ C‬المفهومة إلى‬
‫لغة التجميع‪.‬‬

‫‪9‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)2-1‬نماذج مختلفة للمتحكمات الصغرية‪.‬‬

‫‪-3-1‬لوحة األردوينو أونو ‪Arduino UNO‬‬


‫تعتبر لوحة األردوينو أونو ‪ Arduino UNO‬أكثر اللوحات شهرة واستخداما‪ ،‬وتعد األنسب‬
‫للبدء بتعلم األردوينو‪ .‬يوجد لهذه اللوحة في الوقت الحاضر ثالثة إصدارات معدلة‪ :‬اللوحة األولى‬
‫هي اللوحة األصلية ‪ ،Uno R1‬اللوحة الثانية تم فيها إدخال بعض التعديالت على اللوحة األصلية‬
‫وتعرف بـ ‪ ،UNO R2‬الحقا تم إجراء بعض التعديالت على اللوحة الثانية وتم الحصول على اللوحة‬
‫المطورة الثالثة ‪ .UNO R3‬يوجد بعض االختالف البسيطة فيما بينها سنذكرها فيما بعد‪ .‬يبين الشكل‬
‫(‪ )3-1‬لوحة األردوينو أونو المطورة الثالثة ‪ Arduino UNO R3‬التي تم في هذه الفقرة إيضاح بنيتها‬
‫االلكترونية الداخلية بشكل مبسط باإلضافة إلى منافذها الخارجية‪.‬‬

‫الشكل (‪ :)3-1‬لوحة األردوينو أونو المطورة الثالثة ‪.Arduino UNO R3‬‬

‫‪-1-3-1‬المتحكم الصغري ‪ AVR ATmega328‬الرئيسي‬


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

‫الشكل (‪ :)4-1‬المتحكم الصغري ‪ ATmega328‬الرئيسي في لوحة األردوينو أونو‪.‬‬


‫ال نحتاج لتعلم هذا المتحكم بالتفصيل‪ ،‬وسنكتفي بذكر أهم خواص هذا المتحكم في الجدول (‪.)1-1‬‬
‫الجدول (‪ :)1-1‬مزايا المتحكم ‪.ATmega328‬‬
‫القيمة‬ ‫الخاصية‬
‫‪8-bit AVR‬‬ ‫نوع المعالج‬
‫‪20 MHz‬‬ ‫تردد العمل األعظمي‬
‫يستطيع المتحكم تنفيذ مليون تعليمة في الثانية )‪(MIPS‬‬ ‫األداء‬
‫عند تردد عمل ‪.1MHz‬‬
‫‪32 KB‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2 KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1 KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪28 pin‬‬ ‫عدد األرجل‬
‫مبدل تمثيلي رقمي ‪ ADC‬بدقة ‪ ،10 bit‬وعدد قنواته ‪.6‬‬ ‫الملحقات الداخلية‬
‫ثالث مؤقتات ‪ /‬عدادات‪.‬‬
‫وحدة االتصال التسلسلي ‪.USART‬‬
‫وحدة االتصال التسلسلي ‪.I2C‬‬
‫وحدة االتصال التسلسلي ‪.SPI‬‬
‫مقاطعات داخلية وخارجية‪.‬‬

‫يتصل المتحكم ‪ ATmega328‬في لوحة األردوينو أونو بكريستالة ترددها ‪ ،16 MHz‬لذلك‬
‫فإن عدد التعليمات المنفذة في الثانية ‪ 16‬مليون تعليمة‪.‬‬

‫‪11‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-3-1‬المتحكم الصغري ‪ ATmega16U2‬الثانوي‬


‫ال يمكن للمتحكم الرئيسي ‪ ATmega328‬أن يتبادل البيانات مع الحاسب عبر منفذ ‪،USB‬‬
‫لذلك تم إضافة المتحكم ‪ ATmega16U2‬إلى لوحة األردوينو أونو‪ ،‬الذي يوجد ضمن بنيته الداخلية‬
‫وحدة اتصال تسلسلية ‪ .USB‬يبين الشكل(‪ )5-1‬مكان توضع هذا المتحكم ضمن لوحة األردوينو أونو‪.‬‬
‫البيانات التي يتم تبادلها ما بين المتحكم الرئيسي ‪ ATmega328‬والحاسب قد تكون عملية نقل‬
‫للشيفرة البرمجية المكتوبة في الحاسب عن طريق برنامج ‪ Arduino cc‬إلى المتحكم‪ ،‬أو نقل‬
‫معلومات أثناء تشغيل اللوحة مثل إرسال قيمة درجة الحرارة من اللوحة إلى الحاسب‪ ،‬وإرسال أوامر‬
‫من الحاسب إلى اللوحة وغير ذلك‪ ،‬وهذا ما سيتم دراسته الحقا‪.‬‬
‫ال يتصل متحكم ‪ ATmega328‬بشكل مباشر مع منفذ ‪ USB‬كما ذكرنا‪ ،‬وإنما يتواصل مع‬
‫متحكم ‪ ATmega16U2‬بشكل تسلسلي وفق بروتوكول ‪ ،UART‬وبدوره يتصل ‪ ATmega16U2‬مع‬
‫الحاسب عبر منفذ ‪ .USB‬بنفس الطريقة يتصل الحاسب مع ‪ ATmega328‬عن طريق‬
‫‪ .ATmega16U2‬يمكن اعتبار متحكم ‪ ATmega16U2‬بمثابة مبدل ‪ USB‬إلى )‪Serial (UART‬‬
‫والعكس‪ ،‬ويظهر كمنفذ ‪ COM‬افتراضي ‪ virtual‬على الحاسب‪.‬‬
‫يتصل متحكم ‪ ATmega16U2‬مع خط إعادة إقال ع المتحكم الرئيسي ‪ ATmega328‬ألنه‬
‫عندما يراد برمجة المتحكم الرئيسي البد من إعادة تشغيله‪ ،‬وهذا ما يقوم به هذا المتحكم‪ .‬كذلك‬
‫يتصل متحكم ‪ ATmega16U2‬مع كريستالة ترددها ‪ 16MHz‬تقع إلى األسفل منه في الشكل (‪.)5-1‬‬
‫البد من اإلشارة إلى أنه في لوحتي األردوينو أونو للنوعين ‪ original‬و‪ R2‬يستخدم المتحكم‬
‫‪ ATmega8U2‬بدال من المتحكم ‪.ATmega16U2‬‬

‫الشكل (‪ :)5-1‬المتحكم الصغري ‪. ATmega16U2‬‬

‫‪-3-3-1‬منظم جهد ‪ ،5V‬ومنظم جهد ‪3.3V‬‬


‫تعمل لوحة األردوينو أونو بجهد ‪ ،+5V‬لذلك تحتاج إلى منظم جهد ‪ +5V‬عندما يتم تغذيتها‬
‫كهربائيا من منبع خارجي‪ .‬منظم جهد ‪ +5V‬المستخدم هو ‪ .1117ST50T3G‬تيار الخرج األعظمي‬
‫‪12‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫لهذا المنظم يزيد عن ‪ .1 A‬توفر اللوحة أيضا جهدا مقداره ‪ 3.3 V‬يمكن أن يستخدم مع دارات أخرى‪.‬‬
‫منظم جهد ‪ +3.3V‬المستخدم هو ‪ .LP2985-33BVR‬تيار الخرج األعظمي لهذا المنظم يصل إلى‬
‫‪ .150 mA‬يوضح الشكل (‪ )6-1‬منظمي الجهد ‪ 1117ST50T3G‬و ‪.LP2985-33BVR‬‬

‫الشكل (‪ :)6-1‬المنظم ‪ 1117ST50T3G‬المحاط بالمربع األحمر‪ ،‬ومنظم الجهد ‪LP2985-33BVR‬‬


‫المحاط بالمربع األصفر‪.‬‬

‫‪-4-3-1‬مجموعة من الثنائيات الضوئية‬


‫تحتوي لوحة األردوينو أونو على أربعة ثنائيات ضوئية كما هو موضح في الشكل (‪.)7-1‬‬
‫‪ ‬ثنائي ضوئي ‪ :ON‬يشير إلى أن اللوحة تم تطبيق جهد كهربائي ‪ +5V‬عليها وهي جاهزة للعمل‪.‬‬
‫لون هذا الثنائي أخضر‪.‬‬
‫‪ ‬ثنائي ضوئي ‪ :L‬هذا الثنائي متصل مع المخرج الرقمي ‪ .13‬يضيء عند تطبيق ‪ 1‬منطقي‬
‫)‪ (+5V‬على هذا المخرج‪ .‬لون هذا الثنائي أصفر‪.‬‬
‫‪ ‬ثنائيان ضوئيان ‪ :RX، TX‬يومض هذان الثنائيان عندما تنتقل البيانات ما بين متحكم‬
‫‪ ATmega16U2‬ومنفذ ‪ USB‬إلى الحاسب فقط‪ .‬لون هذين الثنائيين أصفر‪.‬‬

‫الشكل (‪ :)7-1‬الثنائي الضوئي ‪ ON‬محاط بالمربع األخضر‪ ،‬الثنائي ضوئي ‪ L‬محاط بالمربع األحمر‪،‬‬
‫الثنائيان الضوئيان ‪ RX،TX‬المحاطان بالمربع األصفر‪.‬‬
‫‪13‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-5-3-1‬منفذ ‪USB‬‬
‫يوضح الشكل (‪ )8-1‬منفذ ‪ USB‬للوحة األردوينو أونو‪ .‬لهذا المنفذ عدة استخدامات‪:‬‬
‫‪ ‬برمجة اللوحة عن طريق الحاسب‪.‬‬
‫‪ ‬تبادل البيانات ما بين لوحة األردوينو (المتحكم ‪ )ATmega328‬ومنفذ ‪ USB‬للحاسب‪.‬‬
‫‪ ‬تغذية اللوحة بجهد ‪ +5V‬عند وصل هذا المنفذ مع الحاسب‪.‬‬
‫بجانب هذا المنفذ يوجد فيوز ‪ Fuse‬لحماية منفذ ‪ USB‬للحاسب من القصر والتيار الزائد على‬
‫الرغم من أن معظم الحواسيب لها دارة حماية داخليةـ‪ .‬يقطع الفيوز االتصال بشكل آلي عندما يزيد‬
‫التيار عن ‪.500 mA‬‬

‫‪-6-3-1‬مقبس الطاقة‬
‫يمكن تأمين مصدر طاقة بديل لمنفذ ‪ USB‬عن طريق وصل محول ‪ AC-to-DC‬إلى مقبس‬
‫الطاقة ‪ power jack‬الموضح في الشكل (‪ .)8-1‬قطر المقبس ‪ ،2.1 mm‬وفي مركزه يطبق الطرف‬
‫الموجب للمحول‪ .‬مجال جهد المحول الموصى به يمتد من ‪ 7V‬وحتى ‪.12V‬‬

‫‪-7-3-1‬زر إعادة التشغيل‬


‫يوضح الشكل (‪ )8-1‬زر إعادة إقال ع لوحة األردوينو أونو لبدء تنفيذ األوامر من البداية من جديد‪.‬‬

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

‫‪14‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-8-3-1‬دارة متكاملة ‪LM358‬‬


‫تتضمن لوحة األونو أيضا دارة متكاملة ‪ LM358‬كما هو موضح في الشكل (‪ .)9-1‬هذه الدارة‬
‫عبارة عن مكبري عمليات‪ .‬يستخدم أحدهما كمقارن جهدي الختيار تغذية اللوحة من منفذ ‪ USB‬أو‬
‫من منفذ ‪ ،Vin‬ويستخدم اآلخر كعازل ‪ buffer‬ما بين المخرج ‪ 13‬والثنائي الضوئي ‪.L‬‬

‫الشكل (‪ :)9-1‬الدارة المتكاملة ‪ LM358‬في لوحة األردوينو أونو‪.‬‬

‫‪-9-3-1‬منفذ برمجة تسلسلي )‪In-Circuit Serial Programming (ICSP‬‬


‫ذكرنا سابقا أنه من الممكن برمجة المتحكم الرئيسي ‪ ATmega328‬عن طريق منفذ ‪.USB‬‬
‫يوجد طريقة أخرى يتم فيها برمجته من خالل منفذ يعرف بـ ‪ ICSP‬الموضح في الشكل (‪.)11-1‬‬
‫كذلك يوجد للمتحكم ‪ ATmega16U2‬منفذ ‪ ICSP‬تتم برمجته من خالله‪ .‬تتم عمليه البرمجة ‪ICSP‬‬
‫من خالل استخدام مبرمجة خارجية أو لوحة أردوينو أخرى يتم وصلها معه‪.‬‬

‫الشكل (‪ :)11-1‬منفذ برمجة ‪ ICSP‬للمتحكم ‪ ATmega328‬محاط باللون األحمر‪ ،‬و منفذ برمجة‬
‫‪ ICSP‬للمتحكم ‪ ATmega16U2‬محاط باللون األصفر‪.‬‬
‫‪15‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-11-3-1‬منافذ االستطاعة‬
‫يوضح الشكل (‪ )11-1‬خمسة منافذ استطاعة في لوحة األردوينو أونو وهي مرتبة من اليمين‬

‫إلى اليسار على الشكل التالي‪:‬‬

‫المنفذ ‪ :Vin‬يمكن من خالله تطبيق مصدر تغذية خارجي للوحة (بطارية مثال) بدال من منفذ ‪USB‬‬
‫ومقبس الطاقة‪ .‬يتراوح الجهد المطبق ما بين ‪ 7V‬و ‪ 12V‬تقريبا‪.‬‬

‫منفذان ‪ GND‬على التتالي‪ :‬أرضي لوحة األردوينو‪ .‬يمكن االستفادة منهما عند وصل اللوحة مع دارات‬

‫أخرى‪.‬‬

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

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

‫منفذ ‪ :3.3V‬تعطي لوحة األردوينو أيضا من خالل هذا المخرج جهدا مقداره ‪ ،+3.3V‬بالتالي من‬

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

‫‪.50mA‬‬
‫يوجد إلى األيسر من منافذ االستطاعة ثالثة منافذ أخرى مرتبة على الشكل التالي‪:‬‬

‫منفذ ‪ :RESET‬من خالل هذا المنفذ يتم إعادة تشغيل لوحة األردوينو‪ ،‬وذلك من خالل تطبيق ‪0V‬‬
‫(إشارة منخفضة) عليه‪ .‬يمكن وصل مفتاح لحظي ‪ ،button‬طرف منه يتصل مع هذا المنفذ‪ ،‬والطرف‬

‫آخر يتصل مع األرضي‪ ،‬عند الضغط على هذا المفتاح يتم تطبيق إشارة ‪ 0V‬على هذا المنفذ‪ ،‬ويعاد‬

‫تشغيل اللوحة‪ .‬يعمل المفتاح في هذه الحالة بشكل مشابه لزر إعادة التشغيل الموجود على اللوحة‪.‬‬

‫يمكن االستفادة من هذا المنفذ عندما يتم وصل لوحة األردوينو مع لوحة تعرف بالغطاء ‪shield‬‬
‫(لوحة خاصة يتم تركيبها فوق األردوينو األصلي لتوسيع عمله) مانعة الوصول لزر إعادة التشغيل‬

‫على لوحة األردوينو‪ ،‬ليكون البديل هذا المنفذ‪.‬‬

‫منفذ ‪ :IOREF‬يقدم هذا المنفذ الجهد المرجعي الذي يعمل فيه المتحكم الصغري‪ .‬يستخدم هذا المنفذ‬

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

‫للعمل مع ‪ 5V‬أو ‪.3.3V‬‬

‫منفذ غير مستخدم حاليا‪ :‬ومن الممكن أن يستخدم الحقا للتطوير‪.‬‬

‫‪16‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)11-1‬منافذ االستطاعة من اليمين إلى اليسار ‪ .3.3V ،5V ،GND ،GND ،Vin‬يضاف إليها‬
‫منفذ ‪ ،IOREF ،RESET‬وفي اآلخر منفذ غير مستخدم حاليا‪.‬‬

‫‪-11-3-1‬منافذ دخل تشابهية‬


‫تسمح هذه المنافذ بإدخال إشارات تشابهية‪ ،‬والتي تنتج عادة عن الحساسات التشابهية‪ .‬يتم‬
‫تحويل اإلشارة التشابهية إلى إشارة رقمية باستخدام مبدل ‪ ADC‬في متحكم ‪ .ATmega328‬دقة‬
‫تمييز المبدل ‪ ،10bit‬والجهد المرجعي افتراضيا ‪ ،5V‬ويمكن تغييره عن طريق المنفذ ‪ .AREF‬عدد‬
‫هذه المنافذ التشابهية ‪ 6‬هي ‪ A5، A4، A3، A2، A1،A0‬كما هو موضح في الشكل (‪.)12-1‬‬

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

‫‪-12-3-1‬منافذ دخل وخرج رقمية‬


‫يوضح الشكل (‪ )13-1‬منافذ الدخل والخرج الرقمية مرتبة من اليمين إلى اليسار باألرقام من‬
‫‪ 0‬وحتى ‪ .13‬والتي لها عدة وظائف كما يلي‪:‬‬

‫‪17‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يمكن لهذه األرجل كلها أن تعمل كمخارج رقمية (أي تخرج إشارة ‪ 0V‬أو إشارة ‪ )5V‬تبعا للشيفرة‬
‫البرمجية‪ .‬أو أن تعمل كمداخل رقمية (أي إدخال إشارة ‪ 0V‬أو إشارة ‪ .)5V‬بالتالي يتم على هذه‬
‫النوافذ وصل عناصر ودارت الكترونية أخرى مثل الثنائيات الضوئية‪ ،‬شاشة اإلظهار ‪ LCD‬التي‬
‫تستقبل بتات رقمية‪ ،‬أو لوحة مفاتيح‪ ،‬أو محرك‪ ،‬وغير ذلك كما سنرى‪ .‬لكل رجل مقاومة سحب‬
‫داخلية ‪( internal pull-up‬غير مفعلة افتراضيا)‪.‬‬
‫المنافذ ‪ : 11، 10، 9، 6، 5،3‬يمكن لكل منها أن تولد إشارة تعديل عرض النبضة ‪Pulse Width‬‬
‫)‪ .Modulation (PWM‬يرمز إليها في اللوحة على شكل ~‪ .‬إشارة ‪ PWM‬هي إشارة مربعة دورية يتم‬
‫التحكم بعرض النبضة المرتفعة (‪ 1‬منطقي)‪ ،‬وسيتم شرحها الحقا‪.‬‬
‫المنفذان ‪ 1،0‬يعمالن كواجهة اتصال للبروتوكول التسلسلي ‪ UART‬الذي سيتم دراسته فيما بعد‪.‬‬
‫المنفذ ‪ 1‬لإلرسال‪ ،‬والمنفذ ‪ 0‬لالستقبال‪ .‬يتصل هذان المنفذان في نفس الوقت مع منافذ متوافقة‬
‫للمتحكم ‪ ATmega16U2‬بحيث يمكن إرسال البيانات التسلسلية إلى الحاسب عبر منفذ ‪.USB‬‬
‫المنفذان ‪ : 3،2‬تستخدم كمقاطعات خارجية‬
‫المنافذ ‪ : 13، 12، 11،10‬تعمل كواجهة اتصال للبروتوكول التسلسلي ‪.SPI‬‬
‫يضاف لهذه المنافذ إلى اليسار منها في الشكل (‪ )13-1‬المنافذ التالية‪:‬‬
‫منفذ ‪ :GND‬أرضي لوحة األردوينو‪.‬‬
‫منفذ ‪ : AREF‬الجهد المرجعي للمداخل التشابهية‪ .‬سيتم إيضاح المقصود منه الحقا‪.‬‬
‫المنفذان األخيران ‪ : SCL،SDA‬يعمالن كواجهة اتصال للبروتوكول التسلسلي ‪.I2C‬‬

‫الشكل (‪ :)13-1‬المداخل والمخارج الرقمية المرقمة بالترتيب من اليمين إلى اليسار‪ .‬يضاف إلى‬
‫األيسر منها منافذ ‪.SCL ،SDA ،AREF ، GND‬‬

‫يمكن تلخيص مزايا وخواص لوحة األردوينو أونو بالجدول (‪.)2-1‬‬

‫‪18‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ :)2-1‬مزايا وخواص لوحة األردوينو أونو‬
‫‪ATmega328‬‬ ‫المتحكم‬
‫‪( 32KB‬يستخدم ‪ 0.5 KB‬لمحمل اإلقالع‬
‫سعة ذاكرة البرنامج‬
‫‪)bootloader‬‬
‫‪2KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪16MHz‬‬ ‫سرعة المعالج‬
‫‪+5V‬‬ ‫جهد عمل اللوحة‬
‫‪7-12V‬‬ ‫جهد الدخل عبر مقبس الطاقة أو مدخل ‪Vin‬‬
‫الموصى به‬
‫‪14‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي (دخل أو خرج)‬
‫الموصى به‬
‫‪6‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪6‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪SPI، I2C، UART‬‬ ‫بروتوكوالت االتصال التسلسلية التي تدعمها‬
‫عن طريق منفذ ‪ USB‬أو مبرمجة خارجية )‪(ICSP‬‬ ‫طرق البرمجة‬
‫‪68.6 mm‬‬ ‫الطول‬
‫‪53.4 mm‬‬ ‫العرض‬
‫‪25 gr‬‬ ‫الوزن‬

‫‪-4 -1‬لوحات ‪Arduino MEGA ADK - Arduino MEGA 2560 - Arduino MEGA‬‬
‫تعتبر لوحات األردوينو ميغا ‪ MEGA‬من اللوحات ذات الحجم الكبير‪ ،‬حيث توفر منافذا رقمية‬
‫يصل عددها إلى ‪ 54‬أي ما يعادل ‪ 4‬أضعاف لوحة األردوينو أونو تقريبا‪ ،‬ومنافذ دخل تشابهية عددها‬

‫‪ 16‬منفذا‪ .‬تتشابه اللوحات الثالثة في شكلها كما هو موضح في (‪ ،)16-1( ،)15-1( ،)14-1‬وتختلف‬

‫في بعض األمور‪ .‬يستخدم األردوينو ‪ Arduino MEGA‬متحكما صغريا ‪ ATmega1280‬لذلك فإن‬
‫سعة ذاكرة البرنامج ‪ ،128KB‬بينما تستخدم اللوحتان ‪ Arduino MEGA 2560‬و ‪Arduino MEGA‬‬
‫‪ ADK‬متحكما صغريا ‪ ATmega2560‬لذلك نجد أن سعة ذاكرة البرنامج لهما ‪ .256KB‬تمتاز لوحة‬
‫‪ Arduino MEGA ADK‬أيضا بوجود دارة متكاملة ‪ MAX3421E‬التي توفر واجهة مستضيف ‪USB‬‬

‫‪19‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫)‪ ،(USB Host‬مما يسمح لهذه اللوحة باالتصال والتفاعل مع أي جهاز له منفذ ‪ USB‬مثل الهواتف‬
‫الخلوية الداعمة لنظام األندرويد ‪ ،android‬والكاميرات‪ ،‬ومتحكمات ألعاب مثل ‪ PS3‬و‪،Wiimote‬‬
‫باإلضافة إلى الفارة ولوحة المفاتيح‪ .‬يقارن الجدول (‪ )3-1‬ما بين خواص ومزايا لوحات األردوينو‬
‫الثالثة‪.‬‬

‫الشكل (‪ :)14-1‬لوحة ‪ Arduino MEGA‬التي تحتوي على المتحكم ‪ ،ATmega1280‬وبجانبه منفذ‬


‫البرمجة ‪ ICSP‬وزر إعادة التشغيل ‪ ،Reset‬والدارة المتكاملة ‪ FT232RL‬التي تعمل كمبدل ‪USB-‬‬
‫‪ ،serial‬و‪ 16‬منفذ دخل تشابهي‪ ،‬و‪ 32‬منفذ رقمي التي يعمل بعضها كوحدات اتصال ‪ UART‬أو‪ I2C‬أو‬
‫‪ ،SPI‬والبعض اآلخر كمولد إشارة ‪.PWM‬‬

‫‪21‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)15-1‬لوحة ‪ Arduino MEGA 2560‬التي تحتوي على المتحكم ‪ ،ATmega2560‬وبجانبه‬


‫منفذ ‪ ICSP‬وزر إعادة التشغيل ‪ ،Reset‬والمتحكم ‪ ،ATmega16U2‬و‪ 16‬منفذ تشابهي‪ ،‬و‪ 32‬منفذ‬
‫رقمي التي يعمل بعضها كوحدات اتصال ‪ UART‬أو‪ I2C‬أو ‪ ،SPI‬والبعض اآلخر كمولد إشارة ‪.PWM‬‬

‫الشكل (‪ :)16-1‬لوحة ‪ Arduino MEGA ADK‬التي تحتوي على المتحكم ‪ ،ATmega2560‬وبجانبه‬


‫منفذ ‪ ICSP‬وزر إعادة التشغيل ‪ ،Reset‬والمتحكم ‪ ، ATmega16U2‬و‪ 16‬منفذ دخل تشابهي‪ ،‬و‪32‬‬
‫منفذ رقمي التي يعمل بعضها كوحدات اتصال ‪ UART‬أو‪ I2C‬أو ‪ ،SPI‬والبعض اآلخر كمولد إشارة‬
‫‪ ،PWM‬والدارة المتكاملة ‪ MAX3421‬التي تعمل كمستضيف لمنفذ ‪.USB plug‬‬

‫‪21‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ :)3-1‬مقارنة ما بين مزايا لوحات األردوينو ‪ MEGA‬و ‪ MEGA 2560‬و ‪MEGA ADK‬‬
‫‪MEGA ADK‬‬ ‫‪MEGA 2560‬‬ ‫‪MEGA‬‬
‫‪ATmega2560‬‬ ‫‪ATmega2560‬‬ ‫‪ATmega1280‬‬ ‫المتحكم‬
‫‪8KB( 256KB‬‬ ‫‪8KB( 256KB‬‬ ‫‪8KB( 128KB‬‬
‫سعة ذاكرة البرنامج‬
‫لمحمل اإلقالع)‬ ‫لمحمل اإلقالع)‬ ‫لمحمل اإلقالع)‬
‫‪8 KB‬‬ ‫‪8 KB‬‬ ‫‪8 KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪4 KB‬‬ ‫‪4 KB‬‬ ‫‪4 KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪16 MHz‬‬ ‫‪16 MHz‬‬ ‫‪16 MHz‬‬ ‫سرعة المعالج‬
‫‪+5 V‬‬ ‫‪+5 V‬‬ ‫‪+5 V‬‬ ‫جهد عمل اللوحة‬
‫‪7-12V‬‬ ‫‪7-12V‬‬ ‫‪7-12V‬‬ ‫جهد الدخل عبر مقبس الطاقة‬
‫أو مدخل ‪Vin‬‬
‫‪54‬‬ ‫‪54‬‬ ‫‪54‬‬ ‫عدد المنافذ الرقمية‬
‫‪40 mA( 20 mA‬‬ ‫‪40 mA( 20 mA‬‬ ‫‪40 mA( 20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي‬
‫كحد أعظمي)‬ ‫كحد أعظمي)‬ ‫كحد أعظمي)‬
‫(دخل أو خرج) الموصى به‬
‫‪15‬‬ ‫‪15‬‬ ‫‪15‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪16‬‬ ‫‪16‬‬ ‫‪16‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫ال يوجد‬ ‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫‪10 bit‬‬ ‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫مع المنفذ ‪13‬‬ ‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪UART : 4‬‬ ‫‪UART : 4‬‬ ‫‪UART : 4‬‬
‫‪SPI : 1‬‬ ‫‪SPI : 1‬‬ ‫‪SPI : 1‬‬ ‫بروتوكوالت االتصال‬
‫‪I2C : 1‬‬ ‫‪I2C : 1‬‬ ‫‪I2C : 1‬‬ ‫التسلسلية التي تدعمها‬
‫‪USB Host : 1‬‬
‫عن طريق منفذ ‪USB‬‬ ‫عن طريق منفذ ‪USB‬‬ ‫عن طريق منفذ ‪USB‬‬
‫أو مبرمجة خارجية‬ ‫أو مبرمجة خارجية‬ ‫أو مبرمجة خارجية‬ ‫طرق البرمجة‬
‫)‪(ICSP‬‬ ‫)‪(ICSP‬‬ ‫)‪(ICSP‬‬
‫‪101.52 mm‬‬ ‫‪101.52 mm‬‬ ‫‪101.52 mm‬‬ ‫الطول‬
‫‪53.3 mm‬‬ ‫‪53.3 mm‬‬ ‫‪53.4 mm‬‬ ‫العرض‬
‫‪36 gr‬‬ ‫‪37 gr‬‬ ‫‪25 gr‬‬ ‫الوزن‬

‫‪-5-1‬لوحة األردوينو ‪Arduino Due‬‬


‫تشبه لوحة ‪ Arduino Due‬لوحة ‪ Arduino MEGA ADK‬من حيث الشكل‪ ،‬وتختلف عنها في‬
‫البنية االلكترونية‪ .‬المتحكم الصغري المستخدم في هذه اللوحة هو ‪ AT91SAM3X8E‬الذي يعتمد‬
‫على بينة ‪ ARM‬بـ ‪ 32‬بت‪ ،‬مع سرعة معالج تصل إلى‪ .84 MHz‬تعمل اللوحة بجهد مقداره ‪.3.3 V‬‬
‫يوجد منفذي خرج تشابهيين‪ ،‬ومنفذين لالتصال وفق بروتوكول ‪ ،CAN‬وزر مسح ‪ erase‬لمسح ذاكرة‬

‫‪22‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫البرنامج‪ .‬كذلك يوجد منفذين ‪ micro USB‬أحدهما للبرمجة واالتصال مع الحاسب‪ ،‬واآلخر لالتصال‬
‫مع أجهزة محيطية‪ ،‬ويمكن استخدامه للبرمجة‪ .‬ال تتم برمجة المتحكم من خالل منفذ ‪ .ICSP‬يبين‬
‫الشكل (‪ )17-1‬لوحة ‪ ،Arduino Due‬والجدول (‪ )4-1‬مزايا وخواص هذه اللوحة‪.‬‬

‫الشكل (‪ :)17-1‬لوحة األردوينو ‪ .DUE‬منفذ ‪ USB Prog‬للبرمجة واالتصال مع الحاسب‪ ،‬والمنفذ‬


‫‪ Native USB‬لالتصال مع الوحدات المحيطية غالبا‪.‬‬
‫الجدول (‪ :)4-1‬مزايا وخواص لوحة األردوينو ‪.DUE‬‬
‫‪AT91SAM3X8E‬‬ ‫المتحكم‬
‫‪512KB‬‬ ‫سعة ذاكرة البرنامج‬
‫‪96KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪84 MHz‬‬ ‫سرعة المعالج‬
‫‪+5V‬‬ ‫جهد عمل اللوحة‬
‫‪7-12V‬‬ ‫جهد الدخل عبر مقبس الطاقة‬
‫أو مدخل ‪ Vin‬الموصى به‬
‫‪54‬‬ ‫عدد المنافذ الرقمية‬
‫منفذ خرج‪ 3 mA :‬أو ‪ .15 mA‬اعتماداً على المنفذ المستخدم‪.‬‬ ‫التيار األعظمي للمنفذ الرقمي‬
‫منفذ دخل‪ 6 mA :‬أو ‪ .9 mA‬اعتماداً على المنفذ المستخدم‪.‬‬ ‫الموصى به‬
‫‪12‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪12‬‬ ‫عدد أرجل الدخل التشابهية‬
‫‪2‬‬ ‫عدد أرجل الخرج التشابهية‬
‫‪12 Bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫‪23‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪12 bit‬‬ ‫دقة تمييز المبدل ‪DAC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪UART : 4‬‬
‫‪SPI : 1‬‬ ‫بروتوكوالت االتصال التسلسلية‬
‫‪I2C : 2‬‬
‫‪USB Host : 1‬‬
‫‪Programming USB Port. Native USB Port.‬‬ ‫طرق البرمجة‬
‫‪800 mA‬‬ ‫أعظم تيار لمنفذ التغذية ‪3.3 V‬‬
‫‪800 mA‬‬ ‫أعظم تيار لمنفذ التغذية ‪5 V‬‬
‫‪101.52 mm‬‬ ‫الطول‬
‫‪53.3 mm‬‬ ‫العرض‬
‫‪36 gr‬‬ ‫الوزن‬

‫‪ -6-1‬لوحة األردوينو ليوناردو ‪Arduino Leonardo‬‬


‫تشبه لوحة األردوينو ليوناردو لوحة األونو من حيث الشكل‪ ،‬وتختلف عنها بالمتحكم الصغري‬
‫الرئيسي المستخدم وهو ‪ ATmega32u4‬الذي يحتوي على وحدة اتصال ‪ USB‬مدمجة‪ ،‬لذلك ال‬
‫يحتاج إلى متحكم ثانوي‪ ،‬مما يسمح للحاسب باالتصال مع الليوناردو كجهاز واجة إنسان ‪Human‬‬
‫)‪ interface device(HID‬كالفارة أو لوحة المفاتيح‪ ،‬بالتالي فهو مناسب للمشاريع التي تتطلب ذلك‪.‬‬
‫يمكن أيضا للحاسب أن يتصل مع اللوحة كمنفذ ‪ COM‬افتراضي‪ .‬يوضح الشكل (‪ )18-1‬لوحة‬
‫األردوينو ليوناردو‪ ،‬والجدول (‪ )5-1‬مزايا اللوحة‪.‬‬

‫الشكل (‪ :)18-1‬لوحة األردوينو ليوناردو‪.‬‬


‫‪24‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ :)5-1‬مزايا وخواص لوحة األردوينو ليوناردو‬
‫‪ATmega32u4‬‬ ‫المتحكم‬
‫‪ 4 KB( 32KB‬لمحمل اإلقالع ‪)bootloader‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2.5KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪16MHz‬‬ ‫سرعة المعالج‬
‫‪+5V‬‬ ‫جهد عمل اللوحة‬
‫‪7-12V‬‬ ‫جهد الدخل عبر مقبس الطاقة أو مدخل‬
‫‪ Vin‬الموصى به‬
‫‪20‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي الموصى به‬
‫‪7‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪12‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪SPI، I2C، USB،UART‬‬ ‫بروتوكوالت االتصال التسلسلية‬
‫عن طريق منفذ ‪ USB‬أو مبرمجة خارجية‬
‫طرق البرمجة‬
‫)‪(ICSP‬‬
‫‪68.6 mm‬‬ ‫الطول‬
‫‪53.4 mm‬‬ ‫العرض‬
‫‪20 gr‬‬ ‫الوزن‬

‫‪-7-1‬لوحة األردوينو ميكرو ‪Arduino micro‬‬


‫يعتبر األردوينو ميكرو لوحة مصغرة للوحة ليوناردو‪ ،‬ولها نفس المزايا والخواص المذكورة‬
‫في الجدول (‪ )5-1‬باستثناء أبعاد اللوحة ووزنها‪ .‬تم تصميمها بحيث يمكن استخدامها بسهولة مع‬
‫لوحة التجارب ‪ .breadboard‬يوضح الشكل (‪ )19-1‬لوحة األردوينو ميكرو‪ ،‬والجدول (‪ )6-1‬يبين‬
‫مزايا وخواص اللوحة‪.‬‬

‫‪25‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)19-1‬لوحة األردوينو ميكرو‬


‫الجدول (‪ :)6-1‬مزايا وخواص لوحة األردوينو ميكرو‬
‫‪ATmega32u4‬‬ ‫المتحكم‬
‫‪ 4 KB( 32KB‬لمحمل اإلقالع ‪)bootloader‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2.5KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪16MHz‬‬ ‫سرعة المعالج‬
‫‪+5V‬‬ ‫جهد عمل اللوحة‬
‫‪7-12V‬‬ ‫جهد الدخل عبر مقبس الطاقة أو مدخل‬
‫‪ Vin‬الموصى به‬
‫‪20‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي الموصى به‬
‫‪7‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪12‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪SPI، I2C، USB،UART‬‬ ‫بروتوكوالت االتصال التسلسلية‬
‫عن طريق منفذ ‪ USB‬أو مبرمجة )‪(ICSP‬‬ ‫طرق البرمجة‬
‫‪48 mm‬‬ ‫الطول‬
‫‪18 mm‬‬ ‫العرض‬
‫‪13 gr‬‬ ‫الوزن‬

‫‪26‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-8-1‬لوحة األردوينو نانو ‪Arduino Nano‬‬


‫تعتبر لوحة النانو لوحة مصغرة للوحة األونو ويمكن استخدامها بسهولة مع لوحات التجارب‪.‬‬
‫يوضح الشكل (‪ )21-1‬لوحة األردوينو نانو‪ ،‬والجدول (‪ )7-1‬يبين مزايا وخواص اللوحة‪.‬‬

‫الشكل (‪ :)21-1‬لوحة األردوينو نانو‪.‬‬


‫الجدول (‪ :)7-1‬مزايا وخواص لوحة األردوينو نانو‬
‫‪ATmega328‬‬ ‫المتحكم‬
‫‪ 2 KB( 32KB‬لمحمل اإلقالع ‪)bootloader‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪16MHz‬‬ ‫سرعة المعالج‬
‫‪+5V‬‬ ‫جهد عمل اللوحة‬
‫‪7-12V‬‬ ‫جهد الدخل عبر مدخل ‪ Vin‬الموصى به‬
‫‪22‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي الموصى به‬
‫‪6‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪8‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪SPI، I2C،UART‬‬ ‫بروتوكوالت االتصال التسلسلية‬
‫عن طريق منفذ ‪ USB‬أو مبرمجة )‪(ICSP‬‬ ‫طرق البرمجة‬
‫‪45 mm‬‬ ‫الطول‬
‫‪18 mm‬‬ ‫العرض‬
‫‪7 gr‬‬ ‫الوزن‬
‫‪27‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪ -9-1‬لوحة األردوينو ‪Arduino Mini‬‬


‫تشبه هذه اللوحة لوحة النانو السابقة‪ ،‬ولها نفس المزايا باستثناء عدم وجود محول ‪USB-‬‬
‫‪ serial‬في اللوحة‪ ،‬مما يستدعي استخدام ذلك المحول لربط اللوحة مع الحاسب للبرمجة أو تبادل‬
‫المعلومات‪ .‬يوضح الشكل (‪ )21-1‬لوحة األردوينو ‪ ،Mini‬والجدول (‪ )8-1‬مزايا اللوحة‪.‬‬

‫الشكل (‪ :)21-1‬لوحة األردوينو ‪.Mini‬‬


‫الجدول (‪ :)8-1‬مزايا وخواص لوحة األردوينو ‪.Mini‬‬
‫‪ATmega328‬‬ ‫المتحكم‬
‫‪ 2 KB( 32KB‬لمحمل اإلقالع ‪)bootloader‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪16 MHz‬‬ ‫سرعة المعالج‬
‫‪+5V‬‬ ‫جهد عمل اللوحة‬
‫‪7-9 V‬‬ ‫جهد الدخل عبر مدخل ‪ Vin‬الموصى به‬
‫‪14‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي الموصى به‬
‫‪6‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪8‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫ولكن تحتاج لمحول‬ ‫يمكن عن طريق منفذ ‪USB‬‬
‫طرق البرمجة‬
‫‪ USB-Serial‬أو عن طريق مبرمجة )‪(ICSP‬‬
‫‪30 mm‬‬ ‫الطول‬
‫‪18 mm‬‬ ‫العرض‬
‫‪7 gr‬‬ ‫الوزن‬
‫‪28‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪ – 11-1‬لوحة ‪Arduino Pro‬‬


‫تم تصميم لوحة ‪ Pro‬ليتم تركيبها بشكل شبه دائم في المشاريع‪ ،‬حيث تأتي المنافذ من دون‬
‫رؤوس محمولة مسبقا‪ ،‬مما يسمح من لحمها بأسالك خارجية‪ ،‬أو أنماط مختلفة من الموصالت‪ .‬ال‬
‫يوجد محول ‪ ،USB-serial‬مما يستدعي استخدام ذلك المحول لربط اللوحة مع الحاسب للبرمجة أو‬
‫تبادل المعلومات‪ .‬يوضح الشكل (‪ )22-1‬لوحة األردوينو ‪ ،Pro‬والجدول (‪ )9-1‬مزايا اللوحة‪.‬‬

‫الشكل (‪ :)22-1‬لوحة ‪.Arduino Pro‬‬


‫الجدول (‪ :)9-1‬مزايا وخواص لوحة ‪Arduino Pro‬‬
‫‪ATmega328‬‬ ‫المتحكم‬
‫‪ 2 KB( 32KB‬لمحمل اإلقالع ‪)bootloader‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫)‪8MHz(3.3V version) or 16MHz(5V version‬‬ ‫سرعة المعالج‬
‫)‪3.3V(3.3V version) or 5V(5V version‬‬ ‫جهد عمل اللوحة‬
‫)‪3.3-12V(3.3V version) or 5-12V(5V version‬‬ ‫جهد الدخل عبر مدخل ‪ Vin‬الموصى به‬
‫‪14‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي‬
‫‪6‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪6‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪SPI، I2C،UART‬‬ ‫بروتوكوالت االتصال التسلسلية‬
‫يمكن عن طريق منفذ ‪ USB‬ولكن تحتاج لمحول ‪USB-‬‬
‫طرق البرمجة‬
‫‪ Serial‬أو عن طريق مبرمجة خارجية )‪(ICSP‬‬
‫‪52 mm , 53.3 mm‬‬ ‫الطول‪ ،‬العرض‬
‫‪29‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪ – 11-1‬لوحة ‪Arduino Pro mini‬‬


‫يعتبر األردوينو ‪ Pro mini‬لوحة مصغرة للوحة ‪ ،Pro‬ولها نفس المزايا والخواص المذكورة‬
‫في الجدول (‪ )11-1‬باستثناء أبعاد اللوحة ووزنها‪ .‬تم تصميمها أيضا ليتم تركيبها بشكل شبه دائم في‬
‫المشاريع‪ .‬يوضح الشكل (‪ )23-1‬لوحة األردوينو ‪ ،Pro mini‬والجدول (‪ )11-1‬مزايا اللوحة‪.‬‬

‫الشكل (‪ :)23-1‬لوحة ‪.Arduino Pro min‬‬


‫الجدول (‪ :)11-1‬مزايا وخواص لوحة ‪.Arduino Pro mini‬‬
‫‪ATmega328‬‬ ‫المتحكم‬
‫‪ 2 KB( 32KB‬لمحمل اإلقالع ‪)bootloader‬‬ ‫سعة ذاكرة البرنامج‬
‫‪2KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1KB‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫)‪8MHz(3.3V version) or 16MHz(5V version‬‬ ‫سرعة المعالج‬
‫)‪3.3V(3.3V version) or 5V(5V version‬‬ ‫جهد عمل اللوحة‬
‫)‪3.3-12V(3.3V version) or 5-12V(5V version‬‬ ‫جهد الدخل عبر مدخل ‪ Vin‬الموصى به‬
‫‪14‬‬ ‫عدد منافذ الدخل أو الخرج الرقمية‬
‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ الرقمي الموصى به‬
‫‪6‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪6‬‬ ‫عدد أرجل الدخل التشابهية‬
‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫مع المنفذ ‪13‬‬ ‫الثنائي الضوئي ‪ L‬المدمج‬
‫‪SPI، I2C،UART‬‬ ‫بروتوكوالت االتصال التسلسلية‬
‫يمكن عن طريق منفذ ‪ USB‬ولكن تحتاج لمحول ‪USB-‬‬
‫طرق البرمجة‬
‫‪ Serial‬أو عن طريق مبرمجة خارجية )‪(ICSP‬‬
‫‪17.7 mm ، 33 mm‬‬ ‫الطول‪ ،‬العرض‬

‫‪31‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-12-1‬لوحة أردوينو ليلي باد ‪Arduino Lilypad‬‬


‫تم تصميم لوحات ليلي باد لتعمل مع المنسوجات االلكترونية ‪ .E-textiles‬تقدم نفس وظائف‬
‫لوحات األردوينو األخرى مع مزايا أخرى مثل خفة الوزن‪ ،‬ودائرية الشكل‪ ،‬ولها منافذ خرج كبيرة‬
‫بهدف تسهيل عملية االتصال والربط مع المالبس‪ .‬يوجد عدة إصدارات للوحات ليلي باد كما هو‬
‫موضح في الشكل (‪ .Lilypad simple - Lilypad USB - Lilypad main board:)24-1‬يقارن‬
‫الجدول (‪ )11-1‬مزايا وخواص اللوحات الثالثة‪.‬‬

‫)‪(c‬‬ ‫)‪(b‬‬ ‫)‪(a‬‬


‫الشكل (‪ :)24-1‬لوحات ليلي باد أردوينو‪،Lilypad USB (b) ،Lilypad main (a) :‬‬
‫)‪.Lilypad simple (c‬‬
‫الجدول (‪ :)11-1‬مقارنة ما بين لوحات ‪Lilypad‬‬
‫‪Lilypad simple‬‬ ‫‪Lilypad USB‬‬ ‫‪Lilypad main board‬‬
‫‪ATmega328‬‬ ‫‪ATmega32u4‬‬ ‫‪ ATmega168‬أو‬
‫المتحكم‬
‫‪ATmega328‬‬
‫‪( 32KB‬يستخدم ‪2 KB‬‬ ‫‪( 32KB‬يستخدم ‪4‬‬ ‫‪( 16KB‬يستخدم ‪2 KB‬‬
‫سعة ذاكرة البرنامج‬
‫لمحمل اإلقالع)‬ ‫‪ KB‬لمحمل اإلقالع)‬ ‫لمحمل اإلقالع)‬
‫‪2 KB‬‬ ‫‪2.5 KB‬‬ ‫‪1KB‬‬ ‫سعة ذاكرة ‪SRAM‬‬
‫‪1 KB‬‬ ‫‪1 KB‬‬ ‫‪512 B‬‬ ‫سعة ذاكرة ‪EEPROM‬‬
‫‪8MHz‬‬ ‫‪8MHz‬‬ ‫‪8MHz‬‬ ‫سرعة المعالج‬
‫‪2.7-5.5V‬‬ ‫‪3.3 V‬‬ ‫‪2.7-5.5V‬‬ ‫جهد عمل اللوحة‬
‫‪2.7-5.5V‬‬ ‫‪3.8-5 V‬‬ ‫‪2.7-5.5V‬‬ ‫جهد الدخل عبر وصلة‬
‫‪ USB‬أو طاقة خارجية‬
‫‪9‬‬ ‫‪9‬‬ ‫‪14‬‬ ‫عدد منافذ الدخل أو الخرج‬
‫الرقمية‬
‫‪20 mA‬‬ ‫‪mA 21‬‬ ‫‪20 mA‬‬ ‫التيار األعظمي للمنفذ‬
‫الرقمي الموصى به‬
‫‪5‬‬ ‫‪4‬‬ ‫‪6‬‬ ‫عدد أرجل ‪PWM‬‬
‫‪31‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪4‬‬ ‫‪4‬‬ ‫‪6‬‬ ‫عدد أرجل الدخل‬
‫التشابهية‬
‫ال يوجد‬ ‫ال يوجد‬ ‫ال يوجد‬ ‫عدد أرجل الخرج التشابهية‬
‫‪10 bit‬‬ ‫‪10 bit‬‬ ‫‪10 bit‬‬ ‫دقة تمييز المبدل ‪ADC‬‬
‫يمكن عن طريق منفذ‬ ‫يمكن عن طريق منفذ‬ ‫يمكن عن طريق منفذ‬
‫‪ USB‬ولكن تحتاج‬ ‫‪ USB‬ألن المتحكم‬ ‫‪ USB‬ولكن تحتاج لمحول‬
‫لمحول ‪ USB-Serial‬أو‬ ‫يتضمن وحدة ‪USB‬‬ ‫‪ USB-Serial‬أو عن‬ ‫طرق البرمجة‬
‫عن طريق مبرمجة‬ ‫مدمجة أو عن طريق‬ ‫طريق مبرمجة خارجية‬
‫خارجية )‪(ICSP‬‬ ‫مبرمجة )‪(ICSP‬‬ ‫)‪(ICSP‬‬
‫‪50 mm‬‬ ‫القطر‬

‫‪32‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الفصل الثاني‬
‫بيئة التطوير المتكاملة لألردوينو ‪Arduino IDE‬‬

‫‪-1-2‬مقدمة‬
‫بيئة التطوير المتكاملة لألردوينو ‪Arduino integrated development environment‬‬
‫)‪ (IDE‬هو البرنامج الذي من خالله يتم كتابة الكود البرمجي للوحة األردوينو بلغة ‪ ،C‬وتحميله إليها‪.‬‬
‫تتسم بيئة التطوير بالبساطة وسهولة التعامل‪ ،‬وتحتوي على كل ما يحتاجه المبرمج لكتابة الشيفرة‪،‬‬
‫وتعمل على أنظمة التشغيل المختلفة‪. Linux، Mac OS X،Windows :‬‬
‫تعرف البرامج المكتوبة باستخدام بيئة التطوير ‪ Arduino IDE‬بالسكتش ‪ ،sketch‬ويتم‬
‫تخزينها في الحاسب بملف يأخذ التوسع ‪.ino‬‬

‫‪-2-2‬تحميل بيئة التطوير المتكاملة لألردوينو ‪Arduino IDE‬‬


‫يمكن تحميل ‪ Arduino IDE‬من الموقع الرسمي لمطوري األردوينو من الرابط التالي‪:‬‬
‫‪https://www.arduino.cc/en/Main/Software‬‬
‫بعد فتح الرابط نختار نظام التشغيل ومن ثم ‪ just download‬ليبدأ التحميل مباشرة ومجانا‪.‬‬
‫قم بفك الضغط للملف المحمل الذي يحتوي على برنامج بيئة التطوير وتعاريف ومكتبات وأمثلة‬
‫وغيرها‪ .‬قم بتشغيل برنامج ‪ Arduino.exe‬لتعمل بيئة التطوير مباشرة من دون الحاجة إلى تنصيب‬
‫‪.setup‬‬

‫‪ -3-2‬بيئة التطوير المتكاملة لألردوينو ‪Arduino IDE‬‬


‫يوضح الشكل (‪ )1-2‬واجهة بيئة التطوير ‪ Arduino IDE‬التي تتكون من األجزاء التالية‪:‬‬
‫‪ .1‬شريط أدوات القوائم ‪.menu toolbar‬‬
‫‪ .2‬شريط أدوات الوظائف العامة ‪.common functions toolbar‬‬
‫‪ .3‬محرر النص ‪.text editor‬‬
‫‪ .4‬منطقة الرسالة ‪.message area‬‬
‫‪ .5‬لوحة مراقبة النص ‪.text console‬‬

‫‪33‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪1‬‬
‫‪2‬‬

‫‪3‬‬

‫‪4‬‬

‫‪5‬‬

‫الشكل (‪ :)1-2‬بيئة التطوير المتكاملة لألردوينو ‪.Arduino IDE‬‬

‫‪-1-3-2‬شريط أدوات القوائم‬


‫يحتوي هذا الشريط على خمس قوائم هي‪ .File – Edit – Sketch – Tools – Help :‬في كل‬
‫قائمة عدد من الوظائف‪.‬‬
‫تتضمن القائمة ‪ File‬عددا من الوظائف‪:‬‬
‫‪ :New‬إنشاء نموذج جديد للمحرر‪.‬‬
‫‪ :Open‬لفتح ملف مخزن‪.‬‬
‫‪ :Open Recent‬تقدم قائمة قصيرة ألحداث الملفات البرمجية‬
‫)‪ (sketch‬لفتحها‪.‬‬
‫‪ :Examples‬تحتوي أمثلة مقدمة من بيئة التطوير‪.‬‬
‫‪ :Close‬إغالق المحرر الذي يتم العمل عليه‪.‬‬
‫‪ :Save‬حفظ الملف البرمجي بنفس االسم‪.‬‬
‫‪ :Save as‬حفظ الملف البرمجي باسم مختلف‪.‬‬
‫‪ :Page setup‬إعداد الصفحة للطباعة‪.‬‬
‫‪ :Print‬طباعة الملف البرمجي‪.‬‬
‫‪ :Preferences‬يتم فتح نافذة التفضيالت لضبط بعض إعدادات بيئة التطوير مثل لغة الواجهة‪.‬‬
‫‪ :Quit‬يتم إغالق كافة نوافذ بيئة التطوير‪.‬‬
‫‪34‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تتضمن القائمة ‪ Edit‬عددا من الوظائف الخاصة بالنسخ‪ ،‬والقص‪ ،‬واللصق‪ ،‬والتراجع‪ ،‬والبحث‪.‬‬
‫تتضمن القائمة ‪ Sketch‬الوظائف التالية‪:‬‬
‫‪ :Verify/Compile‬لفحص النص البرمجي من األخطاء‪ ،‬مع‬
‫تقديم معلومات عن مقدار استخدام ذاكرة البرنامج وذاكرة‬
‫‪ RAM‬في منطقة مراقبة النص ‪.text area‬‬
‫‪ :Upload‬يتم تحويل الملف البرمجي إلى ترميز اآللة ومن‬
‫ثم يتم تحميل الملف الثنائي إلى اللوحة عبر المنفذ الذي تم‬
‫إعداده‪( .‬قبل تحميل الملف للوحة البد من اختيار اللوحة‬
‫بشكل صحيح من القائمة ‪ ،Tools>Board‬واختيار منفذ‬
‫‪ COM‬الصحيح أثناء وصل اللوحة مع الحاسب وذلك من‬
‫القائمة ‪.)Tools>Port‬‬
‫‪ :Upload Using Programmer‬يستخدم هذا األمر لنقل‬
‫الملف البرمجي إلى اللوحة عن طريق مبرمجة خارجية‪ .‬يتم‬
‫الكتابة على محمل اإلقال ع ‪ ،bootlaoder‬وتستخدم كامل‬
‫سعة ذاكرة البرنامج‪.‬‬
‫‪ :Export Compiled Binary‬يتم تخزين ملف ‪.hex‬‬
‫(ملف ترميز لغة اآللة مكتوب بصيغة ست عشري‬
‫‪ )hexadecimal‬الستخدامه في برنامج محاكاة‪ ،‬أو‬
‫تحميله للوحة عن طريق أدوات أخرى‪.‬‬
‫‪ :Show Sketch folder‬فتح مجلد الشيفرة البرمجية‬
‫‪ sketch‬الحالي‪.‬‬
‫‪ :Include library‬إضافة مكتبات إلى الشيفرة‬
‫البرمجية ‪ sketch‬الحالي بإضافة التعبير ‪#include‬‬
‫في بداية الشيفرة‪.‬‬
‫‪ :Add File‬إضافة ملف برمجي‪ ،‬ويتم نسخه إلى‬
‫مكان الشيفرة البرمجية الحالية‪.‬‬
‫تتضمن القائمة ‪ Tools‬الوظائف التالية‪:‬‬
‫‪ :Auto Format‬يجعل الشيفرة البرمجية تظهر بشكل‬
‫أنيق‪.‬‬
‫‪ :Archive Sketch‬يتم أرشفة نسخة للشيفرة‬
‫البرمجية الحالية بتنسيق ‪.zip‬‬

‫‪35‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ :Serial Monitor‬فتح نافذة المراقبة التسلسلية‪.‬‬
‫‪ :Board‬يتم تحديد اللوحة التي يتم العمل بها‪.‬‬
‫‪ :Port‬تحتوي هذه القائمة على كل المنافذ التسلسلية المعرفة على الحاسب (فعلية أو ظاهرية)‪ .‬من‬
‫خاللها يتم اختيار المنفذ الذي تتصل مع لوحة األردوينو‪.‬‬
‫‪ :Programmer‬تستخدم الختيار المبرمجة عندما يتم برمجة اللوحة من دون استخدام لوصلة‬
‫‪ .USB-serial‬في العادة لن تحتاج إلى ذلك‪ ،‬إال إذا أردت تحميل محمل اإلقال ع ‪ bootloader‬إلى‬
‫المتحكم الصغري‪.‬‬
‫‪ :Burn Bootloader‬تستخدم لنقل محمل اإلقال ع ‪ bootloader‬إلى المتحكم الصغري للوحة‪.‬‬

‫‪-2-3-2‬شريط أدوات وظائف عامة ‪common functions toolbar‬‬


‫‪ :Verify‬لفحص النص البرمجي من األخطاء‪.‬‬
‫‪ :Upload‬يتم تحويل الملف البرمجي إلى ترميز اآللة ومن ثم يتم تحميل الملف الثنائي إلى اللوحة‬
‫عبر المنفذ الذي تم إعداده‪.‬‬
‫‪ :New‬إنشاء نموذج جديد للمحرر‪.‬‬
‫‪ :Open‬لفتح ملف مخزن‪.‬‬
‫‪ :Save‬حفظ الملف البرمجي‪.‬‬
‫‪ :Serial Monitor‬فتح نافذة المراقبة التسلسلية‪.‬‬

‫الشكل(‪:)2-2‬شريط أدوات وظائف عامة‪Verify–Upload–New–Open –save – Serial Monitor:‬‬

‫‪-3-3-2‬محرر النص ‪text editor‬‬


‫يتم في محرر النص كتابة الشيفرة البرمجية الخاصة بعمل لوحة األردوينو كما هو موضح في‬
‫الشكل (‪ .)3-2‬سنتعلم الحقا كيفية كتابة الشيفرة البرمجية في بيئة التطوير‪.‬‬

‫الشكل (‪ :)3-2‬محرر النص لكتابة الشيفرة البرمجية‪.‬‬


‫‪36‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-3-2‬منطقة الرسالة ‪message area‬‬


‫تقدم معلومات تفاعلية أثناء الحفظ‪ ،‬والتصدير‪ ،‬وتعرض األخطاء كما هو موضح في الشكل‬
‫(‪.)4-2‬‬

‫الشكل (‪ :)4-2‬منطقة الرسالة لتقديم معلومات تفاعلية‪.‬‬

‫‪ -5-3-2‬لوحة مراقبة النص ‪text console‬‬


‫تعرض معلومات عن نتائج الشيفرة البرمجية مثل نسبة استخدام الذواكر‪ ،‬وأماكن التخزين‪،‬‬
‫ورسائل األخطاء كاملة‪ ،‬وغير ذلك كما هو موضح في الشكل (‪.)5-2‬‬

‫الشكل (‪ :)5-2‬لوحة مراقبة النص‪.‬‬


‫تعرض الزاوية اليمنى السفلى للواجهة اللوحة والمنفذ التسلسلي اللذين تم إعدادهما كما هو‬
‫موضح في الشكل (‪.)6-2‬‬

‫الشكل (‪ :)6-2‬إظهار اسم اللوحة والمنفذ التسلسلي اللذين تم إعدادهما‪.‬‬

‫‪ -4-2‬خطوات تحميل الشيفرة البرمجية إلى لوحة األردوينو‬


‫يتم نقل الشيفرة البرمجية عن طريق بيئة التطوير إلى لوحة األردوينو على المراحل التالية‪:‬‬
‫‪ )1‬وصل لوحة األردوينو إلى الحاسب عن طريق منفذ ‪.USB‬‬
‫‪ )2‬كتابة الشيفرة البرمجية‪.‬‬
‫‪ )3‬تحميل ونقل الشيفرة إلى اللوحة‪.‬‬
‫‪ )4‬تشغيل اللوحة‪.‬‬
‫في الفقرات التالية تم شرح هذه المراحل األربعة‪.‬‬

‫‪-1-4-2‬وصل لوحة األردوينو إلى الحاسب عن طريق منفذ ‪.USB‬‬


‫ذكرنا في الفصل األول أن معظم لوحات األردوينو تحتوي على منفذ ‪ USB‬يستخدم من أجل‬
‫البرمجة‪ ،‬باإلضافة إلى تغذية اللوحة بالطاقة وتبادل البيانات‪ .‬عندما نقوم بوصل اللوحة مع الحاسب‬
‫عبر ذلك المنفذ سيتعرف عليها الجهاز على أنها منفذ ‪ COM‬افتراضي وله رقم‪ .‬إذا لم يتعرف الجهاز‬
‫على اللوحة كما هو موضح في الشكل(‪ )7-2‬يجب عندئذ تنصيب التعريفات الالزمة والتي تأتي مع‬
‫حزمة ‪ Arduino IDE‬التي قمت بتحميلها من الموقع المذكور سابقا‪.‬‬

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


‫‪37‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫لتنصيب التعريف نتبع الخطوات التالية‪:‬‬
‫‪ -1‬اضغط على زر الفارة األيمن على أيقونة الحاسوب وافتح المدير ‪ manager‬كما في الشكل (‪.)8-2‬‬

‫الشكل (‪ :)8-2‬فتح نافذة المدير ‪.manager‬‬

‫‪-2‬اختر مدير األجهزة ‪ ،Device Manager‬ومنها اختر ‪ other devices‬ثم بزر الفارة األيمن على‬
‫‪( Arduino‬أو قد تكون ‪ )Unknown devices‬واختر ‪ Update driver software‬كما هو موضح في‬
‫الشكل (‪.)9-2‬‬

‫الشكل (‪ :)9-2‬نافذة مدير األجهزة لتنصيب التعريف‪.‬‬

‫‪38‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-3‬اختر تصفح الحاسب الختيار التعريف كما هو موضح في الشكل (‪ ،)11-2‬واختر المجلد الذي به‬

‫التعريف وهو ‪( drivers‬المجلد الذي يتم تحميله مع البيئة التطويرية ‪ IDE‬من الموقع)‪.‬‬

‫الشكل (‪ :)11-2‬اختيار التصفح عن طريق الحاسب لتحديد مكان التعريف‪.‬‬

‫‪-4‬تظهر رسالة إذا كنت ترغب تنصيب التعريف أو ال‪ .‬نضغط ‪ OK‬وننتظر حتى تنتهي عملية التعريف‪.‬‬
‫‪-5‬بعد االنتهاء من تنصيب التعريف يمكن معرفة رقم المنفذ من مدير األجهزة أيضا كما هو موضح‬
‫في الشكل (‪.)11-2‬‬

‫الشكل(‪ :)11-2‬تعريف لوحة األردوينو كمنفذ ‪ ،COM‬ورقم المنفذ ‪( 9‬يختلف من جهاز آلخر)‪.‬‬

‫‪-2-4-2‬كتابة الشيفرة البرمجية‬


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

‫‪-3-4-2‬تحميل الشيفرة البرمجية إلى لوحة األردوينو‬


‫قبل نقل الشيفرة البرمجية إلى لوحة األردوينو البد من اختيار لوحة األردوينو المناسبة من‬
‫القائمة ‪ Tools‬ثم ‪ ،board‬واختيار رقم المنفذ ‪ COM‬الصحيح من القائمة ‪ Tools‬ومن ثم ‪serial‬‬
‫‪ Port‬كما هو موضح في الشكلين (‪.)13-2( )12-2‬‬

‫‪39‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)12-2‬اختيار اسم اللوحة الصحيح‪ ،‬على سبيل المثال ‪.Arduino Uno‬‬

‫الشكل (‪ :)13-2‬اختيار رقم منفذ ‪ COM‬الصحيح‪ ،‬على سبيل المثال ‪.COM9‬‬

‫بعد ذلك نضغط ‪ Upload‬من شريط أدوات وظائف العامة المذكور في الفقرة (‪.)2-3-2‬‬
‫يضيء الثنائيان ‪ RX،TX‬في اللوحة للداللة على نقل الشيفرة إلى المتحكم الصغري الرئيسي‪ ،‬ويظهر‬
‫البرنامج رسالة بأن نقل الشيفرة تم بنجاح كما هو موضح في الشكل (‪.)14-2‬‬

‫الشكل (‪ :)14-2‬رسالة تحميل الشيفرة بنجاح‪.‬‬

‫‪41‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-4-2‬تشغيل الدارة‬
‫بعد االنتهاء من نقل الشيفرة البرمجية‪ ،‬ستعمل لوحة األردوينو مباشرة ما دامت متصلة مع‬
‫الحاسب عبر منفذ ‪ USB‬الذي يزودها بالطاقة الالزمة‪ ،‬ويمكن إزالة االتصال بينهما‪ ،‬وتشغيل اللوحة‬
‫عبر مصدر طاقة آخر كما تم ذكره سابقا في الفصل األول‪.‬‬

‫‪-5-2‬مبادئ كتابة الشيفرة البرمجية في بيئة التطوير ‪Arduino IDE‬‬


‫‪-1-5-2‬هيكلة كتابة الشيفرة البرمجية‬
‫يتم كتابة الشيفرة البرمجية وفق األسلوب والترتيب التالي‪:‬‬
‫>‪.h‬اسم مكتبة ما مطلوبة< ‪#include‬‬
‫التصريح عن متغيرات وثوابت عامة‬

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

‫‪void ……….‬‬
‫{‬
‫التصريح عن متغيرات وثوابت محلية‬
‫يتم هنا كتابة تعليمات البرنامج الفرعي‬
‫}‬

‫‪ -2-5-2‬التصريح عن المتغيرات والمصفوفات والثوابت‬


‫‪ -1-2-5-2‬التصريح عن المتغيرات‬
‫يستخدم التصريح أو اإلعالن عن المتغيرات إلعطاء اسم لقيمة متغيرة‪ .‬وهذا ما يتم من خالل‬
‫حجز موقع أو عدة مواقع ضمن الذاكرة ‪ RAM‬للمتحكم‪ ،‬يتم فيها تخزين القيم المتغيرة‪.‬‬
‫الفرق بين المتغيرات العامة والمحلية‪ :‬المتغيرات العامة يتم التعامل معها ومشاهدتها في كل‬
‫البرنامج (برنامج اإلعداد ) (‪ ،setup‬البرنامج الرئيسي ) (‪ loop‬والبرامج الفرعي)‪ .‬المتغيرات المحلية‬
‫يتم التعامل معها ومشاهدتها فقط في البرنامج الذي تم تعريفها فيه‪.‬‬

‫‪41‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يتم التصريح عن المتغيرات في لغة ‪ C‬على الشكل التالي‪:‬‬
‫;‪Variable_type Variable_name‬‬
‫‪ : Variable_type‬نو ع أو نمط المتغير‪ :Variable_name .‬اسم المتغير‪.‬‬
‫يوضح الجدول (‪ )1-2‬أنماط المتغيرات ‪ Variable_type‬من أجل اللوحات التي تتضمن متحكم‬
‫‪ . ATMega‬من أجل البقية اللوحات يمكن زيارة الصفحة‬
‫‪.www.arduino.cc/en/Reference/HomePage‬‬

‫الجدول (‪ :)1-2‬أنماط تعريف المتغيرات‪.‬‬


‫مثال‬ ‫السعة‬ ‫المجال الذي يأخذه المتغير‬ ‫نمط المتغير‬
‫;‪boolean x‬‬ ‫‪1 Byte‬‬ ‫‪False،True‬‬ ‫‪boolean‬‬
‫;‪byte x‬‬ ‫‪1 Byte‬‬ ‫عدد صحيح من ‪ 0‬وحتى ‪255‬‬ ‫‪byte‬‬
‫;‪unsigned int x‬‬ ‫‪2 Byte‬‬ ‫عدد صحيح من ‪ 0‬وحتى ‪65535‬‬ ‫‪unsigned int‬‬
‫;‪int x‬‬ ‫‪2 Byte‬‬ ‫عدد صحيح من ‪ -32768‬إلى‬ ‫‪int‬‬
‫;‪short x‬‬ ‫‪32767‬‬ ‫‪short‬‬
‫;‪unsigned long x‬‬ ‫‪4 Byte‬‬ ‫‪232-1‬‬ ‫عدد صحيح من ‪ 0‬وحتى‬ ‫‪unsigned long‬‬
‫;‪long x‬‬ ‫‪4 Byte‬‬ ‫عدد صحيح من ‪ -231‬وحتى ‪231-1‬‬ ‫‪long‬‬
‫;‪float x‬‬ ‫‪4 Byte‬‬ ‫عدد حقيقي من‬ ‫‪float‬‬
‫;‪double x‬‬ ‫‪-3.4028235E+38‬‬ ‫‪double‬‬
‫وحتى ‪3.4028235E+38‬‬
‫;‪char x‬‬ ‫‪1 Byte‬‬ ‫حرف‬ ‫‪char‬‬

‫يتم إسناد القيم للمتغيرات باستخدام عالمة = ‪ .‬فيما يلي مثال على تعريف متغيرين ‪ y،x‬وإسناد‬
‫قيمة لكل منهما‪.‬‬

‫;‪byte x‬‬
‫;‪char y‬‬
‫‪//…….‬‬
‫;‪x=10‬‬
‫;'‪y='A‬‬

‫‪-2-2-5-2‬التصريح عن المصفوفات‬
‫المصفوفة هي مجموعة من المتغيرات التي يتم الوصول إليها برقم مفهرس‪ .‬تأخذ المصفوفة‬
‫في البرنامج بعد واحد‪ ،‬أو بعدين‪ ،‬ويمكن عدم تحديد حجمها‪ .‬يبين الجدول (‪ )2-2‬كيفية التصريح‬
‫عن هذه المصفوفات‪.‬‬

‫‪42‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ :)2-2‬التصريح عن المصفوفات‬

‫مثال‬ ‫كيفية التصريح عن المصفوفة‬ ‫نوع المصفوفة‬


‫;]‪byte x[5‬‬ ‫نمط عناصر المصفوفة‬ ‫]عدد العناصر[اسم المصفوفة‬ ‫;‬ ‫مصفوفة ببعد واحد‬
‫;]‪byte x[5][4‬‬ ‫نمط عناصر المصفوفة‬ ‫]عدد األعمدة[ ]عدد األسطر[اسم المصفوفة‬ ‫;‬ ‫مصفوفة ببعدين‬

‫يبين الجدول (‪ )3-2‬كيفية إسناد قيم للمصفوفات‬


‫الجدول (‪ :)3-2‬إسناد المصفوفات‬

‫كيفية إسناد قيم للمصفوفة‬ ‫نوع المصفوفة‬


‫; ]رقم العنصر[ اسم المصفوفة‬ ‫مصفوفة ببعد واحد‬
‫; ]رقم العمود[ ]رقم السطر[ اسم المصفوفة‬ ‫مصفوفة ببعدين‬

‫فيما يلي مثال على كيفية تصريح عن مصفوفتين ‪ x, y‬وإسناد قيم لهما‪.‬‬

‫;]‪float x[5‬‬
‫;]‪byte y[5][4‬‬
‫‪//….‬‬
‫;‪x[0]=10.5‬‬
‫;‪y[0][0]=10‬‬
‫البد من اإلشارة إلى أن البرنامج يعطي تعريفا مختلفا للحروف الكبيرة ‪ capital‬عن الحروف‬
‫الصغيرة ‪ ،small‬فمثال ‪ X‬تختلف عن ‪ x‬في البرنامج‪.‬‬

‫‪-3-2-5-2‬التصريح عن الثوابت‬
‫تستخدم الثوابت إلعطاء اسم لقيمة ثابتة‪ .‬تختلف الثوابت عن المتغيرات في أن قيمتها تبقى‬
‫ثابتة وال تتغير (أي أنها للقراءة فقط)‪ .‬يتم التصريح عنها كما يلي‪:‬‬
‫;‪const const_type const_name=value‬‬
‫‪ :Const‬كلمة مفتاحية لإلشارة إلى التصريح عن ثابت‪.‬‬
‫‪ : const_type‬نمط الثابت‪ ،‬ويأخذ األنماط الموضحة في الجدول (‪.)1-2‬‬
‫‪ : const_name‬اسم الثابت‪.‬‬
‫‪ : Value‬قيمة الثابت‪.‬‬
‫مثال‪:‬‬
‫التصريح عن ثابت ‪const float pi = 3.14; //‬‬
‫;‪float x‬‬
‫‪// ....‬‬
‫استخدام صحيح للثابت ‪x = pi * 2; //‬‬
‫;‪pi = 7‬‬ ‫غير صحيح‪ ،‬ألنه ال يمكن تعديل الثابت ‪//‬‬

‫‪43‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫مالحظة‪ :‬هناك تعليمة ‪ #define‬أيضا تستخدم إلعطاء اسم لثابت‪ ،‬ولكن التصريح على شكل‬
‫‪ const‬أفضل من ‪.#define‬‬

‫‪-3-5-2‬كتابة األعداد الصحيحة‬


‫يتم ترميز األعداد بشكل ثنائي أو ثماني أو عشري أو ست عشري كما هو معلوم‪ .‬يبين الجدول‬
‫(‪ )4-2‬كيفية كتابة األعداد في البرنامج‪.‬‬
‫الجدول (‪ :)4-2‬كتابة األعداد‬
‫مثال‬ ‫كيفية كتابة العدد‬ ‫الترميز‬
‫‪B1111011‬‬ ‫أمام العدد نضع ‪B‬‬ ‫الثنائي‬
‫‪0173‬‬ ‫أمام العدد نضع ‪0‬‬ ‫الثماني‬
‫‪123‬‬ ‫يكتب العدد بشكل مباشر‬ ‫العشري‬
‫‪0x7B‬‬ ‫أمام العدد نضع ‪0x‬‬ ‫الست عشري‬

‫‪-4-5-2‬بنى التحكم‬
‫‪-1-4-5-2‬الحلقات‪:‬‬
‫تهدف إلى الحلقة إلى تكرار تنفيذ مجموعة من األوامر‪ ،‬ولها نوعان‪:‬‬
‫‪ ‬غير شرطية‪ :‬حلقة ‪.for‬‬
‫‪ ‬شرطية‪ :‬حلقة ‪.while‬‬

‫‪ -1-1-4-5-2‬حلقة ‪for‬‬
‫في هذه الحلقة يحدد المبرمج عدد مرات التكرار من خالل اختيار القيمة االبتدائية للعداد‬
‫والقيمة النهائية ومقدار تزايد أو تناقص العداد‪ .‬تكتب حلقة ‪ for‬من أجل تزايد المتغير ‪ x‬كما يلي‪:‬‬
‫) قفزة ‪ ; x = x +‬قيمة نهائية =<‪ ; x‬قيمة ابتدائية = ‪for ( x‬‬
‫} أوامر {‬
‫وتكتب حلقة ‪ for‬من أجل تناقص المتغير ‪ x‬كما يلي‪:‬‬
‫) قفزة‪ ; x = x -‬قيمة نهائية =>‪ ; x‬قيمة ابتدائية = ‪for ( x‬‬
‫} أوامر {‬
‫مثال ‪ :‬تكرار أوامر ‪ 10‬مرات‪.‬‬
‫)‪for (x=1;x<=10;x=x+1‬‬
‫} أوامر {‬
‫عندما يكون مقدار القفزة ‪ ،1‬يمكن عندئذ كتابة الحلقة للمثال السابق كما يلي‪:‬‬
‫)‪for (x=1;x<=10;x++‬‬
‫} أوامر {‬
‫‪44‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪ -2-1-4-5-2‬حلقة ‪: while‬‬
‫تتبع هذه الحلقة لشرط‪ ،‬ما دام هذا الشرط محققا تستمر أوامر الحلقة بالتنفيذ‪.‬‬
‫) شرط منطقي ( ‪while‬‬
‫} أوامر {‬
‫ما هو الشرط المنطقي ؟‬
‫هو عملية مقارنة تكون نتيجتها ‪ True‬أو ‪ ،False‬فعندما تكون النتيجة ‪ (1) True‬يتم تنفيذ‬
‫أوامر‪ ،while‬أما ‪ (0) False‬فال يتم تنفيذها ‪ .‬وأهم عمليات المقارنة ‪comparison operators‬‬
‫يبينها الجدول (‪.)5-2‬‬
‫الجدول (‪ :)5-2‬عمليات المقارنة‬
‫المعنى‬ ‫عملية المقارنة‬
‫‪ x‬تساوي ‪y‬‬ ‫‪x==y‬‬
‫‪ x‬ال تساوي ‪y‬‬ ‫‪x!=y‬‬
‫‪ x‬أصغر من ‪y‬‬ ‫‪x<y‬‬
‫‪ x‬أكبر من ‪y‬‬ ‫‪x>y‬‬
‫‪ x‬أصغر أو يساوي ‪y‬‬ ‫‪x<=y‬‬
‫‪ x‬أكبر أو يساوي ‪y‬‬ ‫‪x>=y‬‬

‫من الممكن أيضا دمج عمليتي مقارنة باستخدام ‪ AND‬من خالل &&‪ .‬مثال ‪A==3 && B!=8 :‬‬
‫‪A==3 || B!=8‬‬ ‫من الممكن أيضا دمج عمليتي مقارنة باستخدام ‪ OR‬من خالل ||‪ .‬مثال ‪:‬‬

‫‪-2-4-5-2‬تعليمة ‪ IF‬الشرطية‬
‫تهدف إلى تقييد تنفيذ أوامر بتحقق شرط معين‪ ،‬بمعنى أنه في حال تحقق الشرط المنطقي‬
‫يتم تنفيذ األوامر‪.‬‬
‫) شرط منطقي ( ‪if‬‬
‫} أوامر {‬
‫يمكن استخدام أيضا تركيبة ‪ . if / else‬في حال تحقق الشرط يتم تنفيذ األوامر بعد ‪ .if‬في‬
‫حال كون الشرط غير محقق يتم تنفيذ األوامر بعد ‪else‬‬
‫) شرط منطقي ( ‪if‬‬
‫} أوامر ‪{ A‬‬
‫‪else‬‬
‫} أوامر ‪{ B‬‬

‫‪45‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يمكن أيضا فحص عدة شروط منطقية‪ .‬في حال تحقق الشرط األول يتم تنفيذ األوامر بعد ‪.if‬‬
‫في حال تحقق الشرط الثاني يتم تنفيذ األوامر بعد ‪ ...... ،else if‬في حال عدم تحقق أي شرط يتم‬
‫تنفيذ األوامر بعد ‪.else‬‬
‫) شرط منطقي ( ‪if‬‬
‫} أوامر ‪{ A‬‬
‫) شرط منطقي ( ‪else if‬‬
‫} أوامر ‪{ B‬‬
‫‪else‬‬
‫} أوامر ‪{ C‬‬

‫‪ -3-4-5-2‬تعليمة القفز ‪goto‬‬


‫الهدف من هذه التعليمة االنتقال من الموقع الحالي للبرنامج إلى موقع آخر‬
‫‪label:‬‬

‫;‪goto label‬‬ ‫القفز إلى الموقع ‪// label‬‬

‫‪ -5-5-2‬التعليقات ‪Comments‬‬
‫تستخدم التعليقات لكي تعلم المبرمج أو اآلخرين بكيفية عمل البرنامج‪ .‬يتم تجاهلها من قبل‬
‫المترجم‪ ،‬وال يتم تنفيذها من قبل المعالج‪ ،‬لذلك فهي ال تأخذ أي مساحة من ذاكرة برنامج المتحكم‬
‫الصغري‪ .‬يوجد طريقتان إلضافة التعليقات ‪:‬‬
‫تعليق على سطر واحد‪ :‬يتم استخدام العالمة ‪ //‬كما هو موضح في المثال التالي‪:‬‬
‫;‪x = 5‬‬ ‫‪// This is a single line comment.‬‬
‫تعليق متعدد األسطر‪ :‬تستخدم العالمة *‪ /‬في البداية‪ ،‬والعالمة ‪ */‬في النهاية كما في المثال‬
‫التالي‪:‬‬
‫‪/* this is multiline comment‬‬
‫‪Don't forget closing the comment‬‬
‫‪*/‬‬

‫‪-6-5-2‬تعليمة التأخير الزمني‬


‫تهدف تعليمة التأخير الزمني إلى إيقاف تنفيذ البرنامج بشكل مؤقت ولفترة زمنية محددة‪ .‬يوجد‬
‫تعليمتان‪ :‬األولى تقدم تأخيرا زمنيا بالميلي ثانية‬
‫;)‪delay(value‬‬
‫حيث ‪ value‬تأخذ مجال ‪. Unsigned long‬‬

‫‪46‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫التعليمة الثانية تقدم تأخيرا بالميكرو ثانية‪.‬‬
‫;)‪delaymicroseconds(value‬‬
‫حيث ‪ value‬تأخذ مجال ‪. Unsigned int‬‬

‫مثال من أجل إيقاف تنفيذ البرنامج لمدة ثانية فإن تعليمة التأخير الزمني هي‪:‬‬
‫;)‪delay(1000‬‬

‫‪ -7-5-2‬البرنامج الفرعي‬
‫عندما تحتاج إلى تنفيذ أوامر عدة مرات‪ ،‬يمكن كتابتها في برنامج فرعي منفصل خارج‬
‫البرنامج الرئيسي )(‪ ،loop‬ومن ثم يتم استدعائها في كل مرة‪ .‬تساعد البرامج الفرعية في تقليل‬
‫نسبة استخدام ذاكرة البرنامج‪ ،‬وتقلل الوقت المطلوب لكتابة الشيفرة‪ ،‬وتجعل الشيفرة البرمجية‬
‫المكتوبة مرتبة وأكثر وضوحا‪ .‬يوجد نمطان للبرامج الفرعية المستخدمة‪ :‬إجرائية ‪ Procedure‬أو‬
‫تابع ‪.function‬‬

‫‪ -1-7-5-2‬البرامج الفرعية على شكل إجرائية ‪Procedure‬‬


‫تبدأ بكلمة ‪ void‬وال تعيد أية قيمة‪ .‬ويتم كتابتها واستدعاؤها على الشكل التالي‪:‬‬
‫)‪ ………….‬اسم المتغير نمط المتغير ( اسم البرنامج الفرعي ‪Void‬‬ ‫البرنامج الفرعي ‪//‬‬
‫{‬
‫التصريح عن متغيرات محلية‬
‫جسم البرنامج الفرعي‬
‫}‬
‫استدعاء البرنامج الفرعي ‪( ;……… //‬قيمة يراد تمريرها للبرنامج الفرعي ( اسم البرنامج الفرعي‬

‫مثال ‪ :‬برنامج فرعي لضرب عددين بدون إعادة الناتج‪.‬‬


‫{ )(‪void loop‬‬
‫;)‪Multiply(2,3‬‬
‫}‬
‫{)‪void Multiply(int x, int y‬‬
‫;‪result = x * y‬‬
‫}‬

‫‪ -2-7-5-2‬البرامج الفرعية على شكل تابع ‪function‬‬


‫تبدأ بنمط القيمة المستعادة (الجدول (‪ ،))1-2‬وتنتهي بـ ‪ ،Return‬لتعيد قيمة ما‪ ،‬ويتم كتابتها‬
‫واستدعاؤها على الشكل التالي‪:‬‬

‫‪47‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫نمط القيمة المستعادة‬ ‫نوع المتغير ( اسم البرنامج الفرعي‬ ‫)‪ ………….‬اسم المتغير‬
‫{‬
‫التصريح عن متغيرات تظهر في البرنامج الفرعي فقط‬
‫جسم البرنامج الفرعي‬
‫)القيمة المستعادة ‪-‬قد يكون متغير‪Return ( -‬‬
‫}‬

‫استدعاء البرنامج الفرعي ‪( ;… //‬قيمة يراد تمريرها للبرنامج الفرعي ( اسم البرنامج الفرعي = ‪Value‬‬

‫مثال ‪ :‬برنامج فرعي لضرب عددين ويعيد الناتج‪.‬‬


‫{ )(‪void loop‬‬
‫;‪int k‬‬
‫;)‪k = Multiply(2,3‬‬ ‫‪// k now contains 6‬‬
‫}‬

‫{)‪int Multiply(int x, int y‬‬


‫;‪int result‬‬
‫;‪result = x * y‬‬
‫;‪return result‬‬
‫}‬

‫‪48‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الفصل الثالث‪ :‬التطبيقات العملية‬


‫الثنائيات الضوئية ‪LEDs‬‬
‫‪-1-1-3‬مقدمة‬
‫سنبدأ في هذا الجزء تنفيذ أول دارة عملية بسيطة للتحكم بتشغيل وإطفاء ثنائيات ضوئية‬
‫‪ LEDs‬من خالل لوحة األردوينو‪ .‬ذكرنا سابقا أن للوحة عدة مخارج رقمية يمكن من خاللها إخراج ‪1‬‬
‫منطقي (يكافئ ‪ +5V‬للوحة التي تعمل بنفس الجهد)‪ ،‬و‪ 1‬منطقي (يكافئ ‪ .)0V‬بالتالي عند وصل‬
‫ثنائيات ضوئية إلى هذه المخارج سنتمكن من التحكم بها‪ .‬سنتعلم في الجزء التالي تعليمات اإلدخال‬
‫واإلخراج الرقمية في بيئة التطوير ‪ ،Arduino IDE‬وبعد ذلك ننتقل إلى األمثلة والتطبيق العملي‪.‬‬

‫‪-2-1-3‬تعليمات الدخل والخرج الرقمية ‪Digital I/O‬‬


‫)‪pinMode(pin,mode‬‬
‫تستخدم هذه التعليمة لتحديد رجل معينة كدخل أو خرج‪ ،‬أو دخل مع تفعيل لمقاومة السحب‬
‫الداخلية‪.internal pull-up resistor‬‬
‫‪ :Pin‬رقم الرجل المطلوب ضبط نمطها‪.‬‬
‫‪ :mode‬تأخذ إحدى القيم التالية ‪ INPUT_PULLUP، OUTPUT،INPUT‬لتحديد نمط الرجل دخل‪،‬‬
‫خرج‪ ،‬دخل مع تفعيل مقاومة السحب‪.‬‬

‫)‪digitalWrite(pin,value‬‬
‫يتم من خالل هذه التعليمة إخراج ‪ 1‬منطقي‪ ،‬أو ‪ 0‬منطقي على رجل محددة‪ .‬جهد ‪ 1‬منطقي ‪ +5V‬من‬
‫أجل لوحات ‪ ،+5V‬وجهد ‪ 0‬منطقي ‪.0V‬‬
‫‪ :Pin‬رقم الرجل المطلوب اإلخراج عليها‪.‬‬
‫‪ :value‬تأخذ إحدى القيمتين التاليتين‪( LOW :‬يمكن كتابة ‪ 0‬عوضا عنها)‪( HIGH ،‬يمكن كتابة ‪1‬‬
‫عوضا عنها) إلخراج ‪ 0‬منطقي أو ‪ 1‬منطقي‪.‬‬
‫مالحظة‪ :‬من المفروض أن هذه التعليمة تستخدم مع تعليمة ‪ pinMode‬بحيث يكون بارامتر ‪mode‬‬
‫يساوي ‪ .OUTPUT‬ولكن بفرض أن ‪ mode‬يساوي ‪ INPUT‬عندئذ فإن تعليمة ‪ digitalWrite‬ستعمل‬
‫على تفعيل أو عدم تفعيل مقاومة السحب تبعا لقيمة ‪ value‬تساوي ‪ HIGH‬أو ‪ .LOW‬على كل حال‬
‫من األفضل تفعيل مقاومة السحب من خالل تعليمة ‪ pinMode‬كما تم ذكره سابقا‪.‬‬

‫)‪digitalRead(pin‬‬
‫يتم من خالل هذه التعليمة قراءة حالة رجل محددة وتعيد إحدى القيمتين التاليتين ‪ HIGH‬أو‬
‫‪ .LOW‬الجهد األعلى من ‪ 3V‬من أجل لوحات ‪ +5V‬يتم اعتباره ‪.HIGH‬‬
‫‪ :Pin‬رقم رجل اإلدخال الرقمية‪.‬‬

‫‪49‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪ -3-1-3‬التطبيقات العملية‬
‫‪-1-3-1-3‬تشغيل وإطفاء ثنائي ضوئي بشكل متكرر ‪Blinking LED‬‬
‫يوضح الشكل (‪ )1-3‬الدارة العملية لتشغيل وإطفاء ثنائي ضوئي عن طريق لوحة أردوينو‬
‫أونو‪ .‬تم وصل مصعد الثنائي إلى الرجل ذات الرقم ‪ 2‬للوحة عن طريق مقاومة قيمتها ‪ ،220Ω‬ومهبط‬
‫الثنائي تم وصله إلى أرضي اللوحة‪ .‬تبعا لذلك عندما نطبق ‪ 1‬منطقي )‪ (+5V‬على الرجل ‪ 2‬للوحة‬
‫سيضيئ الثنائي‪ ،‬وعندما نطبق ‪ 0‬منطقي سينطفئ الثنائي‪ .‬بتكرار تطبيق ‪ 1‬و‪ 0‬على الرجل ‪2‬‬
‫سنالحظ أن الثنائي سيضيئ وينطفئ بشكل متكرر‪ ،‬مع ترك فاصل زمني بينهما‪.‬‬

‫الشكل (‪ :)1-3‬الدارة العملية لتشغيل وإطفاء ثنائي ضوئي بشكل متكرر‪.‬‬

‫‪-1-1-3-1-3‬الكود البرمجي‬
‫)(‪void setup‬‬
‫{‬
‫;)‪pinMode(2,OUTPUT‬‬ ‫تفعيل الرجل ‪ 2‬على أنها خرج ‪//‬‬
‫}‬

‫)(‪void loop‬‬
‫{‬
‫;)‪digitalWrite(2,HIGH‬‬ ‫إخراج ‪ 1‬منطقي على الرجل ‪// 2‬‬
‫;)‪delay(1000‬‬ ‫تأخير زمني لمدة ثانية ‪//‬‬
‫;)‪digitalWrite(2, LOW‬‬ ‫إخراج ‪ 1‬منطقي على الرجل ‪// 2‬‬
‫;)‪delay(1000‬‬ ‫تأخير زمني لمدة ثانية ‪//‬‬
‫}‬
‫‪51‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-1-3-1-3‬محاكاة تشغيل وإطفاء ثنائي ضوئي من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)2-3‬محاكاة دارة تشغيل وإطفاء ثنائي ضوئي من خالل برنامج ‪.Proteus‬‬

‫‪-2-3-1-3‬تشغيل وإطفاء مجموعة ثنائيات ضوئية ‪LEDs‬‬


‫يوضح الشكل (‪ )3-3‬الدارة العملية لتشغيل وإطفاء مجموعة ثنائيات ضوئية ‪ LEDs‬عن‬
‫طريق لوحة أردوينو أونو‪ .‬لسوء الحظ ال يوجد تعليمة جاهزة في برنامج ‪ Arduino IDE‬تمكننا من‬
‫التعامل مع بوابة (عدة أرجل) معا إلخراج قيمة ما‪ .‬الحل يكون بكتابة برنامج فرعي يؤدي تلك‬
‫الوظيفة‪ .‬لنسمي هذا البرنامج )‪ ،PORTA(value‬ويعمل على إخراج القيمة ‪ value‬على األرجل‬
‫الرقمية من ‪ 0‬وحتى ‪ 7‬للوحة األردوينو‪ .‬تكتب القيمة ‪ value‬بـ ‪ 8‬بتات‪ ،‬تمثل الخانة األقل أهمية‬
‫الرجل ‪ 0‬وهكذا‪ .‬طريقة كتابة القيمة ‪ value‬تم ذكره في فقرة كتابة األعداد‪ .‬كود البرنامج الفرعي‬
‫)‪ PORTA(value‬هو‬
‫)‪void PORTA(byte value‬‬
‫{‬
‫;‪byte i‬‬
‫)‪for(i=0;i<=7;i++‬‬
‫};))‪{digitalWrite(i,bitRead(value,i‬‬
‫}‬

‫‪51‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫مالحظات على البرنامج‪:‬‬
‫‪ ‬تم تعريف ‪ value‬وفق النمط ‪ byte‬ألن قيمته تأخذ ‪. 8 bit‬‬
‫‪ ‬التعليمة )‪ bitRead(value,i‬تعمل على قراءة البت ذي الرقم ‪ i‬من العدد ‪ ،value‬والنتيجة‬
‫بالتأكيد ستكون إما ‪ 0‬أو ‪.1‬‬
‫‪ ‬يعمل البرنامج كما يلي‪ :‬مع أول قيمة ‪ ،i=0‬يكون لدينا ))‪digitalWrite(0,bitRead(value,0‬‬
‫‪ ،‬وهذا ما يسمح بإخراج قيمة البت ذي الرقم ‪( 0‬الخانة األقل أهمية) على الرجل الرقمية ‪0‬‬
‫للوحة األردوينو‪ .‬يكرر نفس األسلوب لبقية األرجل الرقمية‪.‬‬

‫الشكل (‪ :)3-3‬الدارة العملية لتشغيل وإطفاء مجموعة ثنائيات ضوئية بشكل متكرر‪.‬‬

‫‪-1-2-3-1-3‬الكود البرمجي‬
‫()‪void setup‬‬
‫{‬
‫;‪byte i‬‬
‫)‪for(i=0;i<=7;i++‬‬ ‫تفعيل األرجل من ‪ 1‬وحتى ‪ 7‬كمخارج ‪//‬‬
‫};)‪{pinMode(i,OUTPUT‬‬
‫}‬

‫() ‪void loop‬‬


‫{‬
‫;)‪PORTA(B11111111‬‬ ‫استدعاء البرنامج الفرعي إلخراج ‪ 1‬منطقي على كل األرجل ‪//‬‬

‫;)‪delay(1000‬‬ ‫تأخير زمني لمدة ثانية ‪//‬‬


‫;)‪PORTA(B00000000‬‬ ‫استدعاء البرنامج الفرعي إلخراج ‪ 1‬منطقي على كل األرجل‪//‬‬
‫;)‪delay(1000‬‬ ‫تأخير زمني لمدة ثانية ‪//‬‬
‫}‬
‫‪52‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫)‪void PORTA(byte value‬‬ ‫برنامج فرعي إلخراج قيمة على األرجل من ‪ 1‬وحتى ‪// 7‬‬
‫{‬
‫;‪byte i‬‬
‫)‪for(i=0;i<=7;i++‬‬
‫};))‪{digitalWrite(i,bitRead(value,i‬‬
‫}‬

‫‪-2-2-3-1-3‬محاكاة تشغيل وإطفاء مجموعة ثنائيات ضوئية من خالل برنامج‬


‫‪Proteus‬‬

‫الشكل (‪ :)4-3‬محاكاة دارة تشغيل وإطفاء مجموعة ثنائيات ضوئية من خالل برنامج ‪.Proteus‬‬
‫مالحظة هامة‪ :‬تتصل الرجل ‪ 0‬للمتحكم الرئيسي ‪ ATmega328‬مع رجل اإلرسال التسلسلية )‪(TX‬‬
‫للمتحكم الثانوي ‪ ،ATmega16U2‬حيث يرسل من خالل هذا الخط الكود البرمجي‪ .‬بالتالي عند تنفيذ‬
‫الوصل في الشكل (‪ )3-3‬ومن ثم تحميل الكود البرمجي عبر بيئة التطوير ‪ Arduino IDE‬سيحدث‬
‫خطأ في عملية نقل الكود وستظهر رسالة خطأ‪ .‬لتفادي ذلك يمكن أن يتم تحميل الكود البرمجي في‬
‫البداية من دون وصل السلك ما بين الرجل ‪ 0‬والمقاومة‪ ،‬وبعد االنتهاء من التحميل يتم إعادة السلك‪.‬‬
‫أو يمكن استخدام رجل رقمية أخرى غير الرجل ‪ 0‬وعندئذ يمكن تحميل الكود من دون أية مشاكل‪.‬‬

‫‪-3-3-1-3‬التحكم بثنائيات ضوئية من خالل مفاتيح الكترونية‬


‫في هذه الفقرة تم ربط أربعة مفاتيح الكترونية مع األرجل من ‪ 1‬وحتى ‪ 3‬للوحة‪ ،‬والتي‬
‫ستعمل تبعا لذلك كمداخل رقمية‪ ،‬وتم ربط أربعة ثنائيات ضوئية مع األرجل من ‪ 4‬وحتى ‪ 7‬كما هو‬
‫موضح في الشكل (‪ .)5-3‬كل مفتاح من المفاتيح األربعة يتحكم بتشغيل وإطفاء ثنائي ضوئي‪.‬‬

‫‪53‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)5-3‬الدارة العملية لتشغيل وإطفاء ثنائيات ضوئية من خالل مفاتيح الكترونية‬
‫تم تفعيل مقاومة السحب ‪ Pull-up‬الداخلية لكل رجل من أرجل الدخل من ‪ 0‬وحتى ‪ 3‬بحيث‬
‫عندما يكون المفتاح بحالة ‪ OFF‬تكون رجل الدخل مطبق عليها ‪ 1( +5V‬منطقي) بسبب مقاومة‬
‫السحب‪ ،‬وعندما يكون المفتاح بحالة ‪ ON‬تكون الرجل متصلة مع األرضي (‪ 1‬منطقي) كما هو موضح‬
‫في الشكل (‪.)6-3‬‬

‫الشكل (‪ :)6-3‬تفعيل مقاومة السحب الداخلية وربط مفتاح الكتروني إلى رجل الدخل الرقمية‪.‬‬

‫‪-1-3-3-1-3‬الكود البرمجي‬
‫{ )(‪void setup‬‬
‫;‪byte i‬‬
‫)‪for (i = 0; i <= 3; i++‬‬
‫};)‪{ pinMode(i, INPUT_PULLUP‬‬
‫)‪for (i = 4; i <= 7; i++‬‬
‫} ;)‪{ pinMode(i, OUTPUT‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪boolean x1, x2, x3, x4‬‬
‫;)‪x1 = digitalRead(0‬‬
‫;)‪x2 = digitalRead(1‬‬
‫‪54‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
x3 = digitalRead(2);
x4 = digitalRead(3);
if (x1 == HIGH) {
digitalWrite(4, HIGH);
} else {
digitalWrite(4, LOW);
}
if (x2 == HIGH) {
digitalWrite(5, HIGH);
} else {
digitalWrite(5, LOW);
}
if (x3 == HIGH) {
digitalWrite(6, HIGH);
} else {
digitalWrite(6, LOW);
}
if (x4 == HIGH) {
digitalWrite(7, HIGH);
} else {
digitalWrite(7, LOW);
}
}

‫محاكاة التحكم بثنائيات ضوئية من خالل مفاتيح الكترونية من خالل‬-2-3-3-1-3


Proteus ‫برنامج‬

.Proteus ‫ محاكاة دارة التحكم بثنائيات ضوئية من خالل برنامج‬:)7-3( ‫الشكل‬

55
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫السبع قطع الضوئية ‪7-Segment‬‬

‫‪-1-2-3‬مقدمة‬
‫السبع قطع ضوئية هي عبارة عن سبع ثنائيات ضوئية تم ترتيبها بطريقة يمكن من خاللها‬
‫إظهار األرقام‪ .‬للسبع قطع ضوئية نمطان كما هو موضح في الشكل (‪.)8-3‬‬
‫مهبط مشترك ‪ :common cathode‬تتصل فيها مهابط الثنائيات معا‪ .‬تتمثل نقطة الوصل المشتركة‬
‫بالرجل ‪ k‬في األعلى واألسفل في الشكل (‪ .)a-8-3‬تعمل السبع قطع في هذه الحالة من خالل وصل‬
‫إحدى األرجل ‪ K‬إلى ‪( 0V‬أي تطبيق ‪ 0V‬على مهابط الثنائيات)‪ ،‬ويتم إضاءة كل ثنائي ضوئي على‬
‫حدى من خالل تطبيق ‪ +5V‬على الرجل الخاصة به ‪. g ،f،e،d،c،b،a‬‬
‫مصعد مشترك ‪ :common anode‬تتصل فيها مصاعد الثنائيات معا‪ .‬تتمثل نقطة الوصل المشتركة‬
‫بالرجل ‪ k‬في األعلى واألسفل في الشكل (‪ .)b-8-3‬تعمل السبع قطع في هذه الحالة من خالل وصل‬
‫إحدى األرجل ‪ K‬إلى ‪( +5V‬أي تطبيق ‪ +5V‬على مصاعد الثنائيات)‪ ،‬ويتم إضاءة كل ثنائي ضوئي‬
‫على حدى من خالل تطبيق ‪ 0V‬على الرجل الخاصة به ‪. g ،f،e،d،c،b،a‬‬
‫يوجد ثنائي ضوئي إضافي ‪ dp‬يضيء كنقطة‪.‬‬

‫)‪(a‬‬ ‫)‪(b‬‬
‫الشكل (‪ :)8-3‬السبع قطع ضوئية‪ (a) ،‬مهبط مشترك‪ (b) ،‬مصعد مشترك‪.‬‬

‫‪-2-2-3‬إظهار األرقام على السبع قطع ضوئية ذات نمط مهبط مشترك‬
‫استنادا لما تم ذكره في الفقرة (‪ ، )1-2-3‬إلظهار الرقم ‪ 0‬مثال على السبع قطع ضوئية ذات‬
‫نمط مهبط مشترك البد من تطبيق ‪ 1‬منطقي على األرجل ‪ f،e،d،c،b،a‬للسبع قطع ضوئية‪ ،‬و‪ 1‬منطقي‬
‫على الرجل ‪ .g‬يطبق نفس األسلوب لبقية األرقام‪ .‬يوضح الجدول (‪ )1-3‬القيم المطلوب تطبيقها على‬
‫األرجل ‪ g،f،e،d،c،b،a‬إلظهار األرقام من ‪ 0‬وحتى ‪.9‬‬

‫‪56‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ :)1-3‬شيفرات األرقام من ‪ 0‬وحتى ‪ 9‬للسبع قطع ضوئية‬

‫‪g‬‬ ‫‪f‬‬ ‫‪e‬‬ ‫‪d‬‬ ‫‪c‬‬ ‫‪b‬‬ ‫‪a‬‬ ‫الرقم‬


‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫لنقم اآلن بوصل لوحة األردوينو مع السبع قطع ضوئية كما هو موضح في الشكل (‪ )9-3‬حيث‬
‫تتصل الرجل ‪ 1‬للوحة مع الرجل ‪ a‬للسبع قطع‪ ،‬والرجل ‪ 1‬مع الرجل ‪....b‬وهكذا‪ .‬رجل التفعيل ‪K‬‬
‫(الرجل المشتركة) يتم وصلها لألرضي‪ .‬إذا قمنا بإخراج شيفرات األرقام الموضحة في الجدول (‪)1-3‬‬
‫على األرجل من ‪ 0‬وحتى ‪ 6‬للوحة األردوينو‪ ،‬ستعد السبع قطع األرقام من ‪ 0‬وحتى ‪.9‬‬

‫‪57‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)9-3‬الدارة العملية لربط لوحة األردوينو مع السبع قطع ضوئية‪.‬‬

‫‪-1-2-2-3‬الكود البرمجي‬
‫{ )(‪void setup‬‬
‫;‪byte i‬‬
‫)‪for (i = 0; i <= 6; i++‬‬ ‫تفعيل األرجل من ‪ 1‬وحتى ‪ 6‬كمخارج ‪//‬‬
‫{‬
‫;)‪pinMode(i,OUTPUT‬‬
‫}‬
‫}‬

‫{ )(‪void loop‬‬
‫;)‪PORTA(B0111111‬‬ ‫إخراج شيفرة الرقم ‪// 1‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B0000110‬‬ ‫إخراج شيفرة الرقم ‪// 1‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B1011011‬‬ ‫إخراج شيفرة الرقم ‪// 2‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B1001111‬‬ ‫إخراج شيفرة الرقم ‪// 3‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B1100110‬‬ ‫إخراج شيفرة الرقم ‪// 4‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B1101101‬‬ ‫إخراج شيفرة الرقم ‪// 5‬‬
‫;)‪delay(1000‬‬
‫‪58‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫;)‪PORTA(B1111101‬‬ ‫إخراج شيفرة الرقم ‪// 6‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B0000111‬‬ ‫إخراج شيفرة الرقم ‪// 7‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B1111111‬‬ ‫إخراج شيفرة الرقم ‪// 8‬‬
‫;)‪delay(1000‬‬
‫;)‪PORTA(B1101111‬‬ ‫إخراج شيفرة الرقم ‪// 9‬‬
‫;)‪delay(1000‬‬
‫}‬

‫برنامج فرعي إلخراج قيمة على األرجل من ‪ 1‬وحتى ‪void PORTA(byte value) // 6‬‬
‫{‬
‫;‪byte i‬‬
‫)‪for (i = 0; i <= 6; i++‬‬
‫{‬
‫;))‪digitalWrite(i,bitRead(value,i‬‬
‫}‬
‫}‬

‫‪-2-2-2-3‬محاكاة إظهار أرقام على سبع قطع ضوئية باستخدام برنامج ‪.Proteus‬‬

‫الشكل (‪ :)11-3‬محاكاة دارة السبع قطع ضوئية من خالل برنامج ‪.Proteus‬‬

‫‪59‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3-2-3‬إظهار أرقام من خالل عدة أجزاء سبع قطع ضوئية‬


‫يتم وصل قطعتي سبع ثنائيات ضوئية إلظهار رقمين كما هو موضح بالشكل (‪ .)11-3‬بفرض‬
‫أن القطعتين من نمط مهبط مشترك‪ ،‬وتم وصل كل من ‪ ،K1‬و‪ K2‬إلى األرضي‪ ،‬عندئذ عند تطبيق‬
‫شيفرة رقم ما عن طريق ‪ g،f،e،d،c،b،a‬فإن الرقم سيظهر على القطعتين بنفس الوقت‪ ،‬وال يمكن‬
‫إظهار رقمين مختلفين وفق هذا األسلوب‪ .‬حل تلك المشكلة بأن يتم وصل ‪ K1‬و ‪ K2‬إلى منفذي خرج‬
‫رقميين للوحة األردوينو‪ ،‬ونطبق الخطوات التالية‪:‬‬
‫‪-1‬نضع ‪ 0V‬على الرجل ‪( K1‬تفعيل السبع قطع األولى)‪ ،‬و نضع ‪ 5V‬على الرجل ‪( K2‬إلغاء تفعيل السبع‬
‫قطع الثانية)‪ ،‬بعد ذلك نرسل شيفرة الرقم المطلوب إظهاره على السبع قطع األولى على األرجل‬
‫‪.g،f،e،d،c،b،a‬‬
‫‪-2‬نضع ‪ 5V‬على الرجل ‪( K1‬إلغاء تفعيل السبع قطع األولى)‪ ،‬و نضع ‪ 0V‬على الرجل ‪( K2‬تفعيل السبع‬
‫قطع الثانية)‪ ،‬بعد ذلك نرسل شيفرة الرقم المطلوب إظهاره على السبع قطع الثانية على األرجل‬
‫‪.g،f،e،d،c،b،a‬‬
‫‪-3‬نكرر الخطوتين السابقتين بشكل سريع‪ ،‬ليظهر العدد المطلوب إظهاره على قطعتي السبع ثنائيات‬
‫ضوئية بدون أن تالحظ العين تبديل اإلظهار من واحدة ألخرى وهذا يعود لعملية المسح السريعة‪.‬‬
‫يبين الشكل (‪ )12-3‬كيفية تنفيذ الخطوات السابقة بحيث نشاهد الرقم على كلتا الخانتين‪.‬‬

‫الشكل (‪ :)11-3‬وصل قطعتي سبع قطع ضوئية‪.‬‬

‫الشكل (‪ :)12-3‬إظهار عدد على خانتين سبع قطع‪ .‬يتم تفعيل الخانة األولى وإظهار رقم عليها‪ ،‬ثم يتم تفعيل‬
‫الخانة الثانية وإظهار الرقم اآلخر‪ ،‬بتكرار العملية سريعا يظهر العدد من دون أن تالحظ العين عملية التبديل‪.‬‬
‫‪61‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫إذا كانت القطعتان نمط مصعد مشترك يتم تفعيل الواحدة منهما عن طريق تطبيق ‪ ،5V‬وإلغاء‬
‫التفعيل عن طريق ‪.0V‬‬
‫يبين الشكل (‪ )13-3‬كيفية توز ع األرجل ‪ A,B,C,D,E,F,G,dp‬وأرجل التفعيل ‪K1, K2….‬‬
‫لمجموعة سبع قطع ضوئية بخانتين وأربع خانات متوفرة باألسواق‪( .‬من الممكن وجود توزيع آخر‪،‬‬
‫ويتم الكشف وتحديد األرجل باستخدام مقياس اآلفو باختيار قياس الديود)‪.‬‬

‫الشكل (‪ :)13-3‬توز ع األرجل ‪ A,B,C,D,E,F,G,dp‬وأرجل التفعيل ‪ 1, 2….‬لمجموعة سبع قطع ضوئية‬


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

‫‪-1-3-2-3‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بإظهار عدة قطع سبع ضوئية‪ ،‬سنستخدم إحدى المكتبات‬
‫المتوفرة على شبكة االنترنت‪ ،‬وهي المكتبة ‪ SevSeg‬الموجودة أيضا ضمن الملفات المرفقة مع هذا‬
‫الكتاب التي يمكن تحميلها من الموقع‬
‫‪http://www.mediafire.com/file/4zo1dcc678js1ae/examples+libraries.rar/file‬‬
‫بعد ذلك نختار من األعلى ‪ Sketch‬ثم ‪ Include Library‬ثم ‪ Add .ZIP Library‬كما هو موضح في‬
‫الشكل (‪ .(14-3‬تظهر نافذة إضافة مكتبة‪ ،‬نختار الملف ‪ SevSeg.zip‬الذي قمنا بتحميله في الخطوة‬
‫السابقة‪.‬‬

‫الشكل (‪ :)14-3‬إضافة مكتبة لبرنامج ‪.Arduino IDE‬‬

‫‪61‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بعد االنتهاء من هذه الخطوة نالحظ أنه قد تم إضافة مكتبة ‪ SevSeg‬لبرنامج ‪ Arduino IDE‬كما هو‬
‫موضح في الشكل (‪.)15-3‬‬

‫الشكل (‪ :)15-3‬إضافة مكتبة ‪.SevSeg‬‬

‫لكتابة كود برمجي باستخدام المكتبة السابقة‪ ،‬نقوم باتبا ع الخطوات التالية‪:‬‬
‫‪-1‬نقوم في البداية باستدعاء المكتبة في بداية البرنامج قبل ) ( ‪ void setup‬كما يلي‪:‬‬
‫>‪#include <SevSeg.h‬‬

‫‪-2‬نعرف كائن لنسميه مثال ‪ sevseg‬بعد استدعاء المكتبة مباشرة كما يلي‪:‬‬
‫;‪SevSeg sevseg‬‬

‫‪-3‬بعد ذلك نقوم بإعداد االتصال ما بين لوحة األردوينو والسبع قطع المتعددة داخل )( ‪void setup‬‬
‫كما يلي‪:‬‬
‫أ‪-‬ندخل عدد خانات مجموعة السبع قطع ضوئية‪ .‬على سبيل المثال إذا كانت المجموعة أربع خانات‬
‫نكتب ما يلي‪:‬‬
‫;‪byte numDigits = 4‬‬
‫‪62‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫ب‪-‬يتم تحديد أرجل األردوينو التي سترتبط مع األرجل المشتركة ‪ K1,K2,K3,K4‬لمجوعة السبع‬
‫قطع‪ .‬على سبيل المثال إذا تم ربط األرجل المشتركة مع األرجل الرقمية ‪ 2, 3, 4, 5‬نكتب ما يلي‪:‬‬
‫;}‪byte digitPins[]= {2, 3, 4, 5‬‬
‫ج‪-‬يتم تحديد أرجل األردوينو التي سترتبط مع األرجل ‪ . a,b,c,d,e,f,g,dp‬على سبيل المثال إذا تم‬
‫ربط األرجل ‪ a,b,c,d,e,f,g,dp‬مع األرجل الرقمية ‪ 6,7,8,9,10,11,12,13‬للوحة األردوينو على‬
‫الترتيب‪ ،‬نكتب ما يلي‪:‬‬
‫;}‪byte segmentPins[]={6, 7, 8, 9, 10, 11, 12, 13‬‬
‫د ‪-‬يتم تحديد نو ع المجموعة مهبط مشترك أم مصعد مشترك‪ .‬على سبيل المثال إذا كانت المجموعة‬
‫مهبط مشترك نكتب ما يلي‪:‬‬
‫;‪byte hardwareConfig = COMMON_CATHODE‬‬
‫يمكن اختيار المصعد المشترك بكتابة ‪COMMON_ANODE‬‬
‫هـ‪ -‬أخيرا نكتب تعليمة اإلعداد لكل ما سبق كما يلي‪:‬‬
‫;)‪sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins‬‬

‫‪-4‬نستخدم تعليمة ضبط السطو ع (التأخير الزمني بعد إضاءة كل قطعة)‪.‬‬


‫;)‪sevseg.setBrightness(X‬‬
‫حيث ‪ X‬قيمة ما بين ‪ 0‬و ‪ .100‬من أجل ‪ 0‬يكون التأخير الزمني يساوي ‪ ،1μs‬من أجل ‪ 100‬يكون‬
‫التأخير الزمني يساوي ‪.2000μs‬‬

‫‪-5‬لتحديد العدد المطلوب إظهاره نستخدم التعلمية‪:‬‬


‫;)‪sevseg.setNumber(number,decPlace‬‬
‫حيث ‪ number‬هو العدد المطلوب إظهاره‪ ،‬و ‪ decPlace‬مكان الفاصلة‪.‬‬
‫;)‪sevseg.setNumber(3141,3‬‬ ‫'‪// Displays '3.141‬‬
‫;)‪sevseg.setNumber(3141,0‬‬ ‫'‪// Displays '3141‬‬
‫تدعم التعليمة إدخال عدد حقيقي ‪ ،floats‬وعندئذ ‪ decPlace‬تحدد عدد األماكن العشرية للدقة‬
‫المطلوب عرضها‪.‬‬
‫'‪sevseg.setNumber(3.14159f,3); //Displays '3.141‬‬

‫‪-6‬لتحديد مجموعة أحرف مطلوب إظهارها نستخدم التعليمة‪:‬‬


‫;)‪Sevseg.setChars(X‬‬
‫حيث ‪ X‬مصفوفة المحارف المطلوب إظهارها بأكبر قدر ممكن من الدقة‪.‬‬
‫;)”‪Sevseg.setChars(“abcd‬‬

‫‪63‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-7‬تعليمة العرض‪:‬‬
‫;)(‪sevseg.refreshDisplay‬‬
‫البد من استدعاء وتنفيذ هذه التعليمة بشكل متكرر إلظهار الرقم أو الحرف الذي قمت بتحديده في‬
‫التعليمتين السابقتين‪ .‬أي تأخير زمني خارج هذه التعليمية سيؤدي إلى تأثيرات إظهار غير مرغوبة‪.‬‬

‫‪-8‬لمسح اإلظهار نستخدم التعليمة‪:‬‬


‫;)(‪sevseg.blank‬‬

‫مالحظة‪ :‬إذا كان المطلوب استخدام مجموعة سبع قطع عدد خاناتها أكثر من ‪ ،8‬البد من زيادة قيمة‬
‫‪ MAXNUMDIGITS‬في ملف ‪.SevSeg.h‬‬
‫سنكتب اآلن كودا إلظهار رقم على مجموعة سبع قطع مكونة من أربع خانات‪ .‬في البداية سنقوم‬
‫بوصل لوحة األردوينو مع المجموعة كما هو موضح في الشكل (‪ .)16-3‬استنادا لتوزيع األرجل‬
‫الموضحة في الشكل (‪ ،)13-3‬تم وصل األرجل ‪ a,b,c,d,e,f,g,dp‬مع األرجل الرقمية‬
‫‪ 6,7,8,9,10,11,12,13‬للوحة األردوينو على الترتيب‪ ،‬وتم وصل األرجل المشتركة ‪K1, K2, K3, K4‬‬
‫مع األرجل الرقمية ‪ .2, 3, 4, 5‬من األفضل إضافة مقاومات قيمتها بحدود ‪ 200Ω‬إلى ‪ 500Ω‬ما بين‬
‫األرجل الرقمية ‪ 6,7,8,9,10,11,12,13‬واألرجل ‪.a,b,c,d,e,f,g,dp‬‬

‫الشكل (‪ :)16-3‬وصل لوحة األردوينو مع مجموعة السبع قطع ضوئية بأربع خانات‪.‬‬
‫‪64‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫فيما يلي الكود الخاص بإظهار العدد ‪ .3.141‬يمكن تعميم هذا الكود الحقا إلظهار درجة الحرارة أو‬
‫المسافة أو التاريخ والوقت‪ ،‬وغير ذلك على مجموعة السبع قطع ضوئية‪.‬‬
‫>‪#include <SevSeg.h‬‬
‫;‪SevSeg sevseg‬‬

‫)(‪void setup‬‬
‫{‬
‫;‪byte numDigits = 4‬‬
‫;}‪byte digitPins[] = {2, 3, 4, 5‬‬ ‫‪//Digits: 1,2,3,4‬‬
‫;}‪byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13‬‬ ‫‪//Segments: A,B,C,D,E,F,G,dP‬‬
‫;‪byte hardwareConfig = COMMON_CATHODE‬‬ ‫‪// common cathode‬‬
‫;)‪sevseg.begin(hardwareConfig, numDigit s, digitPins, segmentPins‬‬
‫;)‪sevseg.setBrightness(10‬‬
‫;)‪sevseg.setNumber(3141,3‬‬
‫}‬

‫)(‪void loop‬‬
‫{‬
‫;)(‪sevseg.refreshDisplay‬‬
‫}‬

‫مالحظة‪ :‬عمليا من األفضل أن ال يتم وصل أرجل لوحة السبع قطع ضوئية بشكل مباشر مع أرجل‬
‫لوحة األردوينو خصوصا أرجل التفعيل ‪ .K‬وذلك ألن أرجل األردوينو الرقمية يجب أن ال يزيد التيار‬
‫المار في كل منها عن ‪ 20 mA‬كما تم ذكره في الفصل األول‪ ،‬في حين رجل التفعيل قد يمر من خاللها‬
‫تيار يزيد عن هذه القيمة خصوصا عندما تعمل كل ثنائيات السبع قطع‪ ،‬لذلك يمكن وصل الدارة‬
‫النموذجية الموضحة في الشكل (‪ .)17-3‬يعمل الترانزستور ‪ NPN‬كمفتاح ‪ ON/OFF‬الكتروني يتم‬
‫التحكم به من خالل رجل األردوينو‪ ،‬ويسمح بمرور التيار من خالله بدال من رجل األردوينو‪.‬‬

‫‪65‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)17-3‬الوصل النموذجي للوحة سبع قطع ضوئية من نمط مهبط مشترك ذات أربع خانات مع‬
‫أرجل األردوينو الرقمية‪.‬‬

‫‪66‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫مصفوفة الثنائيات الضوئية ‪Led Matrix‬‬


‫‪-1-3-3‬مقدمة‬
‫مصفوفة الثنائيات الضوئية هي عبارة عن مجموعة من الثنائيات الضوئية موزعة ضمن أسطر‬
‫وأعمدة (مصفوفة) ‪ ،‬تتصل الثنائيات الموجودة ضمن العمود الواحد بمصاعدها أو مهابطها وكذلك‬
‫األسطر‪ .‬يمكن من خالل مصفوفة الثنائيات الضوئية إظهار األرقام واألحرف أو حتى الرسم عليها‪،‬‬
‫لذلك كثيرا ما نجدها تستخدم في اللوحات اإلعالنية‪ .‬يوضح الشكل (‪ )18-3‬مصفوفة ثنائيات‬
‫ضوئية ‪ 8×8‬تتصل الثنائيات الموجودة في السطر الواحد بمصاعدها في حين تتصل الثنائيات‬
‫الموجودة في العمود الواحد بمهابطها‪ .‬عمليا تتوز ع أرجل المصفوفة )‪ (16‬في خلف لوحة مصفوفة‬
‫الثنائيات بطرق مختلفة‪ ،‬يوضح الشكل (‪ )19-3‬إحدى طرق توزيع األرجل على األعمدة واألسطر‪،‬‬
‫يمكن استخدام مقياس اآلفو لمعرفة التوزيع‪.‬‬

‫الشكل (‪ :)18-3‬مصفوفة ثنائيات ضوئية ‪.8×8‬‬

‫الشكل (‪ :)19-3‬إحدى طرق توزيع أرجل مصفوفة ثنائيات على األعمدة (يرمز لها بحرف ‪ ،)C‬وعلى‬
‫األسطر (يرمز لها بحرف ‪.)R‬‬

‫‪67‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-3-3‬ربط مصفوفة الثنائيات الضوئية مع لوحة األردوينو أونو‬


‫رجل من لوحة األردوينو لقيادة‬ ‫قد يتضح لدينا أنه نحتاج لمصفوفة ‪ 8×8=64 LED‬إلى ‪64‬‬
‫يمكن تقليل هذا العدد‬ ‫وتشغيل المصفوفة‪ ،‬ولكن باستخدام طريقة تعرف بالتجميع ‪multiplexing‬‬
‫بشكل كبير‪ .‬تشبه عملية قيادة مصفوفة الثنائيات الضوئية بالتجميع مسح مجموعة سبع قطع ضوئية‬
‫في السبع قطع ضوئية يتم تفعيل إحدى السبع قطع ومن ثم إرسال القيمة‬ ‫المذكورة في الفقرة (‪.)3-2-3‬‬
‫المراد إظهارها عليها وتكرر العملية للبقية وهكذا‪ ،‬في مصفوفة الثنائيات الضوئية يتم تفعيل أحد األعمدة‬
‫ومن ثم إرسال القيمة المراد إظهارها على ذلك العمود وتكرر العملية لبقية األعمدة وهكذا‪ .‬نتيجة لذلك‬
‫فإن الثنائيات الضوئية في العمود الواحد ستعمل لفترة زمنية‪ ،‬وستتوقف لفترة زمنية أخرى‪ ،‬وبسبب كون‬
‫عملية المسح سريعة فإن العين ستالحظ أن ثنائيات ذلك العمود بحالة عمل ‪ ON‬وهذه هي فكرة طريقة‬
‫التجميع‪ .‬باعتبار أن الثنائيات الموجودة في السطر الواحد تتصل بمصاعدها في حين تتصل الثنائيات‬
‫الموجودة في العمود الواحد بمهابطها‪ ،‬يتم تفعيل العمود بوضع صفر منطقي عليه‪ ،‬وبقية األعمدة ‪.5V‬‬
‫لتوضيح الفكرة المذكورة لنفرض أننا أردنا إظهار الشكل (‪ .)21-3‬إذا قمنا بتفعيل العمود األول من‬
‫اليسار‪ ،‬عندئذٍ البد من إطفاء ليدات السطر األول والثالث والرابع والخامس والسادس والثامن‪ ،‬وتشغيل‬
‫على‬ ‫ليدات السطر الثاني والسابع‪ .‬أي أننا سنرسل على األسطر من ‪ 1‬وحتى ‪ 8‬القيمة ‪0,1,0,0,0,0,1,0‬‬
‫الترتيب‪ .‬تكرر نفس الفكرة لبقية األعمدة‪ .‬يلخص الجدول (‪ )2-3‬القيم المطلوب تطبيقها على األسطر مع‬
‫كل مرة يتم فيها تفعيل عمود من األعمدة‪.‬‬

‫الشكل (‪ :)21-3‬مثال على إظهار شكل على مصفوفة الثنائيات‪.‬‬


‫الجدول(‪ :)2-3‬القيم المطلوب تطبيقها على األسطر مع تفعيل كل عمود‪.‬‬
‫العمود المفعل من اليسار‬
‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬
‫أرقام األسطر‬
‫السطر ‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪2‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪3‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪4‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪5‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪6‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪7‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫السطر ‪8‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪68‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يمكن تطبيق القيم السابقة بوصل األسطر واألعمدة إلى منافذ الخرج للوحة األردوينو‪ ،‬أي أننا‬
‫سنحتاج إلى ‪ 16‬منفذ من اللوحة لقيادة المصفوفة ‪ .8×8=64 LED‬يمكن تقليل عدد األرجل المطلوبة‬
‫لقيادة المصفوفة باستخدام بعض الدارات المتكاملة ‪ IC‬مثل مسجالت اإلزاحة وبعض مفككات‬
‫الترميز‪ .‬وهذا ما سندعه للمستوى الثاني عندما سيتم قيادة مصفوفة ثنائيات كبيرة‪.‬‬
‫سنستخدم جزءا من المصفوفة ‪ 8×8‬يساوي ‪ 7‬أسطر و‪ 5‬أعمدة (أي مصفوفة ‪ 7×5‬بدال من‬
‫‪ .)8×8‬تم وصل أسطر المصفوفة السبعة مع األرجل من ‪ 0‬وحتى ‪ ،6‬واألعمدة الخمسة تم وصلها مع‬
‫األرجل من ‪ 8‬وحتى ‪ 12‬كما هو موضح في الشكل (‪.)21-3‬‬

‫الشكل (‪ :)21-3‬وصل لوحة األردوينو مع مصفوفة ‪ 7×5‬بدال من ‪.8×8‬‬


‫لنفرض أننا أردنا إظهار الرقم ‪ ،2‬خطوات كتابة البرنامج ستكون على الشكل التالي‬
‫‪ -1‬نفعل العمود األول من خالل وضع صفر منطقي على الرجل ‪.8‬‬
‫‪ -2‬يتم إرسال القيمة المراد إظهارها على العمود األول وهي تشغيل الثنائي في السطر الثاني و الثنائي‬
‫في السطر السابع و بالتالي إخراج ‪ +5V‬على األرجل ‪ 1‬و ‪ 6‬وبقية األرجل ‪ . 0V‬أي أن القيمة التي البد‬
‫من إخراجها على األرجل من ‪ 0‬وحتى ‪ 6‬هي ‪ .B1000010 = 0x42‬تستمر العملية لفترة بسيطة لتكن‬
‫‪.1ms‬‬
‫‪ -3‬يتم إلغاء تفعيل العمود األول من خالل وضع واحد منطقي على الرجل ‪.8‬‬
‫‪ -4‬نكرر العمليات السابقة لكل عمود و سطر ليظهر الشكل السابق‪.‬‬

‫‪69‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الكود البرمجي‬-3-3-3
void setup() {
byte i;
for (i = 0; i <= 13; i++) // ‫ كمخارج‬13 ‫ وحتى‬1 ‫تفعيل األرجل من‬
{
pinMode(i,OUTPUT);
}
for (i = 8; i <= 12; i++) // ‫ أي على أعمدة المصفوفة‬12 ‫ وحتى‬8 ‫ منطقي على األرجل من‬1 ‫إخراج‬
{
digitalWrite(i,HIGH);
}
}

void loop()
{
digitalWrite(8,LOW); PORTA(0x42); delay(1); digitalWrite(8,HIGH); PORTA(0); //‫العمود األول‬
digitalWrite(9,LOW); PORTA(0x61); delay(1); digitalWrite(9, HIGH); PORTA(0); // ‫العمود الثاني‬
digitalWrite(10, LOW); PORTA(0x51); delay(1); digitalWrite(10, HIGH); PORTA(0); //‫العمود الثالث‬
digitalWrite(11, LOW); PORTA(0x49); delay(1); digitalWrite(11, HIGH); PORTA(0); //‫العمود الرابع‬
digitalWrite(12, LOW); PORTA(0x46); delay(1); digitalWrite(12, HIGH);PORTA(0); // ‫العمود الخامس‬
}

void PORTA(byte value) // 6 ‫ وحتى‬1 ‫برنامج فرعي إلخراج قيمة على األرجل من‬
{
byte i;
for (i = 0; i <= 7; i++)
{
digitalWrite(i, bitRead(value, i));
}
}

71
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-3-3‬محاكاة مصفوفة الثنائيات الضوئية من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)22-3‬محاكاة دارة مصفوفة الثنائيات الضوئية من خالل برنامج ‪.Proteus‬‬

‫‪71‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫شاشة الكريستال السائلة ‪LCD‬‬


‫‪-1-4-3‬مقدمة‬
‫تستخدم شاشة الكريستال السائلة )‪ Liquid Crystal Display(LCD‬كأداة إلظهار الحروف‬
‫واألرقام المختلفة تبعا لألوامر التي يرسلها المتحكم أو لوحة األردوينو للشاشة‪ .‬سميت الشاشة بذلك‬
‫الحتوائها على قطع كريستال معلقة ضمن سائل لزج‪ .‬تتواجد شاشة ‪ LCD‬بأشكال متنوعة فقد تكون‬
‫مؤلفة من سطر أو عدة أسطر‪ .‬يحتوي كل سطر على عدد من الخانات‪ ،‬والخانة عبارة عن مصفوفة‬
‫ذات بعدين من البكسيالت ‪ pixels‬يتم من خاللها إظهار الحرف المطلوب كما هو موضح في الشكل‬
‫(‪ .)23-3‬أكثر الشاشات شيوعا‪. 4×20, 4×16, 2×20, 2×16, 1×24, 1×20, 1×16:‬‬
‫تمتلك الشاشة معالج إظهار خاص بها وذاكرة داخلية خاصة تقسم إلى قسمين‪ :‬ذاكرة‬
‫المعطيات ‪ DD_RAM‬تسمح باالحتفاظ بالحروف المرسلة دون الحاجة إلى إرسالها كل مرة‪ ،‬وذاكرة‬
‫مولد الرموز ‪ CG_RAM‬التي تحتفظ بأشكال مجموعة من الرموز والمحارف وهذا ما يسمح بإظهار‬
‫الحرف المطلوب بإرسال ترميزة أسكي لهذا الحرف للشاشة‪.‬‬

‫الشكل (‪ :)23-3‬شاشة الكريستال السائل ‪ .2×16‬كل خانة عبارة عن مصفوفة من البكسيالت ببعدين‪.‬‬
‫تتألف الشاشة من ‪ 16‬رجل مرقمة كما هو موضح بالجدول (‪:)3-3‬‬
‫الجدول (‪ :)3-3‬أرجل شاشة الكريستال السائل‪.‬‬
‫الوظيفة‬ ‫الرمز‬ ‫الرقم‬
‫أرضي )‪.(0 V‬‬ ‫‪Vss‬‬ ‫‪1‬‬
‫التغذية (‪.(5 V‬‬ ‫‪Vdd‬‬ ‫‪2‬‬
‫التحكم بشدة التباين ‪ .contrast‬يطبق على هذه الرجل جهد يتغير بين ‪0‬‬ ‫‪3‬‬
‫وحتى ‪ .5V‬عند ما يكون الجهد ‪ 0V‬يكون لون الحروف أسود داكن‪ ،‬كلما ازداد‬ ‫‪Vee‬‬
‫الجهد يقل اللون األسود (يزداد التباين)‪.‬‬
‫اختيار السجل أو نمط العمل ‪ : 0V :‬تعليمة أو أمر ‪ : +5V ،‬حرف أو معطيات‬ ‫‪RS‬‬ ‫‪4‬‬
‫اختيار القراءة من الشاشة أو الكتابة إلى الشاشة‪ : 0V :‬وضع الكتابة ‪،‬‬ ‫‪5‬‬
‫‪R/W‬‬
‫‪ : +5V‬وضع القراءة‬
‫تمكين وتنفيذ األمر المطبق على خطوط المعطيات‪:‬‬
‫عند الكتابة‪ :‬ينفذ األمر عند االنتقال من المنطق المرتفع إلى المنطق المنخفض‪.‬‬ ‫‪E‬‬ ‫‪6‬‬
‫عند القراءة‪ :‬ينفذ األمر عند االنتقال من المنطق المنخفض إلى المنطق المرتفع‪.‬‬

‫‪72‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الوظيفة‬ ‫الرمز‬ ‫الرقم‬
‫‪D0‬‬ ‫‪7‬‬
‫‪D1‬‬ ‫‪8‬‬
‫‪D2‬‬ ‫‪9‬‬
‫خطوط معطيات‪ ،‬يتم من خاللها إرسال شيفرات الحروف واألوامر‬ ‫‪D3‬‬ ‫‪11‬‬
‫‪D4‬‬ ‫‪11‬‬
‫‪D5‬‬ ‫‪12‬‬
‫‪D6‬‬ ‫‪13‬‬
‫‪D7‬‬ ‫‪14‬‬
‫قطب موجب لإلضاءة )‪.(5V‬‬ ‫‪A‬‬ ‫‪15‬‬
‫قطب سالب لإلضاءة )‪.(0V‬‬ ‫‪K‬‬ ‫‪16‬‬

‫‪-2-4-3‬ربط شاشة الكريستال السائل مع لوحة األردوينو أونو‬


‫يوضح الشكل (‪ )24-3‬كيفية وصل شاشة ‪ LCD‬مع لوحة األردوينو أونو‪ .‬تم وصل الرجل ‪RS‬‬
‫مع المنفذ ‪ 0‬للوحة األردوينو‪ ،‬والرجل ‪ E‬مع المنفذ ‪ ،1‬وأرجل المعطيات ‪ D4,D5,D6,D7‬مع المنافذ‬
‫‪ .2,3,4,5‬ال يتم وصل أرجل المعطيات ‪ D0,D1,D2,D3‬ألن الشاشة سيتم التعامل معها وفق نمط ‪4‬‬
‫بت‪ .‬يمكن استخدام أرجل رقمية أخرى لألردوينو بنفس الطريقة‪ .‬تم وصل الرجل ‪ Vee‬مع مقاومة‬
‫متغيرة لتطبيق جهد متغير وبالتالي التحكم بالتباين كما هو موضح في الشكل‪ .‬تم وصل الرجل ‪WR‬‬
‫مع األرضي‪ .‬تم وصل رجل اإلضاءة الموجب ‪ A‬مع التغذية ‪ 5V‬عن طريق مقاومة ‪ ،220Ω‬ورجل‬
‫اإلضاءة السالب إلى األرضي‪.‬‬

‫‪Vs‬‬
‫‪s‬‬

‫الشكل (‪ :)24-3‬وصل لوحة األردوينو مع شاشة ‪ LCD‬وفق نمط ‪ 4‬بت‪.‬‬

‫‪ -3-4-3‬الكود البرمجي‬
‫يتم برمجة الشاشة من خالل استدعاء المكتبة ‪ ،LiquidCrystal.h‬وتطبيق التعليمات في‬
‫الجدول (‪.)4-3‬‬
‫‪73‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ :)4-3‬تعليمات المستخدمة لبرمجة شاشة ‪.LCD‬‬
‫شرح التعليمة‬ ‫التعليمة‬
‫‪ LiquidCrystal lcd(rs,‬يتم وضع هذه التعليمة بعد استدعاء مكتبة >‪<LiquidCrystal.h‬‬
‫مباشرة‪ .‬يتم من خاللها تعريف كائن اسمه ‪ ،lcd‬مع تحديد أرجل لوحة‬
‫ً‬ ‫)‪enable, d4, d5, d6, d7‬‬
‫األردوينو التي ستتصل مع أرجل الشاشة ‪. d7، d6، d5، d4، E،RS‬‬
‫التعليمة وفق هذه الشكل ستجعل الشاشة تعمل وفق نمط ‪ 4‬أرجل‬
‫فقط )‪ .(d7,d6,d5,4‬يمكن كتابتها بشكل آخر للعمل بنمط ‪ 8‬أرجل‬
‫وعندئذ سيتم حجز أرجل أكثر للوحة األردوينو‪ .‬رجل ‪ RW‬يتم وصلها مع‬
‫األرضي وال تدخل في هذه التعليمة‪.‬‬
‫مثال‪ ،‬بفرض أن دارة ربط الشاشة مع األردوينو كما في الشكل (‪)23-3‬‬
‫عندئذ يتم كتابة التعليمة على الشكل التالي‪:‬‬

‫)‪LiquidCrystal lcd(0,1,2,3,4,5‬‬
‫)‪ lcd.begin(cols, rows‬تكتب هذه التعليمة داخل ) ( ‪ .void setup‬تعمل على تهيئة االتصال‬
‫مع الشاشة وتحديد األبعاد‪ :‬عدد األعمدة ‪ ،cols‬وعدد األسطر ‪.rows‬‬
‫مثال‪ :‬بفرض أن الشاشة عبارة عن سطرين و‪ 16‬خانة‪ ،‬عندئذ يتم كتابة‬
‫التعليمة على الشكل التالي‪:‬‬

‫)‪lcd.begin(16, 2‬‬
‫)(‪ lcd.clear‬يتم مسح الشاشة مع إعادة المشيرة إلى الزاوية العلوية اليسرى‪.‬‬

‫)(‪ lcd.home‬يتم إعادة المشيرة إلى الزاوية العلوية اليسرى من دون مسح‬
‫الشاشة‪.‬‬
‫)‪ lcd.setCursor(col، row‬تحريك المشيرة إلى العمود ‪ ،col‬والسطر ‪ .row‬حيث الزاوية العلوية‬
‫اليسرى إحداثياتها )‪.(0,0‬‬
‫مثال‪ :‬بفرض أننا أردنا تحريك المشيرة إلى بداية السطر الثاني‪ ،‬عندئذ‬
‫يتم كتابة التعليمة على الشكل التالي‪:‬‬

‫)‪lcd.setCursor(0، 1‬‬
‫‪ data‬الحرف الذي سيظهر على‬ ‫)‪ lcd.write(data‬كتابة حرف على الشاشة‪ .‬حيث‬
‫الشاشة‪.‬‬
‫)‪ lcd.print(data‬كتابة نص على الشاشة‪ .‬حيث ‪ data‬النص الذي سيظهر على‬
‫الشاشة‪ .‬البارامتر ‪ data‬قد يكون ‪. string، long، int، byte،char‬‬
‫مثال‪ :‬بفرض أننا أردنا إظهار كلمة ‪ ،Hello‬عندئذ يتم كتابة التعليمة‬
‫على الشكل التالي‪:‬‬
‫)”‪lcd.print(“Hello‬‬

‫‪74‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫شرح التعليمة‬ ‫التعليمة‬
‫)(‪ lcd.cursor‬إظهار المشيرة على شكل خط سفلي في المكان الذي سيتم كتابة‬
‫الحرف التالي‪.‬‬
‫)(‪ lcd.noCursor‬إخفاء المشيرة‪.‬‬
‫)(‪ lcd.blink‬إظهار المشيرة على شكل وميض‪.‬‬

‫)(‪ lcd.noBlink‬إيقاف وميض المشيرة‪.‬‬

‫)(‪ lcd.scrollDisplayLeft‬تحريك محتويات الشاشة (النص والمشيرة) مسافة واحدة لليسار‪.‬‬

‫)(‪ lcd.scrollDisplayRight‬تحريك محتويات الشاشة (النص والمشيرة) مسافة واحدة لليمين‪.‬‬


‫‪ lcd.createChar(num،‬تسمح هذه التعليمة من إنشاء رمز خاص‪ .‬كل رمز ‪ ،5x8 pixels‬ويتم‬
‫)‪ data‬إدخاله على شكل مصفوفة بـ ‪ 8‬بايت‪ .‬البتات الخمسة األولى من كل‬
‫بايت تحدد بكسيالت السطر‪ .‬البارامتر ‪ num‬هو رقم الرمز (من ‪0‬‬
‫وحتى ‪ ،)7‬والبارامتر ‪ data‬مصفوفة الرمز‪ .‬تستخدم التعليمة )(‪write‬‬
‫إلظهار الرمز‪ .‬يمكن االطالع على ‪ reference‬الخاص بمكتبة الشاشة‬
‫لمعرفة كيفية تطبيق هذه التعليمة‪.‬‬

‫فيما يلي الكود البرمجي إلظهار عبارة ‪ ،Hello, world‬باإلضافة لعداد يزداد كل ثانية‪.‬‬

‫>‪#include <LiquidCrystal.h‬‬
‫;)‪LiquidCrystal lcd(0, 1, 2, 3, 4, 5‬‬

‫{ )(‪void setup‬‬
‫;)‪lcd.begin(16, 2‬‬
‫;)"!‪lcd.print("hello, world‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪unsigned long x‬‬
‫;)‪lcd.setCursor(0, 1‬‬
‫; ‪x = millis() / 1000‬‬ ‫‪// the number of seconds since reset:‬‬
‫;)‪lcd.print(x‬‬
‫}‬

‫‪75‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-4-3‬محاكاة شاشة الكريستال السائل من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)25-3‬محاكاة ربط شاشة ‪ LCD‬مع لوحة األردوينو من خالل برنامج ‪.Proteus‬‬

‫‪76‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫لوحة المفاتيح ‪Keypad‬‬


‫‪-1-5-3‬مقدمة‬
‫تستخدم لوحة المفاتيح ‪ keypad‬كأداة إدخال لألردوينو‪ .‬تتكون لوحة المفاتيح من مجموعة‬
‫من األزرار ‪ push button‬تكون مرتبة على شكل مصفوفة‪ .‬يوضح الشكل (‪ )26-3‬لوحة مفاتيح بـ ‪4‬‬
‫أسطر‪ ،‬و‪ 3‬أعمدة‪ .‬تتصل مفاتيح كل سطر معا بسلك مشترك‪ ،‬وكذلك كل عمود‪ .‬لذلك ينتج لدينا لوحة‬
‫المفاتيح في الشكل (‪ 4 )26-3‬أسالك مشتركة لكل سطر ‪ ،R1, R2, R3, R4‬و‪ 3‬أسالك مشتركة لكل‬
‫عمود ‪ .C1, C2, C3‬ما يميز لوحة المفاتيح هو أنه عند الضغط على أحد األزرار سيتقاطع (يتصل)‬
‫سلك السطر الذي يتواجد فيه الزر مع سلك العمود‪ .‬مثال عند الضغط على الزر ‪ 1‬يتصل السلك ‪ R1‬مع‬
‫السلك ‪ C1‬وهكذا‪.‬‬

‫الشكل (‪ :)26-3‬لوحة مفاتيح ‪.4×3‬‬


‫يتم الكشف عن زر مضغوط للوحة المفاتيح والتعرف عليه من قبل لوحة األردوينو من خالل‬
‫طريقة تعرف بمسح األعمدة‪ .‬تعتمد هذه الطريقة بأن يتم ربط أسطر لوحة المفاتيح مع ‪ 4‬مقاومات‬
‫سحب ‪ pull-up‬إلى ‪ +5V‬كما هو موضح في الشكل (‪.)27-3‬‬

‫الشكل (‪ :)27-3‬كيفية إعداد لوحة المفاتيح لمعرفة الزر المضغوط‪.‬‬


‫‪77‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يتم ربط األعمدة مع ‪ 3‬مخارج رقمية للوحة األردوينو‪ ،‬ويتم ربط األسطر مع ‪ 4‬مداخل رقمية‬
‫بعد ذلك يتم تنفيذ الخطوات الثالثة التالية‪:‬‬
‫‪ -1‬نطبق على العمود األول ‪ 0‬منطقي )‪ (C1=0‬وبقية األعمدة ‪ 1‬منطقي )‪ (C2=1, C3=1‬من خالل‬
‫المخارج الثالث الرقمية‪ .‬القيمة الناتجة عن األسطر ستدل على الزر المضغوط من العمود األول كما‬
‫هو موضح في الجدول (‪.)5-3‬‬
‫الجدول (‪ :)5-3‬مسح العمود األول‪.‬‬
‫حالة األسطر‬ ‫العملية‬
‫‪R1‬‬ ‫‪R2 R3‬‬ ‫‪R4‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪1‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪4‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪7‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫الضغط على الزر *‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫عدم الضغط على أي زر أو أحد األزرار األخرى‬
‫‪ -2‬نطبق على العمود الثاني ‪ 0‬منطقي )‪ (C2=0‬وبقية األعمدة ‪ 1‬منطقي )‪ .(C1=1, C3=1‬القيمة‬
‫الناتجة عن األسطر ستدل على الزر المضغوط من العمود الثاني كما هو موضح في الجدول (‪.)6-3‬‬
‫الجدول (‪ :)6-3‬مسح العمود الثاني‪.‬‬
‫حالة األسطر‬ ‫العملية‬
‫‪R1‬‬ ‫‪R2 R3‬‬ ‫‪R4‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪2‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪5‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪8‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫الضغط على الزر ‪0‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫عدم الضغط على أي زر أو أحد األزرار األخرى‬
‫‪ -3‬نطبق على العمود الثالث ‪ 0‬منطقي )‪ (C3=0‬وبقية األعمدة ‪ 1‬منطقي )‪ .(C1=1, C2=1‬القيمة‬
‫الناتجة عن األسطر ستدل على الزر المضغوط من العمود الثالث كما هو موضح في الجدول (‪.)7-3‬‬
‫الجدول (‪ :)7-3‬مسح العمود الثالث‪.‬‬
‫حالة األسطر‬ ‫العملية‬
‫‪R1‬‬ ‫‪R2 R3‬‬ ‫‪R4‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪3‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪6‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫الضغط على الزر ‪9‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫الضغط على الزر ‪#‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫عدم الضغط على أي زر أو أحد األزرار األخرى‬

‫‪78‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-5-3‬ربط لوحة المفاتيح مع لوحة األردوينو‬


‫يتم ربط أرجل لوحة المفاتيح مع األرجل الرقمية للوحة األردوينو‪ .‬يوضح الشكل (‪)28-3‬‬
‫مثاال على كيفية ربط لوحة المفاتيح مع األردوينو أونو‪ .‬تم ربط السطر األول مع الرجل ‪ ،9‬والسطر‬
‫الثاني مع الرجل ‪ ،10‬والسطر الثالث مع الرجل ‪ ،11‬والسطر الرابع مع الرجل ‪ .12‬تم ربط العمود األول‬
‫مع الرجل ‪ ،6‬والعمود الثاني مع الرجل ‪ ،7‬والعمود الثالث مع الرجل ‪ .8‬تتميز أرجل لوحة األردوينو‬
‫بإمكانية تفعيل مقاومات سحب داخلية‪ ،‬بالتالي عدم الحاجة إلضافتها خارجيا‪ ،‬ليتم وصل أسطر‬
‫المصفوفة مباشرة مع أرجل األردوينو )‪ .(9,10,11,12‬يمكن استخدام أي أرجل رقمية أخرى‪.‬‬
‫الختبار وتجربة عمل لوحة المفاتيح تم ربط ثنائيات ضوئية على األرجل من ‪ 0‬وحتى ‪5‬‬
‫الختبار عمل لوحة المفاتيح‪ .‬سنكتب برنامجا فيما بعد يعمل على مسح لوحة المفاتيح‪ ،‬ويعيد الزر‬
‫المكبوس‪ .‬إذا كان الزر المكبوس ‪ 1‬يتم تشغيل الثنائي الضوئي األول‪ ،‬وإذا كان ‪ 2‬يتم إطفاء الثنائي‬
‫األول‪ ،‬وإذا كان الزر المكبوس ‪ 3‬يتم تشغيل الثنائي الضوئي الثاني‪ ،‬وإذا كان ‪ 4‬يتم إطفاء الثنائي‬
‫الثاني وهكذا لبقية األزرار‪.‬‬

‫الشكل (‪ :)28-3‬ربط لوحة المفاتيح مع األردوينو‪.‬‬

‫‪79‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3-5-3‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بلوحة المفاتيح‪ ،‬سنستخدم إحدى المكتبات المتوفرة على‬
‫شبكة االنترنت‪ ،‬وهي المكتبة ‪ Keypad‬الموجودة ضمن الملفات المرفقة مع هذا الكتاب التي يمكن‬
‫تحميلها من الموقع‬
‫‪http://www.mediafire.com/file/4zo1dcc678js1ae/examples+libraries.rar/file‬‬
‫‪-2‬نختار من األعلى ‪ Sketch‬ثم ‪ Include Library‬ثم ‪ Add .ZIP Library‬كما هو موضح في الشكل‬
‫(‪ (14-3‬سابقا‪ .‬تظهر نافذة إضافة مكتبة‪ ،‬نختار الملف ‪ keypad.zip‬الذي قمنا بتحميله في الخطوة‬
‫السابقة‪ .‬بعد االنتهاء من هذه الخطوة نالحظ أنه قد تم إضافة مكتبة ‪ keypad‬لبرنامج ‪Arduino‬‬
‫‪ IDE‬كما هو موضح في الشكل (‪.)29-3‬‬

‫الشكل (‪ :)29-3‬إضافة مكتبة ‪.keypad‬‬

‫‪-3‬نقوم باستدعاء المكتبة كما يلي‪:‬‬


‫>‪#include <keypad.h‬‬
‫‪-4‬نقوم بتعريف كائن‪ ،‬مع إعداد لالتصال ما بين لوحة المفاتيح ولوحة األردوينو كما يلي‪:‬‬
‫أ‪-‬ندخل عدد األسطر‪ ،‬وعدد األعمدة كما يلي‪:‬‬
‫;‪const byte ROWS = 4‬‬ ‫أربع أسطر ‪//‬‬
‫;‪const byte COLS = 3‬‬ ‫ثالث أعمدة ‪//‬‬
‫ب‪-‬ندخل خريطة أزرار لوحة المفاتيح كما يلي من أجل لوحة مفاتيح أربعة أسطر‪ ،‬وثالثة أعمدة‬
‫{ = ]‪char keys[ROWS][COLS‬‬
‫‪{'1','2','3'},‬‬
‫‪{'4','5','6'},‬‬
‫‪{'7','8','9'},‬‬
‫}'‪{'*','0','#‬‬
‫;}‬
‫‪81‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫من أجل لوحة مفاتيح أربعة أسطر‪ ،‬وأربعة أعمدة‬
‫{ = ]‪char keys [ROWS][COLS‬‬
‫‪{'0','1','2','3'},‬‬
‫‪{'4','5','6','7'},‬‬
‫‪{'8','9','A','B'},‬‬
‫}'‪{'C','D','E','F‬‬
‫;}‬
‫ج‪-‬ندخل أرجل األردوينو التي سيتم ربطها مع أسطر لوحة المفاتيح‪ ،‬ابتداء من السطر األول‪ .‬على‬
‫سبيل المثال إذا تم تطبيق الشكل (‪ )27-3‬تكون التعليمة على الشكل التالي‪:‬‬
‫;}‪byte rowPins[ROWS] = {9, 11, 11, 12‬‬
‫أيضا ندخل أرجل األردوينو التي سيتم ربطها مع أعمدة لوحة المفاتيح‪ ،‬ابتداء من العمود األول‪ .‬على‬
‫سبيل المثال إذا تم تطبيق الشكل (‪ )27-3‬تكون التعليمة على الشكل التالي‪:‬‬
‫;}‪byte colPins[COLS] = {6, 7, 8‬‬
‫د‪-‬أخيرا ننشئ الكائن (لنسميه مثال ‪ )mykeypad‬كما يلي‪:‬‬
‫;)‪Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS‬‬

‫‪ -5‬بعد إنشاء الكاني ‪ keypad‬يمكننا استخدام التعليمات التالية‪:‬‬


‫شرح التعلمية‬ ‫التعليمة‬
‫تنتظر هذه التعليمية أن يقوم المستخدم بالضغط على أحد أزرار لوحة‬ ‫) (‪mykeypad.waitForKey‬‬
‫المفاتيح‪ ،‬لتعيد عندئذ الزر المضغوط تبعاً للخريطة المذكورة في‬
‫الخطوة ‪ .3‬البد من االنتباه إلى أن هذه التعليمة تسبب توقف تنفيذ‬
‫التعليمات األخرى حتى يتم الضغط على أحد المفاتيح‪ .‬مثال‪:‬‬
‫;‪char key‬‬
‫;) (‪key= keypad.waitForKey‬‬
‫تعيد هذه التعليمة الزر المضغوط في حالة الضغط على أحد األزرار‪،‬‬ ‫) (‪mykeypad.getKey‬‬
‫وال تسبب توقف البرنامج كما في التعليمة السابقة‪ .‬مثال‪:‬‬
‫;‪char key‬‬
‫;) (‪key= keypad.getKey‬‬
‫تعيد هذه التعليمة حالة لوحة المفاتيح الحالية‪ .‬أربع حاالت هي‪:‬‬ ‫) (‪mykeypad.getState‬‬
‫‪IDLE, PRESSED, RELEASED and HOLD‬‬
‫تحدد القيمة الزمنية بالميلي ثانية التي سيحتاجها المستخدم للضغط‬ ‫‪mykeypad.setHoldTime‬‬
‫) ‪(unsigned int time‬‬
‫على الزر حتى يتم تفعيل حالة المسك ‪ .HOLD‬مثال‪:‬‬
‫;)‪mykeypad.setHoldTime(500‬‬
‫تحدد القيمة الزمنية بالميلي ثانية التي سوف تنتظر لوحة المفاتيح‬ ‫‪mykeypad.setDebounceTime‬‬
‫) ‪(unsigned int time‬‬
‫حتى تقبل الضغط على مفتاح جديد‪ .‬مثال‪:‬‬
‫;)‪mykeypad.setDebounceTime(21‬‬

‫‪81‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
‫ وتشغيل وإطفاء‬،‫فيما يلي الكود البرمجي الخاص بمسح لوحة المفاتيح ومعرفة الزر المكبوس‬
.)27-3( ‫الثنائيات الضوئية الموضحة في الشكل‬
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {9, 10, 11, 12};//connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8}; //connect to the column pinouts of the keypad

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
byte i;
for (i=0;i<=5;i++)
{pinMode(i,OUTPUT);}
}

void loop() {
char x;
x=mykeypad.waitForKey();
if (x=='1') {digitalWrite(0,HIGH);}
if (x=='2') {digitalWrite(0,LOW);}
if (x=='3') {digitalWrite(1,HIGH);}
if (x=='4') {digitalWrite(1,LOW);}
if (x=='5') {digitalWrite(2,HIGH);}
if (x=='6') {digitalWrite(2,LOW);}
if (x=='7') {digitalWrite(3,HIGH);}
if (x=='8') {digitalWrite(3,LOW);}
if (x=='9') {digitalWrite(4,HIGH);}
if (x=='*') {digitalWrite(4,LOW);}
if (x=='0') {digitalWrite(5,HIGH);}
if (x=='#') {digitalWrite(5,LOW);}
}

82
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-5-3‬محاكاة لوحة المفاتيح من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)31-3‬محاكاة ربط لوحة المفاتيح مع األردوينو من خالل برنامج ‪.Proteus‬‬

‫‪-5-5-3‬تطبيق على شاشة ‪ LCD‬ولوحة المفاتيح‬


‫يوضح الشكل (‪ )31-3‬تطبيقا على وصل شاشة ‪ LCD‬ولوحة مفاتيح إلى األردوينو‪ .‬تم وصل‬
‫القطب ‪ RS‬للشاشة مع المنفذ ‪ 0‬للوحة األردوينو‪ ،‬والقطب ‪ E‬مع المنفذ ‪ ،1‬وأقطاب المعطيات‬
‫‪ D4,D5,D6,D7‬مع المنافذ ‪ .2,3,4,5‬كذلك تم ربط السطر األول للوحة المفاتيح مع المنفذ ‪ ،9‬والسطر‬
‫الثاني مع المنفذ ‪ ،10‬والسطر الثالث مع المنفذ ‪ ،11‬والسطر الرابع مع المنفذ ‪ .12‬تم ربط العمود األول‬
‫مع المنفذ ‪ ،6‬والعمود الثاني مع المنفذ ‪ ،7‬والعمود الثالث مع المنفذ ‪ .8‬يطلب هذا التطبيق من‬
‫المستخدم إدخال كلمة سر من ‪ 4‬حروف‪ .‬إذا كانت صحيحة يتم إظهار عبارة أن الكلمة صحيحة‬
‫‪ Password True‬على الشاشة‪ ،‬وإذا كانت خاطئة يتم إظهار عبارة أن الكلمة خاطئة ‪Password‬‬
‫‪ .False‬بعد ثالث مرات إدخال كلمات سر خاطئة يتم تشغيل ثنائي ضوئي على المنفذ ‪ 13‬يعتبر‬
‫بمثابة إنذار‪.‬‬
‫‪83‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

.‫ ولوحة مفاتيح‬LCD ‫ تطبيق إدخال كلمة سر من خالل شاشة‬:)31-3( ‫الشكل‬

‫الكود البرمجي‬-6-5-3
#include <LiquidCrystal.h>
LiquidCrystal lcd(0,1,2,3,4,5);

#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
84
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
byte rowPins[ROWS] = {9, 10, 11, 12};//connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 7, 8}; //connect to the column pinouts of the keypad
Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

byte x;

void setup() {
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
x=0;
}

void loop() {
char password[4];
byte i;

lcd.print(" Enter Password ");


lcd.setCursor(6, 1);
for(i=0;i<=3;i++){
password[i]=mykeypad.waitForKey();
lcd.print("*");
}
lcd.setCursor(0, 0);
if(password[0]=='1' && password[1]=='2' && password[2]=='3' &&
password[3]=='4'){
lcd.print(" Password True ");
digitalWrite(13,LOW);}
else
{lcd.print(" Password False ");
x=x+1;
if( x==3) {digitalWrite(13,HIGH);}
delay(2000);
lcd.clear();
}
}

85
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-7-5-3‬محاكاة لوحة المفاتيح وشاشة ‪ LCD‬من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)32-3‬محاكاة ربط شاشة ‪ LCD‬ولوحة المفاتيح مع األردوينو من خالل برنامج ‪.Proteus‬‬

‫‪86‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫قراءة إشارة الحساسات التشابهية‬


‫‪ -1-6-3‬مقدمة‬
‫الحساس ‪ sensor‬هو عبارة عن أداة تعمل على كشف‪ ،‬وتحويل البارامتر الفيزيائي (درجة‬
‫حرارة‪ ،‬رطوبة‪ ،‬ضوء‪ ،‬ضغط‪ )......،‬إلى إشارة كهربائية (جهد أو تيار) تتناسب مع تغيرات البارامتر‬
‫الفيزيائي المقاس‪ .‬تصنف الحساسات تبعا إلشارة الخرج الكهربائية الناتجة إلى‪:‬‬
‫‪ ‬حساسات تشابهية‪ :‬تعطي في خرجها إشارة تشابهية (إشارة مستمرة تأخذ عدة قيم أو‬
‫مطاالت مع الزمن) كما هو موضح في الشكل (‪.)33-3‬‬
‫‪ ‬حساسات رقمية‪ :‬تعطي في خرجها إشارة متقطعة ثنائية ( ‪ 0‬منطقي‪ 1 ،‬منطقي)‪ .‬يتم تمثيل‬
‫‪ 0‬منطقي بجهد‪ ،‬و‪ 1‬منطقي بجهد آخر مختلف كما هو موضح في الشكل (‪.)33-3‬‬

‫الشكل (‪ :)33-3‬اإلشارة التشابهية ‪ ،analog signal‬واإلشارة الرقمية ‪.digital signal‬‬


‫البد ألي حساس تشابهي معرفة بارامتر هام عنه وهو حساسيته ‪ sensitivity‬التي تعبر عن‬
‫مقدار تغير إشارة الخرج الكهربائية بالنسبة للبارامتر الفيزيائي‪ .‬لنأخذ مثاالُ شائعا على الحساسات‬
‫التشابهية وهو حساس الحرارة ‪ LM35‬الموضح في الشكل (‪ .)34-3‬يعمل الحساس ضمن مجال‬
‫درجة حرارة يمتد من ‪ -55 °C‬إلى ‪ .150 °C‬لهذا الحساس ثالث أرجل‪:‬‬
‫‪ ‬تغذية ‪ : Vs‬تغذية الحساس من ‪ 4V‬إلى ‪.20V‬‬
‫‪ ‬خرج ‪ : Vout‬تعطي هذه الرجل جهدا يتغير مع درجة الحرارة‪.‬‬
‫‪ ‬أرضي ‪.GND‬‬
‫حساسية الحساس ‪ LM35‬هي ‪ ،10mV/°C‬بمعنى أن كلما ازدادت درجة الحرارة درجة مئوية‬
‫واحدة (‪ )1 °C‬كلما ازدادت إشارة خرج الحساس ‪.10mV‬‬

‫‪87‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)34-3‬حساس الحرارة ‪.LM35‬‬


‫كما هو معلوم يتم معالجة اإلشارات داخل المتحكم الصغري للوحة األردوينو على شكل‬
‫إشارات رقمية ثنائية‪ ،‬لذلك ال يمكن التعامل مع إشارة خرج الحساس التشابهي‪ .‬لحل تلك المشكلة‬
‫يستخدم ما يعرف بالمبدل التشابهي الرقمي )‪ Analog Digital Converter(ADC‬الذي يعمل على‬
‫تحويل اإلشارة التشابهية إلى سلسلة من البتات الرقمية والتي لها قيمة مكافئة لقيمة اإلشارة‬
‫التشابهية‪ .‬لن نهتم بالبنية الداخلية للمبدل ‪ ADC‬وإنما باألرجل الخاصة به الموضحة في الشكل‬
‫(‪ )35-3‬وهي‪:‬‬
‫مدخل تشابهي ‪ :analog input‬يتم فيه تطبيق اإلشارة التشابهية‪.‬‬
‫مخارج رقمية ‪ :digital output‬يظهر فيها القيمة الثنائية المكافئة‪ .‬يحدد عدد هذه المخارج دقة‬
‫التبديل كما سنرى‪.‬‬
‫مدخالن مرجعيان ‪ :Vref+, Vref-‬يطبق عليهما جهدان يحددان مجال جهد إشارة الدخل التشابهية‬
‫(القيمة العظمى‪ ،‬والقيمة الصغرى)‪ .‬على سبيل المثال بفرض أنه تم تطبيق ‪ 0V‬على المدخل المرجعي‬
‫‪ ، Vref-‬وتم تطبيق ‪ +5V‬على المدخل‪ ،Vref+‬عندئذ إذا كانت إشارة الدخل التشابهية تساوي ‪Vref-‬‬
‫أي ‪ 0V‬فإن إشارة الخرج الرقمية ستكون عند أدنى قيمة لها أي كلها أصفار )‪ ،(00000000‬وإذا كانت‬
‫إشارة الدخل التشابهية تساوي ‪ Vref+‬أي ‪ +5V‬فإن إشارة الخرج الرقمية ستكون عند أعلى قيمة لها‬
‫أي كلها واحدات )‪ .(11111111‬الجهود المطبقة على المدخلين ‪ Vref+, Vref-‬أيضا لها دور في‬
‫تحديد دقة التبديل‪.‬‬

‫الشكل (‪ :)35-3‬أرجل المبدل التمثيلي الرقمي‪.‬‬

‫‪88‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫هناك بارامتر هام للمبدل التمثيلي الرقمي وهو دقة التمييز ‪ resolution‬الذي يمثل الجهد‬
‫المطلوب لكل تزداد إشارة الخرج الرقمية واحد منطقي (أي الخانة األقل أهمية ‪least significant‬‬
‫)‪ .bit (LSB‬على سبيل المثال إذا كانت دقة تمييز مبدل ‪ ADC‬تساوي ‪ 5mV/LSB‬فهذا يعني أنه كلما‬
‫ازدادت إشارة الدخل التشابهية ‪ 5mV‬كلما ازدادت إشارة الخرج الرقمية واحد منطقي‪ .‬يقدم المبدل‬
‫ذو دقة التمييز األقل أداء أفضل حيث يمكن له عندئذ تحسس وتبديل التغيرات الصغيرة إلشارة‬
‫الدخل‪ .‬تعطى دقة التمييز وفق العالقة التالية‪:‬‬

‫‪ :n‬عدد بتات خرج المبدل‪.‬‬


‫من الواضح من العالقة السابقة أنه إلنقاص دقة التمييز نحتاج إلى إنقاص الفرق ما بين‬
‫‪ ،‬ولكن هذا سيكون على حساب إنقاص مجال إشارة الدخل‬ ‫المدخلين المرجعيين‬
‫التشابهية كما تم ذكره سابقا‪ .‬يمكن أيضا إنقاص دقة التمييز من خالل زيادة عدد المخارج أو البتات‬
‫الرقمية‪.‬‬
‫مثال‪ :‬لدينا مبدل تشابهي رقمي ‪ ADC‬عدد مخارجه الرقمية ‪ ،n=10‬تم ضبط ‪،Vref-=0V‬‬
‫‪ .Vref+=5V‬المطلوب‪:‬‬
‫‪-1‬حساب دقة التمييز‪.‬‬
‫‪ -2‬القيمة الرقمية المكافئة عندما يكون جهد إشارة الدخل التشابهية ‪.100mV‬‬
‫دقة التمييز ‪resolution‬‬

‫القيمة الرقمية المكافئة عندما يكون جهد إشارة الدخل التشابهية ‪:100mV‬‬

‫‪ -2-6-3‬ربط الحساسات التشابهية مع لوحة األردوينو‬


‫تم في بعض المتحكمات الصغرية دمج وحدة مبدل ‪ ADC‬ضمن بنيتها الداخلية بحيث يمكن‬
‫وصل الحساس التشابهي مباشرة مع المتحكم الصغري كما هو الحال في المتحكم ‪ATmega328‬‬
‫الخاص بلوحة األردوينو أونو‪ .‬عدد بتات خرج المبدل للمتحكم ‪ ،10‬والجهد المرجعي ‪ ،Vref-=0V‬أما‬
‫الجهد المرجعي ‪ Vref+‬يتم تطبيقه داخليا ويأخذ ‪ +5V‬أو ‪ 1.1V‬أو قد يتم تطبيقه خارجيا على‬
‫الرجل ‪ AREF‬في لوحة األردوينو‪ .‬عدد قنوات المبدل ‪ 6‬قنوات‪ ،‬بمعنى أنه يمكن تطبيق ‪ 6‬إشارات‬
‫تشابهية كما هو موضح في الشكل (‪ .)36-3‬يتم االنتقال من إشارة إلى إشارة أخرى باستخدام‬
‫التعليمات البرمجية‪ .‬زمن قراءة إشارة الدخل التشابهية وتحويلها إلشارة رقمية ‪.100µs‬‬

‫‪89‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)36-3‬استخدام التجميع ‪ multiplexing‬إلدخال عدة إشارات تشابهية (قنوات) إلى المبدل‬
‫‪ ADC‬من خالل التبديل من قناة إلى قناة أخرى‪.‬‬

‫يبين الجدول (‪ )8-3‬التعليمات المستخدمة في بيئة التطوير ‪ Arduino IDE‬التي تسمح بأن‬
‫تتعامل لوحة األردوينو مع اإلشارات التشابهية‪.‬‬
‫الجدول (‪ :)8-3‬تعليمات التعامل مع اإلشارات التشابهية‪.‬‬
‫الشرح‬ ‫التعليمة‬
‫)‪ analogRead(pin‬تسمح هذه التعليمة بقراءة القيمة التشابهية على الرجل المحددة‬
‫‪ .pin‬تعيد هذه التعليمة قيمة من ‪ 0‬وحتى ‪.1023‬‬
‫)‪ analogReference(type‬تسمح هذه التعليمة بتغيير الجهد المرجعي تبعاً لخيارات النمط‬
‫‪:type‬‬
‫‪ : DEFAULT‬يتم ضبط الجهد المرجعي افتراضياً ليساوي ‪ 5V‬في‬
‫لوحات ‪ ، 5V Arduino‬و ‪ 3.3V‬في لوحات ‪.3.3V Arduino‬‬
‫‪ :INTERNAL‬يتم ضبط الجهد المرجعي داخلياً ليساوي ‪ 1.1 V‬من‬
‫أجل لوحات متحكمات ‪ ،ATmega328 ،ATmega168‬وليساوي ‪2.56‬‬
‫‪ V‬من أجل لوحات متحكمات ‪.ATmega8‬‬
‫‪ : EXTERNAL‬يأخذ الجهد المرجعي عندئذ الجهد الخارجي المطبق‬

‫على رجل ‪( AREF‬من ‪ 0V‬وحتى ‪.) +5V‬‬

‫يوضح الشكل (‪ )37-3‬تطبيقا عمليا تم فيه ربط حساس الحرارة ‪ LM35‬وشاشة ‪ LCD‬إلى‬
‫لوحة األردوينو أونو‪ ،‬ويراد إظهار درجة الحرارة على الشاشة‪ .‬تم ربط الحساس مع المدخل التشابهي‬
‫‪ ،A0‬وتم وصل القطب ‪ RS‬للشاشة مع المنفذ ‪ 0‬للوحة األردوينو‪ ،‬والقطب ‪ E‬مع المنفذ ‪ ،1‬وأقطاب‬
‫المعطيات ‪ D4,D5,D6,D7‬مع المنافذ ‪.2,3,4,5‬‬

‫‪91‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)37-3‬تطبيق إظهار درجة الحرارة على شاشة ‪.LCD‬‬

‫‪-3-6-3‬الكود البرمجي‬
‫>‪#include <LiquidCrystal.h‬‬
‫;)‪LiquidCrystal lcd(0, 1, 2, 3, 4, 5‬‬

‫{ )(‪void setup‬‬
‫;)‪lcd.begin(16, 2‬‬
‫;)" ‪lcd.print(" Temperature is‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪unsigned int sensorValue‬‬
‫;)‪lcd.setCursor(7, 1‬‬
‫;‪sensorValue=analogRead(0)/2‬‬
‫;)‪lcd.print(sensorValue‬‬
‫}‬

‫مالحظة ‪ :‬القيمة الرقمية الناتجة عن المبدل ‪ ADC‬ال تعبر عن درجة الحرارة الواقعية‪ ،‬لهذا البد‬
‫من معايرتها (أي ضربها أو قسمتها على قيمة معينة قبل إظهارها)‪ .‬ما هي هذه القيمة؟ حساس‬
‫الحرارة له حساسية ‪ ،10mv/ºC‬والمبدل ‪ ADC‬له دقة تمييز تساوي ‪ (5-0)/210=4.88mv/LSB‬مع‬
‫افتراض أن ‪ .Vref+=5V‬هذا يعني أنه تقريبا كل درجة مئوية ستزداد القيمة الرقمية بمقدار ‪ ، 2‬لهذا‬
‫البد من أن نقسم القيمة الرقمية الناتجة على ‪ 2‬لنحصل على القيمة الحقيقية لدرجة الحرارة و هذا‬
‫ما نجده في البرنامج‪.‬‬

‫‪91‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-6-3‬محاكاة ربط حساس درجة الحرارة من من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)38-3‬محاكاة إظهار درجة الحرارة على شاشة ‪ LCD‬من خالل برنامج ‪.Proteus‬‬

‫‪ -5-6-3‬نماذج لحساسات تشابهية ورقمية‬


‫يوضح الشكل (‪ )39-3‬بعض الحساسات التشابهية والرقمية المتوفرة في األسواق ويمكن من‬
‫خاللها تصميم العديد من المشاريع والدارات االلكترونية‪.‬‬

‫الشكل (‪ :)39-3‬حساسات مختلفة‪ :‬حرارة‪ ،‬رطوبة‪ ،‬غاز‪ ،‬حركة‪ ،‬معدل نبضات القلب‪ ،‬انحناء‪.‬‬

‫‪92‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫التحكم بمحركات التيار المستمر‪ ،‬والخطوية‪ ،‬والسيرفو‬

‫‪-1-7-3‬مقدمة‬
‫المحرك الكهربائي هو آلة تحول الطاقة الكهربائية إلى طاقة ميكانيكية‪ .‬يمكن من خالل‬
‫المحرك المتصل مع لوحة األردوينو تصميم العديد من الدارات والمشاريع االلكترونية كالتحكم بحركة‬
‫سيارة وذرا ع روبوتية وغير ذلك‪ .‬سنتكلم في الفقرات التالية عن المحركات التالية وكيفية ربطها مع‬
‫لوحة األردوينو والتحكم بها‪:‬‬
‫‪ ‬محركات التيار المستمر ‪DC motor‬‬
‫‪ ‬محركات خطوية ‪Stepping motor‬‬
‫‪ ‬محركات السيرفو ‪Servo motor‬‬

‫‪ -2-7-3‬محرك التيار المستمر ‪DC motor‬‬


‫تعتبر أبسط أنوا ع المحركات الكهربائية مثل المحركات الموجودة في المسجلة وألعاب‬
‫السيارات‪ .‬تحتاج إلى تغذية بجهد مستمر‪ .‬لهذه المحركات سلكان فقط كما هو موضح في الشكل‬
‫(‪ .)41-3‬عندما يتم توصيل فرق جهد مستمر إلى هذين السلكين فإن المحرك سيدور باتجاه معين‪،‬‬
‫عند عكس قطبية التغذية فإن المحرك سيتحرك باالتجاه اآلخر‪ .‬جهد التغذية يتراوح ما بين ‪ 6V‬إلى‬
‫‪ .12V‬تستجر هذه المحركات تيارا ال بأس به ال يستطيع المتحكم الصغري في لوحة األردوينو تأمينه‬
‫لهذا ال بد من استخدام دارة عزل ما بين لوحة األردوينو والمحرك تؤمن له هذا التيار‪ .‬هناك طرق‬
‫عديدة يمكن بها تنفيذ دارة العزل‪ :‬ترانزستورات – ريليهات – دارات متكاملة مثل ‪ L293‬أو ‪.L298‬‬

‫الشكل (‪ :)39-3‬محرك التيار المستمر ‪.DC motor‬‬

‫‪ -1-2-7-3‬الدارة المتكاملة ‪L293‬‬


‫الدارة المتكاملة ‪ L293‬عبارة عن أربع بوابات تتصف بأنها‪:‬‬
‫‪-1‬ثالثية الحالة ‪ :tri-state‬أي أن خرجها يأخذ ثالث حاالت تبعا لكل من الدخل ‪ ،A‬ورجل التفعيل ‪.EN‬‬
‫يبين الشكل(‪ )41-3‬البوابة ثالثية الحالة وجدول الحقيقة‪ .‬يشير الحرف ‪ Z‬إلى الممانعة العالية ‪high‬‬
‫‪.impedance‬‬

‫‪93‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)41-3‬البوابة ثالثية الحالة وجدول الحقيقة‪.‬‬


‫‪-2‬من نمط دفع – جذب ‪ push-pull‬حيث تعمل كمصدر للتيار وفي نفس الوقت كمصرف له‪ .‬تسمح‬
‫‪ L293‬بمرور تيار في البوابة يصل إلى ‪ .1A‬يوجد نمط آخر لهذه الدارة هو ‪ L293D‬الذي يمتاز بأنه‬
‫يحتوي على ديودات حماية داخلية وبالتالي ليس هناك حاجة لتركيبها أثناء وصل الدارة مع‬
‫المحركات ولكن مع تيار بوابة أقل يصل إلى ‪.600mA‬‬
‫يبين الشكل (‪ )42-3‬أرجل الدارة ‪ ،L293‬وأرقام مداخل ومخارج البوابات الداخلية األربعة الموافقة‪.‬‬

‫الشكل (‪ (a) :)42-3‬أرجل الدارة المتكاملة ‪ (b) ،L293‬البوابات األربعة للدارة المتكاملة ‪.L293‬‬
‫يبين الجدول (‪ )9-3‬وظيفية كل رجل لدارة ‪.L293‬‬
‫الجدول (‪ :)9-3‬وظائف أرجل الدارة المتكاملة ‪.L293‬‬
‫الوظيفة‬ ‫الرجل‬ ‫رقم الرجل‬
‫رجل تفعيل للبوابتين ‪ 1,2‬البد من وصلها مع ‪+5V‬‬ ‫‪EN 1,2‬‬ ‫‪1‬‬

‫مدخل البوابة ‪1‬‬ ‫‪1A‬‬ ‫‪2‬‬

‫مخرج البوابة ‪1‬‬ ‫‪1Y‬‬ ‫‪3‬‬

‫أرضي‬ ‫‪Ground‬‬ ‫‪4‬‬

‫أرضي‬ ‫‪Ground‬‬ ‫‪5‬‬

‫مخرج البوابة ‪2‬‬ ‫‪2Y‬‬ ‫‪6‬‬

‫مدخل البوابة ‪2‬‬ ‫‪2A‬‬ ‫‪7‬‬

‫يطبق جهد يؤمن التغذية لخرج البوابة إذا كانت في حالة المستوى‬ ‫‪Vcc2‬‬ ‫‪8‬‬

‫المرتفع ‪ .high level‬مجال الجهد من ‪ 4.5V‬إلى ‪.36V‬‬

‫‪94‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الوظيفة‬ ‫الرجل‬ ‫رقم الرجل‬
‫رجل تفعيل للبوابتين ‪ 3,4‬البد من وصلها مع ‪+5V‬‬ ‫‪EN 3,4‬‬ ‫‪9‬‬

‫مدخل البوابة ‪3‬‬ ‫‪3A‬‬ ‫‪11‬‬

‫مخرج البوابة ‪3‬‬ ‫‪3Y‬‬ ‫‪11‬‬

‫أرضي‬ ‫‪Ground‬‬ ‫‪12‬‬

‫أرضي‬ ‫‪Ground‬‬ ‫‪13‬‬

‫مخرج البوابة ‪4‬‬ ‫‪4Y‬‬ ‫‪14‬‬

‫مدخل البوابة ‪4‬‬ ‫‪4A‬‬ ‫‪15‬‬

‫يتم وصلها إلى ‪ +5V‬لتأمين التغذية لدارة دخل البوابة‪.‬‬ ‫‪Vcc1‬‬ ‫‪16‬‬

‫‪-1-1-2-7-3‬التحكم بالمحرك المستمر من خالل لوحة األردوينو مع استخدام لدارة‬


‫القيادة ‪L293‬‬
‫يبين الشكل (‪ )43-3‬مخطط التوصيل العملي للوحة األردوينو مع دارة القيادة ‪L293‬‬
‫والمحرك المستمر‪ .‬تم ربط المنفذين ‪ 9, 10‬للوحة األردوينو مع مدخلي البوابتين ‪ 1, 2‬للدارة ‪.L293‬‬
‫تم وصل الرجل األولى للدارة المتكاملة )‪ (E 1,2‬مع جهد ‪ +5V‬لتفعيل البوابتين األولى والثانية‪ .‬تم‬
‫وصل المحرك المستمر مع مخارج البوابتين ‪ 1,2‬لدارة ‪ ،L293‬مع العلم أنه يمكن وصل محرك آخر مع‬
‫البوابتين ‪ 3,4‬بنفس الطريقة‪ .‬تم استخدام بطارية ‪ 6V‬كمنبع تغذية لمخرج بوابات ‪ L293‬المتصلة مع‬
‫المحرك‪ ،‬ويمكن استخدام منابع تغذية أخرى‪ .‬بين الجدول (‪ )11-3‬حالة المحرك المستمر من حيث‬
‫الحركة وجهة الدوران تبعا للقيم المطبقة على األرجل الرقمية ‪( pin9, pin10‬أي مداخل البوابتين‬
‫‪.(1A,2A‬‬
‫الجدول (‪ :)11-3‬حالة المحرك المستمر تبعا‬
‫للقيم المطبقة على األرجل الرقمية ‪.pin9, pin10‬‬
‫حالة المحرك‬ ‫‪Pin10‬‬ ‫‪pin9‬‬
‫متوقف‬ ‫‪Low‬‬ ‫‪Low‬‬
‫يدور عكس عقارب الساعة‬ ‫‪Low‬‬ ‫‪High‬‬
‫يدور مع عقارب الساعة‬ ‫‪High‬‬ ‫‪Low‬‬
‫متوقف‬ ‫‪High‬‬ ‫‪High‬‬

‫البد من اإلشارة إلى أن دارة ‪ l293D‬ال تحتاج لوصل الديودات فهي تحتوي داخليا عليها‪.‬‬
‫كذلك فإن جهد خرج بوابات دارة ‪ L293‬فعليا أقل من ‪ Vcc2‬بحوالي ‪.0.9V‬‬

‫‪95‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل(‪ :)43-3‬وصل لوحة األردوينو مع المحرك المستمر باستخدام الدارة المتكاملة ‪.L293D‬‬

‫‪-2-2-7-3‬وحدة التحكم بالمحركات ‪L298N‬‬


‫في هذه الفقرة سنتحدث أيضا عن دارة متكاملة أخرى تشبه دارة ‪ L293‬ولكن تمتاز عنها بأنها‬
‫تقدم تيارا أكبر للمحركات وهي دارة ‪ .L298N‬يمكن شراء هذه الدارة مثبتة على لوحة مع العناصر‬
‫االلكترونية األخرى المطلوبة بحيث يمكن التعامل معها بسهولة‪ .‬بين الشكل (‪ )44-3‬وحدة ‪L298N‬‬
‫التي تستخدم لقيادة المحرك المستمر‪ ،‬أو المحرك الخطوي كما سنرى الحقا‪ .‬دارة ‪ L298N‬هي دارة‬
‫الكترونية من نمط ‪( H-bridge‬أي أنها تسمح بتطبيق جهد على الحمولة في اتجاهات متعاكسة)‪.‬‬

‫الشكل (‪ :)44-3‬وحدة التحكم بالمحركات ‪.L298N‬‬


‫‪96‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تشبه دارة ‪ L298N‬الدارة ‪ L293‬والتي تم دراستها في الفقرة السابقة من حيث أنها تحتوي‬
‫على ‪ 4‬بوابات من نمط دفع – جذب كما هو موضح في الشكل (‪ .) 45-3‬بين الجدول (‪ )11-3‬العالقة‬
‫ما بين المداخل المنطقية ‪ IN1, IN2‬مع المخارج ‪ OU1, OUT2‬والجدول (‪ )12-3‬العالقة ما بين‬
‫المداخل المنطقية ‪ IN3, IN4‬مع المخارج ‪ .OU3, OUT4‬المستوى ‪ L‬يمثل ‪ 1‬منطقي )‪، (1V….1,5V‬‬
‫المستوى ‪ H‬يمثل ‪ 1‬منطقي (‪ .)2,3V…+5V‬يشير ‪ X‬إلى أنه بغض النظر عن قيمة الجهد‪ .‬ويشير ‪ Z‬إلى‬
‫حالة الممانعة العالية (دارة مفتوحة)‪ Vin .‬هو الجهد المطبق على الرجل ‪ ،4‬والذي يستخدم لتغذية‬
‫المحركات‪ Vdrop ،‬تتراوح قيمته ما بين ‪ 1V‬و ‪ 3V‬اعتمادا على جهد الدخل‪ ،‬والتيار المسحوب‪.‬‬

‫الشكل (‪ :)45-3‬مخطط مبسط لدارة ‪.L298‬‬

‫الجدول (‪ )11-3‬العالقة ما بين المداخل المنطقية ‪ IN1, IN2‬مع المخارج ‪OU1, OUT2‬‬
‫‪EN 1,2‬‬ ‫‪IN1, IN2‬‬ ‫‪OUT1, OUT2‬‬
‫‪L‬‬ ‫‪X‬‬ ‫‪Z‬‬
‫‪H‬‬ ‫‪H‬‬ ‫‪Vin-Vdrop‬‬
‫‪H‬‬ ‫‪L‬‬ ‫‪L‬‬
‫الجدول (‪ )12-3‬العالقة ما بين المداخل المنطقية ‪ IN3, IN4‬مع المخارج ‪OU3, OUT4‬‬
‫‪EN 3,4‬‬ ‫‪IN3, IN4‬‬ ‫‪OUT3, OUT4‬‬
‫‪L‬‬ ‫‪X‬‬ ‫‪Z‬‬
‫‪H‬‬ ‫‪H‬‬ ‫‪Vin-Vdrop‬‬
‫‪H‬‬ ‫‪L‬‬ ‫‪L‬‬

‫يبين الشكل (‪ )46-3‬مداخل ومخارج وحدة التحكم ‪:L298N‬‬

‫الشكل (‪ :)46-3‬مداخل ومخارج وحدة التحكم ‪.L298N‬‬


‫‪97‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يلخص الجدول (‪ )13-3‬وظائف أرجل مداخل ومخارج وحدة التحكم ‪:L298N‬‬
‫الجدول (‪ )13-3‬وظائف أرجل مداخل ومخارج وحدة التحكم ‪L298N‬‬
‫الوظيفة‬ ‫اسم الرجل‬ ‫الرقم‬
‫أو الوصلة‬
‫مخرج ‪ OUT1‬البوابة األولى‪ .‬يتم ربطه مع أحد أطراف المحرك األول ‪ DC‬أو‬ ‫‪OUT1‬‬ ‫‪1‬‬
‫المحرك الخطوي ‪.A+‬‬
‫مخرج ‪ OUT2‬البوابة الثانية‪ .‬يتم ربطه مع الطرف اآلخر للمحرك األول ‪ DC‬أو‬ ‫‪OUT2‬‬ ‫‪2‬‬
‫المحرك الخطوي ‪A-‬‬
‫عبارة عن وصلة ‪ .jumper‬إذا كانت موجودة يتم تفعيل منظم الجهد المثبت‬ ‫‪Jumper‬‬ ‫‪3‬‬

‫على اللوحة‪ .‬يتم إزالة هذه الوصلة إذا تم تطبيق جهد تغذية أعلى من ‪12V‬‬
‫على الرجل رقم ‪.4‬‬
‫يتم هنا تطبيق جهد تغذية المحركات‪ .‬يتراوح الجهد المطبق ما بين ‪7V‬‬ ‫‪Vin‬‬ ‫‪4‬‬
‫وحتى‪.35V‬‬
‫أرضي‪.‬‬ ‫‪GND‬‬ ‫‪5‬‬
‫إذا كانت وصلة ‪ jumper‬موجودة (الرجل ‪ )3‬فإن هذه الرجل تقدم جهداً‬ ‫‪+5V‬‬ ‫‪6‬‬
‫مقداره ‪ +5V‬ناتج عن منظم الجهد الداخلي‪ .‬وبالتالي إمكانية تغذية دارات‬
‫أخرى مثل األردوينو‪ .‬إذا لم تكن الوصلة موجودة‪ ،‬فلن يتم تفعيل منظم‬
‫الجهد الداخلي‪ ،‬وعندئذ البد من تطبيق جهد ‪ +5V‬خارجي عليها‪ .‬أي أن هذه‬
‫الرجل من الممكن أن تكون خرج أو دخل ‪.+5V‬‬
‫عبارة عن وصلة ‪ jumper‬لتفعيل مخرجي البوابتين األولى والثانية‬ ‫‪Jumper‬‬ ‫‪7‬‬
‫)‪(ENA‬‬
‫)‪ .(OUT1, OUT2‬إذا كانت موجودة فهذا يعني أنه تم تطبيق ‪ +5V‬على‬
‫رجل تفعيل البوابتين األولى والثانية ‪.EN 1,2‬‬
‫مدخل منطقي للبوابة األولى‪ .‬يتم ربطه مع رجل رقمية لألردوينو‪.‬‬ ‫‪IN1‬‬ ‫‪8‬‬
‫مدخل منطقي للبوابة الثانية‪ .‬يتم ربطه مع رجل رقمية لألردوينو‪.‬‬ ‫‪IN2‬‬ ‫‪9‬‬

‫مدخل منطقي للبوابة الثالثة‪ .‬يتم ربطه مع رجل رقمية لألردوينو‪.‬‬ ‫‪IN3‬‬ ‫‪10‬‬
‫مدخل منطقي للبوابة الرابعة‪ .‬يتم ربطه مع رجل رقمية لألردوينو‪.‬‬ ‫‪IN4‬‬ ‫‪11‬‬
‫عبارة عن وصلة ‪ jumper‬لتفعيل مخرجي البوابتين الثالثة والرابعة‬ ‫‪Jumper‬‬ ‫‪12‬‬
‫)‪(ENB‬‬
‫)‪ .(OUT3, OUT4‬إذا كانت موجودة فهذا يعني أنه تم تطبيق ‪ +5V‬على‬
‫رجل تفعيل البوابتين الثالثة والرابعة ‪.EN 3,4‬‬
‫مخرج ‪ OUT3‬البوابة الثالثة‪ .‬يتم ربطه مع أحد أطراف المحرك الثاني ‪ DC‬أو‬ ‫‪OUT3‬‬ ‫‪13‬‬

‫المحرك الخطوي ‪.B+‬‬


‫مخرج ‪ OUT4‬البوابة الرابعة‪ .‬يتم ربطه مع الطرف اآلخر للمحرك الثاني ‪ DC‬أو‬ ‫‪OUT4‬‬ ‫‪14‬‬

‫المحرك الخطوي ‪.B-‬‬

‫‪98‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يمكن إجمال مزايا وحدة التحكم بالمحركات ‪ L298N‬بما يلي‪:‬‬
‫‪ ‬يمكن من خالل هذه الوحدة قيادة محركي تيار مستمر ‪ ،DC‬أو محرك خطوي واحد‪.‬‬
‫‪ ‬جهد تغذية المحركات ما بين )‪.(7V-35V‬‬
‫‪ ‬التيار الذي يمكن استجراره للمحرك يصل إلى ‪.2A‬‬
‫‪ ‬مستوى التحكم (الجهد المنطقي عند وصل لوحة األردوينو)‪ :‬المستوى المنخفض‪-0.3V...1,5V :‬‬
‫‪ ،‬المستوى المرتفع ‪.2,3V..…5V‬‬
‫التيار المنطقي‪.0~36mA :‬‬ ‫‪‬‬
‫‪ ‬أعظم تبديد لالستطاعة‪.20W :‬‬
‫‪ ‬درجة حرارة العمل‪ -25°C :‬وحتى ‪.+130°C‬‬
‫األبعاد‪60mm*54mm :‬‬ ‫‪‬‬

‫‪ ‬الوزن ‪.~48g :‬‬

‫‪-1-2-2-7-3‬التحكم بالمحرك المستمر من خالل لوحة األردوينو مع استخدام للوحة‬


‫التحكم ‪L298N‬‬
‫يبين الشكل (‪ )47-3‬مخطط التوصيل العملي للوحة األردوينو مع لوحة التحكم ‪L298N‬‬
‫والمحرك المستمر‪ .‬تم ربط المنفذين ‪ 9, 10‬للوحة األردوينو مع األرجل ‪ 8,9‬للوحة )‪ .(IN1,IN2‬كذلك‬
‫تم ربط المحرك ‪ DC‬مع األرجل ‪ 1,2‬للوحة )‪ .(OU1,OUT2‬تم تزويد اللوحة بمنبع تغذية ‪ +9V‬على‬
‫الرجل ‪ 4‬والذي من خالله يتم تغذية المحركات‪ .‬تم المحافظة على الوصلة ‪ ،(jumper) 3‬وهذا يعني‬
‫أنه سيتم تفعيل منظم الجهد الداخلي للوحة ‪ +5V‬وبالتالي ال يوجد حاجة لتغذيتها بجهد ‪ .+5V‬إذا‬
‫تم نز ع هذه الوصلة البد من تأمين تغذية ‪ +5V‬على الرجل ‪ .6‬تم المحافظة على الوصلة ‪7‬‬
‫)‪ ،(jumper‬وهذا يعني أن المخارج ‪ OU1,OUT2‬مفعلة‪ .‬بين الجدول (‪ )14-3‬حالة المحرك المستمر‬
‫من حيث الحركة وجهة الدوران تبعا للقيم المطبقة على األرجل الرقمية ‪. pin9, pin10‬‬
‫الجدول (‪ :)14-3‬حالة المحرك المستمر تبعا للقيم المطبقة على األرجل الرقمية ‪.pin9, pin10‬‬
‫حالة المحرك‬ ‫‪Pin10‬‬ ‫‪pin9‬‬
‫متوقف‬ ‫‪Low‬‬ ‫‪Low‬‬
‫يدور عكس عقارب الساعة‬ ‫‪Low‬‬ ‫‪High‬‬
‫يدور مع عقارب الساعة‬ ‫‪High‬‬ ‫‪Low‬‬
‫متوقف‬ ‫‪High‬‬ ‫‪High‬‬

‫‪99‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)47-3‬مخطط وصل لوحة األردوينو مع المحرك المستمر باستخدام وحدة ‪.L298N‬‬

‫‪-3-2-7-3‬الكود البرمجي‬
‫فيما يلي الكود البرمجي للتحكم بحركة المحرك ‪ DC‬سواء باستخدام الدارة المتكاملة ‪L293D‬‬
‫أو لوحة ‪ L298N‬وبشكل يتوافق مع الشكلين (‪ )43-3‬و (‪ .)47-3‬في هذا المثال سنعمل على تحرك‬
‫ثوان‪.‬‬
‫ٍ‬ ‫ثوان‪ ،‬ومن ثم إيقافه لمدة خمس‬
‫ٍ‬ ‫ثوان‪ ،‬ولليسار لمدة خمس‬
‫ٍ‬ ‫المحرك لليمين لمدة خمس‬
‫{ )(‪void setup‬‬
‫;)‪pinMode(9,OUTPUT‬‬
‫;)‪pinMode(10,OUTPUT‬‬
‫}‬

‫{ )(‪void loop‬‬
‫‪move_motor('L'); // move left‬‬
‫‪111‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
delay(5000);
move_motor('R'); // move right
delay(5000);
move_motor('S'); // stop
delay(5000);
}

void move_motor(char Direction)


{
if (Direction=='L' )
{
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
}
if (Direction=='R' )
{
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
}
if (Direction=='S' )
{
digitalWrite(9,LOW);
digitalWrite(10,LOW);
}}

Proteus ‫ من خالل برنامج‬dc ‫محاكاة التحكم بمحرك مستمر‬-4-2-7-3

‫ من خالل‬L293 ‫ باستخدام الدارة المتكاملة‬dc ‫ محاكاة التحكم بمحرك مستمر‬:)48-3( ‫الشكل‬

.Proteus ‫برنامج‬

111
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-5-2-7-3‬التحكم بسرعة المحرك المستمر من خالل لوحة األردوينو‬


‫يوجد عدة طرق للتحكم بسرعة المحرك المستمر ‪ ،DC‬ولكن من أبسط هذه الطرق هو أن تطبق‬
‫إشارة تعديل عرض النبضة )‪ Pulse width modulation(PWM‬على المحرك‪.‬‬
‫إشارة ‪ PWM‬هي إشارة مربعة ترددها ثابت‪ ،‬ويتغير فيها الفترة الزمنية لنبضة ‪( ON‬المستوى‬
‫العالي ‪ ،)HIGH‬والفترة الزمنية لنبضة ‪( OFF‬المستوى المنخفض ‪ )LOW‬كما هو موضح في الشكل‬
‫(‪.)49-3‬‬

‫الشكل (‪ :)49-3‬إشارة تعديل عرض النبضة ‪PWM‬‬


‫يعرف بارامتر دورة التشغيل ‪ duty cycle‬وفق العالقة التالية‪:‬‬

‫‪ :PW‬عرض نبضة المستوى العالي (الفترة الزمنية للنبضة)‪ :T ،‬دور إشارة ‪( PWM‬الفترة الزمنية لنبضة‬
‫المستوى العالي ونبضة المستوى المنخفض)‪.‬‬
‫تعتمد القيمة المتوسطة (المستمرة) لجهد ِإشارة ‪ PWM‬على دورة التشغيل‪ .‬بفرض أن جهد المستوى‬
‫العالي ‪ +12V‬نستنتج ما يلي كما في الشكل (‪:)51-3‬‬
‫‪ ‬إذا كانت دورة التشغيل ‪ 0%‬فإن القيمة المتوسطة لجهد ِإشارة ‪ PWM‬هي صفر‪.‬‬
‫‪ ‬إذا كانت دورة التشغيل ‪ 25%‬فإن القيمة المتوسطة لجهد ِإشارة ‪ PWM‬هي ‪ 25%‬من ‪12V‬‬
‫(أي ‪.)3V‬‬
‫‪ ‬إذا كانت دورة التشغيل ‪ 50%‬فإن القيمة المتوسطة لجهد ِإشارة ‪ PWM‬هي ‪ 50%‬من ‪12V‬‬
‫(أي ‪.)6V‬‬
‫‪ ‬إذا كانت دورة التشغيل ‪ 90%‬فإن القيمة المتوسطة لجهد ِإشارة ‪ PWM‬هي ‪ 90%‬من ‪12V‬‬
‫(أي ‪.)10.8V‬‬
‫‪ ‬إذا كانت دورة التشغيل ‪ 100%‬فإن القيمة المتوسطة لجهد ِإشارة ‪ PWM‬هي ‪ 100%‬من‬
‫‪( 12V‬أي ‪.)12V‬‬

‫‪112‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)51-3‬تغير القيمة المتوسطة إلشارة ‪ PWM‬مع تغير دورة التشغيل‪.‬‬


‫إذا تم تطبيق إشارة ‪ PWM‬على أحد طرفي محرك مستمر‪ ،‬والطرف اآلخر تم وصله لألرضي‪،‬‬
‫وتم تغيير عرض النبضات (دورة التشغيل) ستتغير القيمة المتوسطة إلشارة ‪ PWM‬وهذا ما يؤدي إلى‬
‫تغيير سرعة المحرك‪ ،‬وبالتالي التحكم بها‪.‬‬
‫تتضمن لوحة األردوينو أونو على ‪ 6‬منافذ تسمح بتوليد إشارة ‪ PWM‬هي ‪.3,5,6,9,10,11‬‬
‫يولد المنفذان ‪ 5,6‬إشارة ‪ PWM‬بتردد ‪ 980Hz‬تقريبا‪ ،‬وبقية المنافذ ‪ 490 Hz‬تقريبا‪.‬‬
‫تستخدم التعليمة)‪ analogWrite(pin, value‬في برنامج ‪ Arduino IDE‬لتوليد إشارة ‪ PWM‬حيث‪:‬‬
‫‪ :pin‬رقم المنفذ الذي سيولد إشارة ‪.PWM‬‬
‫‪ :value‬تحدد دورة التشغيل‪ .‬تأخذ قيمة من ‪ 0‬وحتى ‪ .255‬مثال من أجل ‪ value=0‬فإن دورة‬
‫التشغيل ‪ ، 0%‬ومن أجل ‪ value=64‬فإن دورة التشغيل ‪ ،25%‬ومن أجل ‪ value=127‬فإن دورة‬
‫التشغيل ‪ ، 50%‬ومن أجل ‪ value=191‬فإن دورة التشغيل ‪ ، 75%‬ومن أجل ‪ value=255‬فإن‬
‫دورة التشغيل ‪.100%‬‬
‫دا ع الستدعاء )(‪ pinMode‬لضبط المنفذ كمخرج قبل استدعاء التعليمة‬ ‫ٍ‬ ‫ال يوجد‬
‫)‪.analogWrite(pin, value‬‬
‫يوضح الشكل (‪ )51-3‬الدارة العلمية للتحكم بسرعة المحرك المستمر ‪ DC‬باستخدام الدارة‬
‫المتكاملة ‪ .L293D‬تشبه الدارة الموضحة في الشكل (‪ )43-3‬باستثناء أن الرجل األولى للدارة‬
‫المتكاملة )‪ (E 1,2‬يتم وصلها إلى إحدى أرجل األردوينو التي تولد إشارة ‪( PWM‬الرجل ‪ )11‬بدال من‬
‫وصلها إلى ‪.+5V‬‬

‫‪113‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)51-3‬التحكم بسرعة المحرك المستمر ‪ DC‬باستخدام الدارة المتكاملة ‪.L293D‬‬


‫يوضح الشكل (‪ )52-3‬الدارة العلمية للتحكم بسرعة المحرك المستمر ‪ DC‬باستخدام لوحة‬
‫‪ .L298N‬تشبه الدارة الموضحة في الشكل (‪ )47-3‬باستثناء أن الوصلة ‪ (Jumper) 7‬تم إزالتها‪،‬‬
‫ووصلها إلى إحدى أرجل األردوينو التي تولد إشارة ‪( PWM‬الرجل ‪.)11‬‬

‫‪114‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)52-3‬التحكم بسرعة المحرك المستمر ‪ DC‬باستخدام لوحة ‪.L298N‬‬

‫‪-1-5-2-7-3‬الكود البرمجي‬
‫فيما يلي الكود البرمجي للتحكم بسرعة المحرك ‪ DC‬سواء باستخدام الدارة المتكاملة‬
‫‪ L293D‬أو لوحة ‪ L298N‬وبشكل يتوافق مع الشكلين (‪ )51-3‬و (‪ .)52-3‬يشبه الكود البرمجي هنا‬
‫الكود البرمجي السابق (الفقرة ‪ )3-2-7-3‬مع إضافة قيمة تتراوح من ‪ 1‬وحتى ‪ 255‬أثناء استدعاء‬
‫البرنامج الفرعي الخاص بالتحكم بالمحرك‪ .‬هذه القيمة من خاللها يتم التحكم بسرعة المحرك‪ .‬في‬
‫البرنامج الفرعي تم إضافة التعليمة )‪ analogWrite(11,speed‬والتي من خاللها يتم توليد إشارة‬
‫‪ PWM‬على الرجل ‪ 11‬التي تتصل مع رجل التفعيل‪ ،‬وبالتالي التحكم بسرعة المحرك‪.‬‬

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

‫{ )(‪void setup‬‬
‫;)‪pinMode(9, OUTPUT‬‬
‫;)‪pinMode(10, OUTPUT‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;)‪move_motor('L', 127‬‬ ‫‪// L:move left, 127: half speed‬‬
‫;)‪delay(5000‬‬
‫;)‪move_motor('R', 127‬‬ ‫‪// R:move right, 127: half speed‬‬
‫;)‪delay(5000‬‬
‫;)‪move_motor('S', 0‬‬ ‫‪// stop‬‬
‫;)‪delay(5000‬‬
‫}‬

‫)‪void move_motor(char Direction, byte Speed‬‬


‫{‬
‫‪analogWrite(11,Speed); // speed:1….255‬‬
‫) '‪if (Direction=='L‬‬
‫{‬
‫;)‪digitalWrite(9,HIGH‬‬
‫;)‪digitalWrite(10,LOW‬‬
‫}‬
‫) '‪if (Direction=='R‬‬
‫{‬
‫;)‪digitalWrite(9,LOW‬‬
‫;)‪digitalWrite(10,HIGH‬‬
‫}‬
‫) '‪if (Direction=='S‬‬
‫{‬
‫;)‪digitalWrite(9,LOW‬‬
‫;)‪digitalWrite(10,LOW‬‬
‫}‬
‫}‬

‫‪ -3-7-3‬المحركات الخطوية‬
‫تتميز المحركات الخطوية بأنها تتحرك على شكل خطوات متقطعة حيث يدور المحور بزاوية‬
‫محددة مع كل نبضة كهربائية يتلقاها أحد ملفات المحرك من دون أية آلية تغذية عكسية ‪feedback‬‬
‫كما في محرك السيرفو‪ ،‬وهذا ما يجعل المحرك الخطوي أبسط وأقل تكلفة‪ .‬تتغير زاوية دوران‬
‫المحور تبعا لبنية المحرك الداخلية ولكنها محصورة عموما ما بين ‪ 0.9°‬حتى ‪ .90°‬تبعا لذلك تستخدم‬
‫‪116‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫المحركات الخطوية في التطبيقات التي تتطلب دقة في الحركة مثل طابعات ‪ ،3D‬والبلوتر ‪،plotter‬‬
‫ومحركات األقراص الصلبة والليزرية‪ ،‬والماسح الضوئي ‪ ،scanner‬وآالت ‪ CNC‬والروبوتات‪.‬‬
‫يتألف المحرك الخطوي من جزأين رئيسيين هما‪ :‬الدوار ‪ ،rotor‬والجزء الثابت ‪ .stator‬الدوار عبارة‬
‫عن مغناطيس دائم‪ ،‬أما الجزء الثابت فيتألف من عدة ملفات تعمل كمغناطيس كهربائي عندما يمر بها‬
‫تيار كهربائي‪ .‬تسبب ملفات المغناطيس الكهربائي إلى أن ينحاز الجزء الدوار عندما يتم شحنها‬
‫كهربائيا‪ .‬يتم دفع الدوار بالتناوب مع كل ملف يمر من خالله تيار كهربائي‪.‬‬
‫يتغير جهد تغذية المحرك كثيرا تبعا لنوعه فقد يكون محصورا ضمن المجال ‪ 3 V‬وحتى ‪ .10 V‬و‬
‫يتغير أيضا التيار المستهلك في المحرك عموما حسب المقاومة الخاصة بملفات المحرك‪.‬‬
‫يمكن إجمال مزايا المحرك الخطوي بما يلي ‪:‬‬
‫‪ ‬يقدم المحرك الخطوي دقة في تحديد الموقع حيث تصل دقة المحرك الخطوي الجيد إلى‬
‫‪ 3-5%‬وهذا الخطأ ليس تراكميا من خطوة إلى األخرى‪.‬‬
‫‪ ‬المحرك الخطوي رخيص التكلفة وسهل االستخدام‪.‬‬
‫‪ ‬المحرك الخطوي له عمر استخدام طويل جدا‪.‬‬
‫‪ ‬يحافظ المحرك الخطوي على مكانه عندما ال يتم تطبيق نبضات كهربائي‪.‬‬
‫‪ ‬ال يتأذى المحرك الخطوي بزيادة التحميل ‪ ،overloading‬ويتوقف عن العمل فقط‪.‬‬
‫‪ ‬تمتاز المحركات الخطوية بـعزم ‪ torque‬مرتفع عند السرعات المنخفضة‪.‬‬
‫مساوئ ‪:‬‬
‫‪ ‬يحدث اهتزاز الرنين ‪ Resonance‬إذا لم يتم التحكم بشكل صحيح‪.‬‬
‫‪ ‬عزم منخفض عند السرعات العالية‪.‬‬
‫‪ ‬من الصعوبة أن يعمل بسرعات عالية‪.‬‬
‫‪ ‬فاعلية منخفضة ‪ :Low Efficiency‬تستهلك استطاعة أكثر مما تقدمه‪ ،‬لذلك تميل للعمل مع‬
‫وجود حرارة‪.‬‬
‫يمكن تصنيف المحركات الخطوية إلى‪:‬‬
‫‪ ‬محركات خطوية أحادية القطبية ‪.Unipolar‬‬
‫‪ ‬محركات خطوية ثنائية القطبية ‪.Bipolar‬‬
‫سنتكلم في الفقرات التالية عن المحركات الخطوية التي تتحرك بـخطوة ‪ 90‬درجة للتبسيط‪ ،‬مع العلم‬
‫أن المحركات األخرى لن تختلف كثيرا عنها وخصوصا أثناء قيادتها بلوحة األردوينو‪.‬‬

‫‪ -1-3-7-3‬المحرك الخطوي أحادي القطبية ‪Unipolar Stepper Motor‬‬


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

‫‪117‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بنفس الوقت‪ .‬يخرج من المحرك خمسة أو ستة أسالك أو ثمانية أسالك‪ .‬في المحرك خماسي األسالك‬
‫ترتبط الملفات بأحد أطرافها معا ويخرج منها سلك مشترك‪ ،‬واألسالك األربعة المتبقية ألطراف‬
‫الملفات األخرى‪ .‬في المحرك سداسي األسالك يتشارك ملفان بأطرافهما بسلك مشترك‪ ،‬والملفان‬
‫اآلخران يتشاركان بسلك مشترك‪ ،‬واألسالك األربعة المتبقية ألطراف الملفات األربعة األخرى‪ .‬عند‬
‫وصل السلكين المشتركين معا سنحصل على محرك خماسي األسالك‪ .‬في المحرك ثماني األسالك‬
‫تكون الملفات مستقلة وكل سلكين في الخرج يمثالن ملف من الملفات األربعة‪ .‬يوضح الشكل (‪)53-3‬‬
‫محركات خطوية أحادية القطبية بأربعة ملفات خماسية وسداسية وثمانية األسالك‪.‬‬

‫)‪(c‬‬ ‫)‪(b‬‬ ‫)‪(a‬‬


‫الشكل (‪ :)53-3‬محركات خطوية أحادية القطبية بأربعة ملفات‪ (a) :‬خماسية األسالك‪ (b) ،‬سداسية‬
‫األسالك‪ (c) ،‬ثمانية األسالك‪.‬‬
‫يتم تنشيط الملفات األربعة بطرق مختلفة هي‪:‬‬
‫‪ ‬إثارة ملف واحد ‪.Wave drive or Single-Coil Excitation‬‬
‫‪ ‬خطوة كاملة ‪.Full step drive‬‬
‫‪ ‬نصف خطوة ‪.Half stepping‬‬
‫‪ ‬خطوة دقيقة ‪.Micro-stepping‬‬
‫طريقة إثارة ملف واحد‪ :‬في هذه الطريقة يتم تطبيق جهد على ملف واحد (تنشيط ملف واحد)‬
‫في كل مرة‪ .‬نادرا ما تستخدم هذه الطريقة ألنها تقدم أقل من نصف عزم الدوران االسمي للمحرك‪،‬‬
‫بالتالي فإن حمولة المحرك ال يمكن أن تكون كبيرة‪ .‬عموما تستخدم هذه الطريقة لحفظ الطاقة‪ .‬يتم‬
‫إتمام دورة كاملة على ‪ 4‬مراحل‪ .‬يبين الشكل (‪ )54-3‬كيفية عمل هذه الطريقة‪ ،‬والقيم المطلوب‬
‫تطبيقها على الملفات األربعة في كل مرحلة‪.‬‬

‫‪118‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪1‬‬ ‫‪2‬‬

‫‪Step‬‬
‫‪A+‬‬ ‫‪B+ A-‬‬ ‫‪B-‬‬
‫‪Number‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪3‬‬
‫‪4‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫الشكل (‪ :)54-3‬تحريك المحرك الخطوي أحادي القطبية وفق طريقة إثارة ملف واحد‪.‬‬
‫طريقة تحريك بخطوة كاملة‪ :‬هذه الطريقة األكثر استخداما‪ .‬يتم في هذه الطريقة تطبيق‬
‫جهد على ملفين (أي تنشيط ملفين) في كل مرة‪ ،‬وهو ما يؤدي إلى الحصول على عزم اسمي كامل‬
‫)‪ (100%‬للمحرك‪ .‬يتم إتمام دورة كاملة على ‪ 4‬مراحل‪ .‬يبين الشكل (‪ )55-3‬كيفية عمل هذه‬
‫الطريقة‪ ،‬والقيم المطلوب تطبيقها على الملفات األربعة في كل مرحلة‪.‬‬

‫‪1‬‬ ‫‪2‬‬

‫‪Step‬‬
‫‪A+‬‬ ‫‪B+ A-‬‬ ‫‪B-‬‬
‫‪Number‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪4‬‬ ‫‪3‬‬
‫‪4‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫الشكل (‪ :)55-3‬تحريك المحرك الخطوي أحادي القطبية وفق طريقة خطوة كاملة‪.‬‬

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

‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬

‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬

‫‪Step‬‬
‫‪A+‬‬ ‫‪B+ A-‬‬ ‫‪B-‬‬
‫‪Number‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪5‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪6‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪7‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪8‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫الشكل (‪ :)56-3‬تحريك المحرك الخطوي أحادي القطبية وفق طريقة نصف الخطوة‪.‬‬

‫طريقة ‪ :Microstepping‬ال يتم في هذه الطريقة تغذية الملفات بنبضات وإنما بإشارة تشبه‬
‫إشارة ‪ .sin‬بهذا األسلوب يتم االنتقال من خطوة إلى األخرى بشكل أنعم‪ ،‬وهذا ما يجعل المحرك‬
‫الخطوي مناسبا للتطبيقات ذات الدقة العالية مثل أنظمة ‪ .CNC‬يدور المحرك الخطوي في هذه‬
‫الطريقة بشكل مستمر تقريبا مثل محركات ‪ DC‬البسيطة‪.‬‬

‫‪111‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يستجر المحرك الخطوي ‪-‬كما في محركات التيار المستمر‪ -‬تيارا ال بأس به ال تستطيع لوحة األردوينو‬
‫تأمينه لهذا البد من استخدام دارة عزل ما بين المتحكم و المحرك تؤمن له هذا التيار‪ .‬هناك طرق‬
‫عديدة يمكن بها تنفيذ دارة العزل‪ :‬ترانزستورات أو دارات متكاملة مثل ‪ L293‬أو ‪.UL2003‬‬
‫سنستخدم دارة ‪ ULN2003‬التي تمتاز برخصها مقارنة مع ‪.L293‬‬

‫‪ -1-1-3-7-3‬الدارة المتكاملة ‪ULN2003‬‬


‫تتكون دارة ‪ ULN2003‬من سبع بوابات التي تتصف بأنها تعمل كمصب للتيار فقط‪ .‬القيمة‬
‫العظمى للتيار ‪ .500mA‬يوضح الشكل (‪ )57-3‬بنية دارة ‪ ULN2003‬وتوز ع أرجلها‪:‬‬

‫الشكل (‪ :)57-3‬البنية الداخلية لدارة ‪ ، ULN2003‬وتوز ع األرجل‪.‬‬


‫تعمل األرجل من ‪ 1‬و حتى ‪ 7‬كمداخل لبوابات الدارة‪ ،‬واألرجل من ‪ 10‬وحتى ‪ 16‬كمخارج‬
‫للبوابات‪ .‬الرجل رقم ‪ 8‬يتم وصلها إلى األرضي المشترك‪ .‬الرجل ‪ 9‬تتصل مع مهابط ثنائيات‪ ،‬من‬
‫الممكن عدم وصل هذه الرجل‪ ،‬أو قد يتم وصلها مع تغذية المحرك كما سنرى الحقا‪ .‬يوضح الجدول‬
‫(‪ )15-3‬كيفية عمل البوابة‪.‬‬
‫الجدول (‪ :)15-3‬طريقة عمل البوابة في دارة ‪ULN2003‬‬
‫‪INPUT‬‬ ‫‪OUTPUT‬‬
‫‪High‬‬ ‫‪Low‬‬
‫‪Low‬‬ ‫)‪Z (high impedance‬‬

‫إليضاح عمل بوابة دارة ‪ ULN2003‬لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي‬
‫ضوئي من خالل الجهد المطبق على مدخل البوابة األولى‪.‬‬
‫‪-1‬بفرض أن الجهد المطبق على مدخل البوابة األولى ‪ )High level( 5V‬كما هو موضح في الشكل‬
‫(‪ .)58-3‬عندئذ فإن خرج البوابة األولى على الرجل ‪ 16‬هو ‪ .(Low level) 0V‬تبعا لذلك سيضيئ‬
‫الثنائي الضوئي حيث عملت بوابة دارة ‪ ULN2003‬على تأمين مصب للتيار إلى األرضي ‪.‬‬

‫‪111‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)58-3‬الجهد المطبق على مدخل البوابة األولى ‪.5V‬‬


‫‪ -2‬بفرض أن الجهد المطبق على مدخل البوابة األولى ‪ )Low level( 0V‬كما هو موضح في الشكل‬
‫(‪ .)59-3‬عندئذ فإن خرج البوابة األولى على الرجل ‪ 16‬هو ممانعة عالية ‪ .high impedance‬تبعا‬
‫لذلك لن يضيء الثنائي الضوئي حيث لم يتم تأمين مصب للتيار‪.‬‬

‫الشكل (‪ :)59-3‬الجهد المطبق على مدخل البوابة األولى ‪.0V‬‬


‫الجهد المطبق على الرجل ‪( 1‬مدخل البوابة األولى) هو )‪ 0V (Low‬و بالتالي الخرج على‬
‫الرجل ‪( 16‬مخرج البوابة األولى) هو ‪ High Z‬أي كأنها رجل عائمة ‪ .‬الثنائي الضوئي ال يعمل ألنه لم‬
‫يتم تأمين مصب للتيار‪.‬‬
‫ال يمكن استخدام دارة ‪ ULN2003‬مع المحرك المستمر لكي يتحرك باتجاهين وذلك ألنها‬
‫تسمح بمرور التيار باتجاه واحد فقط وبالتالي فهي مناسبة للمحركات الخطوية أحادية القطبية‪.‬‬

‫‪-2-1-3-7-3‬التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خالل لوحة األردوينو‬


‫يبين الشكل (‪ )60-3‬مخطط التوصيل العملي للوحة األردوينو مع دارة القيادة ‪ULN2003‬‬
‫والمحرك الخطوي أحادي القطبية سداسي األسالك‪ .‬تم ربط المنافذ ‪ 0, 1, 2, 3‬مع مداخل بوابات دارة‬
‫‪ ،ULN2003‬والمخارج مع أربعة أسالك للمحرك‪ .‬السلكان المشتركان تم وصلهما إلى التغذية ‪ .+9V‬تم‬
‫وصل الرجل ‪ 8‬لدارة ‪ ULN2003‬مع األرضي‪ ،‬والرجل ‪ 9‬إلى التغذية ‪ +9V‬وذلك للتخلص من الحقل‬
‫الكهربائي المغناطيسي العودي‪ .‬عند تطبيق ‪ 1( +5V‬منطقي) على المنافذ ‪ 0, 1, 2, 3‬سيكون خرج‬
‫البوابات ‪ 0V‬مما يسمح بمرور تيار في ملفات المحرك‪ ،‬أما عند تطبيق ‪ 0( 0V‬منطقي) على المنافذ ‪0,‬‬
‫‪ 1, 2, 3‬سيكون خرج البوابات ممانعة عالية ولن يمر تيار في الملفات‪ .‬يتم اختيار إحدى طرق تنشيط‬
‫الملفات المذكرة سابقا (ملف واحد‪ ،‬خطوة كاملة‪ ،‬نصف خطوة) وبرمجة لوحة األردوينو تبعا لذلك‪.‬‬

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

‫الشكل (‪ :)60-3‬مخطط وصل لوحة األردوينو مع المحرك الخطوي أحادي القطبية من خالل الدارة‬
‫المتكاملة ‪.ULN2003‬‬
‫يبين الشكل (‪ )61-3‬مخطط التوصيل العملي للوحة األردوينو مع لوحة ‪ L298N‬والمحرك‬
‫الخطوي أحادي القطبية‪ .‬تم ربط المنافذ ‪ 0, 1, 2, 3‬مع أرجل الدخل المنطقية للوحة‬
‫)‪ ،(IN1,IN2,IN3,IN4‬والمخارج )‪ (OUT1,OUT2,OUT3,OUT4‬مع أربعة أسالك للمحرك‪ .‬السلكان‬
‫المشتركان للمحرك تم وصلهما إلى التغذية ‪ +9V‬تم المحافظة على الوصلة ‪ ،(jumper) 7‬والوصلة‬
‫‪ (jumper) 12‬بحيث يتم تفعيل جميع المخارج‪ .‬تم تزويد اللوحة بمنبع تغذية ‪ +9V‬على الرجل ‪4‬‬
‫والذي من خالله يتم تغذية المحرك‪ .‬تم المحافظة على الوصلة ‪ ،(jumper) 3‬وهذا يعني أنه سيتم‬
‫تفعيل منظم الجهد الداخلي للوحة ‪ +5V‬وبالتالي ال يوجد حاجة لتغذيتها بجهد ‪ .+5V‬إذا تم نز ع هذه‬
‫الوصلة البد من تأمين تغذية ‪ +5V‬على الرجل ‪.6‬‬

‫‪113‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)61-3‬مخطط وصل لوحة األردوينو مع المحرك الخطوي أحادي القطبية من خالل لوحة‬
‫‪.L298N‬‬

‫‪-3-1-3-7-3‬الكود البرمجي‬
‫تم كتابة الكود البرمجي الخاص بطريقة التحريك بخطوة كاملة‪ ،‬مع إمكانية اختيار جهة‬
‫الدوران وسرعة المحرك‪ .‬يصلح هذا الكود استخدامه مع دارة القيادة ‪ ،UL2003‬ولوحة ‪.L298N‬‬
‫{ )(‪void setup‬‬
‫;‪byte i‬‬
‫)‪for (i = 0; i <= 7; i++‬‬
‫{‬
‫;)‪pinMode(i, OUTPUT‬‬
‫}‬
‫}‬
‫{ )(‪void loop‬‬
‫‪move_motor('L', 250); // move left, speed‬‬
‫‪move_motor('R', 250); // move left, speed‬‬
‫‪114‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
move_motor('L', 500); // move right, speed
move_motor('R', 500); // move right, speed
}

void move_motor(char Direction, int Speed)


{
if (Direction == 'L')
{ PORTA(0x03);
delay(Speed);
PORTA(0x06);
delay(Speed);
PORTA(0x0C);
delay(Speed);
PORTA(0x09);
delay(Speed);
}
if (Direction == 'R')
{
PORTA(0x09);
delay(Speed);
PORTA(0x0C);
delay(Speed);
PORTA(0x06);
delay(Speed);
PORTA(0x03);
delay(Speed);
}
}

void PORTA(byte value)


{
byte i;
for (i = 0; i <= 7; i++)
{
digitalWrite(i, bitRead(value, i));
}
}

115
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-1-3-7-3‬محاكاة التحكم بمحرك أحادي القطبية من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)62-3‬محاكاة التحكم بمحرك أحادي القطبية من خالل برنامج ‪.Proteus‬‬

‫‪ -2-3-7-3‬المحرك الخطوي ثنائي القطبية ‪Bipolar Stepper Motor‬‬


‫في هذا النمط من المحركات الخطوية يرتبط ملفان داخليا مع بعضهما بشكل تسلسلي‪،‬‬
‫ويرتبط الملفان اآلخران أيضا مع بعضهما بشكل تسلسلي كما هو موضح في الشكل (‪ .)63-3‬تبعا لهذا‬
‫الوصل ستكون البينة الداخلية للمحرك الخطوي ثنائي القطبية عبارة عن ملفين‪ .‬تمثل أطراف الملفين‬
‫األسالك األربعة في الخرج‪.‬‬

‫الشكل (‪ :)63-3‬محرك خطوي ثنائي القطبية ذو أربعة أسالك في الخرج‪.‬‬

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

‫‪116‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ ‬إثارة ملف واحد ‪.Wave drive or Single-Coil Excitation‬‬
‫‪ ‬خطوة كاملة ‪.Full step drive‬‬
‫‪ ‬نصف خطوة ‪.Half stepping‬‬
‫‪ ‬خطوة دقيقة ‪.Micro-stepping‬‬
‫طريقة إثارة ملف واحد‪ :‬في كل مرة يتم تطبيق جهد على ملف واحد‪ ،‬وبقية الملفات يطبق عليها‬
‫‪ .0V‬عزم الدوران أقل من بقية الطرق‪ ،‬بالتالي فإن حمولة المحرك ال يمكن أن تكون كبيرة‪ .‬يتم إتمام‬
‫دورة كاملة على ‪ 4‬مراحل‪ .‬يبين الشكل (‪ )64-3‬كيفية عمل هذه الطريقة‪ ،‬والقيم المطلوب تطبيقها‬
‫على الملفات األربعة في كل مرحلة‪.‬‬

‫‪1‬‬ ‫‪2‬‬

‫‪Step‬‬
‫‪A+‬‬ ‫‪B+ A-‬‬ ‫‪B-‬‬
‫‪Number‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪4‬‬ ‫‪3‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫الشكل (‪ :)64-3‬تحريك المحرك الخطوي ثنائي القطبية وفق طريقة إثارة ملف واحد‪.‬‬

‫طريقة تحريك بخطوة كاملة‪ :‬في كل مرة يتم تطبيق جهد على ملفين‪ ،‬والملفان اآلخران‬
‫يطبق عليهما ‪ .0V‬عزم الدوران أعلى من الطريقة السابقة‪ .‬يتم إتمام دورة كاملة على ‪ 4‬مراحل‪ .‬يبين‬
‫الشكل (‪ )65-3‬كيفية عمل هذه الطريقة‪ ،‬والقيم المطلوب تطبيقها على الملفات األربعة في كل‬
‫مرحلة‪.‬‬

‫‪117‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪1‬‬ ‫‪2‬‬

‫‪Step‬‬
‫‪A+‬‬ ‫‪B+ A-‬‬ ‫‪B-‬‬
‫‪Number‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪4‬‬ ‫‪3‬‬
‫‪4‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫الشكل (‪ :)65-3‬تحريك المحرك الخطوي ثنائي القطبية وفق طريقة خطوة كاملة‪.‬‬

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

‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬

‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬

‫‪118‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪Step‬‬
‫‪A+‬‬ ‫‪B+ A-‬‬ ‫‪B-‬‬
‫‪Number‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪4‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪5‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪6‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪7‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪8‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫الشكل (‪ :)66-3‬تحريك المحرك الخطوي ثنائي القطبية وفق طريقة نصف الخطوة‪.‬‬

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

‫‪-1-2-3-7-3‬التحكم بالمحرك الخطوي ثنائي القطبية وسرعته من خالل لوحة األردوينو‬


‫ال بد من استخدام دارة عزل ما بين لوحة األردوينو والمحرك ثنائي القطبية لتأمين التيار‬
‫المطلوب‪ .‬ال يمكن استخدام الدارة المتكاملة ‪ ULN2003‬مع المحرك ثنائي القطبية ألنها تعمل كمصب‬
‫للتيار فقط (أي تسمح بمرور التيار باتجاه واحد)‪ ،‬في حين الدارة المتكاملة ‪ L293‬والدارة ‪L298N‬‬
‫ستفي بالغرض المطلوب منها‪ ،‬وقد تم شرحهما سابقا في الفقرتين (‪.)2-2-7-3( ،)1-2-7-3‬‬
‫يبين الشكل (‪ )67-3‬مخطط التوصيل العملي للوحة األردوينو مع دارة ‪ L293‬والمحرك‬
‫الخطوي ثنائي القطبية‪ .‬تم ربط المنافذ ‪ 0, 1, 2, 3‬مع مداخل بوابات دارة ‪ ،L293‬والمخارج مع أربعة‬
‫أسالك للمحرك‪ .‬يتم اختيار إحدى طرق تنشيط الملفات المذكرة سابقا (ملف واحد‪ ،‬خطوة كاملة‪،‬‬
‫نصف خطوة) وبرمجة لوحة األردوينو تبعا لذلك‪ .‬يتم التحكم بجهة دوران المحرك (مع أو عكس‬
‫عقارب الساعة) من خالل ترتيب تنشيط الملفات الواحد تلو اآلخر‪ ،‬ويتم التحكم بسرعة المحرك من‬
‫خالل تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة‪.‬‬

‫‪119‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)67-3‬مخطط وصل لوحة األردوينو مع المحرك الخطوي ثنائي القطبية من خالل الدارة‬
‫المتكاملة ‪.L298D‬‬
‫يبين الشكل (‪ )68-3‬مخطط التوصيل العملي للوحة األردوينو مع لوحة ‪ L298N‬والمحرك‬
‫الخطوي ثنائي القطبية‪ .‬تم ربط المنافذ ‪ 0, 1, 2, 3‬مع أرجل الدخل المنطقية للوحة‬
‫)‪ ،(IN1,IN2,IN3,IN4‬والمخارج )‪ (OUT1,OUT2,OUT3,OUT4‬مع أربعة أسالك للمحرك‪ .‬تم‬
‫المحافظة على الوصلة ‪ ،(jumper) 7‬والوصلة ‪ (jumper) 12‬بحيث يتم تفعيل جميع المخارج‪ .‬تم‬
‫تزويد اللوحة بمنبع تغذية ‪ +9V‬على الرجل ‪ 4‬والذي من خالله يتم تغذية المحرك‪ .‬تم المحافظة على‬

‫‪121‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الوصلة ‪ ،(jumper) 3‬وهذا يعني أنه سيتم تفعيل منظم الجهد الداخلي للوحة ‪ +5V‬وبالتالي ال يوجد‬
‫حاجة لتغذيتها بجهد ‪ .+5V‬إذا تم نز ع هذه الوصلة البد من تأمين تغذية ‪ +5V‬على الرجل ‪.6‬‬
‫يتم اختيار إحدى طرق تنشيط الملفات المذكرة سابقا (ملف واحد‪ ،‬خطوة كاملة‪ ،‬نصف‬
‫خطوة) وبرمجة لوحة األردوينو تبعا لذلك‪ .‬يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب‬
‫الساعة) من خالل ترتيب تنشيط الملفات الواحد تلو اآلخر‪ ،‬ويتم التحكم بسرعة المحرك من خالل‬
‫تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة‪.‬‬

‫الشكل (‪ :)68-3‬مخطط وصل لوحة األردوينو مع المحرك الخطوي ثنائي القطبية من خالل لوحة‬
‫‪.L298N‬‬

‫‪121‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الكود البرمجي‬-2-2-3-7-3
‫ مع إمكانية اختيار جهة‬،‫تم كتابة الكود البرمجي الخاص بطريقة التحريك بخطوة كاملة‬
L298N ‫ واللوحة‬،L293 ‫ يصلح هذا الكود مع كل من الدارة المتكاملة‬.‫الدوران وسرعة المحرك‬
.)68-3(‫ و‬،)67-3( ‫الموضحتين في الشكلين‬
void setup() {
byte i;
for (i = 0; i <= 7; i++)
{
pinMode(i, OUTPUT);
}
}

void loop() {
move_motor('L', 250); // move left, speed
move_motor('R', 250); // move left, speed
move_motor('L', 500); // move right, speed
move_motor('R', 500); // move right, speed
}

void move_motor(char Direction, int Speed)


{
if (Direction == 'L')
{ PORTA(B00000101);
delay(Speed);
PORTA(B00000110);
delay(Speed);
PORTA(B00001010);
delay(Speed);
PORTA(B00001001);
delay(Speed);
}
if (Direction == 'R')
{ PORTA(B00000101);
delay(Speed);
PORTA(B00001001);
delay(Speed);
PORTA(B00001010);
delay(Speed);
PORTA(B00000110);
delay(Speed);
}
}

122
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫)‪void PORTA(byte value‬‬
‫{‬
‫;‪byte i‬‬
‫)‪for (i = 0; i <= 7; i++‬‬
‫{‬
‫;))‪digitalWrite(i, bitRead(value, i‬‬
‫}‬
‫}‬

‫‪-3-2-3-7-3‬محاكاة التحكم بمحرك ثنائي القطبية من خالل برنامج ‪.Proteus‬‬

‫الشكل (‪ :)69-3‬محاكاة التحكم بمحرك ثنائي القطبية من خالل برنامج ‪.Proteus‬‬

‫‪ -4-7-3‬محرك السيرفو ‪Servo Motor‬‬


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

‫الشكل (‪ :)70-3‬أمثلة لمحركات سيرفو‪.‬‬

‫‪123‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫لمحرك السيرفو ثالث أسالك‪ :‬اثنان لتزويده بالطاقة )‪ ،(ground، Vcc‬والسلك الثالث يتم من‬
‫خالله تطبيق إشارة التحكم (نبضات ‪ .)PWM‬في العادة لون سلك ‪ Vcc‬أحمر‪ ،‬ولون سلك األرضي‬
‫‪ ground‬أسود أو بني‪ ،‬أما لون سلك إشارة التحكم أصفر أو أبيض أو برتقالي‪.‬‬
‫يتكون محرك السيرفو من األجزاء التالية كما هو موضح في الشكل (‪: )71-3‬‬
‫‪-1‬محرك مستمر ‪.DC motor‬‬
‫‪-2‬مقبض الخرج ‪( output shaft‬ذرا ع محرك السرفو)‪.‬‬
‫‪-3‬سلسلة من التروس ‪ gears‬التي تصل محرك ‪ DC‬بمقبض الخرج‪ .‬الهدف منها تقليل سرعة محرك‬
‫‪ DC‬لتصبح مناسبة أكثر عمليا‪.‬‬
‫‪-4‬نظام تحكم الكتروني بمكان المقبض ذو تغذية عكسية مغلقة‪ ،‬ويتكون مما يلي‪:‬‬
‫أ‪-‬مقاومة متغيرة ‪ :potentiometer‬تتصل مع مقبض الخرج أو في مكان ما من سلسلة التروس‪،‬‬
‫تقدم جهدا متناسبا مع مكان المقبض‪.‬‬
‫ب‪-‬مبدل نبضات تعديل عرض النبضة ‪ PWM‬إلى جهد‪.‬‬
‫ج‪-‬مقارن ‪ :comparator‬يعمل على مقارنة الجهد الناتج عن المقاومة المتغيرة مع الجهد الناتج عن‬
‫المبدل‪.‬‬

‫الشكل (‪ :)71-3‬مخطط صندوقي لمحرك السيرفو‪.‬‬

‫يعمل محرك السيرفو كما يلي‪:‬‬


‫‪pulse width‬‬ ‫‪-1‬يطبق على المحرك إشارة تحكم على شكل إشارة تعديل عرض النبضة‬
‫)‪ .‬عرض هذه‬ ‫)‪ modulation (PWM‬والتي ترددها ‪( 50Hz‬أي تتكرر اإلشارة كل‬
‫النبضات هو الذي سيتحكم بزاوية الدوران كما سنرى‪.‬‬
‫‪-2‬يتم تحويل هذه النبضات إلى جهد مكافئ عن طريق مبدل ‪ .PWM‬كلما كان عرض هذه النبضات‬
‫أكبر كلما كان الجهد الناتج أكبر‪.‬‬
‫‪-3‬تقدم المقاومة المتغيرة جهدا يتناسب مع مكان مقبض الخرج‪.‬‬

‫‪124‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-4‬يعمل المقارن على مقارنة الجهد الناتج عن المبدل والجهد الناتج عن المقاومة المتغيرة‪ .‬االختالف‬
‫ما بين اإلشارتين يعرف بإشارة خطأ ‪ ،error signal‬والتي يتم تضخيمها‪ ،‬وتستخدم لقيادة محرك‬
‫المستمر ‪.DC‬‬
‫‪-5‬يتحرك محرك ‪ ،DC‬ومقبض الخرج‪ ،‬وبالتالي الجهد الناتج عن المقاومة المتغيرة بحيث تؤدي‬
‫العملية إلى إنقاص أو حذف إشارة الخطأ‪.‬‬
‫‪-6‬عندما يتم حذف إشارة الخطأ يكون مقبض الخرج قد وصل إلى المكان أو الزاوية المطلوبة‪،‬‬
‫ويتوقف محرك ‪ DC‬تبعا لذلك‪.‬‬
‫‪-7‬عند تغيير عرض نبضات ‪ ،PWM‬سيتغير الجهد الناتج عن مبدل ‪ PWM‬وتنتج إشارة خطأ‪ ،‬ليتحرك‬
‫المحرك ومقبض الخرج إلى زاوية أخرى مطلوبة‪ ،‬ويتوقف عندها‪.‬‬
‫يبين الشكل (‪ )72-3‬العناصر الداخلية لمحرك السيرفو‪.‬‬

‫الشكل (‪ :)72-3‬العناصر الداخلية لمحرك السيرفو‪.‬‬


‫معظم محركات السيرفو تدور ضمن ‪ ،180º‬وبعض منها ضمن ‪ .360º‬يتم التحكم بالزاوية‬
‫الدقيقة من خالل عرض نبضات ‪ PWM‬ذات التردد ‪ 50Hz‬كما تم ذكره‪ .‬تعتمد العالقة ما بين عرض‬
‫النبضة والزاوية على الشركات المصنعة للمحركات ولكن المبدأ األساسي هو نفسه في كل محرك‪.‬‬
‫يوضح الشكل (‪ )73-3‬مثاال على العالقة ما بين عرض النبضات وزاوية الدوران‪:‬‬
‫من أجل عرض نبضة مقداره ‪ 1ms‬تكون زاوية المحرك ‪.0º‬‬
‫من أجل عرض نبضة مقداره ‪ 1.5ms‬تكون زاوية المحرك ‪.90º‬‬
‫من أجل عرض نبضة مقداره ‪ 2ms‬تكون زاوية المحرك ‪.180º‬‬
‫يتحرك محرك السيرفو ما بين ‪ 0‬و‪ 180‬درجة‪ ،‬وال يتحرك في دوران مستمر كما في محرك ‪DC‬‬
‫التقليدي‪.‬‬

‫‪125‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)73-3‬من خالل التحكم بعرض نبضات إشارة ‪ PWM‬المطبقة على محرك السيرفو يتم‬
‫ضبط زاوية دورانه‪.‬‬

‫‪-1-4-7-3‬التحكم بالمحرك السيرفو من خالل لوحة األردوينو‬


‫يبين الشكل (‪ )74-3‬مخطط التوصيل العملي للوحة األردوينو مع محرك السيرفو بشكل‬
‫مباشر‪ .‬تم وصل سلك التغذية للمحرك ‪( Vcc‬عادة لونه أحمر) إلى جهد التغذية للوحة ‪ ،+5V‬وتم وصل‬
‫سلك األرضي للمحرك (عادة أسود أو بني) إلى منفذ األرضي للوحة‪ ،‬سلك إشارة التحكم (عادة لونه‬
‫أصفر أو برتقالي أو أبيض) إلى الرجل رقم ‪ 9‬للوحة والتي من خاللها يمكن توليد إشارة ‪.PWM‬‬

‫الشكل (‪ :)74-3‬مخطط وصل لوحة األردوينو مع المحرك الخطوي أحادي القطبية‪.‬‬

‫‪126‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-4-7-3‬الكود البرمجي‬
‫يمكن استخدام التعليمة )‪ analogWrite(pin,value‬لتوليد إشارة ‪ PWM‬كما تم ذكره سابقا‬

‫في الفقرة (‪ ،)3-2-7-3‬وبالتالي التحكم بمحرك السيرفو‪ .‬يوجد مكتبة ضمن بيئة البرمجة ‪Arduino‬‬
‫‪ IDE‬هي >‪ <Servo.h‬تبسط عملية التحكم أكثر‪ .‬فيما يلي تعليمات هذه المكتبة‪:‬‬

‫الوظيفة‬ ‫التعليمة‬
‫تستخدم إلنشاء عنصر للتحكم بتعليمات محرك السيرفو‪ .‬اسم العنصر‬ ‫;‪Servo myservo‬‬
‫‪( myservo‬ويمكن اختيار اسم آخر)‪ .‬يتم وضع هذه التعلمية بعد‬
‫استدعاء المكتبة‪ .‬مثال‪:‬‬
‫;‪Servo myservo‬‬
‫تحدد هذه التعليمة الرجل ‪ pin‬التي سيتم ربط محرك السيرفو معها‪.‬‬ ‫;)‪myservo.attach(pin‬‬
‫مثال‪:‬‬
‫;)‪myservo.attach(9‬‬
‫تعمل على ضبط زاوية محور المحرك تبعاً للبارامتر ‪( angle‬بالدرجات من‬ ‫;)‪myservo.write(angle‬‬
‫‪ 0‬وحتى ‪ .)180‬مثال‪:‬‬
‫‪myservo.write(90); // set servo to mid-point‬‬
‫يتم تحديد عرض نبضة إشارة ‪ PWM‬بواحدة الميكرو ثانية وبالتالي‬ ‫‪myservo.‬‬
‫;)‪writeMicroseconds(uS‬‬
‫تحريك المحرك إلى زاوية محددة كما في الشكل (‪.)71-3‬‬
‫‪myservo.writeMicroseconds(1500); // set servo to mid-point‬‬
‫قراءة الزاوية الحالية لمحرك السيرفو‪ ،‬ويعيد تبعاً لذلك قيمة من ‪0‬‬ ‫)(‪myservo.read‬‬
‫وحتى ‪.180‬‬
‫مالحظة ‪ :‬اترك فاصال زمنيا مقداره ‪ 15ms‬على األقل لالنتقال من زاوية لزاوية أخرى‪.‬‬
‫تم كتابة كود برمجي لتحريك محرك السيرفو إلى الزوايا ‪.0º, 90°, 180°‬‬
‫>‪#include <Servo.h‬‬
‫;‪Servo myservo‬‬

‫)(‪void setup‬‬
‫{‬
‫;)‪myservo.attach(9‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;)‪myservo.write(0‬‬
‫;)‪delay(1000‬‬

‫;)‪myservo.write(90‬‬
‫;)‪delay(1000‬‬
‫‪127‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫;)‪myservo.write(180‬‬
‫;)‪delay(1000‬‬
‫}‬

‫‪-3-4-7-3‬محاكاة التحكم بمحرك السيرفو من خالل برنامج ‪Proteus‬‬

‫الشكل (‪ :)75-3‬محاكاة التحكم بمحرك السيرفو من خالل برنامج ‪.Proteus‬‬

‫‪128‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫التحكم باألجهزة التي تعمل بجهود عالية‬

‫‪-1-8-3‬مقدمة‬
‫كما هو معلوم لدينا تعمل لوحة األردوينو بجهد مقداره ‪ +5V‬لذلك ال يمكن لها أن تتحكم‬
‫مباشرة بأجهزة الجهد العالي )‪ (120-240V‬كمصابيح اإلضاءة‪ ،‬والمراوح‪ ،‬والسخانات‪ ،‬لتستخدم أداة‬
‫تعرف بالمرحل ‪ relay‬التي تقدم اتصاال ما بين دارة الجهد المنخفض مع دارة الجهد العالي‪ .‬يتألف‬
‫المرحل كما هو موضح في الشكل (‪ )76-3‬من ملف ‪ ،coil‬وعمود أو ذرا ع حديدي متحرك ‪movable‬‬
‫‪ ،armature‬وتماس ثابت مغلق بشكل طبيعي )‪ Normal close (NC‬وتماس مفتوح بشكل طبيعي‬
‫)‪ ،Normal Open (NO‬وقد يكون أكثر من تماسين ثابتين‪ .‬يعمل الملف كمغناطيس كهربائي‬
‫‪ .electromagnet‬بدون تطبيق جهد كهربائي على طرفي الملف يكون الذرا ع المتحرك متصال مع‬
‫التماس المغلق بشكل طبيعي ‪ .NC‬عند تطبيق جهد كهربائي منخفض نسبيا على طرفي الملف سيتولد‬
‫حقل مغناطيسي يؤدي إلى جذب الذرا ع المتحرك إليه‪ ،‬ليتحرك تبعا لذلك من تماس ‪ NC‬إلى تماس‬
‫‪ NO‬ويتصل معه‪ .‬عند إزالة الجهد الكهربائي يعود الذرا ع المتحرك إلى موضع االسترخاء وذلك من‬
‫خالل نابض ‪ ،spring‬ليتصل مع تماس ‪ NC‬من جديد‪ .‬يتم ربط دارة الجهد المنخفض مع طرفي‬
‫الملف‪ ،‬في المقابل يستطيع الذرا ع المتحرك والتماسين الثابتين تحمل تطبيق جهود مرتفعة نسبيا‪،‬‬
‫لهذا يتم وصلها مع دارة الجهد العالي‪.‬‬

‫الشكل (‪ :(76-3‬بنية المرحل‪.‬‬

‫للمرحل استنادا لما سبق خمسة أطراف هي‪ :‬طرفا الملف‪ ،‬وطرف مشترك (الذرا ع المتحرك)‪،‬‬
‫وطرف ‪ ،NC‬وطرف ‪ NO‬كما هو موضح في الشكل (‪.)77-3‬‬

‫‪129‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)77-3‬أطراف المرحل العملية‪ ،‬والرمز االلكتروني المكافئ‪.‬‬


‫يوجد بعض المصطلحات الخاصة بالمرحل هي‪:‬‬
‫جهد الملف االسمي أو المعياري )‪ :Nominal Coil Voltage (Rated Coil Voltage‬الجهد الذي‬
‫تم تصميم الملف من خالله ليعمل به‪ .‬تطبيق جهد أعلى سيكون مهدرا للطاقة ومن الممكن أن يتلف‬
‫المرحل بسبب الحرارة أو اإلجهاد الميكانيكي‪.‬‬
‫جهد المسك ‪ : pickup voltage‬هو أصغر جهد مطبق على الملف يتم من خالله ضمان سحب الذرا ع‬
‫المتحرك‪ .‬إذا كانت قيمة الجهد المطبق أقل من جهد المسك فقد يتم سحب الذرا ع ولكن بشكل غير‬
‫مضمون‪.‬‬
‫جهد االنسحاب ‪ :Dropout voltage‬أعلى جهد مطبق على الملف ال يتم به جذب الذرا ع المتحرك‪.‬‬
‫مثال‪ :‬بفرض أن جهد الملف االسمي ‪ ،5 V‬وجهد المسك ‪ 70%‬من جهد الملف االسمي‪ ،‬وجهد‬
‫االنسحاب ‪ 10%‬من جهد الملف االسمي‪ .‬حدد الجهود التي من خاللها يتم جذب التماس‪ ،‬وعدم جذبه‬
‫بشكل مضمون به‪.‬‬
‫يمكن جذب الذرا ع المتحرك عند تطبيق جهد أعلى ‪ ،(70% of 5V) 3.5 V‬ويمكن ضمان عدم جذب‬
‫(ترك) الذرا ع المتحرك عند تطبيق جهد أقل من ‪.(10% of 5V) 0.5V‬‬
‫تيار التشغيل االسمي ‪ : Nominal Operating Current‬قيمة التيار المتدفق في الملف عندما يتم‬
‫تطبيق الجهد االسمي عليه‪.‬‬
‫استطاعة التشغيل االسمية ‪ : Nominal Operating Power‬قيمة االستطاعة المستخدمة من قبل‬
‫الملف عند تطبيق الجهد االسمي‪.‬‬
‫مقاومة الملف ‪.Coil Resistance‬‬
‫جهد التبديل األعظمي ‪ : Maximum Switching Voltage‬أعظم جهد يمكن تطبيقه على‬
‫التماسات بشكل آمن‪ ،‬وتختلف قيمته حالة كونه مستمر ‪ DC‬أو متناوب ‪ AC‬في معظم الحاالت‪.‬‬
‫تيار التبديل األعظمي ‪ :Maximum Switching Current‬أعظم تيار يمكن تطبيقه على التماسات‬
‫بشكل آمن‪ ،‬وتختلف قيمته في حالة كونه مستمر ‪ DC‬أو متناوب ‪ AC‬في معظم الحاالت‪.‬‬
‫استطاعة التبديل العظمى ‪ : Maximum Switching Power‬الحد األعلى لالستطاعة الممكن‬
‫تبديلها من قبل التماسات‪.‬‬
‫‪131‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يوضح الشكل (‪ )78-3‬مثاالُ على مرحل مع الخواص الخاصة به والتي تكتب عادة على الغالف‬
‫الخارجي‪ .‬الجهد االسمي له ‪ ،12V‬وجهد التبديل األعظمي في حالة كونه متناوبا ‪ 240 VAC‬مع تيار‬
‫تبدل أعظمي ‪ ،15 A‬وفي حالة كونه مستمرا ‪ 24VDC‬مع تيار أعظمي ‪.15A‬‬

‫الشكل(‪ :)78-3‬مثال على مرحل مع الخواص الخاصة به‪ .‬في الدائرة الحمراء الجهد االسمي‪ ،‬في‬
‫الدائرة الخضراء أعظم جهد وتيار تبديل في حالة تطبيق إشارة متناوبة‪ ،‬في الدائرة الصفراء أعظم‬
‫جهد وتيار تبديل عند تطبيق إشارة مستمرة‪.‬‬

‫‪-2-8-3‬ربط المرحل مع لوحة األردوينو‬


‫تم التوصل من خالله الفقرة السابقة إلى أن دارة الجهد المنخفض يتم وصلها مع طرفي‬
‫الملف‪ ،‬ودارة الجهد العالي مع الذرا ع المتحرك‪ ،‬والتماسات الثابتة‪ .‬الجهد المطبق على طرفي الملف قد‬
‫يكون ‪ 6V‬أو ‪ 9V‬أو ‪ 12V‬أو ‪ ،24V‬لهذا ال يمكن وصل أحد أقطاب األردوينو مع الملف مباشرة‪ ،‬أضف‬
‫إلى ذلك إلى أن تيار التشغيل االسمي ال يمكن تأمينه في معظم الحاالت عن طريق قطب األردوينو‪.‬‬
‫لهذا البد من استخدام أداة الكترونية تؤمن الجهد والتيار ويتم التحكم بها عن طريق األردوينو كما‬
‫تم دراسته في فقرة المحركات‪ .‬أبسط أداة يمكن استخدامها هي الترانزستور‪ .‬يوضح الشكل (‪)79-3‬‬
‫كيفية وصل لوحة األردوينو مع طرفي ملف المرحل عن طريق الترانزستور‪ .‬وكيفية وصل دارة الجهد‬
‫العالي المتمثلة بمنبع جهد متناوب ‪ 220V‬ومصباح ‪ LAMP‬مع الذار ع المتحرك والتماسات الثابتة‪.‬‬

‫الشكل (‪ :)79-3‬وصل لوحة األردوينو مع المرحل لتشغيل أجهزة الجهد العالي‪.‬‬

‫‪131‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يعمل الترانزستور كمفتاح ‪ ،switch‬بدون تطبيق جهد )‪ 0‬منطقي) على قاعدة الترانزستور‬
‫يكون في حالة فتح ‪ OFF‬وتصبح الدارة المكافئة له كما هو موضح في الحالة (‪ ،)a-81-3‬وعندئذ لن‬
‫يمر تيار كهربائي ضمن ملف المرحل‪ ،‬وبالتالي سيكون الذرا ع متصل مع التماس ‪ ،NC‬وتكون دارة‬
‫الجهد العالي مفتوحة ولن يعمل المصباح تبعا لذلك‪ .‬عند تطبيق جهد مقداره ‪ +5V‬عن طريق أحد‬
‫أرجل لوحة األردوينو على قاعدة الترانزستور يصبح في هذه الحالة بحالة تشغيل ‪ ON‬وتصبح الدارة‬

‫المكافئة كما هو موضح في الحالة (‪ ،)b-81-3‬ليمر تيار ضمن ملف المرحل‪ ،‬وسيجذب الذرا ع إليه‪،‬‬

‫مما يؤدي إلى أن يتصل مع التماس ‪ ،NO‬بالتالي ستغلق دارة الجهد العالي وسيعمل المصباح عندئذ‪.‬‬
‫يمكن استخدام ترانزستور ‪ BC548‬أو ‪ .BC337‬يمكن مالحظة وجود ثنائي ‪ diode‬على طرفي ملف‬
‫المرحل‪ ،‬وهو ضروري ألنه عندما إزالة الجهد المطبق على طرفي الملف سيحدث ارتفا ع مفاجئ للجهد‬
‫)‪ (voltage spike‬بسبب التيار الذي يحتفظ به الملف‪ ،‬مما قد يؤدي إلى تلف الترانزستور أو قد يقلل‬
‫من عمر تماسات التبديل‪ .‬قد يصل هذا الجهد إلى ‪ 1000V‬من أجل مرحل ‪ .12V‬يوفر هذا الثنائي‬
‫مسارا للتيار المخزن في الملف‪ ،‬وبالتالي تبديد وتفريغ الطاقة المغناطيسية بأمان‪.‬‬

‫الشكل (‪ :)81-3‬الحالة )‪ (a‬عند تطبيق ‪ 0V‬ال يعمل المصباح‪ ،‬الحالة )‪ (b‬عند تطبيق ‪ +5V‬يعمل‬
‫المصباح‪.‬‬

‫‪-3-8-3‬الكود البرمجي‬
‫{ )(‪void setup‬‬
‫;)‪pinMode(0,INPUT_PULLUP‬‬
‫;)‪pinMode(8,OUTPUT‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪boolean x‬‬
‫;)‪x=digitalRead(0‬‬
‫};)‪if (x==LOW) {digitalWrite(8,HIGH‬‬
‫};)‪else {digitalWrite(8,LOW‬‬
‫}‬

‫‪132‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪ -4-8-3‬محاكاة التحكم بمصباح باستخدام المرحل في برنامج ‪Proteus‬‬

‫الشكل (‪ :)81-3‬محاكاة التحكم بمصباح باستخدام المرحل في برنامج ‪.Proteus‬‬

‫‪ -5-8-3‬ملحقات‬
‫يوضح الشكل (‪ )82-3‬بعض الدرات الجاهزة التي تحتوي على مرحل‪ ،‬ويتم وصلها مع لوحة‬
‫األردوينو ودارة الجهد العالي بشكل مباشر‪.‬‬

‫الشكل (‪ :)82-3‬نماذج لبعض دارات المرحل الممكن وصلها مع لوحة األردوينو‪.‬‬

‫‪133‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫نقل المعلومات وفق بروتوكول االتصال التسلسلي ‪UART‬‬

‫‪ -1-9-3‬مقدمة‬
‫يشار إلى عملية تبادل المعلومات ما بين األجهزة باالتصال ‪ .communication‬يمكن‬
‫للطرفيات أن تتبادل المعلومات إما بشكل تسلسلي ‪ serial‬أو بشكل تفرعي ‪ parallel‬كما هو موضح‬
‫في الشكل (‪ .)83-3‬في االتصال التفرعي يتم إرسال مجموعة من النبضات الرقمية في نفس الوقت‪،‬‬
‫بينما في االتصال التسلسلي يتم إرسال نبضة رقمية كل فترة زمنية‪ ،‬بالتالي يتم إرسال النبضات على‬
‫التتالي‪ .‬على الرغم من أن االتصال التفرعي قد يحقق سرعة نقل مرتفعة‪ ،‬إال أنه أكثر تكلفة‪ ،‬لذلك‬
‫يستخدم في اتصاالت المسافات القصيرة مثل مسارات أنظمة الحواسيب وبعض الدارات المتكاملة‪.‬‬
‫في المقابل يتطلب االتصال التسلسلي عدد خطوط نقل أقل من االتصال التفرعي‪ ،‬وبالتالي تكلفة‬
‫أقل‪ ،‬كما أنه في الوقت الحاضر تم التوصل إلى معدالت نقل عالية لالتصال التسلسلي كما هو الحال‬
‫في ‪ USB‬واتصاالت الليف الضوئية‪ ،‬وبعض الدارات المتكاملة الحديثة‪.‬‬

‫الشكل (‪ :)83-3‬االتصال بشكل تسلسلي‪ ،‬وبشكل تفرعي‪.‬‬

‫يمكن تصنيف االتصاالت التسلسلية كما هو موضح في الشكل (‪ )84-3‬حسب اتجاه إرسال المعطيات‬
‫إلى ‪:‬‬
‫‪ : simplex -1‬يتم إرسال المعطيات باتجاه واحد فقط من المرسل إلى المستقبل‪.‬‬
‫‪ : half – duplex -2‬يتم إرسال المعطيات باتجاهين ولكن ال يمكن نقلها باالتجاهين في نفس‬
‫الوقت‪.‬‬
‫‪ : full – duplex -3‬يتم إرسال المعطيات باتجاهين وبنفس الوقت‪.‬‬

‫‪134‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)84-3‬تصنيف االتصاالت التسلسلية حسب اتجاه نقل المعطيات‪.‬‬

‫البد من وجود إيقا ع معين ما بين جهازي اإلرسال واالستقبال‪ ،‬بمعنى أنه يجب على جهاز‬
‫اإلرسال أن يكون لديه المقدرة على تحديد بداية ونهاية كل بت ومعدل اإلرسال المستخدم وهو ما‬
‫يعرف بتزامن اإلرسال‪ .‬يوضح الشكل (‪ )85-3‬تأثير عدم وجود تزامن ما بين المرسل والمستقبل‪.‬‬

‫الشكل (‪ :)85-3‬تأثير عدم وجود تزامن ما بين المرسل والمستقبل‪.‬‬

‫يوجد طريقتان مختلفتان لتزامن اإلرسال‪:‬‬


‫‪-1‬اإلرسال المتزامن ‪ :synchronous transmission‬يستخدم إشارة ساعة خارجية إلجراء عملية‬
‫التزامن كما هو موضح في الشكل (‪ .)86-3‬قد ترسل هذه اإلشارة على خط منفصل عن المعطيات‬
‫وتعرف ب ‪ Clock‬أو ‪ ،Strobe‬أو يمكن تضمينها مع إشارة المعطيات واستعادة إشارة ‪ clock‬عند‬
‫المستقبل‪ .‬من األمثلة على البروتوكوالت التي تستخدم إشارة ساعة ‪ clock‬على خط منفصل‪I2C , :‬‬
‫‪ .SPI‬من األمثلة على تضمين إشارة المعطيات بإشارة ساعة استخدام ترميز ‪ .Manchester‬يستخدم‬
‫اإلرسال المتزامن لنقل كتل كبيرة من المعطيات‪ ،‬ويتم إرسالها على شكل إطارات ‪.frames‬‬

‫‪135‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)86-3‬إرسال المعطيات وفق األسلوب المتزامن‪.‬‬


‫‪ -2‬اإلرسال غير المتزامن ‪ :asynchronous transmission‬تستخدم في هذه الطريقة إشارات خاصة‬
‫على طول وسط النقل‪ .‬يتم في البداية إرسال بت بداية ومن ثم بتات المعطيات (نموذجيا ‪ 8‬أو ‪7‬‬
‫بتات) ومن ثم بت توقف كما موضح في الشكل (‪ .)87-3‬يوجد ثغرات ‪ Gaps‬ما بين إرسال البايتات‬
‫المرسلة توفر للمستقبل فترة من أجل التزامن‪ .‬يعتبر هذا النمط من اإلرسال مناسبا إلرسال معطيات‬
‫بمعدالت بت منخفضة‪ .‬ويستخدم عموما مع معطيات مرسلة على فترات غير منتظمة (كما في لوحة‬
‫المفاتيح)‪ .‬من أمثلة البروتوكوالت التي تستخدم اإلرسال غير المتزامن‪.RS232, RS485 :‬‬

‫الشكل (‪ :)87-3‬إرسال المعطيات وفق األسلوب غير المتزامن‪.‬‬


‫أشهر بروتوكوالت االتصال التسلسلية المستخدمة في المتحكمات الصغرية‪RS232, RS422, :‬‬
‫‪.RS485, I2C, SPI, CAN, Ethernet‬‬

‫‪ -2-9-3‬بروتوكول االتصال التسلسلي ‪(recommended standard ) RS-232‬‬


‫يعد بروتوكول ‪ RS-232‬من أشهر بروتوكوالت االتصال التسلسلية المستخدمة لنقل‬
‫المعلومات ما بين طرفيتين‪ ،‬مثل ربط الحاسب مع أجهزة محيطية أخرى كالمودم والطابعة والفارة‪.‬‬
‫‪DCE (data‬‬ ‫تعرف الطرفية األولى )‪ ، DTE (data terminal equipment‬والطرفية الثانية‬
‫)‪ .communication equipment‬فيما يلي عرض لخصائص هذا البروتوكول‪:‬‬
‫‪-1‬يتم نقل المعطيات على خطين ‪ :‬خط يتم فيه إرسال المعطيات من الجهاز إلى الجهاز اآلخر و خط‬
‫يتم فيه إرسال المعطيات في االتجاه اآلخر‪ ،‬أي أن االتصال بازدواجية تامة ‪ .full duplex‬يمكن أن‬
‫ترتبط الطرفيتان أيضا بخطوط تحكم أخرى (نمط المصافحة ‪ .)handshake‬ال يوجد خط تزامن‪.‬‬

‫‪136‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-2‬المستويات المنطقية على خطوط المعطيات‪ :‬يحدد للواحد منطقي (يعرف أيضا بالعالمة ‪)mark‬‬
‫مستوي الجهد األكثر سلبية من ‪ ،-3V‬ويحدد للصفر منطقي (يعرف أيضا بالفراغ ‪ )space‬مستوي‬
‫الجهد األكثر إيجابية من ‪ .+3V‬قد يكون هذا غريب ولكنه يزيد من المسافة و وثوقية نقل المعطيات‪.‬‬
‫مجال الجهد من ‪ -3V‬إلى ‪ +3V‬غير مسموح به‪.‬‬
‫‪-3‬ترسل المعطيات على شكل مجموعة من البتات وفق الترتيب التالي‪:‬‬
‫بت البداية ‪ :start bit‬بت يدل على بداية عملية إرسال المعطيات ويكون على حالة الجهد المرتفع‬
‫(‪.)logic 0‬‬
‫بتات الرمز أو الحرف ‪ :Character Bits‬عدد هذه البتات ‪ 5‬أو ‪ 6‬أو ‪ 7‬أو ‪ .8‬البت األقل أهمية هو البت‬
‫المرسل أوال‪.‬‬
‫بت الفحص ‪ :Parity Bit‬بت اختياري يمكن عدم إرساله‪ .‬ويستخدم لكشف األخطاء الممكن حدوثها‬
‫على بتات الحروف وهناك نموذجان لهذا البت ‪ :‬فحص زوجي ‪ :Even Parity‬يأخذ بت الفحص صفر‬
‫منطقي أو واحد منطقي بحيث يكون مجمو ع بتات الحروف المساوية للواحد المنطقي مع بت‬
‫صفر منطقي أو واحد‬ ‫الفحص مساوية لعدد زوجي‪ .‬فحص فردي ‪ :Odd Parity‬يأخذ بت الفحص‬
‫منطقي بحيث يكون مجمو ع بتات الحروف المساوية للواحد المنطقي مع بت الفحص مساوية لعدد‬
‫فردي‬
‫بت توقف ‪ : Stop Bits‬بت توقف واحد أو أكثر يتم إضافته في نهاية بتات الحروف أو بت الفحص‪.‬‬
‫ويكون على حالة الجهد المنخفض (‪ . )logic 1‬بت التوقف يعطي للمستقبل فترة زمنية كافية ليكون‬
‫مستعدا الستقبال حرف أخر‪.‬‬
‫يوضح الشكل (‪ )88-3‬كيفية إرسال الحرف ”‪ "K‬وفق بروتوكول االتصال ‪.RS232‬‬

‫الشكل (‪ :)88-3‬إرسال الحرف ”‪ "K‬وفق بروتوكول االتصال ‪.RS232‬‬


‫‪-4‬البد من ضبط كل من المرسل والمستقبل على نفس معدل أو سرعة اإلرسال (عدد البتات في‬
‫الثانية) لكي تتم عملية التزامن بشكل صحيح‪ .‬يعرف معدل اإلرسال بـ ‪ baud rate‬و أكثر المعدالت‬
‫شهرة و يعمل بها ‪Baud rate: 50 , 110 , 300 , 1200 , 2400 , 4800 , 9600 , 14400, 28800, :‬‬
‫)‪33600, 56000, 115000, rarely (330000‬‬

‫‪137‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-5‬وصالت ‪ : RS-232‬يتطلب المعيار ‪ RS-232‬إلجراء عمليات االتصال ما بين الطرفيات وصالت‬
‫خاصة إما ‪ 9 pins‬أو ‪ .25 pins‬الوصلة ‪ 25 pins‬يطلق عليها ‪ ، DB-25‬أما الوصلة ‪ 9 pins‬يطلق‬
‫عليها ‪ .DB-9‬إضافة لذلك هناك الوصلة ‪ RJ-45‬المستخدمة في اإلثرنت‪ .‬يبين الشكل (‪ )89-3‬الوصلة‬
‫‪ ، DB-9‬ووظيفة كل قطب ‪.pin‬‬

‫الشكل (‪ :)89-3‬وصلة ‪ ، DB-9‬ووظيفة كل قطب ‪.pin‬‬


‫يمكن تصنيف اإلشارات المرسلة على األرجل السابقة إلى ‪:‬‬
‫‪ -1‬إشارات معطيات ‪ data signal‬وتضم كال من ‪:‬‬
‫)‪received data(RxD) – transmitted data(TxD‬‬
‫‪ -2‬إشارات تحكم ‪ control signal‬وتضم كال من ‪:‬‬
‫‪clear to send(CTS) – request to send(RTS) - ring indicator(RI) - data terminal‬‬
‫)‪ready(DTR) – data set ready(DSR) - carrier detect(CD‬‬
‫يمكن العمل تبعا لذلك بإحدى الشكلين التاليين‪:‬‬
‫‪ -1‬بدون مصافحة ‪ : no handshaking‬باستخدام إشارات المعطيات فقط‪.‬‬
‫‪ -2‬مصافحة ‪ : full handshaking‬باستخدام إشارات المعطيات والتحكم‪.‬‬
‫سنهتم هنا بالنمط األول من دون مصافحة فهو أبسط بكثير‪.‬‬
‫يوضح الشكل (‪ )91-3‬كيفية ربط جهازين (مثال حاسوبين) وفق المعيار ‪ RS232‬ونمط عدم‬
‫المصافحة‪.‬‬

‫الشكل (‪ :)91-3‬ربط حاسوبين معا من خالل منافذهما التسلسلية ‪ DB-9‬ووفق نمط بدون مصافحة‪.‬‬

‫‪138‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3-9-3‬نقل المعطيات ما بين لوحة األردوينو والطرفيات األخرى من خالل بروتوكول‬


‫االتصال ‪UART‬‬
‫يسمح بروتوكول االتصال )‪universal asynchronous receiver-transmitter (UART‬‬
‫للوحة األردوينو من أن تتصل مع طرفيات أخرى كلوحة أردوينو أخرى أو حاسوب وغير ذلك‪ .‬خواص‬
‫بروتوكول ‪ UART‬مشابهة لبروتوكول ‪ RS232‬باستثناء مستوى جهود ‪ 1‬و‪ 1‬منطقي‪ ،‬حيث تأخذ‬
‫‪ +5V‬و‪ ،0V‬لذلك ال يستخدم ‪ UART‬مع المسافات الطويلة‪ .‬لتبديل مستوى جهود المعطيات الرقمية‬
‫من ‪ UART‬إلى ‪ RS232‬والعكس تستخدم بعض الدارات المتكاملة مثل ‪ُ .max232‬تدعم بعض‬
‫المتحكمات الصغرية ببنية مادية لالتصال وفق هذا البروتوكول‪ .‬إذا لم يتضمن المتحكم الصغري‬
‫وحدة اتصال ‪ UART‬يمكن عندئذ بناؤها برمجيا باستخدام أرجل الدخل والخرج الرقمية‪.‬‬
‫في لوحة األردوينو أونو يتم االتصال وفق بروتوكول ‪ UART‬ببنية مادية من خالل رجل‬
‫إرسال )‪ ،TX (pin 1‬ورجل استقبال )‪.RX (pin 0‬‬
‫لم يعد في الوقت الحاضر المنفذ التسلسلي الموضح في الشكل (‪ )89-3‬منتشرا في أجهزة‬
‫الحواسيب وتم استبداله بمنفذ ‪ .USB‬تبعا لذلك نحتاج لربط لوحة األردوينو مع منفذ ‪ USB‬للحاسب‬
‫إلى استخدام دارة الكترونية تعمل على التبديل ما بين ‪ UART‬و ‪ .USB‬يوجد خياران لتنفيذ ذلك‪:‬‬
‫‪ ‬من خالل المتحكم الصغري الثانوي ‪ ATmega16U2‬المدمج ضمن لوحة األردوينو أونو‪ ،‬حيث‬
‫يعمل على تحويل المعطيات المرسلة من المتحكم الرئيسي وفق بروتوكول ‪ UART‬إلى‬
‫بروتوكول ‪ USB‬والعكس‪ ،‬بالتالي ربط لوحة األردوينو بشكل مباشر مع الحاسب كما هو‬
‫موضح في الشكل (‪.)91-3‬‬
‫من خالل استخدام لوحة الكترونية خارجية تحتوي على دارة متكاملة تعرف بـ ‪ FT232R‬كما‬ ‫‪‬‬
‫هو موضح في الشكل (‪ .)92-3‬تعمل ‪ FT232R‬كوسيط اتصال ما بين ‪ UART‬و ‪ USB‬بشكل‬
‫مشابه للمتحكم الثانوي ‪ .ATmega16U2‬لهذه اللوحة رجل إرسال ‪ TX‬يتم وصلها مع رجل‬
‫استقبال لوحة األردوينو)‪ ، RX (pin 0‬ورجل استقبال ‪ RX‬يتم وصلها مع رجل إرسال لوحة‬
‫األردوينو)‪ .TX (pin 1‬يوجد أيضا رجل تغذية ‪ VCC‬تعطي جهدا ‪ ،+5V‬ورجل أرضي ‪،GND‬‬
‫يمكن استخدامهما لتغذية لوحة األردوينو أو أية دارات أخرى‪ .‬الرجل ‪ DTR‬و ‪ CTS‬ال داعي‬
‫لوصلها في تطبيقاتنا‪.‬‬
‫عند وصل لوحة األردينو أو لوحة ‪ FT232R‬مع منفذ ‪ USB‬للحاسب‪ ،‬يطلب نظام التشغيل برنامج‬
‫تعريف ‪ .driver‬بالنسبة للوحة األردوينو يكون التعريف موجود مع حزمة ‪ Arduino IDE‬التي تم‬
‫شرحها في الفصل الثاني‪ .‬أما شريحة ‪ FT232R‬يمكن تنصيب التعريف )‪Virtual COM port (VCP‬‬
‫‪ driver‬من موقع المنتج ‪ . http://www.ftdichip.com‬في كال الحالتين ستظهر لوحة األردوينو أو‬
‫لوحة ‪ FT232R‬على الحاسب كمنفذ ‪ COM‬إضافي عند فتح نافذة إدارة األجهزة‪ .‬تبعا لذلك فإن‬
‫البرنامج المستخدم في الحاسب للتواصل مع لوحة األردوينو ( مثل نافذة المراقبة التسلسلية ‪serial‬‬
‫‪139‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ monitor‬في برنامج ‪ )Arduino IDE‬سيتعامل مع لوحة األردوينو أو لوحة ‪ FT232R‬على أنهما‬
‫منفذ ‪. COM‬‬

‫الشكل (‪ :)91-3‬نقل المعلومات ما بين لوحة األردوينو والحاسب المحمول عبر منفذ ‪ USB‬عن طريق‬
‫المتحكم الثانوي المدمج ضمن لوحة األردوينو‪.‬‬

‫‪FT232R‬‬
‫‪UAR‬‬ ‫‪USB‬‬
‫‪T‬‬

‫الشكل (‪ :)92-3‬نقل المعلومات ما بين لوحة األردوينو والحاسب عبر منفذ ‪ USB‬عن طريق شريحة‬
‫‪ .FT232R‬يتم وصل رجل ‪ TX‬في لوحة ‪ FT232R‬مع رجل )‪ RX (pin 0‬للوحة األردوينو‪ ،‬والعكس‪.‬‬

‫للوحة األردوينو ميغا ‪ Mega‬أربع منافذ تسلسلية‪:‬‬


‫‪ :serial 0 ‬رجل إرسال )‪ ،TX (pin 1‬ورجل استقبال )‪،RX(pin 0‬‬
‫‪ :serial 1 ‬رجل إرسال )‪ ،TX (pin 18‬ورجل استقبال )‪.RX (pin 19‬‬
‫‪ :serial 2 ‬رجل إرسال )‪ ،TX (pin 16‬ورجل استقبال )‪.RX (pin 17‬‬
‫‪ :serial 3 ‬رجل إرسال )‪ ،TX (pin 14‬ورجل استقبال )‪.RX (pin 15‬‬

‫‪141‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يبين الجدول التالي التعليمات المستخدمة في برنامج ‪ Arduino IDE‬لالتصال وفق البنية‬
‫المادية لبروتوكول ‪ ،UART‬أي في لوحة األردوينو ‪ UNO‬مع رجل االستقبال )‪ ،pin0 (RX‬ورجل‬
‫اإلرسال )‪ ،pin1 (TX‬ومنفذ ‪ USB‬في نفس الوقت عن طريق المتحكم الثانوي ‪ATmega16U2‬‬
‫الوظيفة‬ ‫التعلمية‬
‫تعد ‪ serial‬شرطاً منطقياً ‪ ،‬حيث تعيد القيمة ‪ true‬إذا كان المنفذ‬ ‫} { )‪while (!serial‬‬
‫التسلسلي جاهز لالتصال‪ ،‬وتعيد ‪ false‬في حالة عدم جهوزيته‪.‬‬
‫)‪if (serial‬‬
‫لذلك يمكن استخدامها بحيث تنتظر لوحة األردوينو حتى يصبح‬
‫المنفذ جاهزاً ‪ .‬مثال‪:‬‬
‫{ )‪while (!Serial‬‬
‫‪// wait for serial port to connect. Needed for native USB‬‬
‫}‬
‫تعيد هذه التعليمة عدد البايتات (الحروف) المستقبلة والمخزنة‬ ‫)(‪Serial.available‬‬
‫في ذاكرة االستقبال التسلسلية والجاهزة للقراءة‪ .‬مثال‪:‬‬
‫{ )‪if (Serial.available() > 0‬‬
‫يتحقق الشرط في حال وجود بيانات مستقبلة ‪//‬‬
‫}‬
‫تستخدم هذه التعليمة لتحديد معدل اإلرسال من خالل البارامتر‬ ‫)‪Serial.begin(speed‬‬
‫)‪Serial.begin(speed, config‬‬
‫‪ .speed‬يمكن أيضاً وبشكل اختياري تحديد عدد بتات المعطيات‬
‫‪ ،data‬الزوجية ‪ ،parity‬بتات التوقف ‪ stop‬من خالل البارامتر‬ ‫من أجل لوحة ‪ Arduino Mega‬فقط ‪:‬‬
‫‪ .config‬بشكل افتراضي عدد البتات ‪ ،8‬بدون بت فحص زوجية‪ ،‬بت‬ ‫)‪Serial1.begin(speed‬‬
‫)‪Serial2.begin(speed‬‬
‫توقف واحد‪ .‬مثال‪:‬‬ ‫)‪Serial3.begin(speed‬‬
‫;)‪Serial.begin(9600‬‬ ‫)‪Serial1.begin(speed, config‬‬
‫)‪Serial2.begin(speed, config‬‬
‫)‪Serial3.begin(speed, config‬‬
‫تسمح هذه التعليمة بإرسال معطيات على المنفذ التسلسلي‬ ‫)‪Serial.print(val‬‬
‫)‪Serial.print(val, format‬‬
‫على شكل نص ‪ ASCII‬من خالل البارامتر ‪ .val‬يأخذ البارامتر ‪val‬‬
‫أي نمط من المعطيات (أرقام أو حروف) وكلها ترسل على شكل‬
‫‪ .ASCII‬البارامتر ‪ format‬اختياري ومن خالله يتم ضبط إرسال‬
‫األرقام كما في األمثلة التالية‪:‬‬
‫)‪Serial.print(78‬‬ ‫"‪//gives "78‬‬
‫)‪Serial.print(1.23456‬‬ ‫"‪//gives "1.23‬‬
‫)'‪Serial.print('N‬‬ ‫"‪//gives "N‬‬
‫)"‪Serial.print("Hello world.‬‬ ‫"‪//gives "Hello world.‬‬
‫‪------------------------------------------------------------------------‬‬

‫)‪Serial.print(78, BIN‬‬ ‫"‪//gives "1001110‬‬


‫)‪Serial.print(78, OCT‬‬ ‫"‪//gives "116‬‬
‫)‪Serial.print(78, DEC‬‬ ‫"‪//gives "78‬‬
‫)‪Serial.print(7, HEX‬‬ ‫"‪//gives "4E‬‬
‫)‪Serial.println(1.23456, 0‬‬ ‫"‪// gives "1‬‬
‫) )‪Serial.println(1.23456, 2‬‬ ‫"‪// gives "1.23‬‬
‫) )‪Serial.println(1.23456, 4‬‬ ‫"‪// gives "1.2346‬‬

‫‪141‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الوظيفة‬ ‫التعلمية‬
‫نفس وظيفة التعليمة السابقة‪ ،‬ولكن يتبع النص التسلسلي برمز‬ ‫)‪Serial.println(val‬‬
‫)‪Serial.println(val, format‬‬
‫عودة النقل )'‪ ،(ASCII 13 or '\r‬ورمز السطر الجديد‬
‫)'‪(ASCII 10 or '\n‬‬
‫يتم إرسال معطيات ثنائية‪ .‬المعطيات قد ترسل كبايت واحد‬ ‫)‪Serial.write(val‬‬
‫)‪Serial.write(str‬‬
‫(البارامتر ‪ )val‬أو سلسلة من البايتات (البارامتر ‪ .)str‬مثال‪:‬‬
‫;)‪Serial.write(82‬‬ ‫)‪// send 82 (1010010‬‬
‫;)”‪Serial.write(“hello‬‬ ‫”‪//send the string “hello‬‬
‫يتم قراءة البايت األول للمعطيات التسلسلية القادمة والمتاحة‪.‬‬ ‫)(‪Serial.read‬‬
‫‪Arduino Mega only:‬‬
‫في حالة عدم وجود معطيات تعيد التعليمة ‪ .-1‬مثال‪:‬‬
‫)(‪Serial1.read‬‬
‫;‪int incomingByte = 0‬‬ ‫)(‪Serial2.read‬‬
‫‪…..‬‬ ‫)(‪Serial3.read‬‬
‫;)(‪incomingByte = Serial.read‬‬
‫تعمل على قراءة سلسلة الرموز الموجودة من الذاكرة‬ ‫)(‪Serial.readString‬‬
‫التسلسلية‪ .‬تنتهي هذه الوظيفية في حالة انتهاء المهلة‬
‫(تحددها التعليمة ‪ setTimeout‬ومدة المهلة افتراضياً ثانية)‪.‬‬
‫تعمل على قراءة أول رقم صحيح (موجب أو سالب) من الذاكرة‬ ‫)(‪Serial.parseInt‬‬
‫التسلسلية ‪ .serial buffer‬تنتهي هذه الوظيفية في حالة‬
‫انتهاء المهلة أو قراءة قيمة ليست عدد صحيح‪ ،‬وتعيد قيمة ‪0‬‬
‫عندئذ‪.‬‬
‫‪floating‬‬ ‫تعمل على قراءة أول رقم حقيقي (نقطة عائمة‬ ‫)(‪Serial.parseFloat‬‬
‫‪ )point‬من الذاكرة التسلسلية ‪ .serial buffer‬تنتهي هذه‬
‫الوظيفية في حالة انتهاء المهلة أو قراءة قيمة ليست عدد‬
‫صحيح‪ ،‬وتعيد قيمة ‪ 0‬عندئذ‪.‬‬
‫يتم تحديد مهلة االنتظار العظمى عند استخدام بعض التعليمات‬ ‫)‪Serial.setTimeout(time‬‬
‫التسلسلية من خالل البارامتر ‪ time‬وبواحدة الميلي ثانية ‪.ms‬‬

‫يمكن أيضا بناء بروتوكول ‪ UART‬برمجيا وعندئذ يمكن استخدام أي أرجل رقمية للوحة‬
‫األردوينو‪ .‬من الممكن بناء عدة أرجل لتعمل وفق بروتوكول ‪ UART‬وبسرعة تصل إلى ‪115200‬‬
‫‪ .bps‬لتفعيل البناء البرمجي بروتوكول ‪ UART‬برمجيا نتبع الخطوات التالية‪:‬‬
‫‪-1‬نستدعي مكتبة ‪ SoftwareSerial.h‬في البداية‪.‬‬
‫>‪#include < SoftwareSerial.h‬‬
‫‪-2‬بعد استدعاء المكتبة مباشرة ننشئ كائن تسلسلي جديد (نسميه مثال ‪ ،)mySerial‬ونحدد رجل‬
‫االستقبال ثم رجل اإلرسال كما يلي‪:‬‬
‫;)‪SoftwareSerial mySerial(rxPin,txPin‬‬

‫‪142‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫مثال‪:‬‬
‫;)‪SoftwareSerial mySerial(2,3‬‬
‫‪-3‬داخل اإلجرائية )(‪ void setup‬ندخل معدل نقل البتات كما يلي‪:‬‬
‫;)‪mySerial.begin(speed‬‬
‫مثال‪:‬‬
‫;)‪mySerial.begin(9600‬‬

‫‪-4‬يمكن اآلن استخدام التعلميات‪:‬‬


‫‪mySerial.read(), mySerial.print(), mySerial.write(), mySerial.available(),‬‬
‫والتي تم شرحها سابقا في الجدول‪.‬‬

‫‪-4-9-3‬الكود البرمجي‬
‫التطبيق األول‬
‫يهدف هذا التطبيق إلى معرفة الفرق ما بين تعليمتي اإلرسال ‪.Serial.write ، Serial.println‬‬
‫{ )(‪void setup‬‬
‫‪Serial.begin(9600); // opens serial port, sets data rate to 9600 bps‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;)‪Serial.println(82‬‬
‫;)‪Serial.write(82‬‬
‫;)(‪Serial.println‬‬
‫;)'‪Serial.println('M‬‬
‫;)'‪Serial.write('M‬‬
‫;)(‪Serial.println‬‬
‫;)"‪Serial.println("Hello‬‬
‫;)"‪Serial.write("Hello‬‬
‫} { )‪while (1‬‬
‫}‬

‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪Arduino‬‬
‫‪ ،IDE‬تم التوصل إلى النتيجة الموضحة في الشكل (‪ .)93-3‬نالحظ أن التعليمتين تقدمان نفس‬
‫النتيجة عند إرسال حرف '‪ 'M‬وسلسلة حروف "‪ ،"Hello‬ولكن يختلفان عند إرسال رقم ‪،82‬‬
‫التعليمة ‪( Serial.println‬أو ‪ )Serial.print‬ترسل الرقم على شكل حرفين أو رمزين '‪ ، '8' '2‬بينما‬
‫التعليمة ‪ Serial.write‬فترسل الحرف المكافئ للرقم ‪ 82‬وفق ترميزات أسكي وهو حرف '‪.'R‬‬

‫‪143‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)93-3‬نافذة المراقبة التسلسلية للتطبيق األول‪.‬‬


‫التطبيق الثاني‬
‫يهدف هذا التطبيق إلى معرفة كيفية استخدام تعليمة قراءة بايت واحد وهي‬
‫)(‪.Serial.read‬‬
‫;‪int incomingByte = 0‬‬

‫{ )(‪void setup‬‬
‫‪Serial.begin(9600); // opens serial port, sets data rate to 9600 bps‬‬
‫}‬

‫{ )(‪void loop‬‬
‫{ )‪if (Serial.available() > 0‬‬
‫‪incomingByte = Serial.read(); // read the incoming byte:‬‬
‫;)"‪Serial.print(" I received:‬‬
‫;)‪Serial.println(incomingByte‬‬
‫}‬
‫}‬

‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪Arduino‬‬
‫‪ ،IDE‬تم التوصل إلى النتيجة الموضحة في الشكل (‪ .)94-3‬عند إرسال حرف '‪ 'R‬من الحاسب تكون‬
‫لوحة األردوينو قد استقبلت ترميزة أسكي المكافئة له‪ ،‬لتخزنها في المتغير ‪ .incomingByte‬بعد‬
‫ذلك ترسل لوحة األردوينو للحاسب رمزين '‪ '8' '2‬ألنه تم استخدام تعليمة اإلرسال ‪Serial.println‬‬
‫كما تم شرحه في التطبيق األول‪.‬‬

‫‪144‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)94-3‬نافذة المراقبة التسلسلية للتطبيق الثاني‪.‬‬


‫التطبيق الثالث‬
‫سنعيد نفس التطبيق السابق مع استبدال ‪ Serial.println‬بالتعليمة ‪.Serial.write‬‬
‫;‪int incomingByte = 0‬‬

‫{ )(‪void setup‬‬
‫‪Serial.begin(9600); // opens serial port, sets data rate to 9600 bps‬‬
‫}‬

‫{ )(‪void loop‬‬
‫{ )‪if (Serial.available() > 0‬‬
‫‪incomingByte = Serial.read(); // read the incoming byte:‬‬
‫;)"‪Serial.print(" I received:‬‬
‫;)‪Serial.write(incomingByte‬‬
‫}‬
‫}‬

‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪Arduino‬‬
‫‪ ،IDE‬تم التوصل إلى النتيجة الموضحة في الشكل (‪ .)95-3‬عند إرسال حرف '‪ 'R‬من الحاسب تكون‬
‫لوحة األردوينو استقبلت ترميزة أسكي المكافئة له‪ ،‬لتخزنها في المتغير ‪ .incomingByte‬بعد ذلك‬
‫ترسل لوحة األردوينو للحاسب الحرف '‪ 'R‬ألنه تم استخدام تعليمة اإلرسال ‪ Serial.write‬كما تم‬
‫شرحه في التطبيق األول‪.‬‬

‫الشكل (‪ :)95-3‬نافذة المراقبة التسلسلية للتطبيق الثالث‪.‬‬

‫‪145‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫التطبيق الرابع‬
‫يهدف هذا التطبيق معرفة كيفية استخدام تعليمة استقبال سلسلة من المحارف وهي‬
‫)(‪ .Serial.readString‬تم تخزين السلسلة المستقبلة في متغير اسمه ‪ a‬تم التصريح عنه على شكل‬
‫‪.String‬‬
‫;‪String a‬‬
‫{ )(‪void setup‬‬
‫‪Serial.begin(9600); // opens serial port, sets data rate to 9600 bps‬‬
‫}‬

‫{ )(‪void loop‬‬
‫{ )‪if (Serial.available() > 0‬‬
‫‪a = Serial.readString(); // read the incoming data as string‬‬
‫;)"‪Serial.print(" I received:‬‬
‫;)‪Serial.println(a‬‬
‫}‬
‫}‬
‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪Arduino‬‬
‫‪ ،IDE‬تم التوصل إلى النتيجة الموضحة في الشكل (‪ .)96-3‬عند إرسال سلسلة من المحارف"‪" Hello‬‬
‫من الحاسب إلى لوحة األردوينو‪ ،‬يتم تخزين السلسلة في المتغير ‪ ،a‬ومن ثم يعاد إرسالها من جديد‬
‫باستخدام التعليمة ‪ .Serial.println‬إذا استخدمت التعليمة ‪ Serial.write‬سنصل إلى نفس النتيجة‪.‬‬

‫الشكل (‪ :)96-3‬نافذة المراقبة التسلسلية للتطبيق الرابع‪.‬‬

‫التطبيق الخامس‬
‫يهدف هذا التطبيق معرفة كيفية استخدام تعليمة استقبال رقم صحيح وهي‬
‫)(‪ .Serial.parseInt‬تم تخزين هذا الرقم في متغير اسمه ‪ a‬تم التصريح عنه على شكل ‪.int‬‬
‫;‪int a‬‬

‫)(‪void setup‬‬
‫{‬
‫;)‪Serial.begin(9600‬‬
‫}‬
‫)(‪void loop‬‬
‫{‬
‫‪146‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪//waiting for input‬‬
‫{ )‪if (Serial.available() > 0‬‬
‫‪a = Serial.parseInt(); //read int or parseFloat for ..float...‬‬
‫};)‪Serial.println(a‬‬
‫}‬
‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪Arduino‬‬
‫‪ ،IDE‬تم التوصل إلى النتيجة الموضحة في الشكل (‪ .)97-3‬عند إرسال رقم قيمته ‪ 140‬من الحاسب‬
‫إلى لوحة األردوينو‪ ،‬فإنها تخزن هذا الرقم في المتغير ‪ a‬الذي تم تعريفه على أنه عدد صحيح‪ .‬تم‬
‫إعادة إرسال هذا الرقم للحاسب باستخدام تعليمة ‪.Serial.println‬‬

‫الشكل (‪ :)97-3‬نافذة المراقبة التسلسلية للتطبيق الخامس‪.‬‬


‫التطبيق السادس‬
‫تم في هذا التطبيق ربط حساس درجة الحرارة ‪ LM35‬مع لوحة األردوينو كما تم دراسته في‬
‫الفقرة (‪ ،)2-6-3‬والمطلوب إرسال قيمة درجة الحرارة إلى الحاسب‪.‬‬
‫)(‪void setup‬‬
‫{‬
‫;)‪Serial.begin(9600‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪unsigned int sensorValue‬‬
‫;‪sensorValue=analogRead(0)/2‬‬
‫;)‪Serial.print(sensorValue‬‬
‫;)"‪Serial.println("ْ C‬‬
‫;)‪delay(1000‬‬
‫}‬

‫‪147‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪ ،Arduino IDE‬تم‬
‫التوصل إلى النتيجة الموضحة في الشكل (‪ .)98-3‬نالحظ أنه تم إرسال قيمة درجة الحرارة بشكل‬
‫صحيح على شكل رمزين )'‪ ('2' , '5‬إلى الحاسب من خالل تعليمة ‪.Serial.print‬‬

‫الشكل (‪ :)98-3‬نافذة المراقبة التسلسلية للتطبيق السادس‪.‬‬

‫التطبيق السابع‬
‫تم في هذا التطبيق ربط محرك سيرفو مع لوحة األردوينو كما تم دراسته في الفقرة (‪،)4-7-3‬‬
‫والمطلوب إرسال قيمة زاوية تحريك المحرك من الحاسب‪ .‬يتم إرسال قيمة الزاوية من الحاسب‪،‬‬
‫ليتم استقبالها كرقم من قبل لوحة األردوينو باستخدام تعليمة )(‪ . Serial.parseInt‬من خالل تعليمة‬
‫‪ servo.write‬يتم تحريك المحرك إلى الزاوية المطلوبة‪.‬‬
‫>‪#include <Servo.h‬‬
‫;‪Servo servo‬‬
‫;‪int x‬‬

‫)(‪void setup‬‬
‫{‬
‫;)‪servo.attach(9‬‬
‫;)‪Serial.begin(9600‬‬
‫;)"‪Serial.println("Input the angle:‬‬
‫}‬

‫{ )(‪void loop‬‬
‫‪//waiting for input‬‬
‫{ )‪if (Serial.available() > 0‬‬
‫‪x = Serial.parseInt(); //read int‬‬
‫;)‪servo.write(x‬‬ ‫‪// moving servo motor‬‬
‫}‬
‫}‬
‫‪148‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بعد تحميل البرنامج وفتح نافذة المراقبة التسلسلية ‪ serial monitor‬في برنامج ‪Arduino‬‬
‫‪ ،IDE‬تم التوصل إلى النتيجة الموضحة في الشكل (‪.)99-3‬‬

‫الشكل (‪ :)99-3‬نافذة المراقبة التسلسلية للتطبيق السابع‪.‬‬

‫‪149‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الملحق (‪)1‬‬

‫برامج محاكاة األردوينو‬


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

‫‪-1‬برنامج ‪Proteus‬‬
‫يعد برنامج ‪ Proteus‬أشهر أداة برمجية لمحاكاة الدوائر االلكترونية بمختلف أنواعها‬
‫التشابهية والرقمية بما فيها المتحكمات الدقيقة‪ .‬يمتاز البرنامج بسهولة التعامل معه‪ ،‬وسنكتفي في‬
‫الشكل بشرح مبسط لعناصر الواجهة الرئيسية له‪.‬‬

‫‪151‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫لتحميل نسخة البرنامج ‪: Proteus 8.6‬‬
‫‪http://download894.mediafire.com/vewihot42d2g/4m04g555lln13n6/proteus+8.6+SP2.rar‬‬

‫يتطلب البرنامج التشغيل عن طريق ‪.administrator‬‬

‫ال تحتوي مكتبة عناصر البرنامج على األردوينو لذلك يتم إضافته على الشكل التالي‪:‬‬
‫‪-1‬في البداية قم بتحميل مكتبة لوحات األردوينو من الموقع التالي‪:‬‬
‫‪-2‬بعد التحميل قم بفك ضغط الملف وانقل مكتبات لوحات األردوينو إلى داخل مكتبة برنامج‬
‫‪ Proteus‬الموجودة في الموقع (أو في موقع تنصيب البرنامج في جهازك)‬
‫‪C:\Program Files\Labcenter Electronics\Proteus 8 Professional/ LIBRARY‬‬
‫‪-3‬بعد فتح برنامج البروتوث‪ ،‬وفتح نافذة إضافة العناصر‪ ،‬نكتب ‪ Arduino‬لتظهر لوحات األردوينو‬
‫المضافة‪.‬‬
‫اآلن سنتكلم عن خطوات محاكاة الدارة‬
‫‪-1‬بعد كتابة كود البرمجة في برنامج ‪ ،Arduino cc‬نختار من قائمة األدوات ‪ Sketch‬ومن ثم نضغط‬
‫على ‪ Export Compiled Binary‬ليتولد ملف توسعه ‪ hex‬ضمن المجلد الذي تم فيه حفظ السكتش‪.‬‬
‫(ملف ‪ hex‬هو الملف الذي يتم نقله من الحاسب إلى المتحكم في اللوحة‪ ،‬وهو عبارة عن كود بلغة‬
‫اآللة مكتوب بشكل ست عشري ‪.)hexadecimal‬‬
‫‪-2‬بعد إعداد دارة األردوينو على البروتوث‪ ،‬اضغط مرتين على لوحة األردوينو‪ ،‬واختر ‪program file‬‬
‫واختر الملف ‪ hex‬الذي تم توليده من الخطوة السابقة‪.‬‬
‫‪-3‬اضغط على زر التشغيل وتأكد من صحة كود البرمجة‪.‬‬

‫‪-2‬برنامج ‪VirtualBreadboard‬‬
‫من أشهر برامج المحاكاة التي تستخدم ألواح التجارب ‪ BreadBorads‬في نمذجة الدارت‬
‫بشكل يحاكي الواقع‪ .‬يتوفر البرنامج على صورة اصدارين األولى هي ‪ ،VBB express‬والثانية ‪VBB‬‬
‫‪ .full version‬االختالف بينهما أن األولى مجانية لكن مع قدرات محاكاة محدودة أما الثانية نحصل‬
‫على كامل اإلمكانيات البرمجية و المحاكاة‪.‬‬

‫‪151‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

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

‫‪https://www.mediafire.com/file/s7cr0ynegwjm8da/examples.rar/file‬‬

‫يتناول كتاب األردوينو من البداية وحتى االحتراف – مستوى المتوسط – ما يلي‪:‬‬

‫‪ ‬قراءة إشارة حساسات مختلفة (حساس حرارة ورطوبة ‪ ،DHT11‬حساس مسافة‬

‫‪ ،HC-SR04‬حساس غاز ‪ ،MQ5‬حساس أول أكسيد الكربون ‪ ،MQ7‬حساس حركة‪،‬‬

‫حساس حريق‪ ،‬حساس التسارع وتحديد االتجاه ‪.)Accelerometer and Gyroscope‬‬

‫‪ ‬التحكم بشاشة ملونة ولمس‪.‬‬

‫‪ ‬إرسال واستقبال البيانات (أوامر تحكم ومراقبة) من خالل تقنية البلوتوث‪.‬‬

‫‪ ‬إرسال واستقبال البيانات (أوامر تحكم ومراقبة) من خالل شبكة ‪ Wi-Fi‬وشبكة‬

‫االنترنت‪.‬‬

‫‪ ‬إرسال واستقبال البيانات من خالل شبكة محلية ‪ LAN‬وشبكة االنترنت‪.‬‬

‫‪ ‬ربط األردوينو مع وحدة تحديد الموقع العالمية ‪.GPS‬‬

‫‪ ‬إرسال واستقبال البيانات من خالل الشبكة الخلوية‪.‬‬

‫‪ ‬التقاط الصور ومعالجتها باستخدام الكاميرا ‪.OV7670 640 x 480 VGA CMOS‬‬

‫‪ ‬إرسال واستقبال البيانات من خالل بروتوكول ‪ I2C‬وتطبيق ساعة زمن حقيقي‪.‬‬

‫‪ ‬تصميم واجهات ربط تفاعلية على الحاسب باستخدام برنامج فيجول بيسك‪.‬‬

‫‪ ‬تصميم واجهات ربط تفاعلية على األجهزة المحمولة التي تعمل وفق نظام‬

‫األندرويد‪.‬‬

‫‪152‬‬

You might also like