Arduino Basics Book

  • Uploaded by: Electro Minutes
  • 0
  • 0
  • January 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Arduino Basics Book as PDF for free.

More details

  • Words: 8,522
  • Pages: 155
Loading documents preview...
]h

‫أساسيات األردوينو‬

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

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

‫•‬

‫يجب على المتعلم البحث والتعلم الذاتي باإلضافة إلى هذا الكتاب‪.‬‬

‫تم تبسيط العديد من المعلومات ليسهل على المتعلم الدخول في مجال األردوينو‪.‬‬

‫‪ii‬‬

‫أساسيات األردوينو‬ ‫ماذا ستستفيد من هذا الكتاب؟‬ ‫✓ أساسيات بسيطة في الكهرباء‪.‬‬ ‫✓ ماهو األردوينو‬ ‫✓ منافذ األردوينو أنواعها والتحكم بها‪.‬‬ ‫✓ فهم أهم أوامر األردوينو مع التطبيق‪:‬‬ ‫✓ )‪(digitalWrite, digitalRead, analogWrite, analogRead‬‬ ‫✓ فهم أهم أوامر البرمجة الرئيسية‪:‬‬ ‫✓ )‪(For, while, if else‬‬ ‫✓ التطبيق العملي مع التوصيل والكود مع شرح كل أمر في الكود‪.‬‬ ‫✓ التطبيق على بعض الحساسات وعمل بعض المشاريع البسيطة‪.‬‬

‫‪iii‬‬

‫أساسيات األردوينو‬

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

‫للتواصل مع الكاتب‪:‬‬

‫‪[email protected]‬‬

‫‪iv‬‬

‫أساسيات األردوينو‬

‫‪v‬‬

‫‪Contents‬‬ ‫أساسيات ف الكهرباء‬

‫‪1‬‬

‫المتحكمات واألردوينو‬

‫‪10‬‬

‫برنامج ‪ARDUINO IDE‬‬

‫‪19‬‬

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

‫‪26‬‬

‫قراءة اإلشارة من المنافذ‬

‫‪46‬‬

‫اوامر برمجية مهمة‬

‫‪62‬‬

‫المحركات‬

‫‪79‬‬

‫بروتوكوالت االتصاالت بي األجهزة‬

‫‪94‬‬

‫درايفر سيكت‬

‫‪102‬‬

‫تطبيقات عملية عىل أشهر الحساسات‬

‫‪114‬‬

‫أساسيات األردوينو‬

‫أساسيات في الكهرباء‬ ‫الفولت – التيار – المقاومة‬

‫‪1‬‬

‫أساسيات األردوينو‬ ‫دائما ما نشبه الكهرباء بالماء‪ ،‬ولكن لماذا؟‬ ‫الماء‪:‬‬ ‫•‬

‫ينتقل من مناطق الضغط المرتفع إلى المنخفض ومن المناطق المرتفعة إلى المنخفضة‪.‬‬

‫•‬

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

‫الكهرباء‪:‬‬ ‫•‬

‫تنتقل من مناطق الجهد المرتفع إلى المنخفض‪.‬‬

‫•‬

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

‫لكن ما هو فرق الجهد؟‬

‫‪2‬‬

‫أساسيات األردوينو‬

‫فرق الجهد (الفولت)‪:‬‬ ‫البطارية في الصورة األولى ‪ 1.5‬فولت‪ ،‬يعني أن طرفها الموجب جهده أعلى من السالب ب‪ ،1.5‬والبطارية في‬ ‫الصورة الثانية ‪ 9‬فولت‪ ،‬يعني أن طرفها الموجب جهده أعلى من السالب ب‪9‬‬ ‫فرق الجهد يقاس بالفولت‪ ،‬وهو الفرق في الجهد بين طرفين‪.‬‬

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

‫‪3‬‬

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

‫ألن الشحنات وجدت طريقا لها لتنتقل إلى الطاقة األقل مرورا باللمبة‪.‬‬

‫∞∞∞‬

‫‪4‬‬

‫أساسيات األردوينو‬

‫التيار الكهربائي‪.‬‬ ‫عند توصيل طرفي بطارية ‪ 9‬فولت مع بعضهما ماذا سيحدث؟‬

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

‫‪5‬‬

‫أساسيات األردوينو‬ ‫نالحظ أيضا لو أننا قمنا بتوصيل لمبة ‪ LED‬مباشرة مع بطارية ‪ 9‬فولت ستحترق بسبب ارتفاع شدة التيار‪.‬‬

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

‫‪6‬‬

‫أساسيات األردوينو‬ ‫المقاومة‬ ‫•‬

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

‫•‬

‫كلما زادت المقاومة قل التيار المنتقل‪.‬‬

‫•‬

‫لكل مادة مقاومة كهربائية معينة وتقاس باألوم ‪.Ω‬‬

‫•‬

‫المواد الموصلة مقاومتها قليلة جدا مثل النحاس والفضة واأللمنيوم‪.‬‬

‫•‬

‫المواد العازلة مقاومتها عالية جدا مثل الخشب والبالستيك والمطاط‪.‬‬

‫صورة ‪ 1‬مقاومة كهربائية‬

‫∞∞∞‬

‫‪7‬‬

‫أساسيات األردوينو‬ ‫قانون أوم‪Ohm’s Law‬‬

‫المقاومة = التيار ‪ x‬فرق الجهد‬

‫هو أهم قانون في الكهرباء كلها‪ ،‬مثال‪:‬‬ ‫لمبة ‪ LED‬تحتاج تيار قيمته ‪ 0.020‬أمبير لتعمل‪ ،‬لو أردنا تشغيلها باستخدام بطارية ‪ 9‬فولت كم المقاومة التي‬ ‫يمكن استخدامها؟‬

‫بما أن الفولت = ‪ 9‬والتيار المطلوب = ‪0.020‬‬ ‫المقاومة = الفولت ÷ التيار‪.‬‬ ‫المقاومة المطلوبة = ‪ 450 = 0.020 ÷ 9‬أوم‪.‬‬ ‫نستطيع استخدام مقاومة ‪ 450‬أوم أو أكبر (تم تجاهل فولت اللمبة للتبسيط)‪.‬‬ ‫ومن نفس القانون نستطيع أن نحسب التيار والمقاومة‪.‬‬

‫∞∞∞‬

‫‪8‬‬

‫أساسيات األردوينو‬

‫ملخص الدرس‪:‬‬ ‫الفولت هو فرق الجهد بين نقطتين‪.‬‬ ‫التيار ينتقل من الجهد األعلى إلى األقل‪.‬‬ ‫المقاومة تحدد كمية التيار الكهربائي المار‪.‬‬ ‫اتصال نقطتين بينهما فرق جهد بدون مقاومة أو بمقاومة قليلة جدا يسمى ‪.Short Circuit‬‬ ‫(قانون أوم( الفولت = التيار ‪ x‬المقاومة‬

‫∞∞∞‬ ‫تمارين‬ ‫‪ .1‬إذا زادت المقاومة والفولت ثابت‪ ،‬كيف يتأثر التيار الكهربائي؟‬ ‫‪ .2‬لنسمح بمرور ‪ 2‬أمبير (التيار) في مقاومة قيمتها ‪ 10‬أوم‪ ،‬كم فولت نحتاج؟‬ ‫‪ .3‬ما هو الفولت؟‬ ‫‪ .4‬ما هو التيار؟ وما هي وحدة قياسه؟‬ ‫‪ .5‬كيف ينتقل التيار الكهربائي؟‬

‫‪9‬‬

‫أساسيات األردوينو‬

‫المتحكمات واألردوينو‬ ‫تحكم بال حدود‬

‫‪10‬‬

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

‫ألواح الكترونية تحتوي على متحكم )‪ (Micro-Controller‬وجميع ما يحتاجه من قطع الكترونية‪.‬‬

‫•‬

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

‫•‬

‫برنامج ‪ Arduino IDE‬يمكن من خالله برمجة أي لوحة متوافقة‪.‬‬

‫•‬

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

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

‫‪11‬‬

‫أساسيات األردوينو‬

‫ما هو الأردوينو؟‬ ‫منصة الهدف منها تسهيل برمجة المتحكمات وتوصيلها بالدوائر اإللكترونية‪.‬‬ ‫توجد ألواح كثيرة تدعم األردوينو أكثرها انتشارا هو األونو “‪ ”Uno‬وهي ما سندرسه ونطبق عليه في هذا الكتاب‪.‬‬ ‫األونو يحتوي على متحكم اسمه ‪ Atmega328P‬أهم مواصفاته‪:‬‬ ‫❖ سرعة المتحكم‪ 16 :‬ميجا هرتز (‪.)MHz16‬‬ ‫❖ ذاكرة الفالش‪ 32 :‬كيلو بايت ‪.(32KB)Flash Memory‬‬ ‫❖ ذاكرة تخزين التعريفات‪ 2 :‬كيلو بايت )‪.SRam(2KB‬‬ ‫❖ ذاكرة تخزين دائمة للمستخدم‪ 1 :‬كيلو بايت ‪.(1KB)EEPROOM‬‬ ‫❖ عدد منافذ الديجيتال‪ 14 :‬منفذ‪.‬‬ ‫❖ عدد منافذ األنالوج‪ 6 :‬منافذ‪.‬‬ ‫❖ الكهرباء المطلوبة‪ :‬يعمل على ‪ 5‬فولت تيار ثابت (‪.)DC‬‬ ‫❖ منافذ السيريال‪ :‬واحد‪.‬‬

‫∞∞∞‬

‫‪12‬‬

‫أساسيات األردوينو‬

‫منافذ الديجيتال‪:‬‬ ‫عددها ‪ 14‬في األردوينو أونو‪ ،‬تستخدم في‪:‬‬ ‫‪ .1‬تشغيل األجهزة المختلفة واطفاءها‪.‬‬ ‫‪ .2‬قراءة اإلشارة الواصلة للمنفذ‪ ،‬هل هنالك إشارة واصلة أم ال؟ وال يمكننا معرفة قوتها‪.‬‬ ‫‪ .3‬بعضها تدعم خاصية ال‪ PWM‬وسندرسها بمشيئة هللا تعالى‪.‬‬ ‫‪ .4‬تدعم بعض منافذها بروتوكوالت اإلتصال ‪ Serial‬و ‪.SPI‬‬

‫∞∞∞‬

‫‪13‬‬

‫أساسيات األردوينو‬

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

‫∞∞∞‬

‫‪14‬‬

‫أساسيات األردوينو‬

‫منافذ الطاقة الموجودة في الأونو‪:‬‬ ‫منفذ (‪ :)GND‬يسمى األرضي‪ ،‬وهو يعتبر ‪ 0‬فولت‪.‬‬ ‫منفذ (‪ :)V5‬منفذ ‪ 5‬فولت‪.‬‬ ‫منفذ (‪ :)V3.3‬منفذ ‪ 3.3‬فولت‪.‬‬ ‫منفذ (‪ :)Vin‬لتشغيل األردوينو من مصدر طاقة خارجي كبطارية مثال (بين ‪ 7‬فولت إلى ‪ 12‬فولت)‪.‬‬

‫‪15‬‬

‫أساسيات األردوينو‬ ‫لوحة األونو تعمل على ‪ 5‬فولت‪ ،‬يمكن تغذيتها ب‪ 5‬فولت مباشرة باستخدام سلك ال‪ USB‬عن طريق‪:‬‬ ‫✓ الكمبيوتر‪.‬‬ ‫✓ شاحن جوال متنقل أو ثابت‪.‬‬ ‫✓ يمكننا أيضا توصيل ‪ 5‬فولت مباشرة عن طريق منفذ ‪.V5‬‬

‫‪16‬‬

‫أساسيات األردوينو‬ ‫ويمكن استخدام مصدر كهرباء خارجي مثل البطاريات أو أفياش الكهرباء من ‪ 7‬فولت إلى ‪ 12‬فولت (المنظم‬ ‫المحدد في الصورة سيقلل الفولت إلى ‪ 5‬فولت ليستخدمه المتحكم)‪.‬‬

‫∞∞∞‬

‫‪17‬‬

‫أساسيات األردوينو‬

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

‫‪18‬‬

‫أساسيات األردوينو‬

‫برنامج ‪Arduino IDE‬‬

‫‪19‬‬

‫أساسيات األردوينو‬

‫تثبيت برنامج الأردوينو ‪Arduino IDE‬‬ ‫برنامج يمكن من خالله برمجة أي جهاز متوافق مع األردوينو بسهولة‪ .‬يمكن تحميله من الرابط‪:‬‬ ‫‪https://www.arduino.cc/en/Main/Software‬‬ ‫نختار البرنامج الذي يوافق نظام التشغيل (في حالة ويندوز نختار ‪.)Windows Installer‬‬ ‫ثم نثبت البرنامج على جهازنا‪.‬‬

‫‪20‬‬

‫أساسيات األردوينو‬

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

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

‫‪21‬‬

‫أساسيات األردوينو‬

‫‪22‬‬

‫أساسيات في برمجة الأردوينو‬ ‫دالة الإعدادات‪:‬‬ ‫•‬

‫يجب كتابة هذه الدالة في كل برامج األردوينو‪.‬‬

‫}‬

‫•‬

‫ما بداخل األقواس {‬

‫•‬

‫نضع اإلعدادات التي ال نحتاج تغييرها داخل هذه األقواس‪.‬‬

‫ينفذ مرة واحدة فقط‪.‬‬

‫)(‪void setup‬‬ ‫{‬ ‫}‬

‫∞∞∞‬ ‫الدالة الرئيسية‪:‬‬ ‫•‬

‫يجب كتابة هذه الدالة في كل برامج األردوينو‪.‬‬

‫•‬

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

‫•‬

‫هنا نضع برنامجنا الرئيسي‪.‬‬

‫)(‪void loop‬‬ ‫{‬ ‫}‬

‫أساسيات األردوينو‬

‫مالحظة‪ :‬أي شيء مكتوب بعد الشرطتين المائلتين ‪//‬‬

‫‪23‬‬

‫ال يدخل في البرنامج وهي مجرد مالحظات يكتبها المبرمج‬

‫للشرح والتوضيح‪.‬‬

‫‪//‬‬

‫أساسيات في البرمجة‪:‬‬ ‫✓ كل قوس يجب أن يغلق‪.‬‬

‫)(‪void setup‬‬ ‫{‬ ‫}‬

‫✓ االهتمام بالحروف الكبيرة والصغيرة ( ‪ timer‬ال تساوي ‪.)Timer‬‬

‫صحيحة ;)‪digitalWrite(9, HIGH‬‬ ‫خاطئة ;)‪digitalwrite(9, high‬‬

‫✓ أوامر البرمجة العادية تنتهي بــ‬

‫;‬ ‫;)‪pinMode(9, OUTPUT‬‬ ‫;)‪digitalWrite(9, HIGH‬‬

‫أساسيات األردوينو‬ ‫✓ الدوال “‪ ”Functions‬تنتهي بقوسين فارغة أو داخلها أمر‬

‫‪24‬‬

‫()‬ ‫( )‪void setup‬‬ ‫{‬ ‫}‬ ‫( )‪void loop‬‬ ‫{‬ ‫}‬

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

‫نذهب إلى أدوات ← منفذ ← المنفذ الخاص باألردوينو‪.‬‬ ‫‪Tools - > Port → choose‬‬

‫(إذا لم يوجد المنفذ الخاص باألردوينو تأكد من توصيل األردوينو أو تثبيت البرنامج بشكل صحيح‪،‬‬ ‫في حاالت كثيرة تكون المشكلة عدم تثبيت ال ‪ driver‬الخاص باألردوينو)‪.‬‬ ‫‪o‬‬

‫نختار نوع اللوحة الموجودة لدينا عن طريق‪:‬‬ ‫أدوات ← اللوحة ← نختار اسم اللوحة الموجودة لدينا (‪.)Arduino Uno/Genuino‬‬

‫✓ نضغط ‪.Upload‬‬ ‫✓ سيظهر لك في األسفل معلومات التحميل‪ ،‬وإن كان هناك خطأ سيكتب لك سببه غالبا‪.‬‬ ‫✓ في حال كان كل شيء على ما يرام‪ ،‬ستظهر لك عبارة‪.Done Uploading‬‬

‫أساسيات األردوينو‬

‫اختيار نوع اللوحة المستخدمة‬

‫‪25‬‬

‫أساسيات األردوينو‬

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

‫‪26‬‬

‫أساسيات األردوينو‬

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

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

‫;) ‪ , OUTPUT‬رقم المنفذ (‪pinMode‬‬ ‫•‬

‫مدخل‪ :‬عندما نريد قراءة إشارة أو حساس‪ ،‬نحدد المنفذ كمدخل‪.‬‬

‫;) ‪ , INPUT‬رقم المنفذ (‪pinMode‬‬

‫تحديد المنفذ عادة يكون مرة واحدة داخل دالة اإلعدادات ‪ ،setup‬يمكن أن نغير حالة المنفذ في أي وقت إن‬ ‫احتجنا لذلك‪.‬‬

‫∞∞∞‬

‫‪27‬‬

‫أساسيات األردوينو‬

‫الأمر ‪digitalWrite‬‬ ‫نستطيع التحكم بمنافذ الديجيتال لترسل إشارة ‪ 5‬فولت أو ‪ 0‬فولت (‪ HIGH‬و ‪:)LOW‬‬ ‫لتشغيل األجهزة أو إرسال إشارة ‪ 5‬فولت من أي منفذ نستخدم األمر‪:‬‬

‫;) ‪, HIGH‬رقم المنفذ (‪digitalWrite‬‬ ‫إلرسال إشارة ‪ 0‬فولت من اي منفذ ديجيتال نستخدم األمر‪:‬‬

‫;) ‪, LOW‬رقم المنفذ (‪digitalWrite‬‬

‫ما معنى ديجيتال؟‬ ‫•‬

‫إما تكون تعمل ‪ 5( ON‬فولت)‪.‬‬

‫•‬

‫وإما تكون ال تعمل ‪ 0( OFF‬فولت)‪.‬‬

‫•‬

‫ال يمكننا الحصول على ‪ 2.5‬فولت مثال أو ‪ 3‬فولت‪ ،‬إما تعمل أو ال تعمل‬

‫∞∞∞‬

‫‪28‬‬

‫أساسيات األردوينو‬

‫‪29‬‬

‫تشغيل ال‪ LED‬الداخلي في لوحة الأردوينو‬ ‫هناك إضاءة ‪ LED‬داخل لوحة األردوينو موصولة بالمنفذ ‪ 13‬سنبرمجها لتعمل وتنطفئ كل ثانية‪.‬‬ ‫نفتح برنامج األردوينو ونكتب أو ننسخ هذا البرنامج‪:‬‬

‫)(‪void setup‬‬ ‫{‬ ‫;)‪Serial.begin(9600‬‬ ‫}‬ ‫)(‪int main‬‬ ‫{‬ ‫;)" ‪Serial.println("I love Arduino‬‬ ‫;)‪delay(1000‬‬ ‫}‬ ‫بعد كتابة البرنامج في برنامج األردوينو ‪ IDE‬سنرفعه إلى لوحة األردوينو كما وضحنا مسبقا‪.‬‬

‫ماذا يفعل البرنامج؟‬ ‫‪ .1‬يجعل المنفذ رقم ‪ 13‬مخرج‪.‬‬ ‫‪ .2‬يجعل المنفذ رقم ‪( HIGH 13‬بمعنى آخر ‪ )ON‬فيعمل ال‪ LED‬بسبب مرور التيار من المنفذ ‪ 13‬إلى المنفذ‬ ‫األرضي مرورا بال‪.LED‬‬ ‫‪ .3‬يوقف البرنامج لمدة ثانية‪.‬‬ ‫‪ .4‬يجعل المنفذ رقم ‪( LOW 13‬بمعنى آخر ‪ )off‬فينطفئ ال‪ LED‬ألن المنفذ اآلن أصبح ‪ 0‬فولت واألرضي ‪0‬‬ ‫فولت فال يوجد فرق في الجهد بينهما‪ ،‬فال ينتقل التيار‪.‬‬ ‫‪ .5‬يوقف البرنامج لمدة ثانية‪.‬‬

‫أساسيات األردوينو‬

‫‪30‬‬

‫شرح األوامر‬

‫تحديد المنفذ رقم ‪ 9‬كمخرج‪.‬‬

‫;)‪pinMode(9, OUTPUT‬‬

‫التحكم بالمنفذ رقم ‪ 9‬ليصبح ‪ 5‬فولت‪(HIGH).‬‬

‫;)‪digitalWrite(9, HIGH‬‬

‫ايقاف البرنامج لمدة ‪ 1000‬ملي ثانية (‪ 1‬ثانية)‪.‬‬

‫;)‪delay(1000‬‬ ‫;)‪digitalWrite(9, LOW‬‬

‫التحكم بالمنفذ رقم ‪ 9‬ليصبح ‪ 0‬فولت‪(LOW).‬‬

‫األمر ‪:delay‬‬ ‫•‬

‫يوقف البرنامج حسب المدة المعطاة بين األقواس وهي بالملي ثانية‪.‬‬

‫•‬

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

‫•‬

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

‫∞∞∞‬

‫أساسيات األردوينو‬ ‫تشغيل لمبة ‪ LED‬خارجية‬ ‫القطع المطلوبة‪:‬‬ ‫إضاءة ليد‪.‬‬ ‫مقاومة (أي قيمة بين ‪ 200‬إلى ‪ 1000‬أوم مناسبة)‪.‬‬ ‫لوحة تجارب (بريد بورد)‪.‬‬ ‫سلكين ذكر‪-‬ذكر‪.‬‬

‫‪31‬‬

‫أساسيات األردوينو‬ ‫خطوات التوصيل‪:‬‬ ‫نوصل سلك من المنفذ رقم ‪ 9‬إلى رجل اإلضاءة الطويلة‪.‬‬ ‫نوصل اي طرف من المقاومة برجل اإلضاءة القصيرة‪.‬‬ ‫نوصل الطرف اآلخر من المقاومة باألرضي ‪.GND‬‬

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

‫البرنامج‪:‬‬ ‫نستخدم نفس البرنامج في المثال السابق مع تغيير رقم المنفذ من ‪ 13‬إلى ‪.9‬‬

‫‪32‬‬

‫أساسيات األردوينو‬ ‫تدريب‪ :‬اصنع إشارة مرور‬ ‫ستحتاج إلى اآلتي‪:‬‬ ‫ثالثة مقاومات مناسبة (اي قيمة بين ‪ 200‬و ‪ 1000‬أوم)‬ ‫ثالثة لمبات ‪( LED‬أحمر‪ ،‬أصفر‪ ،‬أخضر)‪.‬‬ ‫لوحة تجارب‪.‬‬ ‫أسالك ذكر‪-‬ذكر للتوصيل‪.‬‬

‫∞∞∞‬

‫‪33‬‬

‫أساسيات األردوينو‬

‫‪34‬‬

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

‫;)‪Serial.begin(9600‬‬ ‫بعدها نستطيع ارسال المعلومات إلى الكمبيوتر باستخدام األمر‪:‬‬

‫;)(‪Serial.println‬‬ ‫إلرسال جملة ‪ I Love Arduino‬من األردوينو إلى الكمبيوتر مرة واحدة كل ثانية نستطيع أن نستخدم البرنامج‬ ‫التالي‪:‬‬

‫)(‪void setup‬‬ ‫{‬ ‫;)‪Serial.begin(9600‬‬ ‫}‬ ‫)(‪int main‬‬ ‫{‬ ‫;)"‪Serial.println("I love Arduino‬‬ ‫;)‪delay(1000‬‬ ‫}‬

‫أساسيات األردوينو‬ ‫اآلن لنرى الرسالة نضغط على العدسة أعلى يمين برنامج األردوينو بعد تحميل البرنامج إلى اللوحة‪.‬‬

‫•‬

‫يجب أن نتأكد من اختيار المنفذ (‪.)Port‬‬

‫•‬

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

‫∞∞∞‬

‫‪35‬‬

‫أساسيات األردوينو‬

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

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

‫‪36‬‬

‫أساسيات األردوينو‬ ‫التوصيل (دياجرام)‪:‬‬

‫‪37‬‬

38

‫أساسيات األردوينو‬ ‫الكود‬

int red = 11; int yellow = 10; int green = 9; void setup() { pinMode(green, OUTPUT); pinMode(yellow, OUTPUT); pinMode(red, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(green, HIGH); Serial.println("Green"); delay(3000); digitalWrite(green, LOW); digitalWrite(yellow, HIGH); Serial.println("Yellow"); delay(1000); digitalWrite(yellow, LOW); digitalWrite(red, HIGH); Serial.println("Red"); delay(3000); digitalWrite(red, LOW); }

‫أساسيات األردوينو‬

‫‪39‬‬

‫شرح الكود‬

‫;‪int red‬‬

‫ينشيء متغير اسمه ‪( red‬يمكننا تسميته أي اسم)‪.‬‬

‫;‪red = 11‬‬

‫يمكن أن نحفظ فيه األعداد الصحيحة‬

‫;) ‪pinMode( ,‬‬

‫نعطي المتغير ‪ red‬قيمة ‪11‬‬ ‫اآلن كلما استخدمنا كلمة ‪ red‬سيراها األردوينو ‪11‬‬

‫;)‪pinMode(red, OUTPUT‬‬

‫هذا األمر يحدد لألردوينو كيف سنستخدم المنفذ إما‬

‫;)‪digitalWrite(red, HIGH‬‬

‫كمخرج أو مدخل‪.‬‬

‫;)‪delay(1000‬‬

‫الفراغ األول بين األقواس هو لرقم المنفذ‪.‬‬

‫;)‪Serial.begin(9600‬‬

‫الفراغ الثاني لنحدد استخدام المنفذ‬ ‫كمخرج ‪OUTPUT‬أو مدخل‪INPUT.‬‬

‫;)”‪Serial.println(“Green‬‬

‫يجب أن تكون بحروف كبيرة‪.‬‬

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

‫∞∞∞‬

‫أساسيات األردوينو‬

‫الأمر ‪analogWrite‬‬ ‫في األمثلة السابقة‪ ،‬تحكمنا في ال‪ LED‬فإما يعمل أو ال يعمل‪ ،‬ولكن كيف يمكننا التحكم في شدة إضاءته؟‬ ‫للتحكم بشدة اإلضاءة علينا تغيير الفولت الخارج من المنافذ‪ ،‬لكن ال يستطيع األردوينو اخراج أي فولت سوى ‪5‬‬ ‫فولت أو ‪ 0‬فولت وال يستطيع إخراج ‪ 3‬أو ‪ 2.5‬فولت من المنافذ‪.‬‬ ‫فلكي نتحكم بشدة اإلضاءة‪ ،‬سنستخدم طريقة تسمى ‪.Pulse Width Modulation‬‬

‫طريقة عمل ال‪:PWM‬‬ ‫‪ .1‬يرسل األردوينو ‪ 500‬إشارة في الثانية‪.‬‬ ‫‪ .2‬أقصى طول لكل إشارة ‪ 2‬ملي ثانية‪.‬‬ ‫‪ .3‬نقوم بالتحكم في طول بقاء اإلشارة‪ .‬كلما طالت مدة بقاء اإلشارة‪ ،‬زادت الطاقة الناتجة من‬ ‫المنفذ (الصورة باألسفل)‪.‬‬ ‫‪ .4‬باستخدام األمر ‪ analogWrite‬سنحدد رقم المنفذ‪ ،‬ورقم (من ‪ 0‬إلى ‪ )255‬كلما زاد الرقم زادت شدة‬ ‫اإلشارة‪.‬‬ ‫‪ .5‬المنافذ التي تدعم ال‪ PWM‬بجانبها عالمة ~ على لوحة األردوينو‪.‬‬

‫‪40‬‬

‫أساسيات األردوينو‬ ‫طريقة استخدام األمر ‪analogWrite‬‬ ‫‪ .1‬نحدد المنفذ كمخرج‪.‬‬ ‫‪ .2‬نحدد قوة اإلشارة من المنفذ (نستخدم رقم من ‪ 0‬إلى ‪.)255‬‬ ‫‪ 255 .a‬أعلى قيمة‪.‬‬ ‫‪ 0 .b‬أقل قيمة‪.‬‬

‫سنقوم بالتحكم بشدة إضاءة لمبة ‪ LED‬باستخدام ال‪.PWM‬‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو وكيبل للبرمجة‬ ‫✓ مقاومة ‪ 220‬أوم او حولها‬ ‫✓ ‪LED‬‬ ‫✓ أسالك للتوصيل‬ ‫✓ لوحة تجارب "‪”Breadboard‬‬

‫‪41‬‬

‫أساسيات األردوينو‬

42

:‫التوصيل‬

:‫الكود‬

void setup() { pinMode(9, OUTPUT); } void loop() { for (int i = 0; i < 255; i++) //for loop { analogWrite(9, i); delay(25); } }

‫أساسيات األردوينو‬

‫‪43‬‬

‫شرح الكود‪:‬‬

‫الكود سيقوم بانشاء عدد صحيح اسمه ‪ i‬قيمته ‪0‬‬

‫)‪for(int i =0;i<255,i++‬‬

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

‫;)‪analogWrite(9, i‬‬ ‫;)‪delay(25‬‬

‫أساسيات األردوينو‬

‫ملخص الباب‪:‬‬ ‫✓ قبل استخدام منافذ الديجيتال علينا تحديدها هل هي مدخل أم مخرج‪.‬‬

‫;)‪pinMode(4, OUTPUT‬‬ ‫;)‪pinMode(5, INPUT‬‬

‫✓ األمر ‪ digitalWrite‬يتحكم في المنفذ بتشغيله وإيقافه (‪.)HIGH, LOW‬‬

‫;)‪digitalWrite(9, HIGH‬‬

‫✓ األمر ()‪ delay‬يوقف البرنامج حسب المدة المحددة بين األقواس‪.‬‬

‫;)‪delay(25‬‬ ‫•‬

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

‫;)‪Serial.begin(9600‬‬

‫‪44‬‬

‫أساسيات األردوينو‬

‫تمارين‪:‬‬ ‫‪ .1‬متى نستخدم المنفذ كمخرج؟ ومتى نستخدمه كمدخل؟‬ ‫‪ .2‬كيف نحدد المنفذ كمخرج؟ اكتب األمر‪.‬‬ ‫‪ .3‬ما األمر الذي نحتاجه لنجعل المنفذ ‪ HIGH‬لنشغل مثال ‪ LED‬متصل به؟‬ ‫‪ .4‬ماذا يفعل األمر ‪delay‬؟‬ ‫‪ .5‬كيف نرسل هذه الجملة إلى الكمبيوتر من األردوينو عن طريق السيريال " ‪“ Hello World‬؟ اكتب البرنامج‪.‬‬ ‫‪ .6‬ما الفرق بين ‪ digitalWrite‬و ‪analogWrite‬؟‬ ‫‪ .7‬ماهي أعلى قيمة في األمر ‪analogWrite‬؟‬ ‫‪ .8‬ماهو أعلى تيار تستطيع المنافذ تحمله؟‬

‫‪45‬‬

‫أساسيات األردوينو‬

‫قراءة اإلشارة من المنافذ‬

‫‪46‬‬

‫أساسيات األردوينو‬ ‫عندما يمر جسم أمام حساس الحركة‪ ،‬يعطي الحساس إشارة (‪ 5-3‬فولت)‪ ،‬وعندما ال يكتشف وجود تغير في‬ ‫الحركة ستكون اإلشارة ‪ 0‬فولت‪ .‬كيف يمكن أن نقرأ إشارة الحساس باستخدام األردوينو؟‬

‫قراءة إشارة عن طريق منافذ الديجيتال‬ ‫✓ نحدد المنفذ كمدخل‪.‬‬

‫;)‪pinMode(3, INPUT‬‬ ‫✓ نقرأ اإلشارة باستخدام األمر‪:‬‬

‫;(‪digitalRead )3‬‬

‫إذا كانت هناك إشارة عند المنفذ سيعطينا قيمة (‪ ،.)1‬إذا لم يكن هناك إشارة عند المنفذ سيعطينا قيمة‬ ‫(‪.)0‬‬ ‫علينا أن نحفظ القيمة في متغير إن أردنا استخدام القيمة الحقا‪.‬‬

‫‪47‬‬

‫أساسيات األردوينو‬

48

:‫الكود‬

void setup() { Serial.begin(9600); pinMode(3, INPUT); } int main() { int x; x = digitalRead(3); if (x == 1) { Serial.println("Pin received HIGH Signal"); } else if (x == 0) { Serial.println("Pin received LOW Signal"); } }

‫أساسيات األردوينو‬

‫حساس الحركة‬ ‫األجسام الحية تنبعث منها أشعة تحت حمراء نظرا لحرارتها‪ .‬الحساس يقوم بقياس التغير في هذه األشعة‬ ‫الواصلة له‪.‬‬ ‫الحساس يحتوي على ثالثة أرجل أو منافذ‪:‬‬ ‫‪ .1‬منفذ للفولت‬ ‫‪ .2‬منفذ لألرضي‬ ‫‪ .3‬منفذ نقرأ منها حالة الحساس‪.‬‬

‫طريقة عمل المشروع‪:‬‬ ‫‪ .1‬عندما يمر جسم حي أمام حساس الحركة سيعطينا الحساس اشارة‪.‬‬ ‫‪ .2‬األردوينو سيقرأها عن طريق أحد منافذ الديجيتال‪.‬‬ ‫‪ .3‬في حال وجود إشارة سيقوم األردوينو بتشغيل إضاءة لعدة ثوان‪.‬‬

‫‪49‬‬

‫أساسيات األردوينو‬ ‫القطع المطلوبة‪:‬‬ ‫‪ .1‬أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫‪ .2‬حساس الحركة‪.‬‬ ‫‪ .3‬إضاءة ‪.LED‬‬ ‫‪ .4‬مقاومة ‪ 200‬أوم أو أعلى‪.‬‬ ‫‪ .5‬لوحة تجارب ‪.Breadboard‬‬

‫‪50‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪51‬‬

‫أساسيات األردوينو‬

52

:‫الكود‬

void setup() { Serial.begin(9600); pinMode(10, INPUT); pinMode(9, OUTPUT); } void loop() { int active = digitalRead(10); if (active == 1) { digitalWrite(9, HIGH); Serial.println("Motion Detected"); delay(500); } else { digitalWrite(9 , LOW); Serial.println("No Motion Detected"); } }

‫أساسيات األردوينو‬

‫‪53‬‬

‫شرح الكود‪:‬‬

‫تحديد المنفذ رقم ‪ 10‬كمدخل‬ ‫تحديد المنفذ رقم ‪ 9‬كمخرج‬ ‫انشاء متغير يقبل اعداد صحيحة اسمه ‪active‬‬

‫;)‪pinMode(10, INPUT‬‬ ‫;)‪pinMode(9, OUTPUT‬‬ ‫;)‪int active = digitalRead(10‬‬

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

‫)‪if (active == 1‬‬ ‫} {‬

‫نالحظ انه كتب == وليس=‬ ‫إن لم يتحقق الشرط في الجملة الشرطية‪...‬‬ ‫يوقف البرنامج لمدة نصف ثانية (‪ 1 = 1000‬ثانية)‪.‬‬

‫‪else‬‬ ‫;)‪delay(500‬‬

‫أساسيات األردوينو‬

‫لماذا استخدمنا إشارتين يساوي == وليس واحدة في الجملة الشرطية في األعلى؟‬ ‫األمر ‪ active = 1‬معناه أننا نعطي المتغير ‪ active‬قيمة ‪1‬‬ ‫األمر ‪ active ==1‬معناه أننا نسأل األردوينو هل قيمة المتغير ‪ active‬تساوي واحد أم ال؟‬

‫األردوينو قادر على أن يقرأ اإلشارات التي قوتها من ‪ 0‬إلى‪ 5‬فولت لكن عندما نقرأها من منفذ ديجيتال فإن‬ ‫األردوينو سيظهر لنا هل اإلشارة موجودة أم ال‪ ،‬ولن نعرف مدى قوتها‪ .‬لمعرفة قيمة اإلشارة سنستخدم منافذ‬ ‫األنالوج‪.‬‬

‫∞∞∞‬

‫‪54‬‬

‫أساسيات األردوينو‬

‫القراءة من منفذ أنالوج‪:‬‬ ‫❖ حساس درجة الحرارة يعطينا إشارة تزيد قوتها (الفولت) كلما زادت درجة الحرارة‪.‬‬ ‫❖ القراءة من منافذ الديجيتال لن تفيدنا ألنها فقط تخبرنا هل هناك إشارة أم ال‪.‬‬ ‫❖ يجب استخدام منافذ األنالوج ألنها تقيس اإلشارة بدقة عالية‪.‬‬ ‫لن نحتاج لتحديد المنفذ كمدخل "‪ ”Input‬عند القراءة من منفذ أنالوج‬ ‫فقط نستخدم األمر التالي‪:‬‬

‫;)‪analogRead(A0‬‬ ‫يمكن أن ننشيء متغير ونحفظ فيه قيمة القراءة‪:‬‬ ‫;)‪int reading = analogRead(A0‬‬

‫‪55‬‬

‫أساسيات األردوينو‬

‫مشروع قراءة فرق الجهد من مقاومة متغيرة‪:‬‬ ‫المقاومة المتغيرة (‪)Potentiometer‬‬

‫•‬

‫مقاومة لها قيمة معينة (‪ 1000‬أوم مثال)‪.‬‬

‫•‬

‫لها ‪ 3‬أرجل‪ ،‬عند حساب المقاومة من طرفيها سنجدها (‪ 1000‬أوم)‪.‬‬

‫•‬

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

‫•‬

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

‫‪56‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪57‬‬

‫أساسيات األردوينو‬

‫‪58‬‬

‫طريقة التوصيل‪:‬‬ ‫•‬

‫الرجل الوسطى نوصلها بمنفذ أنالوج‪.‬‬

‫•‬

‫نوصل أحد أطراف المقاومة ب‪ 5‬فولت‪.‬‬

‫•‬

‫الطرف األخر نوصله باألرضي ‪.GND‬‬

‫الكود‪:‬‬

‫)(‪void setup‬‬ ‫{‬ ‫;)‪Serial.begin(9600‬‬ ‫}‬ ‫)(‪void loop‬‬ ‫{‬ ‫;‪float reading‬‬ ‫;)‪reading = analogRead(0‬‬ ‫;)‪Serial.println(reading‬‬ ‫;)‪Serial.println(reading * 5 / 1023‬‬ ‫;)‪delay(100‬‬ ‫}‬

‫أساسيات األردوينو‬

‫‪59‬‬

‫شرح الكود‪:‬‬

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

‫;)‪Serial.print(9600‬‬ ‫;‪float reading‬‬

‫يحفظ أرقام كسرية (مثل ‪ 1.0‬أو ‪ 0.74‬أو ‪.)102.9‬‬ ‫أمر لقراءة اإلشارة من المنفذ رقم ‪( A0‬أنالوج)‪.‬‬ ‫يأخذ قراءة من المنفذ رقم ‪ A0‬ويحفظها في‬

‫;)‪analogRead(0‬‬ ‫;)‪reading = analogRead(0‬‬

‫المتغير ‪.reading‬‬ ‫ارسال قيمة ‪ reading‬عن طريق السيريال‪.‬‬

‫;)‪Serial.println(reading‬‬

‫يمكننا قراءتها على شاشة الكمبيوتر‪.‬‬ ‫القراءة تأتينا رقم من ‪ 0‬إلى ‪1024‬‬ ‫‪ 1024‬يعني أن اإلشارة قيمتها ‪ 5‬فولت‪.‬‬ ‫‪ 0‬يعني أن اإلشارة قيمتها ‪ 0‬فولت‪.‬‬ ‫نحول القراءة إلى فولت كالتالي‪:‬‬ ‫نضربها في ‪ 5‬ونقسمها على ‪1024‬‬ ‫في هذا األمر حولنا القراءة إلى فولت وأرسلناها‬ ‫إلى الكمبيوتر عن طريق السيريال‪.‬‬

‫;)‪Serial.println(reading*5/1024‬‬

‫أساسيات األردوينو‬ ‫ماذا يعمل الكود؟‬ ‫•‬

‫ينشيء متغير اسمه ‪reading‬‬

‫•‬

‫يقرأ من منفذ األنالوج ويخزنه في المتغير ‪reading‬‬

‫•‬

‫يرسل القراءة عن طريق السيريال لنتمكن من قراءتها من الكمبيوتر‬

‫•‬

‫يحول القراءة إلى فولت بضربها في ‪ 5‬وقسمتها على ‪1024‬‬

‫•‬

‫يرسل القراءة عن طريق السيريال لنتمكن من قراءتها من الكمبيوتر‬

‫•‬

‫يوقف البرنامج لمدة عشر ثانية‬

‫‪ .1‬عندما تصل إشارة ‪ 5‬فولت إلى منفذ األنالوج‪ ،‬سيعطينا قراءة ‪.1024‬‬ ‫‪ .2‬عندما تصل إشارة ‪ 2.5‬فولت‪ ،‬سيعطينا قراءة ‪.512‬‬ ‫‪ .3‬دقة القراءة هي ‪ 5‬قسمة ‪ 0.004882813 = 1024‬فولت‪.‬‬ ‫‪ .4‬لتحويل القراءة إلى فولت‪ ،‬نضربها في ‪ 5‬ونقسمها على ‪.1024‬‬

‫∞∞∞‬

‫‪60‬‬

‫أساسيات األردوينو‬

‫تمارين‪:‬‬ ‫‪ .1‬ما الفرق بين قراءة المنفذ الديجيتال وبين األنالوج؟‬ ‫‪ .2‬كيف نحدد المنفذ كمدخل؟‬ ‫‪ .3‬هل يجب علينا تحديد المنفذ كمدخل عند قراءة إشارة أنالوج؟‬ ‫‪ .4‬اكتب برنامجا يقرأ قيمة أنالوج‪ ،‬ويحولها لفرق جهد‪.‬‬

‫‪61‬‬

‫أساسيات األردوينو‬

‫اوامر برمجية مهمة‬

‫‪62‬‬

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

‫الجملة الشرطية (‪)If Statement‬‬ ‫من أهم األوامر التي نحتاجها في البرمجة‪ ،‬وهي بسيطة وسهلة‪ ،‬مثال لها‪:‬‬

‫;‪int i = 5‬‬ ‫)‪if (i == 3‬‬ ‫{‬ ‫;)"‪Serial.println("Hello‬‬ ‫}‬ ‫)‪else if (i == 4‬‬ ‫{‬ ‫;)"‪Serial.println("Good Morning‬‬ ‫}‬ ‫)‪else if (i == 5‬‬ ‫{‬ ‫;)"‪Serial.println ("Good Night‬‬ ‫}‬

‫‪ .1‬عرفنا عدد صحيح اسمه ‪ i‬وأعطيناه القيمة ‪. 5‬‬ ‫‪ .2‬كونا جملة شرطية تقول ( إذا ‪ i‬تساوي ‪ ) 3‬نفذ ما بين األقواس‪.‬‬ ‫‪ .3‬وإال إذا كانت ‪ i‬تساوي ‪ 4‬نفذ ما بين األقواس‪.‬‬ ‫‪ .4‬وإال إذا كانت ‪ i‬تساوي ‪ 5‬نفذ ما بين األقواس‪.‬‬ ‫بما أن ‪ i‬تساوي ‪ 5‬سيتجاوز األردوينو الشرط األول والثاني‪ ،‬وسينفذ ما بين األقواس في الشرط الثالث وسيطبع‬ ‫لنا على الشاشة‪.Good Night :‬‬

‫‪63‬‬

‫أساسيات األردوينو‬ ‫مثال‪:‬‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو‪.‬‬ ‫✓ كيبل للبرمجة‪.‬‬ ‫✓ مقاومة متغيرة أي قيمة "‪.”Potentiometer‬‬

‫التوصيل‪:‬‬

‫‪64‬‬

‫أساسيات األردوينو‬

65

:‫الكود‬

int reading; float voltage; void setup() { Serial.begin(9600); } void loop() { reading = analogRead(0); voltage = reading * 5 / 1024; if (voltage >= 4) { Serial.println("voltage is above than four"); } else if (voltage >= 3 && voltage < 4) { Serial.println("voltage is between three and four"); } else if (voltage >= 2 && voltage < 3) { Serial.println("voltage is between two and three"); } else { Serial.println("Voltage is less than two"); } delay(50); Serial.println("The voltage is : " ); Serial.println(voltage); }

‫أساسيات األردوينو‬

‫‪66‬‬

‫شرح الكود‪:‬‬

‫تعريف متغير يقبل األعداد الصحيحة اسمه ‪.reading‬‬

‫;‪int reading‬‬

‫تعريف متغير يقبل االعداد الكسرية اسمه ‪.voltage‬‬

‫;‪float voltage‬‬

‫بداية التحدث باستخدام السيريال بسرعة ‪ 9600‬بت في الثانية‪.‬‬

‫;)‪Serial.begin(9600‬‬

‫نقرأ من المنفذ رقم ‪ A0‬ونعطي المتغير ‪ reading‬قيمة القراءة‪.‬‬

‫;)‪reading = analogRead(0‬‬

‫نضرب القراءة في ‪ 5‬ونقسمها على ‪ 1024‬لنحولها إلى فولت‪.‬‬

‫;‪voltage = reading * 5 / 1024‬‬

‫إذا كان قيمة المتغير ‪ voltage‬أكبر من أو يساوي ‪ 4‬سينفذ ما‬ ‫بين األقواس‪.‬‬

‫معناها (و) يجب أن يتحقق الشرطين معا كما في األمر‬

‫)‪if (voltage >= 4‬‬ ‫{‬ ‫‪Serial.println("voltage is above‬‬ ‫;)"‪than four‬‬ ‫}‬ ‫&&‬

‫أسفل‪.‬‬ ‫إن لم يتحقق الشرط السابق وإذا كانت قيمة ‪voltage‬‬ ‫(أكبر من أو تساوي ‪ )3‬و (أقل من ‪ )4‬نفذ األمر بين األقواس‪.‬‬

‫إذا لم يتحقق أي شرط من الشروط السابقة نفذ ما بين‬ ‫األقواس‪.‬‬

‫نوقف البرنامج ‪ 0.005‬ثانية لتقليل سرعة ارسال المعلومات‬ ‫وتسهيل قراءتها‪.‬‬

‫‪else if (voltage >= 3 && voltage‬‬ ‫)‪< 4‬‬ ‫{‬ ‫‪Serial.println("voltage is‬‬ ‫;)"‪between three and four‬‬ ‫}‬ ‫‪else‬‬ ‫{‬ ‫‪Serial.println("Voltage is less‬‬ ‫;)"‪than two‬‬ ‫}‬ ‫;)‪delay(50‬‬

‫أساسيات األردوينو‬ ‫البرنامج يقوم باآلتي‪:‬‬ ‫‪ .1‬يعرف عدد صحيح اسمه ‪.reading‬‬ ‫‪ .2‬يعرف متغير اسمه ‪( voltage‬سميناه ‪ float‬ألنها تستطيع احواء األعداد الكسرية ألن الفولت قد يكون‬ ‫‪ 3.45‬أو ‪ 4.21‬وليس دائما عدد صحيح‪.‬‬ ‫‪ .3‬يفتح السيريال بسرعة ‪ 9600‬بت في الثانية‪.‬‬

‫∞∞∞‬

‫‪67‬‬

‫أساسيات األردوينو‬

‫حلقة ما دام ‪while loop‬‬ ‫مثال‪:‬‬

‫;‪int i = 5‬‬ ‫)‪while (i == 5‬‬ ‫{‬ ‫;)"‪Serial.println("the code is inside the loop‬‬ ‫}‬ ‫;)"‪Serial.println("End loop‬‬

‫‪ .1‬عرفنا متغير اسمه ‪ i‬وأعطيناه القيمة ‪.5‬‬ ‫‪ .2‬حلقة مادام (‪ )while loop‬طالما ‪ i‬تساوي ‪ 5‬نفذ ما بين األقواس‪.‬‬ ‫‪ .3‬سيظل البرنامج يرسل لنا "‪ ”the code is inside the loop‬لألبد‬ ‫‪ .4‬مادامت ‪ i‬تساوي ‪ 5‬لن يغادر البرنامج الحلقة ‪while loop‬‬

‫∞∞∞‬

‫‪68‬‬

‫أساسيات األردوينو‬

‫‪loop For‬‬ ‫من أكثر األوامر استخداما‪ .‬نستخدمها عندما نريد تكرار الشيء مرات معدودة ‪ 5‬مرات أو ‪ 100‬مرة مثال‪.‬‬

‫)‪for (int i = 0; i < 5 ; i++‬‬ ‫{‬ ‫;)‪Serial.println(i‬‬ ‫}‬

‫‪ .1‬البرنامج في األعلى سيطبع لنا األرقام من ‪ 0‬إلى ‪.4‬‬ ‫‪ .2‬أنشأنا متغير وأسميناه ‪ i‬وأعطيناه القيمة ‪.0‬‬ ‫‪ .3‬ما دامت ‪ i‬اصغر من ‪ 5‬سينفذ البرنامج مابين األقواس { }‪.‬‬ ‫‪ .4‬سيضيف في كل مرة ينفذ فيها البرنامج داخل الحلقة رقم ‪ 1‬إلى ‪.i‬‬ ‫‪ i .5‬في البداية تساوي ‪ ،0‬سينفذ البرنامج‪ ،‬ثم يقارنها هل هي أصغر من ‪5‬؟ نعم… إذا سيضيف لها‬ ‫الرقم واحد وينفذ ما بين األقواس مرة أخرى وهكذا حتى تصبح قيمتها ‪.5‬‬

‫‪69‬‬

‫أساسيات األردوينو‬

70

:‫تطبيق عملي‬ :‫القطع المطلوبة‬ .‫ أردوينو أونو‬.1 .‫ كيبل للبرمجة‬.2 :‫الكود‬

void setup() { Serial.begin(9600); } void loop() { for (int i = 0; i < 100 ; i ++) { Serial.println(i); delay(50); } Serial.println(" Loop Ended " ); }

‫أساسيات األردوينو‬

‫‪71‬‬

‫شرح الكود‪:‬‬

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

‫;)‪Serial.begin(9600‬‬ ‫)‪for (int i=0; i<100; i++‬‬ ‫;‪int i = 0‬‬

‫ننشيء عدد صحيح اسمه ‪ i‬ونعطيه القيمة ‪0‬‬ ‫يمكن تسميته أي اسم‪.‬‬

‫‪i < 100‬‬

‫طالما ‪ i‬اصغر من ‪ 100‬نفذ األمر التالي‪.‬‬

‫‪i++‬‬

‫تعني ‪i = i + 1‬‬ ‫(أضف رقم ‪ 1‬إلى ‪)i‬‬ ‫ارسال قيمة ‪ i‬عن طريق السيريال إلى الكمبيوتر‪.‬‬ ‫لتقليل سرعة ارسال المعلومات حتى نستطيع قراءتها‪.‬‬

‫;)‪Serial.println(i‬‬ ‫;)‪delay(50‬‬

‫البرنامج يقوم باآلتي‪:‬‬ ‫✓ يفتح السيريال بسرعة ‪ 9600‬بت في الثانية‪.‬‬ ‫✓ ينشيء متغير ‪ i‬قيمته ‪. 0‬‬ ‫✓ طالما ‪ i‬أقل من ‪ ،100‬سننفذ األمر بين األقواس وسيضيف واحد إلى ‪ i‬حتى تصل إلى مئة‪.‬‬

‫∞∞∞‬

‫أساسيات األردوينو‬

‫‪72‬‬

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

‫;‪int num = 5‬‬

‫✓ ‪ int‬اختصار لكلمة ‪ integer‬ومعناها عدد صحيح‪.‬‬ ‫✓ سمينا العدد الصحيح ‪ ،abcd‬نستطيع تسميته أي اسم نريد‪.‬‬ ‫✓ أعطينا المتغير قيمة ‪ ،5‬نستطيع تعريفه من غير أن نعطيه قيمة‪.‬‬ ‫نستطيع استخدام المتغير كالتالي‪:‬‬

‫‪ 9‬قيمة المتغير اآلن‬

‫;‪int x = 10‬‬ ‫;‪x = x – 1‬‬

‫‪ 18‬قيمة المتغير اآلن‬

‫;‪x = 2 * x‬‬

‫يفضل تعريف المتغيرات خارج الدوال في بداية البرنامج‪.‬‬

‫أساسيات األردوينو‬

‫‪73‬‬

‫أساسيات األردوينو‬

‫‪74‬‬

‫أهم التعريفات‪:‬‬

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

‫‪int‬‬

‫مثل ‪. 4 ،3 ،2 ،1‬‬ ‫أكبر عدد له هو ‪ 32،768‬وال يستطيع تخزين عدد أكبر‬ ‫منه‪.‬‬ ‫متغير يقبل األعداد الكسرية‪ ،‬يستطيع تخزين أرقام‬

‫‪float‬‬

‫كبيرة جدا‪.‬‬ ‫أكثر دقة من ‪ ،float‬يستطيع تخزين أرقام أقل من‬

‫‪double‬‬

‫‪.float‬‬ ‫متغير يقبل الحروف (قد يكون رقم أيضا‪ ،‬لكن لن‬

‫‪char‬‬

‫يعامل معاملة األرقام) يجب أن يكون بين هذه‬ ‫العالمتين ‘ ‘‬ ‫مثل‪:‬‬ ‫‘‪’a‬‬ ‫‘‪’b‬‬ ‫‘‪’1‬‬ ‫‘‪’4‬‬

‫‪string‬‬

‫نعرف متغير يخزن مجموعة من الحروف‪.‬‬

‫∞∞∞‬

‫أساسيات األردوينو‬

‫)(‪millis‬‬ ‫لو أردنا تشغيل إضاءة لمدة ‪ 20‬ثانية واطفاءها عن طريق منفذ ديجيتال بدون ايقاف البرنامج طول هذه المدة‬ ‫يمكننا استخدام ‪ millis‬كالتالي‪:‬‬

‫;()‪float timer = millis‬‬ ‫طريقة استخدامها‪:‬‬ ‫•‬

‫نقرأ قيمة ‪ millis‬عند تشغيل اإلضاءة ونحفظ قيمتها في متغير‪.‬‬

‫•‬

‫نتفقد قيمة ()‪ millis‬الحالية باستمرار ونقارنها بالمتغير فإذا أصبحت أكبر من قيمة المتغير ب‪ 20‬ثانية‬ ‫نطفيء الجهاز‪.‬‬

‫•‬

‫وبهذا استطعنا توقيت اإلضاءة بدون استخدام أمر ال ‪ delay‬الذي يمنعنا من تنفيذ أوامر أخرى أثناء‬ ‫عمله‪.‬‬

‫;)(‪float timer = millis‬‬ ‫;)‪digitalWrite(3, HIGH‬‬ ‫) )‪if (millis() > (20000 + timer‬‬ ‫{‬ ‫;)‪digitalWrite(3, LOW‬‬ ‫;‪timer = 0‬‬ ‫}‬

‫‪75‬‬

‫أساسيات األردوينو‬

76

delay ‫ بدون‬LED ‫التحكم بلمبة‬ :‫القطع المطلوبة‬ ‫✓ أردوينو أونو‬ ‫✓ كيبل للبرمجة‬ ‫✓ لمبة ليد‬ ‫✓ مقاومة‬ :‫الكود‬

float timePassed; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { if (timePassed > millis() + 1000) { digitalWrite(13, !digitalRead(13)); timePassed = millis(); } }

‫أساسيات األردوينو‬

‫‪77‬‬

‫ماذا يفعل البرنامج؟‬ ‫‪ .1‬يعرف متغير ‪ float‬اسمه ‪.timePassed‬‬ ‫‪ .2‬يبدأ السيريال ويحدد سرعته ب‪.9600‬‬ ‫‪ .3‬دالة ‪ if‬الشرطية‪ ،‬إذا كان المتغير ‪ timePassed‬أكبر من (‪ millis‬الحالي ‪ )1000 +‬سينفذ ما بين األقواس‬ ‫وإال سيتجاوز الدالة الشرطية‪.‬‬ ‫‪ .4‬إذا تحقق الشرط في الدالة سيشغل ال‪ LED‬إذا كان ال يعمل‪ ،‬وسيطفئه إذا كان يعمل‪.‬‬ ‫‪ .5‬سيحفظ قيمة ‪ )(millis‬اآلن في المتغير ‪ timePassed‬ليحفظ الوقت الذي تم فيه تغيير حالة ال‪.LED‬‬ ‫شرح الكود‬ ‫انشاء متغير ‪ float‬يقبل الكسور واألرقام اسميناه‬

‫;‪float timePassed‬‬

‫‪timePassed‬‬ ‫هذه الدالة تخبرنا كم مر على تشغيل األردوينو بالمللي‬

‫;)(‪millis‬‬

‫ثانية‬ ‫إذا كان الوقت الحالي أكبر من ‪ timePassed‬ب‪ 1000‬مللي‬

‫)‪if (timePassed > millis() + 1000‬‬

‫ثانية (‪ 1‬ثانية) نفذ ما بين األقواس‬ ‫إذا كان المنفذ ‪ led‬يعمل سيقوم بإطفائه‪ ،‬إذا كان ال يعمل‬

‫;))‪digitalWrite(led,!digitalRead(led‬‬

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

‫)(‪timePassed = millis‬‬

‫أساسيات األردوينو‬

‫تمارين‬ ‫‪ .1‬عرف متغير يقبل األعداد الصحيحة اسمه ‪ .number‬ثم اجعل قيمته تساوي ‪. 10‬‬ ‫‪ .2‬عرف متغير ‪ float‬وسميه ‪ number2‬وأعطيه القيمة ‪. 5.5‬‬ ‫‪ .3‬لماذا يفضل تعريف المتغير خارج الدوال؟‬ ‫‪ .4‬ما الفرق بين ‪ int‬و ‪float‬؟‬ ‫‪ .5‬باستخدام حلقة ‪ ،for‬اكتب برنامجا يطبع األرقام الزوجية من ‪ 0‬إلى ‪.1000‬‬ ‫‪ .6‬مالحظة‪.‬‬ ‫‪.a‬‬

‫‪ i++‬تضيف رقم ‪ 1‬إلى ‪.i‬‬

‫‪ i+2 .b‬تضيف رقم ‪ 2‬إلى قيمة ‪.i‬‬ ‫‪ .7‬اكتب مثاال على حلقة ‪.while‬‬ ‫‪ .8‬اكتب مثاال على دالة ‪.if else‬‬

‫‪78‬‬

‫أساسيات األردوينو‬

‫المحركات‬

‫‪79‬‬

‫أساسيات األردوينو‬

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

‫ماذا يعمل المشروع‪:‬‬ ‫التحكم بسيرفو موتور عن طريق مقاومة متغيرة‪.‬‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو‪.‬‬ ‫✓ كيبل للبرمجة‪.‬‬ ‫✓ سيرفو موتور‪.‬‬ ‫✓ لوحة تجارب ‪.Breadboard‬‬ ‫✓ أسالك للتوصيل‪.‬‬ ‫✓ مقاومة متغيرة‪.‬‬

‫‪80‬‬

‫أساسيات األردوينو‬ ‫التوصيل (دياجرام)‪:‬‬

‫‪81‬‬

‫أساسيات األردوينو‬

82

:‫الكود‬

#include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); } void loop() { int reading = analogRead(0); pos = map(reading, 0, 1023, 0, 160); myservo.write(pos); delay(150); }

‫أساسيات األردوينو‬

‫‪83‬‬

‫شرح الكود‬

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

‫>‪#include <Servo.h‬‬

‫باستخدام اوامر بسيطة فقط‬

‫;‪Servo myservo‬‬

‫تعريف سيرفو جديد اسمه‪myservo‬‬

‫;)‪myservo.attach(9‬‬

‫تحديد المنفذ رقم ‪ 9‬للسيرفو الجديد‬

‫;)‪int reading = analogRead(0‬‬

‫قراءة اإلشارة على المقاومة المتغيرة‬ ‫تحويل قيمة ‪ reading‬من (‪ 0‬حتى ‪ )1023‬لتصبح من (‪0‬‬

‫;)‪pos=map(reading,0,1023,0,160‬‬

‫حتى ‪ )160‬وتخزين القيمة الجديدة في المتغير ‪pos‬‬ ‫إذا كانت قيمة القراءة ‪ 1023‬سيحولها إلى‪160‬‬ ‫إذا كانت قيمة القراءة ‪ 512‬سيحولها إلى ‪80‬‬ ‫وهكذا‬

‫;)‪myservo.write(pos‬‬

‫تحريك السيرفو إلى الزاوية ‪pos‬‬

‫∞∞∞‬

‫أساسيات األردوينو‬

‫‪DC Motor‬‬ ‫ما هو ال‪ DC Motor‬؟‬ ‫محرك يعمل على الكهرباء الثابتة دي سي‪.‬‬ ‫عند عكس أسالك الكهرباء سيتحرك في الجهة المعاكسة‪.‬‬ ‫طريقة عمل المشروع‪:‬‬ ‫•‬

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

‫•‬

‫أعلى تيار تستطيع منافذ األردوينو وغيرها من المتحكمات توفيره هو ‪ 40‬ملي أمبير فقط(‪ 0.04‬أمبير)‪.‬‬

‫•‬

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

‫•‬

‫سيتم التحكم بالدرايفر عن طريق األردوينو بحيث نرسل فقط إشارات إلى الدرايفر‪ ،‬وسيتم توفير‬ ‫وتشغيل الموتور عن طريقه‪.‬‬

‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫✓ موتور ‪ 5‬فولت دي سي‪.‬‬ ‫✓ درايفر ‪.L293D‬‬ ‫✓ لوحة تجارب ‪.Breadboard‬‬ ‫✓ أسالك ذكر‪-‬ذكر‪.‬‬

‫‪84‬‬

‫أساسيات األردوينو‬ ‫قطعة الدرايفر‪L293D‬‬ ‫كل قطعة إلكترونية توفر الشركة المصنعة لها ملف يحتوي كافة معلوماتها ويسمى الملف ‪.Datasheet‬‬ ‫لهذا الدرايفر ‪ 16‬منفذ‪ ،‬نستطيع من خالل ال‪ Datasheet‬معرفه كل منفذ وطريقة توصيله‪.‬‬ ‫المنافذ مرقمة من ‪ 1‬إلى ‪.16‬‬ ‫المنفذ يسار نصف الدائرة الرمادية هو رقم ‪ ،1‬ويمين نصف الدائرة الرمادي هو منفذ رقم ‪.16‬‬ ‫فائدة وخواص هذا الدرايفر‪:‬‬ ‫•‬

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

‫•‬

‫يمكن تشغيل المحركين من مصدر طاقة خارجي‪.‬‬

‫•‬

‫يستقبل إشارة فقط ويتحكم بالمحركات‪.‬‬

‫•‬

‫يستطيع التحكم بالمحركات (‪ )DC motor‬لتتحرك مع عقارب الساعة أو عكسها‪.‬‬

‫‪85‬‬

‫أساسيات األردوينو‬ ‫طريقة التوصيل‪:‬‬

‫رقم المنفذ في‪L293D‬‬

‫التوصيل‬

‫‪1‬‬

‫نوصله ب‪ 5‬فولت (يفعل التحكم بالموتور األول)‬

‫‪2‬‬

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

‫‪7‬‬

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

‫‪5،4‬‬

‫‪GND‬أرضي‪ ،‬يمكن توصيل أحدهم فقط‬

‫‪8‬‬

‫‪5‬فولت‪ ،‬فائدة المنفذ توفير الطاقة للمحرك‪ ،‬يمكن‬ ‫استخدام ‪ 5‬فولت من األردوينو‪ ،‬أو مصدر طاقة‬ ‫خارجي مناسب للمحرك المستخدم (يمكن استخدام‬ ‫فولت من ‪ 4.5‬إلى ‪ 36‬فولت)‬

‫‪3‬‬

‫نوصله بطرف المحرك األول‬

‫‪6‬‬

‫نوصله بطرف المحرك األول‬

‫‪16‬‬

‫نوصله ب‪ 5‬فولت‬

‫‪86‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪87‬‬

‫أساسيات األردوينو‬

88

:‫الكود‬

void setup() { pinMode(11, OUTPUT); pinMode(8, OUTPUT); } void loop() { digitalWrite(11, HIGH); digitalWrite(8, LOW); delay(3000); digitalWrite(11, LOW); digitalWrite(8, HIGH); delay(3000); }

:‫شرح الكود‬

pinMode(11, OUTPUT); pinMode(8,OUTPUT);

‫ كمخرج‬8 ‫ و‬11 ‫تحديد المنفذ رقم‬

digitalWrite(11, HIGH); digitalWrite(8, LOW);

‫سيتحرك المحرك‬

digitalWrite(11, LOW); digitalWrite(8, HIGH);

‫سيتحرك المحرك بعكس اإلتجاه‬

delay(3000);

‫يوقف البرنامج لمدة ثالثة ثواني‬

∞∞∞

‫أساسيات األردوينو‬

‫‪Stepper Motor‬‬ ‫ما هو ال‪ Stepper Motor‬؟‬ ‫•‬

‫محرك يتحرك بدقة كبيرة جدا‪.‬‬

‫•‬

‫يتحرك على خطوات‪.‬‬

‫•‬

‫عزمه عالي عندما يتحرك ببطئ‪.‬‬

‫•‬

‫كلما زادت سرعته قل عزمه‪.‬‬

‫•‬

‫يستخدم في أيادي الروبوت‪ ،‬وفي أجهزة ال‪ CNC‬و ‪ D3‬وغيرها‪.‬‬

‫طريقة عمله‪:‬‬ ‫•‬

‫للستيبر موتور عدة أقطاب عادة إما ‪ 4‬أو ‪.8‬‬

‫•‬

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

‫•‬

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

‫•‬

‫سنستخدم المكتبة ‪ stepper.h‬للتحكم بالموتور عن طريق األردوينو‪.‬‬

‫‪89‬‬

‫أساسيات األردوينو‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‬ ‫✓ ستيبر موتور‬ ‫✓ ستيبر موتور درايفر‬

‫التوصيل‪:‬‬

‫‪90‬‬

‫أساسيات األردوينو‬

91

:‫الكود‬

#include <Stepper.h> const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution // for your motor // initialize the stepper library on pins 8 through 11: Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); void setup() { // set the speed at 60 rpm: myStepper.setSpeed(60); // initialize the serial port: Serial.begin(9600); } void loop() { // step one revolution in one direction: Serial.println("clockwise"); myStepper.step(stepsPerRevolution); delay(500); // step one revolution in the other direction: Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); delay(500); }

‫أساسيات األردوينو‬

‫‪92‬‬

‫شرح الكود‪:‬‬

‫>‪#include <Stepper.h‬‬

‫نضيف مكتبة لمحرك الستيبر لتسهيل برمجته‬

‫‪Stepper myStepper(stepsPerRevolution,‬‬ ‫;)‪(8, 9, 10, 11‬‬

‫انشاء محرك جديد للمكتبة اسمه ‪myStepper‬‬ ‫حددنا له عدد الخطوات التي يحتاجها ليكمل دورة‬ ‫كاملة والمنافذ التي ستكون موصلة بالدرايفر (‪،9 ،8‬‬ ‫‪)11 ،10‬‬

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

‫;)‪myStepper.setSpeed(60‬‬

‫في الدقيقة‪.‬‬

‫;)‪myStepper.step(stepsPerRevolution‬‬

‫أمر للمحرك ليتحرك خطوات تساوي العدد بين‬ ‫األقواس‬

‫∞∞∞‬

‫أساسيات األردوينو‬

‫تمارين‬ ‫‪ .1‬ما الفرق بين محرك السيرفو‪ ،‬محرك الدي سي ومحرك الستيبر؟‬ ‫‪ .2‬لماذا نستخدم مكتبة للتحكم بمحرك السيرفو والستيبر؟‬ ‫‪ .3‬كيف نجعل محرك الدي سي يمشي بعكس اإلتجاه؟‬ ‫‪ .4‬لماذا نستخدم درايفر مع المحركات؟‬

‫‪93‬‬

‫أساسيات األردوينو‬

‫بروتوكوالت االتصاالت بين األجهزة‬

‫‪94‬‬

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

‫منافذ الــ‪Serial‬‬ ‫من خاللها يستطيع األردوينو التحدث مع األجهزة األخرى مثل الكمبيوتر‪ ،‬قطعة البلوتوث‪ ،‬وغيرها من األجهزة‬ ‫التي تدعم السيريال‪ ،‬وتسمى هذه المنافذ أيضا ب ‪ .UART‬األجهزة التي تدعم السيريال تحتوي على منفذ‬ ‫مرسل (‪ )TX‬ومنفذ مستقبل (‪ )RX‬نالحظهم في المنفذ الديجيتال رقم ‪ 0‬و ‪ 1‬في األردوينو أونو‪.‬‬ ‫يكون التوصيل عادة كالتالي‪:‬‬

‫‪RX → TX‬‬ ‫‪TX → RX‬‬ ‫‪VCC → VCC‬‬ ‫‪GND → GND‬‬ ‫(‪ VCC‬ترمز إلى الفولت المستخدم "‪ 5‬فولت في حالة األونو”)‬ ‫األردوينو أونو يدعم بروتوكول سيريال واحد‪.‬‬ ‫األردوينو ميجا لديه ‪ 3( 3‬منافذ ‪ TX‬و ‪ 3‬منافذ ‪.)RX‬‬ ‫تستخدم في‪:‬‬ ‫✓ إرسال واستقبال معلومات من أردوينو آخر‪.‬‬ ‫✓ إرسال واستقبال معلومات عن طريق قطعة البلوتوث‪.‬‬ ‫✓ إرسال واستقبال معلومات عن طريق الكمبيوتر‪.‬‬ ‫✓ استقبال وارسال معلومات من الحساسات مثل ‪. GSM،GPS‬‬

‫‪95‬‬

‫أساسيات األردوينو‬ ‫✓ رفع برنامج على األردوينو من خاللها‪.‬‬

‫∞∞∞‬ ‫‪SoftwareSerial‬‬ ‫عند عدم وجود منفذ سيريال متاح يمكن استخدام ‪.Software Serial‬‬ ‫أألردوينو أونو يدعم سيريال واحد فقط‪ ،‬فال يمكن االتصال بجهازين عن طريق السيريال في نفس الوقت‪.‬‬ ‫لكن يمكن استخدام أي منفذين ديجيتال وتحديدهم كمنافذ سيريال‪.‬‬ ‫تطبيق عملي‪:‬‬ ‫التحكم بجهاز عن طريق البلوتوث (الجوال)‪.‬‬ ‫ماذا يعمل المشروع‪:‬‬ ‫سوف نقوم بالتحكم بلمبة ‪ LED‬عن طريق الجوال‪.‬‬ ‫الخطوات‪:‬‬ ‫‪ .1‬نرفع البرنامج على لوحة األردوينو‬ ‫‪ .2‬نحمل برنامج مناسب للتحكم باألردوينو عن طريق البلوتوث عن طريق ال‪Google app store‬‬ ‫‪ .3‬نوصل الدائرة كما هو موضح‬

‫‪96‬‬

‫أساسيات األردوينو‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو‪.‬‬ ‫✓ كيبل للبرمجة‪.‬‬ ‫✓ قطعة بلوتوث ‪ HC-05‬أو ‪.HC-06‬‬ ‫✓ لوحة تجارب ‪.Breadboard‬‬ ‫✓ لمبة ‪.LED‬‬ ‫✓ مقاومة ‪ 220‬أوم تقريب‪.‬‬

‫‪97‬‬

‫أساسيات األردوينو‬ ‫التوصيل (دياجرام)‪:‬‬

‫‪98‬‬

‫أساسيات األردوينو‬

99

:‫الكود‬

char reading; SoftwareSerial SoftSerial1(6, 7); void setup() { Serial.begin(9600); SoftSerial1.begin(9600); pinMode(10, OUTPUT); } void loop() { if (SoftSerial.available() > 0) { if (SoftSerial.read() ) == 'a') digitalWrite(10, HIGH); } else if (SoftSerial.read() ) == 'b') { digitalWrite(10, LOW); } }

‫أساسيات األردوينو‬

‫‪100‬‬

‫شرح الكود‪:‬‬

‫;‪char reading‬‬

‫يعرف متغير يقبل الحروف ويسميه ‪reading‬‬ ‫ينشيء سيريال اضافي على المنفذ رقم ‪ 6‬للمستقبل ‪RX‬‬ ‫ورقم ‪ 7‬للمرسل ‪.TX‬‬

‫‪SoftwareSerial SoftSerial1(6,‬‬ ‫;)‪7‬‬

‫أنشأنا سيريال إضافي ألن السيريال العادي مستخدم من قبل‬ ‫الكمبيوتر‪.‬‬

‫;)‪Serial.begin(9600‬‬

‫يحدد سرعة التخاطب عن طريق السيريال‪.‬‬ ‫يحدد سرعة ارسال واستقبال البيانات عن طريق السيريال‬

‫;)‪SoftSerial1.begin(9600‬‬

‫اإلضافي‪.‬‬

‫;)‪pinMode(10, OUTPUT‬‬

‫يحدد المنفذ ‪ 10‬كمخرج‬ ‫وجدت بيانات في السيريال نفذ ما بين األقواس‬

‫)‪if(SoftSerial.available()>0‬‬ ‫{‬ ‫}‬

‫القراءة من السيريال اإلضافي‬

‫;)(‪SoftSerial1.read‬‬

‫القراءة من السيريال اإلضافي‬

‫)'‪if (SoftSerial.read()) == 'a‬‬

‫إذا استقبل حرف ‪ a‬نفذ ما بين األقواس‬

‫)'‪else if (SoftSerial.read()) == 'b‬‬

‫وإال إذا استقبل حرف ‪ b‬نفذ ما بين األقواس‬

‫∞∞∞‬

‫أساسيات األردوينو‬

‫‪I2C‬‬ ‫يمكن ارسال واستقبال المعلومات من أكثر من ‪ 60‬حساس في نفس الوقت عن طريق سلكين فقط‪.‬‬ ‫لكل حساس أو جهاز متصل عنوان خاص به (‪.)Address‬‬ ‫سرعة نقل البيانات متوسطة‪.‬‬ ‫في األردوينو هناك مكتبة تستخدم لتسهيل التواصل عن طريق هذا البروتوكول اسمها ‪.wire library‬‬

‫∞∞∞‬ ‫‪SPI‬‬ ‫يمكن ارسال واستقبال المعلومات من أجهزة كثيرة لكن تحتاج إلى أسالك متعددة أكثر من ال‪.I2C‬‬ ‫سرعة نقل البيانات عالية وهي أسرع من ال‪ I2C‬بكثير‪.‬‬

‫‪101‬‬

‫أساسيات األردوينو‬

‫درايفر سيركت‬

‫‪102‬‬

‫أساسيات األردوينو‬ ‫أقصى تيار تستطيع منافذ األردوينو اخراجه هو (‪.)mA40‬‬ ‫فلكي نتحكم بأي دائرة تحتاج تيار أكبر أو فولت أعلى سنحتاج إلى ‪.Driver circuit‬‬ ‫نستطيع استخدام التالي‪:‬‬ ‫•‬

‫ريالي‪.‬‬

‫•‬

‫موسفت )‪.FET Transistor (Mosfet‬‬

‫•‬

‫ترانسيستور ‪.BJT Transistor‬‬

‫‪103‬‬

‫أساسيات األردوينو‬

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

‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو‪.‬‬ ‫✓ كيبل للبرمجة‪.‬‬ ‫✓ لوحة تجارب (بريد بورد)‪.‬‬ ‫✓ لوجيك موسفت‪.‬‬ ‫✓ مقاومة ‪ 100‬أوم إلى ‪ 1000‬أوم ال يهم‪.‬‬ ‫✓ لمبة ‪.LED‬‬

‫‪104‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪105‬‬

‫أساسيات األردوينو‬

106

:‫الكود‬

void setup() { pinMode(9, OUTPUT); } void loop() { digitalWrite(9, HIGH); delay(500); digitalWrite(9, LOW); delay(200); }

∞∞∞

‫أساسيات األردوينو‬

‫التحكم بدائرة عن طريق ترانسيستور وأردوينو‬ ‫عندما تكون هناك إشارة لل ‪ ,Base‬سيتوصل ال ‪ Collector‬وال‪ ,Emitter‬عندها سيمر التيار‪.‬‬ ‫عندما ال توجد إشارة على ال ‪ ,Base‬سيكون ال ‪ Collector‬وال ‪ Emitter‬غير متصلين‪.‬‬

‫القطع المطلوبة‪:‬‬ ‫✓ مقاومة ‪ 200‬أوم تقريبا‪.‬‬ ‫✓ لمبة ‪.LED‬‬ ‫✓ لوحة تجارب ‪.BreadBoard‬‬ ‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫✓ أسالك ذكر‪-‬ذكر للتوصيل‪.‬‬ ‫✓ ‪ NPN Transistor‬مثل‪:‬‬ ‫‪o‬‬

‫‪n22222‬‬

‫‪o‬‬

‫‪BC547‬‬

‫‪o‬‬

‫‪BC548‬‬

‫‪107‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪108‬‬

‫أساسيات األردوينو‬

‫‪109‬‬

‫الكود‪:‬‬

‫)(‪void setup‬‬ ‫{‬ ‫;)‪pinMode(9, OUTPUT‬‬ ‫}‬ ‫)(‪void loop‬‬ ‫{‬ ‫;)‪digitalWrite(9, HIGH‬‬ ‫;)‪delay(500‬‬ ‫;)‪digitalWrite(9, LOW‬‬ ‫;)‪delay(200‬‬ ‫}‬

‫∞∞∞‬ ‫الريلاي‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو‪.‬‬ ‫✓ كيبل للبرمجة‪.‬‬ ‫✓ موتور دي سي‪.‬‬ ‫✓ ‪ 4-3‬بطاريات ‪.AA‬‬ ‫✓ ريالي ‪ 5‬فولت‪.‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪110‬‬

‫أساسيات األردوينو‬

111

:‫الكود‬

int relay = 9; void setup() { pinMode(relay, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(relay, HIGH); Serial.println("Relay On"); delay(1000); digitalWrite(relay, LOW); Serial.println("Relay OFF"); delay(1000); }

‫أساسيات األردوينو‬

‫‪112‬‬

‫شرح الكود‪:‬‬

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

‫;‪int relay = 9‬‬

‫ونعطيه القيمته ‪.9‬‬ ‫تحديد المنفذ رقم ‪ 9‬كمخرج لنتمكن من تشغيله‬

‫;)‪pinMode(relay, OUTPUT‬‬

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

‫;)‪Serial.begin(9600‬‬

‫معلومات من األردوينو إلى الكمبيوتر( هذه الخطوة‬ ‫تكون داخل ال)‪setup‬‬ ‫تشغيل المنفذ رقم ‪ 9‬ليعطينا ‪ 5‬فولت ليعمل الريالي‬

‫;)‪digitalWrite(relay,HIGH‬‬

‫ايقاف المنفذ رقم ‪ 9‬لنوقف الريالي‬

‫;)‪digitalWrite(relay,LOW‬‬

‫ارسال ما بداخل القوسين عن طريق السيريال لنقرأه‬ ‫من الكمبيوتر (لنرسل جملة أو كلمة يجب وضعها‬ ‫داخل هذه العالمتين “‬

‫“)‬

‫;)(‪Serial.println‬‬

‫أساسيات األردوينو‬

‫تمار ين‪:‬‬ ‫‪ .1‬ما الفرق بين الترانسيستور والموسفت؟‬ ‫‪ .2‬لماذا نستخدم دائرة درايفر؟‬ ‫‪ .3‬ماهي مميزات وعيوب كل من‪:‬‬ ‫‪ .a‬الترانسيستور‪.‬‬ ‫‪ .b‬الموسفت‪.‬‬ ‫‪ .c‬الريالي‪.‬‬

‫‪113‬‬

‫أساسيات األردوينو‬

‫تطبيقات عملية على أشهر الحساسات‬

‫‪114‬‬

‫أساسيات األردوينو‬

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

‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو‪.‬‬ ‫✓ كيبل للبرمجة‪.‬‬ ‫✓ لوحة تجارب (بريد بورد)‪.‬‬ ‫✓ حساس ‪LM35‬‬

‫‪115‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪116‬‬

‫أساسيات األردوينو‬

‫‪117‬‬

‫الكود‪:‬‬

‫)(‪void setup‬‬ ‫{‬ ‫;)‪Serial.begin(9600‬‬ ‫}‬ ‫)(‪void loop‬‬ ‫{‬ ‫;)‪float reading = analogRead(A0‬‬ ‫;‪float voltage = (reading / 1024) * 5‬‬ ‫;)‪float temp = (voltage / 0.01‬‬ ‫;)" ‪Serial.print(" The temperature is :‬‬ ‫;)‪Serial.println(temp‬‬ ‫}‬

‫طريقة عمل المشروع‪:‬‬ ‫‪ .1‬نقرأ اإلشارة من الحساس عن طريق منفذ أنالوج (سنحصل على رقم بين ‪ 0‬إلى ‪.)1023‬‬ ‫‪ .2‬نحول القراءة إلى فولت (نقسمها على ‪ 1023‬ونضربها في ‪.)5‬‬ ‫‪ .3‬لكل ‪ 0.010‬فولت درجة مئوية واحدة‪ ،‬لنحصل على درجة الحرارة نقسم الفولت على ‪0.010‬‬

‫أساسيات األردوينو‬

‫‪118‬‬

‫شرح الكود‪:‬‬

‫تحديد سرعة التخاطب عن طريق السيريال وبدأها‬ ‫إنشاء متغير يقبل األعداد الكسرية ونسميه ‪reading‬‬

‫;)‪Serial.begin(9600‬‬ ‫;)‪float reading = analogRead(A0‬‬

‫نحفظ فيه قيمة القراءة من المنفذ‪A0.‬‬

‫;‪float voltage = (reading/1024)*5‬‬

‫إنشاء متغير ‪ float‬يقبل أعداد كسرية ونسميه‬ ‫‪voltage‬‬ ‫قيمته تساوي القراءة بالفولت‪ .‬نحول القراءة إلى‬ ‫فولت عن طريق العملية الحسابية التالية‪:‬‬ ‫(القراءة ÷ ‪5 × )1024‬‬

‫;)‪float temp = (voltage / 0.01‬‬

‫كل ‪ 0.01‬فولت تساوي درجة حرارة واحدة‪(.‬من‬ ‫ال‪ datasheet‬الخاص بالحساس)‬ ‫نقسم الفولت على ‪ 0.01‬لنحصل على درجة الحرارة‬ ‫الحالية‪.‬‬

‫;)" ‪Serial.print(" The temperature is :‬‬

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

‫;)‪Serial.println(temp‬‬

‫ارسال درجة الحرارة عن طريق السيريال‪.‬‬

‫∞∞∞‬

‫أساسيات األردوينو‬

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

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

‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫✓ حساس مطر أو حساس ماء‪.‬‬ ‫✓ مقاومة متغيرة‪.‬‬ ‫✓ لوحة تجارب ‪.Breadboard‬‬ ‫✓ أسالك ذكر‪-‬ذكر‪.‬‬ ‫✓ قليل من الماء‪.‬‬

‫‪119‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪120‬‬

‫أساسيات األردوينو‬

121

:‫الكود‬

float readSensor; float voltage; void setup() { Serial.begin(9600); } void loop() { readSensor = analogRead(0); Serial.print(" Rain Sensor Reading is: "); Serial.println(readSensor); Serial.println(); delay(300); }

:‫شرح الكود‬

float reading;

‫ يقبل األعداد الكسرية والصحيحة‬float ‫تعريف متغير‬ readSensor.‫ونسميه‬

Serial.begin(9600);

‫بدأ اإلرسال واإلستقبال عن طريق السيريال بسرعة‬ .‫ بت في الثانية‬9600

readSensor = analogRead(0);

‫ وحفظ القراءة في‬0 ‫القراءة من منفذ األنالوج رقم‬ readSensor.‫المتغير‬

Serial.println(readSensor);

‫ عن طريق السيريال نستطيع‬readSensor ‫ارسال قيمة‬ .‫قراءتها عن طريق الكمبيوتر أو غيره‬

‫أساسيات األردوينو‬

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

‫القطع المطلوبة‪:‬‬ ‫‪ .1‬أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫‪ .2‬حساس التربة‪.‬‬ ‫‪ .3‬مقاومة متغيرة أو قطعة الحساس المساعدة‪.‬‬ ‫‪ .4‬لوحة تجارب ‪.Breadboard‬‬ ‫‪ .5‬أسالك ذكر‪-‬ذكر‪.‬‬ ‫‪ .6‬أرض زراعية أو مركن زراعي‪.‬‬

‫‪122‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪123‬‬

‫أساسيات األردوينو‬

124

:‫الكود‬

float reading; void setup() { Serial.begin(9600); } void loop() { readSensor(0); delay(300); } void readSensor(int pin) { reading = analogRead(pin); Serial.print(" Soil Sensor Reading is: "); Serial.println(reading); }

‫أساسيات األردوينو‬

‫‪125‬‬

‫شرح الكود‪:‬‬

‫نعرف متغير ‪ float‬يقبل األعداد الكسرية ونسميه‪reading.‬‬ ‫بدأ اإلرسال واإلستقبال عن طريق السيريال بسرعة ‪ 9600‬بت في الثانية‪.‬‬ ‫هذا األمر سيقوم بنداء الدالة ‪ function‬التالية‪:‬‬

‫;)‪void readSensor(int pin‬‬ ‫سيعطي قيمة ‪ pin‬الرقم ‪0‬‬ ‫ثم سينفذ البرنامج داخلها‪.‬‬

‫∞∞∞‬

‫;‪float reading‬‬ ‫;)‪Serial.begin(9600‬‬ ‫;)‪readSensor(0‬‬

‫أساسيات األردوينو‬

‫قراءة مقاومة ضوئية‬ ‫ماهي المقاومة الضوئية؟‬ ‫هي مقاومة قيمتها عالية جدا عند عدم وجود ضوء‪ ،‬وفي حال وجود ضوء عليها تنخفض مقاومتها إلى بضع‬ ‫مئات فقط (حسب شدة الضوء)‪.‬‬

‫القطع المطلوبة‪:‬‬ ‫‪ .1‬أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫‪ .2‬مقاومة ضوئية‪.‬‬ ‫‪ .3‬مقاومة ‪ 10،000‬أوم‪.‬‬ ‫‪ .4‬لوحة تجارب ‪.Breadboard‬‬ ‫‪ .5‬أسالك ذكر‪-‬ذكر‪.‬‬

‫‪126‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪127‬‬

‫أساسيات األردوينو‬

128

:‫الكود‬

void setup() { Serial.begin(9600); } void loop() { float reading; reading = analogRead(A0); Serial.println("Reading is : "); Serial.println(reading); if (reading > 700) { Serial.println("Light is High"); } else if (reading < 700 && reading > 300) { Serial.println("Light is Medium"); } else Serial.println("Light is Low"); }

‫أساسيات األردوينو‬

‫‪129‬‬

‫شرح الكود‪:‬‬

‫إذا كانت قيمة ‪ reading‬أكبر من ‪ 700‬نفذ ما بين‬ ‫األقواس‪.‬‬ ‫وإال إذا كانت ‪ reading‬أصغر من ‪ 700‬و أكبر من ‪300‬‬ ‫نفذ ما بين األقواس‪.‬‬ ‫وإال إذا لم تتحقق جميع الشروط السابقة نفذ األمر‬ ‫التالي أو ما بين األقواس‪.‬‬

‫∞∞∞‬

‫)‪if (reading > 700‬‬ ‫} {‬

‫> ‪else if (reading < 700 && reading‬‬ ‫)‪300‬‬ ‫{‬ ‫}‬ ‫‪else‬‬

‫أساسيات األردوينو‬

‫شاشة ‪LCD‬‬ ‫ماذا يعمل المشروع‪:‬‬ ‫يظهر قيمة أو جملة على شاشة ‪.LCD‬‬

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

‫‪130‬‬

‫أساسيات األردوينو‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬ ‫✓ شاشة ‪.1602‬‬ ‫✓ مقاومة متغيرة ‪.Potentiometer – 10k‬‬ ‫✓ مقاومة ‪ 220‬أوم‪.‬‬ ‫✓ لوحة تجارب ‪.Breadboard‬‬ ‫✓ أسالك ذكر‪-‬ذكر‪.‬‬

‫‪131‬‬

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

‫‪http://playground.arduino.cc/uploads/Main/LiquidCrystal_1.zip‬‬ ‫ثم نضيفها إلى برنامج األردوينو كالتالي‪:‬‬

‫‪Sketch → Include library → Add .zip library‬‬ ‫ونختار الملف الذي حملناه‬ ‫بعدها يجب أن نضيف المكتبة في بداية البرنامج الذي نريد استخدامها فيه عن طريق كتابة التالي‪:‬‬ ‫<اسم المكتبة>‪#include‬‬

‫>‪#include
‫‪132‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪133‬‬

‫أساسيات األردوينو‬

‫‪134‬‬

‫أساسيات األردوينو‬ ‫طريقة التوصيل‪:‬‬

‫منفذ الشاشة‬ ‫‪1‬‬

‫‪GND‬‬

‫‪2‬‬

‫مقاومة ‪ 220‬أوم موصلة بال‪ 5‬فولت‬

‫‪3‬‬

‫منفذ ‪ 2‬من األردوينو‬

‫‪4‬‬

‫منفذ ‪ 3‬من األردوينو‬

‫‪5‬‬

‫منفذ ‪ 4‬من األردوينو‬

‫‪6‬‬

‫منفذ ‪ 5‬من األردوينو‬

‫‪10 ,9 , 8 ,7‬‬

‫فارغ‬

‫‪11‬‬

‫منفذ ‪ 11‬من األردوينو‬

‫‪12‬‬

‫‪GND‬‬

‫‪13‬‬

‫منفذ ‪ 12‬من األردوينو‬

‫‪14‬‬

‫سلك من رجل المقاومة المتغيرة الوسطى‬

‫‪15‬‬

‫‪5volt‬‬

‫‪16‬‬

‫‪GND‬‬

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

‫‪135‬‬

‫أساسيات األردوينو‬

136

:‫الكود‬

#include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print("hello, world!"); } void loop() { }

‫أساسيات األردوينو‬

‫‪137‬‬

‫شرح الكود‪:‬‬

‫>‪#include
‫نضيف المكتبة‬ ‫سنقوم بتعريف شاشة اسمها ‪ lcd‬ونحدد المنافذ‬

‫;)‪LiquidCrystal lcd(12, 11, 5, 4, 3, 2‬‬

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

‫;)‪lcd.begin(16, 2‬‬

‫شاشتنا ‪x2 16‬فسنكتب ‪2 ,16‬‬

‫)"!‪lcd.print("hello, world‬‬

‫طباعة هذه الجملة على الشاشة‪.‬‬ ‫يجب أن تكون بين هذه العالمتين "‬

‫“‬

‫ان اردنا اظهار قيمة متغير‪ ،‬ال نستخدم هذه العالمة‬

‫∞∞∞‬

‫أساسيات األردوينو‬

‫جهاز انذار باستخدام الليزر‬ ‫ماذا يعمل المشروع‪:‬‬ ‫•‬

‫الليزر هو ضوء موجه‪.‬‬

‫•‬

‫المقاومة المتغيرة بالضوء تقل مقاومتها اذا تسلط عليها ضوء‪.‬‬

‫•‬

‫نقوم بتوجيه الليزر إلى مقاومة متغيرة بالضوء "‪ ”LDR‬عن بعد‪.‬‬

‫•‬

‫نقراء قيمة المقاومة عن طريق األردوينو‪.‬‬

‫•‬

‫عند مرور شخص من أمام الليزر‪ ،‬سينقطع الليزر من المقاومة الضوئية وستزيد مقاومتها‪.‬‬

‫•‬

‫نقوم بتشغيل جهاز إنذار ولمبة تحذيرية‪.‬‬

‫‪138‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫‪139‬‬

‫أساسيات األردوينو‬ ‫القطع المطلوبة‪:‬‬ ‫✓ أردوينو وكيبل للبرمجة‪.‬‬ ‫✓ ليزر‪.‬‬ ‫✓ مقاومة متغيرة بالضوء "‪.”LDR‬‬ ‫✓ طنان "‪ ”Buzzer‬يفضل من نوع ‪.Active‬‬ ‫✓ مقاومة ‪ 220‬أوم أو حولها‪.‬‬ ‫✓ ‪.LED‬‬ ‫✓ أسالك للتوصيل‪.‬‬ ‫✓ لوحة تجارب "‪.”Breadboard‬‬

‫‪140‬‬

‫أساسيات األردوينو‬

141

:‫الكود‬

int int int int

sensorValue = 0; laser = 12; buzzer = 8; led = 9;

void setup() { pinMode(laser, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { sensorValue = analogRead(0); Serial.println(sensorValue); if (sensorValue < 700) { digitalWrite(led, HIGH); digitalWrite(buzzer, HIGH); } else { digitalWrite(led, LOW); digitalWrite(buzzer, LOW); } delay(500); }

∞∞∞

‫أساسيات األردوينو‬

‫حساس الرطوبة والحرارة‬ ‫ماذا يعمل الحساس؟‬ ‫الحساس يقيس حرارة الجو بالمقياس المئوي ويقيس رطوبة الجو‪.‬‬ ‫الحساس يرسل إشارات ديجيتال ‪ 0‬و ‪ 1‬لكن القراءة منه معقدة‪.‬‬ ‫لهذا سنستخدم مكتبة جاهزة لهذا الحساس‪.‬‬

‫فائدة المكتبات (‪)Library‬‬ ‫المكتبة عبارة عن برنامج يسهل لنا استخدام الحساسات وغيرها يحتوي على دوال "‪ ”Functions‬وتعريفات وأوامر‪،‬‬ ‫باستخدامها نختصر كتابة البرنامج من عدة صفحات أحيانا إلى سطرين أو ثالث فقط!‬

‫‪142‬‬

‫أساسيات األردوينو‬ ‫القطع المطلوبة‪:‬‬ ‫أردوينو أونو ‪ +‬كيبل للبرمجة‬ ‫حساس الرطوبة والحرارة ‪ DH11‬أو ‪ DH22‬أو ‪DH21‬‬ ‫لوحة تجارب ‪Breadboard‬‬ ‫أسالك ذكر‪-‬أنثى‬ ‫قد تحتاج مقاومة ‪ k10‬أوم‪.‬‬

‫‪143‬‬

‫أساسيات األردوينو‬

‫خطوات تحميل المكتبة‪:‬‬ ‫‪ .1‬نفتح برنامج األردوينو‬ ‫‪ .2‬نضغط أعلى البرنامج على‪:‬‬ ‫‪Sketch → Include Library → Manage Libraries‬‬

‫‪ .3‬نبحث عن المكتبة باسم ‪DH11‬‬ ‫‪ .4‬نختار أحدث إصدار ونحملها ‪Install‬‬

‫اآلن عندما نريد استخدام المكتبة نكتب أعلى البرنامج األمر التالي‪:‬‬ ‫>‪#include
‫نحدد رقم المنفذ الديجيتال الذي سنقرأ منه ونوع الحساس الذي نستخدمه (اخترت ‪ D7‬يمكنك اختيار ما تريد)‬

‫;)‪DHT dht(7, DHT11‬‬

‫ثم نبدأ التخاطب مع الحساس باستخدام األمر‬

‫;)(‪dht.begin‬‬

‫‪144‬‬

‫أساسيات األردوينو‬ ‫التوصيل‪:‬‬

‫التوصيل كالتالي‪:‬‬

‫منفذ الحساس األيمن‬

‫يوصل مع ال‪ 5‬فولت‪.‬‬

‫منفذ الحساس األوسط‬

‫يوصل مع أي منفذ ديجيتال في األردوينو (يجب‬ ‫تحديده في البرنامج)‬

‫منفذ الحساس األيسر‬

‫يوصل في أي منفذ أرضي ‪GND‬‬

‫‪145‬‬

‫أساسيات األردوينو‬

146

:‫الكود‬

#include "DHT.h" DHT dht(7, DHT11); void setup() { Serial.begin(9600); dht.begin(); } void loop() { Serial.println(); delay(2000); float h; float t; h = dht.readHumidity(); t = dht.readTemperature(); Serial.print("Humidity: "); Serial.println(h); Serial.print("Temperature: "); Serial.println(t); }

‫أساسيات األردوينو‬

‫‪147‬‬

‫شرح الكود‪:‬‬

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

‫"‪#include "DHT.h‬‬

‫في البرنامج‪.‬‬ ‫انشاء حساس جديد في البرنامج أسميناه ‪( dht‬يمكن‬

‫;)‪DHT dht(7, DHT11‬‬

‫اعطاءه اي اسم) حددنا له المنفذ رقم ‪( 7‬يمكن‬ ‫تحديد أي منفذ ديجيتال) ونوعه ‪.DHT11‬‬ ‫بدأ قراءة الحساس‪.‬‬ ‫عرفنا متغير نوعه ‪ float‬يقبل األعداد الكسرية‬

‫;)(‪dht.begin‬‬ ‫;‪float h‬‬

‫والصحيحة وسميناه ‪ h‬ليمثل الرطوبة‪.‬‬ ‫عرفنا متغير نوعه ‪ float‬يقبل األعداد الكسرية‬

‫;‪float t‬‬

‫والصحيحة وسميناه ‪ t‬ليمثل الحرارة‪.‬‬ ‫قراءة الرطوبة من الحساس‪ ،‬وحفظها في المتغير‬

‫;)(‪h = dht.readHumidity‬‬

‫‪h‬‬ ‫قراءة درجة الحرارة من الحساس واعطاءها للمتغير ‪t‬‬

‫;)(‪t = dht.readTemperature‬‬

‫ارسال قيمة ‪ h‬عن طريق السيريال‪.‬‬

‫;)‪Serial.println(h‬‬

‫ارسال قيمة ‪ t‬عن طريق السيريال‪.‬‬

‫;)‪Serial.println(t‬‬

‫أساسيات األردوينو‬

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

‫‪148‬‬

‫أساسيات األردوينو‬

149

:‫مراجع‬ 1. https://www.arduino.cc/en/Tutorial/PWM 2. https://stackoverflow.com/questions/2386772/what-is-the-difference-between-float-and-double 3. https://learn.adafruit.com/all-about-stepper-motors/what-is-a-stepper-motor 4. http://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-an-arduino/ 5. http://www.circuitbasics.com/wp-content/uploads/2015/11/DHT11-Datasheet.pdf 6. https://www.arduino.cc/reference/en/language/functions/com 7. munication/serial/ 8.

http://bit.do/Avishkar

9. https://www.arduino.cc/en/Tutorial/SoftwareSerialExample 10. https://stackoverflow.com/questions/6160963/how-can-i-digitalread-a-pin-that-is-in-pinmode-output 11. http://donalmorrissey.blogspot.com/2010/04/sleeping-arduino-part-5-wake-up-via.html 12. http://fritzing.org/projects/soil-moisture-sensor-and-serial/ 13. https://oscarliang.com/arduino-gps-tutorial/ 14. http://omnigatherum.ca/wp/?p=338

Related Documents

Arduino Basics Book
January 2021 1
Arduino
January 2021 6
Arduino
February 2021 1
Makalah Arduino
January 2021 0
Arduino+matlab
January 2021 0

More Documents from "Lorena Santos"

Arduino Basics Book
January 2021 1
Zez Confrey
February 2021 0