You are on page 1of 155

]h

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

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

‫نقاط مهمة عن هذا الكتاب‪:‬‬

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

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

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

‫ماذا ستستفيد من هذا الكتاب؟‬

‫✓ أساسيات بسيطة في الكهرباء‪.‬‬

‫✓ ماهو األردوينو‬

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

‫✓ فهم أهم أوامر األردوينو مع التطبيق‪:‬‬

‫✓ )‪(digitalWrite, digitalRead, analogWrite, analogRead‬‬

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

‫✓ )‪(For, while, if else‬‬

‫✓ التطبيق العملي مع التوصيل والكود مع شرح كل أمر في الكود‪.‬‬

‫✓ التطبيق على بعض الحساسات وعمل بعض المشاريع البسيطة‪.‬‬


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

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

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

‫‪Electro.ahmed.a@gmail.com‬‬
‫‪v‬‬ ‫أساسيات األردوينو‬

‫‪Contents‬‬

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

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

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

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

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

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

‫‪79‬‬ ‫المحركات‬

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

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

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


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

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

‫دائما ما نشبه الكهرباء بالماء‪ ،‬ولكن لماذا؟‬

‫الماء‪:‬‬

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

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

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

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

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

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


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

‫فرق الجهد (الفولت)‪:‬‬

‫البطارية في الصورة األولى ‪ 1.5‬فولت‪ ،‬يعني أن طرفها الموجب جهده أعلى من السالب ب‪ ،1.5‬والبطارية في‬

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

‫فرق الجهد يقاس بالفولت‪ ،‬وهو الفرق في الجهد بين طرفين‪.‬‬

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

‫الطرفين (فولت)‪.‬‬
‫‪4‬‬ ‫أساسيات األردوينو‬

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

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

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

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

‫التيار الكهربائي‪.‬‬

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

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

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

‫ولكن لماذا انتقل تيار كبير جدا؟‬

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


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

‫المقاومة‬

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

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

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

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

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

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

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

‫قانون أوم‪Ohm’s Law‬‬

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

‫هو أهم قانون في الكهرباء كلها‪ ،‬مثال‪:‬‬

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

‫يمكن استخدامها؟‬

‫بما أن الفولت = ‪ 9‬والتيار المطلوب = ‪0.020‬‬

‫المقاومة = الفولت ÷ التيار‪.‬‬

‫المقاومة المطلوبة = ‪ 450 = 0.020 ÷ 9‬أوم‪.‬‬

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

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

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

‫ملخص الدرس‪:‬‬

‫الفولت هو فرق الجهد بين نقطتين‪.‬‬

‫التيار ينتقل من الجهد األعلى إلى األقل‪.‬‬

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

‫اتصال نقطتين بينهما فرق جهد بدون مقاومة أو بمقاومة قليلة جدا يسمى ‪.Short Circuit‬‬

‫(قانون أوم( الفولت = التيار ‪ x‬المقاومة‬

‫∞∞∞‬
‫تمارين‬

‫‪ .1‬إذا زادت المقاومة والفولت ثابت‪ ،‬كيف يتأثر التيار الكهربائي؟‬

‫‪ .2‬لنسمح بمرور ‪ 2‬أمبير (التيار) في مقاومة قيمتها ‪ 10‬أوم‪ ،‬كم فولت نحتاج؟‬

‫‪ .3‬ما هو الفولت؟‬

‫‪ .4‬ما هو التيار؟ وما هي وحدة قياسه؟‬

‫‪ .5‬كيف ينتقل التيار الكهربائي؟‬


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

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

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

‫مشكلة‪:‬‬

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

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

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

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

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

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

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

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

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

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

‫األونو يحتوي على متحكم اسمه ‪ Atmega328P‬أهم مواصفاته‪:‬‬

‫❖ سرعة المتحكم‪ 16 :‬ميجا هرتز (‪.)MHz16‬‬

‫❖ ذاكرة الفالش‪ 32 :‬كيلو بايت ‪.(32KB)Flash Memory‬‬

‫❖ ذاكرة تخزين التعريفات‪ 2 :‬كيلو بايت )‪.SRam(2KB‬‬

‫❖ ذاكرة تخزين دائمة للمستخدم‪ 1 :‬كيلو بايت ‪.(1KB)EEPROOM‬‬

‫❖ عدد منافذ الديجيتال‪ 14 :‬منفذ‪.‬‬

‫❖ عدد منافذ األنالوج‪ 6 :‬منافذ‪.‬‬

‫❖ الكهرباء المطلوبة‪ :‬يعمل على ‪ 5‬فولت تيار ثابت (‪.)DC‬‬

‫❖ منافذ السيريال‪ :‬واحد‪.‬‬

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

‫منافذ الديجيتال‪:‬‬

‫عددها ‪ 14‬في األردوينو أونو‪ ،‬تستخدم في‪:‬‬

‫‪ .1‬تشغيل األجهزة المختلفة واطفاءها‪.‬‬

‫‪ .2‬قراءة اإلشارة الواصلة للمنفذ‪ ،‬هل هنالك إشارة واصلة أم ال؟ وال يمكننا معرفة قوتها‪.‬‬

‫‪ .3‬بعضها تدعم خاصية ال‪ PWM‬وسندرسها بمشيئة هللا تعالى‪.‬‬

‫‪ .4‬تدعم بعض منافذها بروتوكوالت اإلتصال ‪ Serial‬و ‪.SPI‬‬

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

‫منافذ الأنالوج‬

‫لوحة األردوينو أونو تحتوي على ‪ 6‬منافذ أنالوج‪ ،‬تستخدم في‪:‬‬

‫‪ .1‬قراءة قيمة اإلشارة الواصلة لها بدقة‪.‬‬

‫‪ .2‬كمنافذ ديجيتال‪.‬‬

‫‪ .3‬بعض منافذها تدعم بروتوكول االتصال ‪.I2C‬‬

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

‫منافذ الطاقة الموجودة في الأونو‪:‬‬

‫منفذ (‪ :)GND‬يسمى األرضي‪ ،‬وهو يعتبر ‪ 0‬فولت‪.‬‬

‫منفذ (‪ :)V5‬منفذ ‪ 5‬فولت‪.‬‬

‫منفذ (‪ :)V3.3‬منفذ ‪ 3.3‬فولت‪.‬‬

‫منفذ (‪ :)Vin‬لتشغيل األردوينو من مصدر طاقة خارجي كبطارية مثال (بين ‪ 7‬فولت إلى ‪ 12‬فولت)‪.‬‬
‫‪16‬‬ ‫أساسيات األردوينو‬

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

‫✓ الكمبيوتر‪.‬‬

‫✓ شاحن جوال متنقل أو ثابت‪.‬‬

‫✓ يمكننا أيضا توصيل ‪ 5‬فولت مباشرة عن طريق منفذ ‪.V5‬‬


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

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

‫المحدد في الصورة سيقلل الفولت إلى ‪ 5‬فولت ليستخدمه المتحكم)‪.‬‬

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

‫تمارين‬

‫‪ .1‬ماهي أشهر لوحة أردوينو؟‬

‫‪ .2‬كيف سهل األردوينو استخدام األلواح اإللكترونية؟‬

‫‪ .3‬ماهو الفرق بين منافذ الديجيتال واألنالوج؟‬

‫‪ .4‬كيف نستطيع تشغيل األردوينو بمصدر طاقة ‪ 12‬فولت؟‬


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

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


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

‫تثبيت برنامج الأردوينو ‪Arduino IDE‬‬

‫برنامج يمكن من خالله برمجة أي جهاز متوافق مع األردوينو بسهولة‪ .‬يمكن تحميله من الرابط‪:‬‬
‫‪https://www.arduino.cc/en/Main/Software‬‬

‫نختار البرنامج الذي يوافق نظام التشغيل (في حالة ويندوز نختار ‪.)Windows Installer‬‬

‫ثم نثبت البرنامج على جهازنا‪.‬‬


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

‫برنامج الأردوينو‬

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

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


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

‫أساسيات في برمجة الأردوينو‬

‫دالة الإعدادات‪:‬‬

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

‫ينفذ مرة واحدة فقط‪.‬‬ ‫}‬ ‫ما بداخل األقواس {‬ ‫•‬

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

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

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

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

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

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

‫)(‪void loop‬‬
‫{‬
‫}‬
‫‪23‬‬ ‫أساسيات األردوينو‬

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

‫‪//‬‬

‫أساسيات في البرمجة‪:‬‬

‫✓ كل قوس يجب أن يغلق‪.‬‬

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

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

‫صحيحة ;)‪digitalWrite(9, HIGH‬‬


‫خاطئة ;)‪digitalwrite(9, high‬‬

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

‫;)‪pinMode(9, OUTPUT‬‬
‫;)‪digitalWrite(9, HIGH‬‬
‫‪24‬‬ ‫أساسيات األردوينو‬

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

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

‫خطوات رفع برنامج من الكمبيوتر إلى المتحكم‪:‬‬

‫✓ نتأكد من توصيل األردوينو بالكمبيوتر عن طريق سلك ال‪.USB‬‬

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

‫نذهب إلى أدوات ← منفذ ← المنفذ الخاص باألردوينو‪.‬‬ ‫‪o‬‬


‫‪Tools - > Port → choose‬‬

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

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

‫نختار نوع اللوحة الموجودة لدينا عن طريق‪:‬‬ ‫‪o‬‬

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

‫✓ نضغط ‪.Upload‬‬

‫✓ سيظهر لك في األسفل معلومات التحميل‪ ،‬وإن كان هناك خطأ سيكتب لك سببه غالبا‪.‬‬

‫✓ في حال كان كل شيء على ما يرام‪ ،‬ستظهر لك عبارة‪.Done Uploading‬‬


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

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


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

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


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

‫الأمر ‪pinMode‬‬

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

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

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

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

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

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

‫احتجنا لذلك‪.‬‬

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

‫الأمر ‪digitalWrite‬‬

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

‫لتشغيل األجهزة أو إرسال إشارة ‪ 5‬فولت من أي منفذ نستخدم األمر‪:‬‬

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

‫إلرسال إشارة ‪ 0‬فولت من اي منفذ ديجيتال نستخدم األمر‪:‬‬

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

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

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

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

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

‫∞∞∞‬
‫‪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‬‬ ‫أساسيات األردوينو‬

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

‫;)‪pinMode(9, OUTPUT‬‬
‫تحديد المنفذ رقم ‪ 9‬كمخرج‪.‬‬

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

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

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

‫األمر ‪:delay‬‬

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

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

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

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

‫تشغيل لمبة ‪ LED‬خارجية‬

‫القطع المطلوبة‪:‬‬

‫إضاءة ليد‪.‬‬

‫مقاومة (أي قيمة بين ‪ 200‬إلى ‪ 1000‬أوم مناسبة)‪.‬‬

‫لوحة تجارب (بريد بورد)‪.‬‬

‫سلكين ذكر‪-‬ذكر‪.‬‬
‫‪32‬‬ ‫أساسيات األردوينو‬

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

‫نوصل سلك من المنفذ رقم ‪ 9‬إلى رجل اإلضاءة الطويلة‪.‬‬

‫نوصل اي طرف من المقاومة برجل اإلضاءة القصيرة‪.‬‬

‫نوصل الطرف اآلخر من المقاومة باألرضي ‪.GND‬‬

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

‫البرنامج‪:‬‬

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

‫تدريب‪ :‬اصنع إشارة مرور‬

‫ستحتاج إلى اآلتي‪:‬‬

‫ثالثة مقاومات مناسبة (اي قيمة بين ‪ 200‬و ‪ 1000‬أوم)‬

‫ثالثة لمبات ‪( LED‬أحمر‪ ،‬أصفر‪ ،‬أخضر)‪.‬‬

‫لوحة تجارب‪.‬‬

‫أسالك ذكر‪-‬ذكر للتوصيل‪.‬‬

‫∞∞∞‬
‫‪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‬‬
‫}‬
‫‪35‬‬ ‫أساسيات األردوينو‬

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

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

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

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

‫مشروع إشارة مرور‬

‫ماذا يعمل المشروع؟‬

‫سنبرمج األردوينو ليقوم بتشغيل ثالث لمبات ‪ LED‬كالتالي‪:‬‬

‫✓ سيشغل اللون األخضر لمدة ثالث ثواني ثم يطفيه‪.‬‬

‫✓ سيشغل اللون األصفر لمدة ثانية ويطفيه‪.‬‬

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

‫✓ وفي كل مرة سيظهر لنا على شاشة السيريال اللون الحالي‪.‬‬

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو‪.‬‬

‫✓ كيبل للبرمجة‪.‬‬

‫✓ ثالث مقاومات قيمتها ‪ 220‬أوم‪.‬‬

‫✓ ثالث لمبات ‪ :LED‬لون أخضر‪ ،‬لون أحمر‪ ،‬لون أصفر‪.‬‬

‫✓ لوحة تجارب (بريد بورد)‪.‬‬

‫✓ أسالك للتوصيل ذكر‪-‬ذكر‪.‬‬


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

‫;)‪pinMode(red, OUTPUT‬‬
‫اآلن كلما استخدمنا كلمة ‪ red‬سيراها األردوينو ‪11‬‬

‫;)‪digitalWrite(red, HIGH‬‬
‫هذا األمر يحدد لألردوينو كيف سنستخدم المنفذ إما‬
‫كمخرج أو مدخل‪.‬‬

‫;)‪delay(1000‬‬
‫الفراغ األول بين األقواس هو لرقم المنفذ‪.‬‬

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

‫;)”‪Serial.println(“Green‬‬
‫يجب أن تكون بحروف كبيرة‪.‬‬

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

‫يرسله لنا األردوينو‪.‬‬

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

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

‫الأمر ‪analogWrite‬‬

‫في األمثلة السابقة‪ ،‬تحكمنا في ال‪ LED‬فإما يعمل أو ال يعمل‪ ،‬ولكن كيف يمكننا التحكم في شدة إضاءته؟‬

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

‫فولت أو ‪ 0‬فولت وال يستطيع إخراج ‪ 3‬أو ‪ 2.5‬فولت من المنافذ‪.‬‬

‫فلكي نتحكم بشدة اإلضاءة‪ ،‬سنستخدم طريقة تسمى ‪.Pulse Width Modulation‬‬

‫طريقة عمل ال‪:PWM‬‬

‫‪ .1‬يرسل األردوينو ‪ 500‬إشارة في الثانية‪.‬‬

‫‪ .2‬أقصى طول لكل إشارة ‪ 2‬ملي ثانية‪.‬‬

‫‪ .3‬نقوم بالتحكم في طول بقاء اإلشارة‪ .‬كلما طالت مدة بقاء اإلشارة‪ ،‬زادت الطاقة الناتجة من‬
‫المنفذ (الصورة باألسفل)‪.‬‬

‫‪ .4‬باستخدام األمر ‪ analogWrite‬سنحدد رقم المنفذ‪ ،‬ورقم (من ‪ 0‬إلى ‪ )255‬كلما زاد الرقم زادت شدة‬
‫اإلشارة‪.‬‬

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


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

‫طريقة استخدام األمر ‪analogWrite‬‬

‫‪ .1‬نحدد المنفذ كمخرج‪.‬‬

‫‪ .2‬نحدد قوة اإلشارة من المنفذ (نستخدم رقم من ‪ 0‬إلى ‪.)255‬‬

‫‪ 255 .a‬أعلى قيمة‪.‬‬

‫‪ 0 .b‬أقل قيمة‪.‬‬

‫سنقوم بالتحكم بشدة إضاءة لمبة ‪ LED‬باستخدام ال‪.PWM‬‬

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو وكيبل للبرمجة‬

‫✓ مقاومة ‪ 220‬أوم او حولها‬

‫✓ ‪LED‬‬

‫✓ أسالك للتوصيل‬

‫✓ لوحة تجارب "‪”Breadboard‬‬


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

:‫التوصيل‬

:‫الكود‬
void setup()
{
pinMode(9, OUTPUT);
}

void loop()
{
for (int i = 0; i < 255; i++) //for loop
{
analogWrite(9, i);
delay(25);
}
}
‫‪43‬‬ ‫أساسيات األردوينو‬

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

‫)‪for(int i =0;i<255,i++‬‬
‫الكود سيقوم بانشاء عدد صحيح اسمه ‪ i‬قيمته ‪0‬‬

‫مادامت ‪ i‬أقل من ‪ 255‬سيضيف البرنامج رقم واحد ل ‪i‬‬


‫وسينفذ الكود الذي في األقواس ثم يعود ويكرر‬
‫ننفس العملية إلى أن تصل قيمة ‪ i‬إلى ‪.255‬‬

‫;)‪analogWrite(9, i‬‬
‫يحدد المنفذ رقم ‪ 9‬كمخرج‬

‫;)‪delay(25‬‬
‫من غير هذا األمر لن نستطيع تشغيل أي جهاز من‬
‫المنفذ‬
‫‪44‬‬ ‫أساسيات األردوينو‬

‫ملخص الباب‪:‬‬

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

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

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

‫;)‪digitalWrite(9, HIGH‬‬

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

‫;)‪delay(25‬‬

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

‫;)‪Serial.begin(9600‬‬
‫‪45‬‬ ‫أساسيات األردوينو‬

‫تمارين‪:‬‬

‫‪ .1‬متى نستخدم المنفذ كمخرج؟ ومتى نستخدمه كمدخل؟‬

‫‪ .2‬كيف نحدد المنفذ كمخرج؟ اكتب األمر‪.‬‬

‫‪ .3‬ما األمر الذي نحتاجه لنجعل المنفذ ‪ HIGH‬لنشغل مثال ‪ LED‬متصل به؟‬

‫‪ .4‬ماذا يفعل األمر ‪delay‬؟‬

‫‪ .5‬كيف نرسل هذه الجملة إلى الكمبيوتر من األردوينو عن طريق السيريال " ‪“ Hello World‬؟ اكتب البرنامج‪.‬‬

‫‪ .6‬ما الفرق بين ‪ digitalWrite‬و ‪analogWrite‬؟‬

‫‪ .7‬ماهي أعلى قيمة في األمر ‪analogWrite‬؟‬

‫‪ .8‬ماهو أعلى تيار تستطيع المنافذ تحمله؟‬


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

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


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

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

‫الحركة ستكون اإلشارة ‪ 0‬فولت‪ .‬كيف يمكن أن نقرأ إشارة الحساس باستخدام األردوينو؟‬

‫قراءة إشارة عن طريق منافذ الديجيتال‬

‫✓ نحدد المنفذ كمدخل‪.‬‬

‫;)‪pinMode(3, INPUT‬‬

‫✓ نقرأ اإلشارة باستخدام األمر‪:‬‬

‫;(‪digitalRead )3‬‬

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

‫علينا أن نحفظ القيمة في متغير إن أردنا استخدام القيمة الحقا‪.‬‬


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");
}
}
‫‪49‬‬ ‫أساسيات األردوينو‬

‫حساس الحركة‬

‫األجسام الحية تنبعث منها أشعة تحت حمراء نظرا لحرارتها‪ .‬الحساس يقوم بقياس التغير في هذه األشعة‬

‫الواصلة له‪.‬‬

‫الحساس يحتوي على ثالثة أرجل أو منافذ‪:‬‬

‫‪ .1‬منفذ للفولت‬

‫‪ .2‬منفذ لألرضي‬

‫‪ .3‬منفذ نقرأ منها حالة الحساس‪.‬‬

‫طريقة عمل المشروع‪:‬‬

‫‪ .1‬عندما يمر جسم حي أمام حساس الحركة سيعطينا الحساس اشارة‪.‬‬

‫‪ .2‬األردوينو سيقرأها عن طريق أحد منافذ الديجيتال‪.‬‬

‫‪ .3‬في حال وجود إشارة سيقوم األردوينو بتشغيل إضاءة لعدة ثوان‪.‬‬
‫‪50‬‬ ‫أساسيات األردوينو‬

‫القطع المطلوبة‪:‬‬

‫‪ .1‬أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫‪ .2‬حساس الحركة‪.‬‬

‫‪ .3‬إضاءة ‪.LED‬‬

‫‪ .4‬مقاومة ‪ 200‬أوم أو أعلى‪.‬‬

‫‪ .5‬لوحة تجارب ‪.Breadboard‬‬


‫‪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‬‬ ‫أساسيات األردوينو‬

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

‫;)‪pinMode(10, INPUT‬‬
‫تحديد المنفذ رقم ‪ 10‬كمدخل‬

‫;)‪pinMode(9, OUTPUT‬‬
‫تحديد المنفذ رقم ‪ 9‬كمخرج‬

‫;)‪int active = digitalRead(10‬‬


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

‫اآلن قيمة القراءة محفوظة في المتغير نستطيع استرجاعها‬


‫واستخدامها متى ما أردنا‬

‫)‪if (active == 1‬‬


‫} {‬ ‫جملة شرطية‪...‬اذا كانت قيمة ‪ active‬تساوي ‪ 1‬سينفذ ما‬
‫بداخل األقواس‪.‬‬

‫نالحظ انه كتب == وليس=‬

‫‪else‬‬
‫إن لم يتحقق الشرط في الجملة الشرطية‪...‬‬

‫;)‪delay(500‬‬
‫يوقف البرنامج لمدة نصف ثانية (‪ 1 = 1000‬ثانية)‪.‬‬
‫‪54‬‬ ‫أساسيات األردوينو‬

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

‫األمر ‪ active = 1‬معناه أننا نعطي المتغير ‪ active‬قيمة ‪1‬‬

‫األمر ‪ active ==1‬معناه أننا نسأل األردوينو هل قيمة المتغير ‪ active‬تساوي واحد أم ال؟‬

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

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

‫األنالوج‪.‬‬

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

‫القراءة من منفذ أنالوج‪:‬‬

‫❖ حساس درجة الحرارة يعطينا إشارة تزيد قوتها (الفولت) كلما زادت درجة الحرارة‪.‬‬

‫❖ القراءة من منافذ الديجيتال لن تفيدنا ألنها فقط تخبرنا هل هناك إشارة أم ال‪.‬‬

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

‫لن نحتاج لتحديد المنفذ كمدخل "‪ ”Input‬عند القراءة من منفذ أنالوج‬

‫فقط نستخدم األمر التالي‪:‬‬

‫;)‪analogRead(A0‬‬

‫يمكن أن ننشيء متغير ونحفظ فيه قيمة القراءة‪:‬‬

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


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

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

‫المقاومة المتغيرة (‪)Potentiometer‬‬

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

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

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

‫بتغيير المقاومة يتغير فرق الجهد على الرجل الوسطى وهذا ما سنقيسه باستخدام منفذ األنالوج‪.‬‬ ‫•‬
‫‪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‬‬ ‫أساسيات األردوينو‬

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

‫;)‪Serial.print(9600‬‬
‫يحدد سرعة التخاطب عن طريق السيريال‪.‬‬

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

‫يحفظ أرقام كسرية (مثل ‪ 1.0‬أو ‪ 0.74‬أو ‪.)102.9‬‬

‫;)‪analogRead(0‬‬
‫أمر لقراءة اإلشارة من المنفذ رقم ‪( A0‬أنالوج)‪.‬‬

‫;)‪reading = analogRead(0‬‬
‫يأخذ قراءة من المنفذ رقم ‪ A0‬ويحفظها في‬
‫المتغير ‪.reading‬‬

‫;)‪Serial.println(reading‬‬
‫ارسال قيمة ‪ reading‬عن طريق السيريال‪.‬‬

‫يمكننا قراءتها على شاشة الكمبيوتر‪.‬‬

‫;)‪Serial.println(reading*5/1024‬‬
‫القراءة تأتينا رقم من ‪ 0‬إلى ‪1024‬‬

‫‪ 1024‬يعني أن اإلشارة قيمتها ‪ 5‬فولت‪.‬‬

‫‪ 0‬يعني أن اإلشارة قيمتها ‪ 0‬فولت‪.‬‬

‫نحول القراءة إلى فولت كالتالي‪:‬‬

‫نضربها في ‪ 5‬ونقسمها على ‪1024‬‬

‫في هذا األمر حولنا القراءة إلى فولت وأرسلناها‬


‫إلى الكمبيوتر عن طريق السيريال‪.‬‬
‫‪60‬‬ ‫أساسيات األردوينو‬

‫ماذا يعمل الكود؟‬

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

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

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

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

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

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

‫‪ .1‬عندما تصل إشارة ‪ 5‬فولت إلى منفذ األنالوج‪ ،‬سيعطينا قراءة ‪.1024‬‬

‫‪ .2‬عندما تصل إشارة ‪ 2.5‬فولت‪ ،‬سيعطينا قراءة ‪.512‬‬

‫‪ .3‬دقة القراءة هي ‪ 5‬قسمة ‪ 0.004882813 = 1024‬فولت‪.‬‬

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

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

‫تمارين‪:‬‬

‫‪ .1‬ما الفرق بين قراءة المنفذ الديجيتال وبين األنالوج؟‬

‫‪ .2‬كيف نحدد المنفذ كمدخل؟‬

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

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


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

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


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

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

‫الجملة الشرطية (‪)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 :‬‬


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

‫مثال‪:‬‬

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو أونو‪.‬‬

‫✓ كيبل للبرمجة‪.‬‬

‫✓ مقاومة متغيرة أي قيمة "‪.”Potentiometer‬‬

‫التوصيل‪:‬‬
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‬‬ ‫أساسيات األردوينو‬

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

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

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

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

‫;)‪reading = analogRead(0‬‬
‫نقرأ من المنفذ رقم ‪ A0‬ونعطي المتغير ‪ reading‬قيمة القراءة‪.‬‬

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


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

‫)‪if (voltage >= 4‬‬


‫{‬ ‫إذا كان قيمة المتغير ‪ voltage‬أكبر من أو يساوي ‪ 4‬سينفذ ما‬
‫‪Serial.println("voltage is above‬‬ ‫بين األقواس‪.‬‬
‫;)"‪than four‬‬
‫}‬

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

‫‪else if (voltage >= 3 && voltage‬‬


‫)‪< 4‬‬ ‫إن لم يتحقق الشرط السابق وإذا كانت قيمة ‪voltage‬‬
‫{‬
‫‪Serial.println("voltage is‬‬
‫(أكبر من أو تساوي ‪ )3‬و (أقل من ‪ )4‬نفذ األمر بين األقواس‪.‬‬
‫;)"‪between three and four‬‬
‫}‬

‫‪else‬‬
‫{‬ ‫إذا لم يتحقق أي شرط من الشروط السابقة نفذ ما بين‬
‫‪Serial.println("Voltage is less‬‬ ‫األقواس‪.‬‬
‫;)"‪than two‬‬
‫}‬

‫;)‪delay(50‬‬
‫نوقف البرنامج ‪ 0.005‬ثانية لتقليل سرعة ارسال المعلومات‬
‫وتسهيل قراءتها‪.‬‬
‫‪67‬‬ ‫أساسيات األردوينو‬

‫البرنامج يقوم باآلتي‪:‬‬

‫‪ .1‬يعرف عدد صحيح اسمه ‪.reading‬‬

‫‪ .2‬يعرف متغير اسمه ‪( voltage‬سميناه ‪ float‬ألنها تستطيع احواء األعداد الكسرية ألن الفولت قد يكون‬
‫‪ 3.45‬أو ‪ 4.21‬وليس دائما عدد صحيح‪.‬‬

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

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

‫حلقة ما دام ‪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‬‬

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

‫‪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‬‬
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‬‬ ‫أساسيات األردوينو‬

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

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

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


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

‫;‪int i = 0‬‬
‫ننشيء عدد صحيح اسمه ‪ i‬ونعطيه القيمة ‪0‬‬

‫يمكن تسميته أي اسم‪.‬‬

‫‪i < 100‬‬


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

‫‪i++‬‬
‫تعني ‪i = i + 1‬‬

‫(أضف رقم ‪ 1‬إلى ‪)i‬‬

‫;)‪Serial.println(i‬‬
‫ارسال قيمة ‪ i‬عن طريق السيريال إلى الكمبيوتر‪.‬‬

‫;)‪delay(50‬‬
‫لتقليل سرعة ارسال المعلومات حتى نستطيع قراءتها‪.‬‬

‫البرنامج يقوم باآلتي‪:‬‬

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

‫✓ ينشيء متغير ‪ i‬قيمته ‪. 0‬‬

‫✓ طالما ‪ i‬أقل من ‪ ،100‬سننفذ األمر بين األقواس وسيضيف واحد إلى ‪ i‬حتى تصل إلى مئة‪.‬‬

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

‫التعريفات‬

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

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

‫;‪int num = 5‬‬

‫✓ ‪ int‬اختصار لكلمة ‪ integer‬ومعناها عدد صحيح‪.‬‬

‫✓ سمينا العدد الصحيح ‪ ،abcd‬نستطيع تسميته أي اسم نريد‪.‬‬

‫✓ أعطينا المتغير قيمة ‪ ،5‬نستطيع تعريفه من غير أن نعطيه قيمة‪.‬‬

‫نستطيع استخدام المتغير كالتالي‪:‬‬

‫;‪int x = 10‬‬
‫;‪x = x – 1‬‬ ‫‪ 9‬قيمة المتغير اآلن‬
‫;‪x = 2 * x‬‬ ‫‪ 18‬قيمة المتغير اآلن‬

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


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

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

‫‪int‬‬
‫نعرف متغير يقبل األعداد الصحيحة وال يقبل الكسور‪،‬‬
‫مثل ‪. 4 ،3 ،2 ،1‬‬

‫أكبر عدد له هو ‪ 32،768‬وال يستطيع تخزين عدد أكبر‬


‫منه‪.‬‬

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

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

‫‪char‬‬
‫متغير يقبل الحروف (قد يكون رقم أيضا‪ ،‬لكن لن‬
‫يعامل معاملة األرقام) يجب أن يكون بين هذه‬
‫العالمتين ‘ ‘‬

‫مثل‪:‬‬

‫‘‪’a‬‬

‫‘‪’b‬‬

‫‘‪’1‬‬

‫‘‪’4‬‬

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

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

‫)(‪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‬‬
‫}‬
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 timePassed‬‬
‫انشاء متغير ‪ float‬يقبل الكسور واألرقام اسميناه‬
‫‪timePassed‬‬

‫;)(‪millis‬‬
‫هذه الدالة تخبرنا كم مر على تشغيل األردوينو بالمللي‬
‫ثانية‬

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


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

‫;))‪digitalWrite(led,!digitalRead(led‬‬
‫إذا كان المنفذ ‪ led‬يعمل سيقوم بإطفائه‪ ،‬إذا كان ال يعمل‬
‫سيقوم بتشغيله‪.‬‬

‫)(‪timePassed = millis‬‬
‫نخزن قيمة ‪ millis‬في المتغير ‪timePassed‬‬

‫لن يتحدث الوقت في ‪ timePassed‬إال إذا خزنا الوقت مرة‬


‫أخرى‪.‬‬
‫‪78‬‬ ‫أساسيات األردوينو‬

‫تمارين‬

‫‪ .1‬عرف متغير يقبل األعداد الصحيحة اسمه ‪ .number‬ثم اجعل قيمته تساوي ‪. 10‬‬

‫‪ .2‬عرف متغير ‪ float‬وسميه ‪ number2‬وأعطيه القيمة ‪. 5.5‬‬

‫‪ .3‬لماذا يفضل تعريف المتغير خارج الدوال؟‬

‫‪ .4‬ما الفرق بين ‪ int‬و ‪float‬؟‬

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

‫‪ .6‬مالحظة‪.‬‬

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

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

‫‪ .7‬اكتب مثاال على حلقة ‪.while‬‬

‫‪ .8‬اكتب مثاال على دالة ‪.if else‬‬


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

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

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

‫ما هو السيرفو موتور؟‬

‫محرك يتحرك ‪ 180‬درجة فقط (تقريبا) يمكننا التحكم به للذهاب إلى الزاوية التي نريد بدقة‪.‬‬

‫يستخدم في أيادي الروبوت وفي الطائرات الصغيرة وفي مشاريع األردوينو األخرى‪.‬‬

‫عادة يحتوي على ثالثة أسالك‪ ،‬سلكين للكهرباء (‪ 5‬فولت‪ ،‬أرضي ‪ ،GND‬وسلك لإلشارة للتحكم)‪.‬‬

‫ماذا يعمل المشروع‪:‬‬

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

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو‪.‬‬

‫✓ كيبل للبرمجة‪.‬‬

‫✓ سيرفو موتور‪.‬‬

‫✓ لوحة تجارب ‪.Breadboard‬‬

‫✓ أسالك للتوصيل‪.‬‬

‫✓ مقاومة متغيرة‪.‬‬
‫‪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‬‬


‫قراءة اإلشارة على المقاومة المتغيرة‬

‫;)‪pos=map(reading,0,1023,0,160‬‬
‫تحويل قيمة ‪ reading‬من (‪ 0‬حتى ‪ )1023‬لتصبح من (‪0‬‬
‫حتى ‪ )160‬وتخزين القيمة الجديدة في المتغير ‪pos‬‬

‫إذا كانت قيمة القراءة ‪ 1023‬سيحولها إلى‪160‬‬

‫إذا كانت قيمة القراءة ‪ 512‬سيحولها إلى ‪80‬‬

‫وهكذا‬

‫;)‪myservo.write(pos‬‬
‫تحريك السيرفو إلى الزاوية ‪pos‬‬

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

‫‪DC Motor‬‬

‫ما هو ال‪ DC Motor‬؟‬

‫محرك يعمل على الكهرباء الثابتة دي سي‪.‬‬

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

‫طريقة عمل المشروع‪:‬‬

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

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

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

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

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫✓ موتور ‪ 5‬فولت دي سي‪.‬‬

‫✓ درايفر ‪.L293D‬‬

‫✓ لوحة تجارب ‪.Breadboard‬‬

‫✓ أسالك ذكر‪-‬ذكر‪.‬‬
‫‪85‬‬ ‫أساسيات األردوينو‬

‫قطعة الدرايفر‪L293D‬‬

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

‫لهذا الدرايفر ‪ 16‬منفذ‪ ،‬نستطيع من خالل ال‪ Datasheet‬معرفه كل منفذ وطريقة توصيله‪.‬‬

‫المنافذ مرقمة من ‪ 1‬إلى ‪.16‬‬

‫المنفذ يسار نصف الدائرة الرمادية هو رقم ‪ ،1‬ويمين نصف الدائرة الرمادي هو منفذ رقم ‪.16‬‬

‫فائدة وخواص هذا الدرايفر‪:‬‬

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

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

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

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


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

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

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

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

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

‫واتجاهه‬

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

‫واتجاهه‬

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

‫‪5‬فولت‪ ،‬فائدة المنفذ توفير الطاقة للمحرك‪ ،‬يمكن‬ ‫‪8‬‬

‫استخدام ‪ 5‬فولت من األردوينو‪ ،‬أو مصدر طاقة‬


‫خارجي مناسب للمحرك المستخدم (يمكن استخدام‬
‫فولت من ‪ 4.5‬إلى ‪ 36‬فولت)‬

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

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

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


‫‪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);
‫يوقف البرنامج لمدة ثالثة ثواني‬

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

‫‪Stepper Motor‬‬

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

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

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

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

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

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

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

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

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

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

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


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

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

‫تمارين‬

‫‪ .1‬ما الفرق بين محرك السيرفو‪ ،‬محرك الدي سي ومحرك الستيبر؟‬

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

‫‪ .3‬كيف نجعل محرك الدي سي يمشي بعكس اإلتجاه؟‬

‫‪ .4‬لماذا نستخدم درايفر مع المحركات؟‬


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

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


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

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

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

‫منافذ الــ‪Serial‬‬

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

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

‫يكون التوصيل عادة كالتالي‪:‬‬

‫‪RX → TX‬‬
‫‪TX → RX‬‬
‫‪VCC → VCC‬‬
‫‪GND → GND‬‬

‫(‪ VCC‬ترمز إلى الفولت المستخدم "‪ 5‬فولت في حالة األونو”)‬

‫األردوينو أونو يدعم بروتوكول سيريال واحد‪.‬‬

‫األردوينو ميجا لديه ‪ 3( 3‬منافذ ‪ TX‬و ‪ 3‬منافذ ‪.)RX‬‬

‫تستخدم في‪:‬‬

‫✓ إرسال واستقبال معلومات من أردوينو آخر‪.‬‬

‫✓ إرسال واستقبال معلومات عن طريق قطعة البلوتوث‪.‬‬

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

‫✓ استقبال وارسال معلومات من الحساسات مثل ‪. GSM،GPS‬‬


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

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

‫∞∞∞‬

‫‪SoftwareSerial‬‬

‫عند عدم وجود منفذ سيريال متاح يمكن استخدام ‪.Software Serial‬‬

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

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

‫تطبيق عملي‪:‬‬

‫التحكم بجهاز عن طريق البلوتوث (الجوال)‪.‬‬

‫ماذا يعمل المشروع‪:‬‬

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

‫الخطوات‪:‬‬

‫‪ .1‬نرفع البرنامج على لوحة األردوينو‬

‫‪ .2‬نحمل برنامج مناسب للتحكم باألردوينو عن طريق البلوتوث عن طريق ال‪Google app store‬‬

‫‪ .3‬نوصل الدائرة كما هو موضح‬


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

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو‪.‬‬

‫✓ كيبل للبرمجة‪.‬‬

‫✓ قطعة بلوتوث ‪ HC-05‬أو ‪.HC-06‬‬

‫✓ لوحة تجارب ‪.Breadboard‬‬

‫✓ لمبة ‪.LED‬‬

‫✓ مقاومة ‪ 220‬أوم تقريب‪.‬‬


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

‫‪SoftwareSerial SoftSerial1(6,‬‬
‫;)‪7‬‬ ‫ينشيء سيريال اضافي على المنفذ رقم ‪ 6‬للمستقبل ‪RX‬‬
‫ورقم ‪ 7‬للمرسل ‪.TX‬‬

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


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

‫;)‪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‬نفذ ما بين األقواس‬

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

‫‪I2C‬‬

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

‫لكل حساس أو جهاز متصل عنوان خاص به (‪.)Address‬‬

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

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

‫∞∞∞‬

‫‪SPI‬‬

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

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


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

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

‫أقصى تيار تستطيع منافذ األردوينو اخراجه هو (‪.)mA40‬‬

‫فلكي نتحكم بأي دائرة تحتاج تيار أكبر أو فولت أعلى سنحتاج إلى ‪.Driver circuit‬‬

‫نستطيع استخدام التالي‪:‬‬

‫ريالي‪.‬‬ ‫•‬

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

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


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

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

‫الموسفت هو أحد أفضل أنواع الترانسيستورز اآلن ومن أكثرها شيوعا‪ ،‬له ثالثة أرجل ‪.Drain, Gate, Source‬‬

‫عند وجود إشارة على رجل ال‪ ,Gate‬سيقوم بتوصيل الطرفين األخرى ببعضهما وستعمل الدائرة‪.‬‬

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

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو أونو‪.‬‬

‫✓ كيبل للبرمجة‪.‬‬

‫✓ لوحة تجارب (بريد بورد)‪.‬‬

‫✓ لوجيك موسفت‪.‬‬

‫✓ مقاومة ‪ 100‬أوم إلى ‪ 1000‬أوم ال يهم‪.‬‬

‫✓ لمبة ‪.LED‬‬
‫‪105‬‬ ‫أساسيات األردوينو‬

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

:‫الكود‬

void setup()
{
pinMode(9, OUTPUT);
}

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

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

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

‫عندما تكون هناك إشارة لل ‪ ,Base‬سيتوصل ال ‪ Collector‬وال‪ ,Emitter‬عندها سيمر التيار‪.‬‬

‫عندما ال توجد إشارة على ال ‪ ,Base‬سيكون ال ‪ Collector‬وال ‪ Emitter‬غير متصلين‪.‬‬

‫القطع المطلوبة‪:‬‬

‫✓ مقاومة ‪ 200‬أوم تقريبا‪.‬‬

‫✓ لمبة ‪.LED‬‬

‫✓ لوحة تجارب ‪.BreadBoard‬‬

‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫✓ أسالك ذكر‪-‬ذكر للتوصيل‪.‬‬

‫✓ ‪ NPN Transistor‬مثل‪:‬‬

‫‪n22222‬‬ ‫‪o‬‬

‫‪BC547‬‬ ‫‪o‬‬

‫‪BC548‬‬ ‫‪o‬‬
‫‪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‬‬ ‫أساسيات األردوينو‬

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

‫;‪int relay = 9‬‬


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

‫;)‪pinMode(relay, OUTPUT‬‬
‫تحديد المنفذ رقم ‪ 9‬كمخرج لنتمكن من تشغيله‬
‫وايقافه‬

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

‫;)‪digitalWrite(relay,HIGH‬‬
‫تشغيل المنفذ رقم ‪ 9‬ليعطينا ‪ 5‬فولت ليعمل الريالي‬

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

‫;)(‪Serial.println‬‬
‫ارسال ما بداخل القوسين عن طريق السيريال لنقرأه‬
‫من الكمبيوتر (لنرسل جملة أو كلمة يجب وضعها‬
‫“)‬ ‫داخل هذه العالمتين “‬
‫‪113‬‬ ‫أساسيات األردوينو‬

‫تمار ين‪:‬‬

‫‪ .1‬ما الفرق بين الترانسيستور والموسفت؟‬

‫‪ .2‬لماذا نستخدم دائرة درايفر؟‬

‫‪ .3‬ماهي مميزات وعيوب كل من‪:‬‬

‫‪ .a‬الترانسيستور‪.‬‬

‫‪ .b‬الموسفت‪.‬‬

‫‪ .c‬الريالي‪.‬‬
‫‪114‬‬ ‫أساسيات األردوينو‬

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


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

‫حساس درجة الحرارة ‪LM35‬‬

‫ماذا يعمل المشروع‪:‬‬

‫يظهر درجة الحرارة على الكمبيوتر عن طريق قراءة الحساس وتحويل القيمة إلى درجة مئوية‪.‬‬

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

‫‪ 150‬درجة مئوية فقط‪.‬‬

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو أونو‪.‬‬

‫✓ كيبل للبرمجة‪.‬‬

‫✓ لوحة تجارب (بريد بورد)‪.‬‬

‫✓ حساس ‪LM35‬‬
‫‪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‬‬ ‫أساسيات األردوينو‬

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

‫;)‪Serial.begin(9600‬‬
‫تحديد سرعة التخاطب عن طريق السيريال وبدأها‬

‫;)‪float reading = analogRead(A0‬‬


‫إنشاء متغير يقبل األعداد الكسرية ونسميه ‪reading‬‬
‫نحفظ فيه قيمة القراءة من المنفذ‪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‬‬
‫ارسال درجة الحرارة عن طريق السيريال‪.‬‬

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

‫حساس المطر‬

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

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

‫إلى الثانية‪.‬‬

‫كلما زاد الماء زادت قوة اإلشارة‪.‬‬

‫ماذا يعمل المشروع‪:‬‬

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

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫✓ حساس مطر أو حساس ماء‪.‬‬

‫✓ مقاومة متغيرة‪.‬‬

‫✓ لوحة تجارب ‪.Breadboard‬‬

‫✓ أسالك ذكر‪-‬ذكر‪.‬‬

‫✓ قليل من الماء‪.‬‬
‫‪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 ‫ارسال قيمة‬
.‫قراءتها عن طريق الكمبيوتر أو غيره‬
‫‪122‬‬ ‫أساسيات األردوينو‬

‫∞∞∞‬

‫حساس رطوبة التربة‬

‫طريقة عمل المشروع‪:‬‬

‫الحساس له طرفين غير متصلين كهربيا‪.‬‬

‫ندخل الطرفين في التربة‪.‬‬

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

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

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

‫القطع المطلوبة‪:‬‬

‫‪ .1‬أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫‪ .2‬حساس التربة‪.‬‬

‫‪ .3‬مقاومة متغيرة أو قطعة الحساس المساعدة‪.‬‬

‫‪ .4‬لوحة تجارب ‪.Breadboard‬‬

‫‪ .5‬أسالك ذكر‪-‬ذكر‪.‬‬

‫‪ .6‬أرض زراعية أو مركن زراعي‪.‬‬


‫‪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‬‬
‫نعرف متغير ‪ float‬يقبل األعداد الكسرية ونسميه‪reading.‬‬

‫;)‪Serial.begin(9600‬‬
‫بدأ اإلرسال واإلستقبال عن طريق السيريال بسرعة ‪ 9600‬بت في الثانية‪.‬‬

‫;)‪readSensor(0‬‬
‫هذا األمر سيقوم بنداء الدالة ‪ function‬التالية‪:‬‬

‫;)‪void readSensor(int pin‬‬

‫سيعطي قيمة ‪ pin‬الرقم ‪0‬‬

‫ثم سينفذ البرنامج داخلها‪.‬‬

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

‫قراءة مقاومة ضوئية‬

‫ماهي المقاومة الضوئية؟‬

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

‫مئات فقط (حسب شدة الضوء)‪.‬‬

‫القطع المطلوبة‪:‬‬

‫‪ .1‬أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫‪ .2‬مقاومة ضوئية‪.‬‬

‫‪ .3‬مقاومة ‪ 10،000‬أوم‪.‬‬

‫‪ .4‬لوحة تجارب ‪.Breadboard‬‬

‫‪ .5‬أسالك ذكر‪-‬ذكر‪.‬‬
‫‪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‬‬ ‫أساسيات األردوينو‬

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

‫)‪if (reading > 700‬‬


‫} {‬ ‫إذا كانت قيمة ‪ reading‬أكبر من ‪ 700‬نفذ ما بين‬
‫األقواس‪.‬‬

‫> ‪else if (reading < 700 && reading‬‬


‫)‪300‬‬ ‫وإال إذا كانت ‪ reading‬أصغر من ‪ 700‬و أكبر من ‪300‬‬
‫{‬ ‫نفذ ما بين األقواس‪.‬‬
‫}‬

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

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

‫شاشة ‪LCD‬‬

‫ماذا يعمل المشروع‪:‬‬

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

‫طريقة عمل المشروع‪:‬‬

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

‫فبدال من أن نكتب أوامر كثيرة‪ ،‬سنكتب سطرين أو ثالثة فقط لوجود المكتبة)‪.‬‬

‫نستطيع تحميلها من اإلنترنت وهي متوفرة لحساسات عديدة‪.‬‬

‫الشاشة لها ‪ 16‬منفذ موضحة كما في الصورة أدناه‪:‬‬


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

‫القطع المطلوبة‪:‬‬

‫✓ أردوينو أونو ‪ +‬كيبل للبرمجة‪.‬‬

‫✓ شاشة ‪.1602‬‬

‫✓ مقاومة متغيرة ‪.Potentiometer – 10k‬‬

‫✓ مقاومة ‪ 220‬أوم‪.‬‬

‫✓ لوحة تجارب ‪.Breadboard‬‬

‫✓ أسالك ذكر‪-‬ذكر‪.‬‬
‫‪132‬‬ ‫أساسيات األردوينو‬

‫استخدام المكتبة لتسهيل برمجة الشاشة‪:‬‬

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

‫‪http://playground.arduino.cc/uploads/Main/LiquidCrystal_1.zip‬‬

‫ثم نضيفها إلى برنامج األردوينو كالتالي‪:‬‬

‫‪Sketch → Include library → Add .zip library‬‬

‫ونختار الملف الذي حملناه‬

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

‫<اسم المكتبة>‪#include‬‬
‫>‪#include <LiquidCrystal.h‬‬
‫‪133‬‬ ‫أساسيات األردوينو‬

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

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

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

‫‪GND‬‬ ‫‪1‬‬

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

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

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

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

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

‫فارغ‬ ‫‪10 ,9 , 8 ,7‬‬

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

‫‪GND‬‬ ‫‪12‬‬

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

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

‫‪5volt‬‬ ‫‪15‬‬

‫‪GND‬‬ ‫‪16‬‬

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

:‫الكود‬

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

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

void loop()
{
}
‫‪137‬‬ ‫أساسيات األردوينو‬

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

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

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


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

‫;)‪lcd.begin(16, 2‬‬
‫نحدد عدد الصفوف واألعمدة في شاشتنا بما أن‬
‫شاشتنا ‪x2 16‬فسنكتب ‪2 ,16‬‬

‫)"!‪lcd.print("hello, world‬‬
‫طباعة هذه الجملة على الشاشة‪.‬‬

‫“‬ ‫يجب أن تكون بين هذه العالمتين "‬

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

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

‫جهاز انذار باستخدام الليزر‬

‫ماذا يعمل المشروع‪:‬‬

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

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

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

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

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

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


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

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

‫القطع المطلوبة‪:‬‬

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

‫✓ ليزر‪.‬‬

‫✓ مقاومة متغيرة بالضوء "‪.”LDR‬‬

‫✓ طنان "‪ ”Buzzer‬يفضل من نوع ‪.Active‬‬

‫✓ مقاومة ‪ 220‬أوم أو حولها‪.‬‬

‫✓ ‪.LED‬‬

‫✓ أسالك للتوصيل‪.‬‬

‫✓ لوحة تجارب "‪.”Breadboard‬‬


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

:‫الكود‬

int sensorValue = 0;
int laser = 12;
int buzzer = 8;
int 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);
}

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

‫حساس الرطوبة والحرارة‬

‫ماذا يعمل الحساس؟‬

‫الحساس يقيس حرارة الجو بالمقياس المئوي ويقيس رطوبة الجو‪.‬‬

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

‫لهذا سنستخدم مكتبة جاهزة لهذا الحساس‪.‬‬

‫فائدة المكتبات (‪)Library‬‬

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

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

‫القطع المطلوبة‪:‬‬

‫أردوينو أونو ‪ +‬كيبل للبرمجة‬

‫حساس الرطوبة والحرارة ‪ DH11‬أو ‪ DH22‬أو ‪DH21‬‬

‫لوحة تجارب ‪Breadboard‬‬

‫أسالك ذكر‪-‬أنثى‬

‫قد تحتاج مقاومة ‪ k10‬أوم‪.‬‬


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

‫خطوات تحميل المكتبة‪:‬‬

‫‪ .1‬نفتح برنامج األردوينو‬

‫‪ .2‬نضغط أعلى البرنامج على‪:‬‬

‫‪Sketch → Include Library → Manage Libraries‬‬

‫‪ .3‬نبحث عن المكتبة باسم ‪DH11‬‬

‫‪ .4‬نختار أحدث إصدار ونحملها ‪Install‬‬

‫اآلن عندما نريد استخدام المكتبة نكتب أعلى البرنامج األمر التالي‪:‬‬

‫>‪#include <dht.h‬‬

‫نحدد رقم المنفذ الديجيتال الذي سنقرأ منه ونوع الحساس الذي نستخدمه (اخترت ‪ D7‬يمكنك اختيار ما تريد)‬
‫;)‪DHT dht(7, DHT11‬‬

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


‫;)(‪dht.begin‬‬
‫‪145‬‬ ‫أساسيات األردوينو‬

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

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

‫يوصل مع ال‪ 5‬فولت‪.‬‬ ‫منفذ الحساس األيمن‬

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


‫تحديده في البرنامج)‬

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


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(7, DHT11‬‬


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

‫;)(‪dht.begin‬‬
‫بدأ قراءة الحساس‪.‬‬

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

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

‫;)(‪h = dht.readHumidity‬‬
‫قراءة الرطوبة من الحساس‪ ،‬وحفظها في المتغير‬
‫‪h‬‬

‫;)(‪t = dht.readTemperature‬‬
‫قراءة درجة الحرارة من الحساس واعطاءها للمتغير ‪t‬‬

‫;)‪Serial.println(h‬‬
‫ارسال قيمة ‪ h‬عن طريق السيريال‪.‬‬

‫;)‪Serial.println(t‬‬
‫ارسال قيمة ‪ t‬عن طريق السيريال‪.‬‬
‫‪148‬‬ ‫أساسيات األردوينو‬

‫تمارين‬

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

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

‫‪ .3‬اصنع جهاز انذار مبتكر باستخدام الليزر واألردوينو‪.‬‬


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

You might also like