Arduino Book PDF
Arduino Book PDF
(مستوى المبتدئ)
-2بيئة التطوير المتكاملة لألردوينو Arduino IDEالتي من خاللها يتم برمجة لوحة األردوينو.
[email protected]
مالحظة :يسمح باالستفادة العلمية من الكتاب والنسخ منه مع اإلشارة إلى المصدر ،ويمنع استخدامه
تجاريا.
حمص 2118/8/1
1
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الفهرس
الفهرس 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-1-1مقدمة 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-4 -1لوحات 19 . . . . . . . . . Arduino MEGA ADK - Arduino MEGA 2560 - Arduino MEGA
2
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
– 11-1لوحة 29 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arduino Pro
3
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-4-5-2بنى التحكم 44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-1-4-5-2الحلقات44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :
-2-2-3-1-3محاكاة تشغيل وإطفاء مجموعة ثنائيات ضوئية من خالل برنامج 53 . . . . . . . Proteus
-2-3-3-1-3محاكاة التحكم بثنائيات ضوئية من خالل مفاتيح الكترونية من خالل برنامج Proteus
55 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
السبع قطع الضوئية 56 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-Segment
-2-2-3إظهار األرقام على السبع قطع ضوئية ذات نمط مهبط مشترك 56 . . . . . . . . . . . . . . . . . . . .
-2-2-2-3محاكاة إظهار أرقام على سبع قطع ضوئية باستخدام برنامج 59 . . . . . . . . . . . .Proteus
-3-2-3إظهار أرقام من خالل عدة أجزاء سبع قطع ضوئية 61 . . . . . . . . . . . . . . . . . . . . . . . . . .
5
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
قراءة إشارة الحساسات التشابهية 87 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-1-1-2-7-3التحكم بالمحرك المستمر من خالل لوحة األردوينو مع استخدام لدارة القيادة 95 . L293
-1-2-2-7-3التحكم بالمحرك المستمر من خالل لوحة األردوينو مع استخدام للوحة التحكم 99L298N
-2-1-3-7-3التحكم بالمحرك الخطوي أحادي القطبية وسرعته من خالل لوحة األردوينو 112 . . . . . .
-1-2-3-7-3التحكم بالمحرك الخطوي ثنائي القطبية وسرعته من خالل لوحة األردوينو 119 . . . . . . .
6
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-2-2-3-7-3الكود البرمجي 122 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-3-9-3نقل المعطيات ما بين لوحة األردوينو والطرفيات األخرى من خالل بروتوكول االتصال UART
139 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-4-9-3الكود البرمجي 143 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الفصل األول
-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وغير ذلك.
ذاكرة البرنامج
نوافذ الدخل
والخرج
9
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يتصل المتحكم ATmega328في لوحة األردوينو أونو بكريستالة ترددها ،16 MHzلذلك
فإن عدد التعليمات المنفذة في الثانية 16مليون تعليمة.
11
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)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
الشكل ( :)8-1منفذ USBالمحاط باللون األحمر ،وبجانيه فيوز الحماية محاط باللون األسود ،مقبس
الطاقة الخارجية المحاط باللون األصفر ،وزر إعادة التشغيل المحاط باللون األخضر .
14
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)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الختيار مصدر الطاقة المناسب أو تمكين محول جهد على المخارج
16
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)11-1منافذ االستطاعة من اليمين إلى اليسار .3.3V ،5V ،GND ،GND ،Vinيضاف إليها
منفذ ،IOREF ،RESETوفي اآلخر منفذ غير مستخدم حاليا.
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
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ما بين خواص ومزايا لوحات األردوينو
الثالثة.
21
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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 الوزن
22
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
البرنامج .كذلك يوجد منفذين micro USBأحدهما للبرمجة واالتصال مع الحاسب ،واآلخر لالتصال
مع أجهزة محيطية ،ويمكن استخدامه للبرمجة .ال تتم برمجة المتحكم من خالل منفذ .ICSPيبين
الشكل ( )17-1لوحة ،Arduino Dueوالجدول ( )4-1مزايا وخواص هذه اللوحة.
25
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
26
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
31
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
32
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الفصل الثاني
بيئة التطوير المتكاملة لألردوينو Arduino IDE
-1-2مقدمة
بيئة التطوير المتكاملة لألردوينو Arduino integrated development environment
) (IDEهو البرنامج الذي من خالله يتم كتابة الكود البرمجي للوحة األردوينو بلغة ،Cوتحميله إليها.
تتسم بيئة التطوير بالبساطة وسهولة التعامل ،وتحتوي على كل ما يحتاجه المبرمج لكتابة الشيفرة،
وتعمل على أنظمة التشغيل المختلفة. Linux، Mac OS X،Windows :
تعرف البرامج المكتوبة باستخدام بيئة التطوير Arduino IDEبالسكتش ،sketchويتم
تخزينها في الحاسب بملف يأخذ التوسع .ino
33
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
1
2
3
4
5
35
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
:Serial Monitorفتح نافذة المراقبة التسلسلية.
:Boardيتم تحديد اللوحة التي يتم العمل بها.
:Portتحتوي هذه القائمة على كل المنافذ التسلسلية المعرفة على الحاسب (فعلية أو ظاهرية) .من
خاللها يتم اختيار المنفذ الذي تتصل مع لوحة األردوينو.
:Programmerتستخدم الختيار المبرمجة عندما يتم برمجة اللوحة من دون استخدام لوصلة
.USB-serialفي العادة لن تحتاج إلى ذلك ،إال إذا أردت تحميل محمل اإلقال ع bootloaderإلى
المتحكم الصغري.
:Burn Bootloaderتستخدم لنقل محمل اإلقال ع bootloaderإلى المتحكم الصغري للوحة.
-2اختر مدير األجهزة ،Device Managerومنها اختر other devicesثم بزر الفارة األيمن على
( Arduinoأو قد تكون )Unknown devicesواختر Update driver softwareكما هو موضح في
الشكل (.)9-2
38
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-3اختر تصفح الحاسب الختيار التعريف كما هو موضح في الشكل ( ،)11-2واختر المجلد الذي به
التعريف وهو ( driversالمجلد الذي يتم تحميله مع البيئة التطويرية IDEمن الموقع).
-4تظهر رسالة إذا كنت ترغب تنصيب التعريف أو ال .نضغط OKوننتظر حتى تنتهي عملية التعريف.
-5بعد االنتهاء من تنصيب التعريف يمكن معرفة رقم المنفذ من مدير األجهزة أيضا كما هو موضح
في الشكل (.)11-2
الشكل( :)11-2تعريف لوحة األردوينو كمنفذ ،COMورقم المنفذ ( 9يختلف من جهاز آلخر).
39
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)12-2اختيار اسم اللوحة الصحيح ،على سبيل المثال .Arduino Uno
بعد ذلك نضغط Uploadمن شريط أدوات وظائف العامة المذكور في الفقرة (.)2-3-2
يضيء الثنائيان RX،TXفي اللوحة للداللة على نقل الشيفرة إلى المتحكم الصغري الرئيسي ،ويظهر
البرنامج رسالة بأن نقل الشيفرة تم بنجاح كما هو موضح في الشكل (.)14-2
41
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-4-4-2تشغيل الدارة
بعد االنتهاء من نقل الشيفرة البرمجية ،ستعمل لوحة األردوينو مباشرة ما دامت متصلة مع
الحاسب عبر منفذ USBالذي يزودها بالطاقة الالزمة ،ويمكن إزالة االتصال بينهما ،وتشغيل اللوحة
عبر مصدر طاقة آخر كما تم ذكره سابقا في الفصل األول.
) (void setup
{
التصريح عن متغيرات وثوابت محلية
يتم هنا كتابة تعليمات إعداد وضبط المتحكم ،ويتم تنفيذها مرة واحدة بعد تشغيل أو إعادة إقالع اللوحة
}
) (void loop
{
التصريح عن متغيرات وثوابت محلية
يتم هنا كتابة البرنامج الرئيسي ،ويتم تنفيذه بشكل متكرر
}
void ……….
{
التصريح عن متغيرات وثوابت محلية
يتم هنا كتابة تعليمات البرنامج الفرعي
}
41
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يتم التصريح عن المتغيرات في لغة Cعلى الشكل التالي:
;Variable_type Variable_name
: Variable_typeنو ع أو نمط المتغير :Variable_name .اسم المتغير.
يوضح الجدول ( )1-2أنماط المتغيرات Variable_typeمن أجل اللوحات التي تتضمن متحكم
. ATMegaمن أجل البقية اللوحات يمكن زيارة الصفحة
.www.arduino.cc/en/Reference/HomePage
يتم إسناد القيم للمتغيرات باستخدام عالمة = .فيما يلي مثال على تعريف متغيرين y،xوإسناد
قيمة لكل منهما.
;byte x
;char y
//…….
;x=10
;'y='A
-2-2-5-2التصريح عن المصفوفات
المصفوفة هي مجموعة من المتغيرات التي يتم الوصول إليها برقم مفهرس .تأخذ المصفوفة
في البرنامج بعد واحد ،أو بعدين ،ويمكن عدم تحديد حجمها .يبين الجدول ( )2-2كيفية التصريح
عن هذه المصفوفات.
42
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الجدول ( :)2-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
-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
-5-5-2التعليقات Comments
تستخدم التعليقات لكي تعلم المبرمج أو اآلخرين بكيفية عمل البرنامج .يتم تجاهلها من قبل
المترجم ،وال يتم تنفيذها من قبل المعالج ،لذلك فهي ال تأخذ أي مساحة من ذاكرة برنامج المتحكم
الصغري .يوجد طريقتان إلضافة التعليقات :
تعليق على سطر واحد :يتم استخدام العالمة //كما هو موضح في المثال التالي:
;x = 5 // This is a single line comment.
تعليق متعدد األسطر :تستخدم العالمة * /في البداية ،والعالمة */في النهاية كما في المثال
التالي:
/* this is multiline comment
Don't forget closing the comment
*/
46
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
التعليمة الثانية تقدم تأخيرا بالميكرو ثانية.
;)delaymicroseconds(value
حيث valueتأخذ مجال . Unsigned int
مثال من أجل إيقاف تنفيذ البرنامج لمدة ثانية فإن تعليمة التأخير الزمني هي:
;)delay(1000
-7-5-2البرنامج الفرعي
عندما تحتاج إلى تنفيذ أوامر عدة مرات ،يمكن كتابتها في برنامج فرعي منفصل خارج
البرنامج الرئيسي )( ،loopومن ثم يتم استدعائها في كل مرة .تساعد البرامج الفرعية في تقليل
نسبة استخدام ذاكرة البرنامج ،وتقلل الوقت المطلوب لكتابة الشيفرة ،وتجعل الشيفرة البرمجية
المكتوبة مرتبة وأكثر وضوحا .يوجد نمطان للبرامج الفرعية المستخدمة :إجرائية Procedureأو
تابع .function
47
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
نمط القيمة المستعادة نوع المتغير ( اسم البرنامج الفرعي ) ………….اسم المتغير
{
التصريح عن متغيرات تظهر في البرنامج الفرعي فقط
جسم البرنامج الفرعي
)القيمة المستعادة -قد يكون متغيرReturn ( -
}
استدعاء البرنامج الفرعي ( ;… //قيمة يراد تمريرها للبرنامج الفرعي ( اسم البرنامج الفرعي = Value
48
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
)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-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-3محاكاة دارة تشغيل وإطفاء ثنائي ضوئي من خالل برنامج .Proteus
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
}
الشكل ( :)4-3محاكاة دارة تشغيل وإطفاء مجموعة ثنائيات ضوئية من خالل برنامج .Proteus
مالحظة هامة :تتصل الرجل 0للمتحكم الرئيسي ATmega328مع رجل اإلرسال التسلسلية )(TX
للمتحكم الثانوي ،ATmega16U2حيث يرسل من خالل هذا الخط الكود البرمجي .بالتالي عند تنفيذ
الوصل في الشكل ( )3-3ومن ثم تحميل الكود البرمجي عبر بيئة التطوير Arduino IDEسيحدث
خطأ في عملية نقل الكود وستظهر رسالة خطأ .لتفادي ذلك يمكن أن يتم تحميل الكود البرمجي في
البداية من دون وصل السلك ما بين الرجل 0والمقاومة ،وبعد االنتهاء من التحميل يتم إعادة السلك.
أو يمكن استخدام رجل رقمية أخرى غير الرجل 0وعندئذ يمكن تحميل الكود من دون أية مشاكل.
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);
}
}
55
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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للسبع قطع ضوئية
لنقم اآلن بوصل لوحة األردوينو مع السبع قطع ضوئية كما هو موضح في الشكل ( )9-3حيث
تتصل الرجل 1للوحة مع الرجل aللسبع قطع ،والرجل 1مع الرجل ....bوهكذا .رجل التفعيل K
(الرجل المشتركة) يتم وصلها لألرضي .إذا قمنا بإخراج شيفرات األرقام الموضحة في الجدول ()1-3
على األرجل من 0وحتى 6للوحة األردوينو ،ستعد السبع قطع األرقام من 0وحتى .9
57
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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
59
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)12-3إظهار عدد على خانتين سبع قطع .يتم تفعيل الخانة األولى وإظهار رقم عليها ،ثم يتم تفعيل
الخانة الثانية وإظهار الرقم اآلخر ،بتكرار العملية سريعا يظهر العدد من دون أن تالحظ العين عملية التبديل.
61
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
إذا كانت القطعتان نمط مصعد مشترك يتم تفعيل الواحدة منهما عن طريق تطبيق ،5Vوإلغاء
التفعيل عن طريق .0V
يبين الشكل ( )13-3كيفية توز ع األرجل A,B,C,D,E,F,G,dpوأرجل التفعيل K1, K2….
لمجموعة سبع قطع ضوئية بخانتين وأربع خانات متوفرة باألسواق( .من الممكن وجود توزيع آخر،
ويتم الكشف وتحديد األرجل باستخدام مقياس اآلفو باختيار قياس الديود).
-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الذي قمنا بتحميله في الخطوة
السابقة.
61
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
بعد االنتهاء من هذه الخطوة نالحظ أنه قد تم إضافة مكتبة SevSegلبرنامج Arduino IDEكما هو
موضح في الشكل (.)15-3
لكتابة كود برمجي باستخدام المكتبة السابقة ،نقوم باتبا ع الخطوات التالية:
-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
63
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-7تعليمة العرض:
;)(sevseg.refreshDisplay
البد من استدعاء وتنفيذ هذه التعليمة بشكل متكرر إلظهار الرقم أو الحرف الذي قمت بتحديده في
التعليمتين السابقتين .أي تأخير زمني خارج هذه التعليمية سيؤدي إلى تأثيرات إظهار غير مرغوبة.
مالحظة :إذا كان المطلوب استخدام مجموعة سبع قطع عدد خاناتها أكثر من ،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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)19-3إحدى طرق توزيع أرجل مصفوفة ثنائيات على األعمدة (يرمز لها بحرف ،)Cوعلى
األسطر (يرمز لها بحرف .)R
67
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
71
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)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
Vs
s
-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إظهار المشيرة على شكل وميض.
فيما يلي الكود البرمجي إلظهار عبارة ،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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)25-3محاكاة ربط شاشة LCDمع لوحة األردوينو من خالل برنامج .Proteus
76
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
78
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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
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
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الكود البرمجي-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;
85
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)32-3محاكاة ربط شاشة LCDولوحة المفاتيح مع األردوينو من خالل برنامج .Proteus
86
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
87
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
88
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
هناك بارامتر هام للمبدل التمثيلي الرقمي وهو دقة التمييز resolutionالذي يمثل الجهد
المطلوب لكل تزداد إشارة الخرج الرقمية واحد منطقي (أي الخانة األقل أهمية least significant
) .bit (LSBعلى سبيل المثال إذا كانت دقة تمييز مبدل ADCتساوي 5mV/LSBفهذا يعني أنه كلما
ازدادت إشارة الدخل التشابهية 5mVكلما ازدادت إشارة الخرج الرقمية واحد منطقي .يقدم المبدل
ذو دقة التمييز األقل أداء أفضل حيث يمكن له عندئذ تحسس وتبديل التغيرات الصغيرة إلشارة
الدخل .تعطى دقة التمييز وفق العالقة التالية:
القيمة الرقمية المكافئة عندما يكون جهد إشارة الدخل التشابهية :100mV
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يأخذ الجهد المرجعي عندئذ الجهد الخارجي المطبق
يوضح الشكل ( )37-3تطبيقا عمليا تم فيه ربط حساس الحرارة LM35وشاشة LCDإلى
لوحة األردوينو أونو ،ويراد إظهار درجة الحرارة على الشاشة .تم ربط الحساس مع المدخل التشابهي
،A0وتم وصل القطب RSللشاشة مع المنفذ 0للوحة األردوينو ،والقطب Eمع المنفذ ،1وأقطاب
المعطيات D4,D5,D6,D7مع المنافذ .2,3,4,5
91
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)38-3محاكاة إظهار درجة الحرارة على شاشة LCDمن خالل برنامج .Proteus
الشكل ( :)39-3حساسات مختلفة :حرارة ،رطوبة ،غاز ،حركة ،معدل نبضات القلب ،انحناء.
92
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-1-7-3مقدمة
المحرك الكهربائي هو آلة تحول الطاقة الكهربائية إلى طاقة ميكانيكية .يمكن من خالل
المحرك المتصل مع لوحة األردوينو تصميم العديد من الدارات والمشاريع االلكترونية كالتحكم بحركة
سيارة وذرا ع روبوتية وغير ذلك .سنتكلم في الفقرات التالية عن المحركات التالية وكيفية ربطها مع
لوحة األردوينو والتحكم بها:
محركات التيار المستمر DC motor
محركات خطوية Stepping motor
محركات السيرفو Servo motor
93
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( (a) :)42-3أرجل الدارة المتكاملة (b) ،L293البوابات األربعة للدارة المتكاملة .L293
يبين الجدول ( )9-3وظيفية كل رجل لدارة .L293
الجدول ( :)9-3وظائف أرجل الدارة المتكاملة .L293
الوظيفة الرجل رقم الرجل
رجل تفعيل للبوابتين 1,2البد من وصلها مع +5V EN 1,2 1
يطبق جهد يؤمن التغذية لخرج البوابة إذا كانت في حالة المستوى Vcc2 8
94
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الوظيفة الرجل رقم الرجل
رجل تفعيل للبوابتين 3,4البد من وصلها مع +5V EN 3,4 9
يتم وصلها إلى +5Vلتأمين التغذية لدارة دخل البوابة. Vcc1 16
البد من اإلشارة إلى أن دارة l293Dال تحتاج لوصل الديودات فهي تحتوي داخليا عليها.
كذلك فإن جهد خرج بوابات دارة L293فعليا أقل من Vcc2بحوالي .0.9V
95
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل( :)43-3وصل لوحة األردوينو مع المحرك المستمر باستخدام الدارة المتكاملة .L293D
الجدول ( )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
على اللوحة .يتم إزالة هذه الوصلة إذا تم تطبيق جهد تغذية أعلى من 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
98
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يمكن إجمال مزايا وحدة التحكم بالمحركات L298Nبما يلي:
يمكن من خالل هذه الوحدة قيادة محركي تيار مستمر ،DCأو محرك خطوي واحد.
جهد تغذية المحركات ما بين ).(7V-35V
التيار الذي يمكن استجراره للمحرك يصل إلى .2A
مستوى التحكم (الجهد المنطقي عند وصل لوحة األردوينو) :المستوى المنخفض-0.3V...1,5V :
،المستوى المرتفع .2,3V..…5V
التيار المنطقي.0~36mA :
أعظم تبديد لالستطاعة.20W :
درجة حرارة العمل -25°C :وحتى .+130°C
األبعاد60mm*54mm :
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);
}
.Proteus برنامج
111
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
: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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
113
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
114
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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
}
-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درجة للتبسيط ،مع العلم
أن المحركات األخرى لن تختلف كثيرا عنها وخصوصا أثناء قيادتها بلوحة األردوينو.
117
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
بنفس الوقت .يخرج من المحرك خمسة أو ستة أسالك أو ثمانية أسالك .في المحرك خماسي األسالك
ترتبط الملفات بأحد أطرافها معا ويخرج منها سلك مشترك ،واألسالك األربعة المتبقية ألطراف
الملفات األخرى .في المحرك سداسي األسالك يتشارك ملفان بأطرافهما بسلك مشترك ،والملفان
اآلخران يتشاركان بسلك مشترك ،واألسالك األربعة المتبقية ألطراف الملفات األربعة األخرى .عند
وصل السلكين المشتركين معا سنحصل على محرك خماسي األسالك .في المحرك ثماني األسالك
تكون الملفات مستقلة وكل سلكين في الخرج يمثالن ملف من الملفات األربعة .يوضح الشكل ()53-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كيفية عمل هذه
الطريقة ،والقيم المطلوب تطبيقها على الملفات األربعة في كل مرحلة.
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
إليضاح عمل بوابة دارة ULN2003لندرس الحالتين التاليتين والتي سنتحكم فيها بثنائي
ضوئي من خالل الجهد المطبق على مدخل البوابة األولى.
-1بفرض أن الجهد المطبق على مدخل البوابة األولى )High level( 5Vكما هو موضح في الشكل
( .)58-3عندئذ فإن خرج البوابة األولى على الرجل 16هو .(Low level) 0Vتبعا لذلك سيضيئ
الثنائي الضوئي حيث عملت بوابة دارة ULN2003على تأمين مصب للتيار إلى األرضي .
111
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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
}
115
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يتم تنشيط الملفات األربعة لقيادة المحرك الخطوي ثنائي القطبية بنفس طريقة المحرك أحادي
القطبية المذكور سابقا:
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كيفية عمل هذه
الطريقة ،والقيم المطلوب تطبيقها على الملفات األربعة في كل مرحلة.
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بهذا األسلوب يتم االنتقال من خطوة إلى األخرى بشكل أنعم ،وهذا ما يجعل المحرك الخطوي
مناسبا للتطبيقات ذات الدقة العالية.
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
}
122
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
)void PORTA(byte value
{
;byte i
)for (i = 0; i <= 7; i++
{
;))digitalWrite(i, bitRead(value, i
}
}
123
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
لمحرك السيرفو ثالث أسالك :اثنان لتزويده بالطاقة ) ،(ground، Vccوالسلك الثالث يتم من
خالله تطبيق إشارة التحكم (نبضات .)PWMفي العادة لون سلك Vccأحمر ،ولون سلك األرضي
groundأسود أو بني ،أما لون سلك إشارة التحكم أصفر أو أبيض أو برتقالي.
يتكون محرك السيرفو من األجزاء التالية كما هو موضح في الشكل (: )71-3
-1محرك مستمر .DC motor
-2مقبض الخرج ( output shaftذرا ع محرك السرفو).
-3سلسلة من التروس gearsالتي تصل محرك DCبمقبض الخرج .الهدف منها تقليل سرعة محرك
DCلتصبح مناسبة أكثر عمليا.
-4نظام تحكم الكتروني بمكان المقبض ذو تغذية عكسية مغلقة ،ويتكون مما يلي:
أ-مقاومة متغيرة :potentiometerتتصل مع مقبض الخرج أو في مكان ما من سلسلة التروس،
تقدم جهدا متناسبا مع مكان المقبض.
ب-مبدل نبضات تعديل عرض النبضة PWMإلى جهد.
ج-مقارن :comparatorيعمل على مقارنة الجهد الناتج عن المقاومة المتغيرة مع الجهد الناتج عن
المبدل.
124
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-4يعمل المقارن على مقارنة الجهد الناتج عن المبدل والجهد الناتج عن المقاومة المتغيرة .االختالف
ما بين اإلشارتين يعرف بإشارة خطأ ،error signalوالتي يتم تضخيمها ،وتستخدم لقيادة محرك
المستمر .DC
-5يتحرك محرك ،DCومقبض الخرج ،وبالتالي الجهد الناتج عن المقاومة المتغيرة بحيث تؤدي
العملية إلى إنقاص أو حذف إشارة الخطأ.
-6عندما يتم حذف إشارة الخطأ يكون مقبض الخرج قد وصل إلى المكان أو الزاوية المطلوبة،
ويتوقف محرك DCتبعا لذلك.
-7عند تغيير عرض نبضات ،PWMسيتغير الجهد الناتج عن مبدل PWMوتنتج إشارة خطأ ،ليتحرك
المحرك ومقبض الخرج إلى زاوية أخرى مطلوبة ،ويتوقف عندها.
يبين الشكل ( )72-3العناصر الداخلية لمحرك السيرفو.
125
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)73-3من خالل التحكم بعرض نبضات إشارة PWMالمطبقة على محرك السيرفو يتم
ضبط زاوية دورانه.
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
}
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من جديد .يتم ربط دارة الجهد المنخفض مع طرفي
الملف ،في المقابل يستطيع الذرا ع المتحرك والتماسين الثابتين تحمل تطبيق جهود مرتفعة نسبيا،
لهذا يتم وصلها مع دارة الجهد العالي.
للمرحل استنادا لما سبق خمسة أطراف هي :طرفا الملف ،وطرف مشترك (الذرا ع المتحرك)،
وطرف ،NCوطرف NOكما هو موضح في الشكل (.)77-3
129
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل( :)78-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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-5-8-3ملحقات
يوضح الشكل ( )82-3بعض الدرات الجاهزة التي تحتوي على مرحل ،ويتم وصلها مع لوحة
األردوينو ودارة الجهد العالي بشكل مباشر.
133
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-1-9-3مقدمة
يشار إلى عملية تبادل المعلومات ما بين األجهزة باالتصال .communicationيمكن
للطرفيات أن تتبادل المعلومات إما بشكل تسلسلي serialأو بشكل تفرعي parallelكما هو موضح
في الشكل ( .)83-3في االتصال التفرعي يتم إرسال مجموعة من النبضات الرقمية في نفس الوقت،
بينما في االتصال التسلسلي يتم إرسال نبضة رقمية كل فترة زمنية ،بالتالي يتم إرسال النبضات على
التتالي .على الرغم من أن االتصال التفرعي قد يحقق سرعة نقل مرتفعة ،إال أنه أكثر تكلفة ،لذلك
يستخدم في اتصاالت المسافات القصيرة مثل مسارات أنظمة الحواسيب وبعض الدارات المتكاملة.
في المقابل يتطلب االتصال التسلسلي عدد خطوط نقل أقل من االتصال التفرعي ،وبالتالي تكلفة
أقل ،كما أنه في الوقت الحاضر تم التوصل إلى معدالت نقل عالية لالتصال التسلسلي كما هو الحال
في USBواتصاالت الليف الضوئية ،وبعض الدارات المتكاملة الحديثة.
يمكن تصنيف االتصاالت التسلسلية كما هو موضح في الشكل ( )84-3حسب اتجاه إرسال المعطيات
إلى :
: simplex -1يتم إرسال المعطيات باتجاه واحد فقط من المرسل إلى المستقبل.
: half – duplex -2يتم إرسال المعطيات باتجاهين ولكن ال يمكن نقلها باالتجاهين في نفس
الوقت.
: full – duplex -3يتم إرسال المعطيات باتجاهين وبنفس الوقت.
134
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
البد من وجود إيقا ع معين ما بين جهازي اإلرسال واالستقبال ،بمعنى أنه يجب على جهاز
اإلرسال أن يكون لديه المقدرة على تحديد بداية ونهاية كل بت ومعدل اإلرسال المستخدم وهو ما
يعرف بتزامن اإلرسال .يوضح الشكل ( )85-3تأثير عدم وجود تزامن ما بين المرسل والمستقبل.
135
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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
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
الشكل ( :)91-3ربط حاسوبين معا من خالل منافذهما التسلسلية DB-9ووفق نمط بدون مصافحة.
138
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)91-3نقل المعلومات ما بين لوحة األردوينو والحاسب المحمول عبر منفذ USBعن طريق
المتحكم الثانوي المدمج ضمن لوحة األردوينو.
FT232R
UAR USB
T
الشكل ( :)92-3نقل المعلومات ما بين لوحة األردوينو والحاسب عبر منفذ USBعن طريق شريحة
.FT232Rيتم وصل رجل TXفي لوحة FT232Rمع رجل ) RX (pin 0للوحة األردوينو ،والعكس.
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.
------------------------------------------------------------------------
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-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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
{ )(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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
{ )(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كما تم
شرحه في التطبيق األول.
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سنصل إلى نفس النتيجة.
التطبيق الخامس
يهدف هذا التطبيق معرفة كيفية استخدام تعليمة استقبال رقم صحيح وهي
)( .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
{ )(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
التطبيق السابع
تم في هذا التطبيق ربط محرك سيرفو مع لوحة األردوينو كما تم دراسته في الفقرة (،)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
149
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الملحق ()1
-1برنامج Proteus
يعد برنامج Proteusأشهر أداة برمجية لمحاكاة الدوائر االلكترونية بمختلف أنواعها
التشابهية والرقمية بما فيها المتحكمات الدقيقة .يمتاز البرنامج بسهولة التعامل معه ،وسنكتفي في
الشكل بشرح مبسط لعناصر الواجهة الرئيسية له.
151
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
لتحميل نسخة البرنامج : Proteus 8.6
http://download894.mediafire.com/vewihot42d2g/4m04g555lln13n6/proteus+8.6+SP2.rar
ال تحتوي مكتبة عناصر البرنامج على األردوينو لذلك يتم إضافته على الشكل التالي:
-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
االنترنت.
التقاط الصور ومعالجتها باستخدام الكاميرا .OV7670 640 x 480 VGA CMOS
تصميم واجهات ربط تفاعلية على الحاسب باستخدام برنامج فيجول بيسك.
تصميم واجهات ربط تفاعلية على األجهزة المحمولة التي تعمل وفق نظام
األندرويد.
152