Professional Documents
Culture Documents
أردوينو جيم تو
أردوينو جيم تو
الكتاب مجاني لالستخدام الشخصي فقط _ وال يـُـسمح للجهات التعليمية استخدامه
أو طباعته بال موافقة المؤلف
2
الصفحة الموضوع
16 الفرق بين اإلشارات الرقمية و التماثلية +طرق تشغيل األردوينو +حساب التيار
18 موديالت األردوينو المختلفة (من الشركة األصلية ،و من الشركات األخرى)
26 الباب الثاني :البرمجة +طرق برمجة األردوينو IDE , Create , Tinker
81 الباب الثالث :إلكترونيات (أهم العناصر ،لوحة التوصيل ،المخططات ،المحاكاة)
100 مقاومة رفع الجهد و مقاومة خفض الجهد pull up/down resistor
111 الباب الرابع :المكتبات و لغة - C++تضمين مكتبة ،تعريف كائن object
سوف نبدأ بوضع األوامر األساسية والشائعة في برمجة األردوينو مع شرح مختصر في جداول لتكون
مرجعا لك أثناء البرمجة .كتاب برمجة األردوينو الفعلي يبدأ عند الصفحة ( ) 9
أساسيات كود األردوينو Sketch
4
} … { )(void setup كل األوامر داخل األقواس { }...سيتم تنفيذها مرة واحدة
في بداية تشغيل الكود
} … {)( void fun1المنطقة أسفل دالة void loopتستخدم لكتابة دوال جديدة
} … { ) int fun2(int xعادة
و تكتب عادة في جزء الـ سيتاب تحديد عمل المنافذ الرقمية (13-0دخل /خرج )
} … {) (void setup
;)pinMode(13,OUTPUT تهيئة الطرف رقم 13ليكون مخرج
الحظ أن األطراف 3,5,6,9,10,11تقبل الخرج التماثلي
;)digitalRead(13 يقرأ الحالة الرقمية على الطرف ، 13و تكون 0أو 1
;)analogRead(A0 يقرأ قيمة الجهد على مدخل تماثلي و يكون الناتج 1023-0
;const int m=7 إذا كانت قيمة المتغير لن تتغير أثناء عمل الكود (غير ضروري)
;static int n=10 تعريف متغير في loopبدون أن يعيد وضع قيمة لنفسه كل دورة
; float y =16.25 متغير يحمل رقم كبير و يقبل الفاصلة العشرية 15.78
( )4B_4B-مالحظة يجب كتابة 5.0وليس 5فقط .
;long var = 123456789 متغير يحمل رقم كبير (يستخدم 4بايت) 2B-إلى 2B
;unsigned long X=120000000 متغير يمكنه حمل رقم كبير 0إلى 4.3بليون
;) constrain(x,0,100 إذا تجاوزت قيمة xالحدود 0و 100فإن األمر يعيد القيمة لتبقى
داخل الـنطاق المطلوب
تــمـهــيــد 😐
عـدد محـدد من األفكار أو المشاكل التي يمكنك حلها باألردوينو ،،،فقط تأمل حولك اليوجـد
وستجد عشرات أو مئات المشاكل التي يمكن حلها أو تحسينها باستخدام المتحكمات اإللكترونية.
مشاكل في المنزل ،في السيارة ،في المصانع ،في الحدائق وغيرها الكثير …
ما هو الحساس المناسب؟ ماهـو الفعل المناسب؟
وعادة ستجد األردوينو يربط المكونات المختلفة و يقوم بالتحكم اإللكتروني الالزم.
سأحاول في هذا الكتاب أن أسير معك خطوة بخطوة حتى تفهم و تستفيد من قدرات (األردوينو) الرائع
9
أنا اآلن في األسطر األولى من الكتاب ،لكن يظهر لي أن الكتاب سيكون طويل …
✌👍👌
عفواً … كنت أجرب اإليموجي في هذا البرنامج … أتمنى أن تستمتع معي في هذا الكتاب.
مع األردوينو ومع القليل من اإللكترونيات ستتمكن من تنفيذ مشاريع إلكترونية أو كهربائية تقوم بأعمال
رائعة كثيرة مثل :التحكم باإلضاءة أو تحريك األشياء بالمحركات المناسبة أو تشغيل شاشة بسيطة أو إصدار
صوت أو الوصول لالنترنت...
سهولة استخدامه و انخفاض تكلفته و موثوقيته جعلته ينتشر بسرعة حول العالم .السبب اآلخر النتشار
األردوينو أنه (مفـتـوح المصدر) وهذا يعني أن أي شركة بإمكانها تصنيع األردوينو و تطوير الملحقات
الخاصة به بدون أي تعقيدات وحقوق ملكية.
المايكروكنترولر Microcontroller :هو شريحة إلكترونية
تجمع معظم مكونات الكمبيوتر في شريحة بسيطة واحدة
(معالج ،ذاكرة ،مواجهة دخل و خرج)
المايكروكنترولر ال يتمكن من تشغيل التطبيقات المتقدمة مثل
الكمبيوتر _ فوتوشوب أو ايتيونز مثالً
المنافـذ الرقمية عددها 14منفـذ … وهي مرقمة ( ) 13 - 0ويمكنك في الكود تحديد عمل كل منفذ
عندما تعمل المنافذ كمخارج ؛ يمكنك حسب كتابة الكود إخراج 5vأو 0v
كما يمكنك جعل هذه المنافذ تعمل كمداخل رقمية (الستشعار حالة زر مثالً)
المنـفـذ الرقمي يمكن أن يم ّد الحمل (الشيء المتصل بالمنـفـذ ) بـ 5vو أمبير . 20mAهذا التيار
مناسب لتشغيل مبين ضوئي LEDلكنه بالتأكيد ال يكفي لتشغيل محرك.
يوجد مبين ضوئي LEDصغير بجانب المنفذ 13وهو يعمل عندما يكون المنفذ Hi 13
استخدام المنفذ 13أصعب كدخل ،و ذلك بسبب الـ LEDالمتصل معه ،حاول استخدام منفذ آخر.
المنفذ GNDيعمل كأرضي للدائرة اإللكترونية 0v
العالمة ∿ تعني أن هذا الطرف يصلح إلخراج قيمة جهد تماثلية .ويسمى أيضا ً PWM
المنفذين( )0,1يسميان TX , RXويستخدمان للتواصل مع الكمبيوتر (مالحظة :إذا استخدمت األمر
Serial.beginفي الكود فال يمكنك استخدام المنفذين 0,1كمنافذ رقمية)
المنفذ AREFنادر االستخدام ويستخدم لضبط أعلى قيمة في نطاق الجهود للمداخل التماثلية ()5v-0
15
بعد تشغيل األردوينو و توصيل الطاقة المناسبة له ،يمكنك أن تستخدم هذه المجموعة لتمد دائرتك
اإللكترونية بالطاقة المناسبة ( 5vأو ) 3.3vالطرفين GNDتسمى األرضي و جهدها 0v
الحظ أيضا ً يمكنك أن تم ّد األردوينو بالطاقة عبر توصيل جهد مناسب ( ) 7v - 12vإلى الطرف Vin
كما يمكنك أن تعمل Resetإعادة تشغيل لألردوينو عبر استخدام المنفذ Reset
(لعمل هذا :وصل المنفذ resetبـ ) GND
عددها )A0-A5( 6و يمكنها قياس الجهد (تماثلياً) _ ويكون التعامل معها بتوصيلها مع السلك المطلوب
قياس الجهد عنده ،ثم التحكم بها في البرنامج .
مالحظة :يمكن استخدام هذه األطراف كمداخل رقمية أو مخارج رقمية .سنشرح الحقاً.
16
;)digitalWrite(13,1
;)analogWrite(3,127
األردوينو أونو يسحب 45mAعادة .لكن كلما شغلت ملحقات أكثر فإن سحب التيار سيزيد
(مثالً إضاءة ،صوت ،مرحالت…)
يختلف األردوينو ميغا عن األونو بأن له مداخل و مخارج أكثر بكثير والجميل أن الجهة اليسرى من اللوحة
تتشابه مع األونو ،و هذا يجعل من السهل استخدام نفس البرنامج ،وتوصيل األسالك بنفس الطريقة .أيضا
هذا يتيح استخدام نفس الدوائر اإلضافية التي تعمل على األنواع الشائعة من األردوينو .
*مقارنة بين األردوينو أونو و األردوينو ميغا UNO vs MEGA
األبعاد cm EEPROM ذاكرة RAM ذاكرة الكود المداخل التماثلية المنافذ الرقمية موديل األردوينو
األردوينو دوو يتشابه مع الميغا في الحجم و عدد المنافذ .لكنه يحتوي معالج مختلف يعمل بسرعة أعلى (
)84MHzكما أنه يعمل على جهد 3.3vوليس 5vمثل األنواع الباقية من األردوينو .هذا يجعل
بعض الدوائر اإلضافية ال تعمل على األردوينو دوو.
في بعض التطبيقات ستحتاج لتصغير الدائرة قدر اإلمكان .توجد موديالت عديدة صغيرة الحجم من
األردوينو .و عيبها هو صعوبة استخدام الدوائر اإلضافية Shieldsالمعتادة معها.
(مالحظة هنا سنضع منتجات شركة أردوينو األم .لن نضع األنواع التي تنتجها شركات أخرى)
أردوينو مايكرو Micro
األبعادmm 18 * 48 :
المنافذ الرقمية _ 20 :منها pwm 7
المداخل التماثلية12 :
جميع أنواع األردوينو الرسمية (من الشركة األم ) اذهب إلى موقع Arduino.cc لمشاهدة
Arduino.cc >> products
أو اضغط على الرابط هنا
في الصورة أسماء أشهر أنواع األردوينو _ فقط اضغط على اسم الموديل وستفتح صفحة فيها كل
المعلومات التي تحتاجها عن هذا الموديل ( باللغة اإلنجليزية طبعا ً 😌)
24
redbearlab.com
شركة تطور بوردات مدمج معها بلوتوث ومتوافقة
مع تطبيق للهواتف الذكية (تشكيلة رائعة تستحق
االهتمام)
شاهد فيديو
nodemcu.com
شركة تصنع بوردات أردوينو يكون مدمج معها
وايفاي
شاهد فيديو
25
etherTen
بورد أردوينو مدمج معه مدخل شبكة ethernet
ومدخل ذاكرة SD card
شاهد فيديو
Particle Photon
بورد أردوينو تم تطويره بحجم صغير مدمج معه
وايفاي
شاهد فيديو
Adafruit Trinket
تشكيلة من بوردات األردوينو الصغيرة جداً و
تستحق االهتمام
شاهد فيديو
26
teensy
تعمل على تصنيع عدد من البوردات المتنوعة
عادة بسرعات عالية وإضافات مدمجة عديدة
معظمها تعمل على 3.3vوليس 5v
شاهد فيديو
*في هذا الكتاب لن نتمكن من تغطية األنواع المختلفة الكثيرة جدا من أنواع
األردوينو من الشركات المطورة .سنكتفي بالتركيز على بوردات األردوينو
المصممة من الشركة األم الشركة األولى ARDUINOو بالتحديد
Arduino UNOألن له ميزة رائعة جداً سنتحدث عنها الحقا ً
💖
27
تمهيد لفهم البرمجة :جميع الكمبيوترات و الهواتف الذكية تعمل ببرامج (كود)
البرامج (األكواد) هي نصوص مكتوبة تم كتابتها من قبل مبرمجين لتـقـوم بعمل معين.
البرمجة تختلف عن استخدام التطبيقات بالفأرة أو بلمس شاشة جوالك .البرمجة هي كتابة أسطر من
األوامر بلغات وسيطة بين اإلنسان و الكمبيوتر .و هذه العملية ليست بسهولة استخدام شاشة اللمس أبداً
البرمجة :هي كتابة سلسلة من األوامر لينفذها الكمبيوتر
اذا كانت لديك خلفية بسيطة في البرمجة ستعرف أنه توجد لغات برمجة كثيرة مثل:
Java , Python , HTML , Objective-C
توجد طريقة أخرى رائعة و أحبها كثيراً وهي استخدام األردوينو افتراضيا ً 🙊
(على موقع انترنت وليس وجوده فعليا ً معك)
هذه الطريقة سهلة ،سريعة ،وال تكلف شيئا ً فقط أنشيء حسابا ً وابدأ في استخدام معمل اإللكترونيات
االفتراضي مجاناً .الموقع من تطوير شركة :
في الحقيقة أنا استـفـدت كثيراً من هذا الموقع كمعمل إلكترونيات رائع ،و كمبرمج لألردوينو .أتمنى أن
تستمتع باستخدامه .شكرا ً 🙏 autodesk
مالحظة :ال يمكننا شرح استخدام البرنامج في هذا الكتاب ،لكننا سنشرحه في دورة فيديو على jeem2
30
تعتبر الواجهة سهلة االستخدام و قليلة الخيارات .تأمل في الصورة وستالحظ ذلك.
31
لن أشرح كل قائمة ،كل خيار كل زر هنا .استكشفها بنفسك .سأذكر أهم األزرار هنا فقط.
نصيحة :قبل البدء بكتابة الكود اذهب لـ Toolsواختر الموديل (مثال )UNO
و تأكد من ظهور رقم واختياره عند الـ port
32
على اليمين يفتح شاشة السيلاير .هذه طريقة تواصل بين الكمبيوتر كما ذكرنا سابقا ً … الرمز
واألردوينو .يمكنك استقبال أرقام و عبارات من األردوينو .و يمكنك أيضا ً إرسال أرقام وعبارات في
المربع بجانب الزر Send :
الحظ الخيار في األسفل )baud 9600( :يحدد سرعة التراسل مع األردوينو .معظم أنواع األردوينو
تتراسل بسرعة 9600
سوف نحل الكثير من األمثلة في دورة الفيديو المرافقة للكتاب ونستخدم الشاشة كثيراً .
اذا طلبت مني برمجة أردوينو اليوم فإني أفضل برمجتها باستخدام أداة البرمجة المتوفرة أونالين
arduino-Createالواجهة أكثر تنظيما ً ،الوصول للمكتبات أسهل .وجميع األكواد مخزنة مع
حسابك و يمكنك الوصول لها من أي كمبيوتر متصل باالنترنت .أيضا ً يمكنك تغيير األلوان لتكون غامقة و
مريحة للعين أكثر.
فقط اذهب لموقع األردوينو Arduino.ccوستجد رابط
Arduino >> software >> web editor
سيطلب منك انشاء حساب ،و تثبيت ملف صغير على الكمبيوتر .الواجهة سهلة .إذا كنت تعرف العمل
على البرنامج العادي Arduino IDEفستحتاج لدقائق لالعتياد على الواجهة الجديدة.
القسم األول :سـتـتـنـقـل بين األكواد التي كتبتها ،و األكواد (األمثلة) و إضافة المكتبات وفتح شاشة
السيلاير ،و خيارات العرض و المساعدة.
القسم الثاني :سترى فيه تفاصيل القسم األول :جميع األكواد ،جميع األمثلة ،البحث عن المكتبات
وإضافتها ،وهكذا.
القسم الثالث :هنا ستكتب الكود و بإمكانك إدراج ملف كتابي أو صورة خاصة بمشروعك 😀 رائع
انظر مثال ُ إلى هذه األسطر 👀 :ربما تكون هذه األسطر أسهل و أشهر برنامج (كود) لألردوينو
إنه كود الوميض ( ) BLINKوإذا رفعته إلى األردوينو ستجد أنه يقوم بالوميض مثل الصورة.
{)(void setup
} ;)pinMode(13,OUTPUT
{)(void loop
;)digitalWrite(13,HIGH
;)delay(500
;)digitalWrite(13,LOW
;)delay(1000 }
أوال ً :ال يمكن أن يقبل األردوينو أي كود بدون أن يحتوي على الجزئين التاليين-:
void { ) (setup }
void { ) ( loop }
36
و void loopضرورية و مفيدة بحيث يتم تقسيم void setup والعبارتين السابقتين
الكود منطقيا ً إلى قسمين.
الجزء األول يكون بين األقواس { } بعد عبارة setup
وهذه األوامر سوف يتم تنفيذها مرة واحدة فقط عند بداية التشغيل.
الجزء الثاني يكتب بين القوسين { } بعد العبارة loop
هذه األوامر يتم تنفيذها بشكل متكرر طوال فترة تشغيل األردوينو.
لقد فهمت الكود األول وبإمكانك تجربته على األردوينو و التالعب بزمن التأخير للتحكم مبروك !!
بالسرعة جرب مثال ( )300بدل ( )1000والحظ الفرق .افرح فأنت اآلن تبرمج ...
اآلن لن نبني برنامج من جديد ،لكننا سنتعلم من مثال موجود و مخزن مع البرنامج .اتبع الخطوات لفتح
الكود:
File >> Examples >> basics >> Blink
-2أخطاء منطقية Logic bugs :وهي أخطاء تجعل الكود ال ينفذ العمل المطلوب ،مع أن قواعد
الكتابة صحيحة.
39
يتفق معظم المبرمجين حول العالم على بعض العادات التي تجعل الكود أسهل للقراءة و الفهم .فالهدف
ليس أن يعمل الكود وحسب ،بل أن يكون واضحا ً ألي مبرمج آخر أن يراه و يفهمه ثم يعدل عليه .ومن
هذه العادات األخالقية عند البرمجة:
{)(void setup
} ;)pinMode(13,OUTPUT
{)(void loop
;)digitalWrite(13,HIGH
;)delay(1000
;)digitalWrite(13,LOW
;)delay(1000 }
الكود الماضي قصير جدا ً -2تعريف المتغيرات الهامة أعلى الكود ☝-:
لكن الحال لن يكون هكذا دائما ً .ينصح المبرمجين بتعريف متغير في أعلى الكود يحتوي القيم التي يمكن
تغييرها للتحكم بطريقة التشغيل .هذا يسهــّــل التعامل مع الكود في المستقبل من أي شخص.
في الكود الماضي ،الطرف الذي يومض هو ، 13و التأخير هو ثانية واحدة .
40
هـــل تشعر أنك فهمت الكود السابق بشكل جيد (كود الوميض) ؟
في األكواد السابقة … الحظ وجود ( ) intقبل تعريف كل متغير .للمتغيرات أنواع كثيرة أشهرها
intوهو لتعريف متغير ( )variableيحمل رقم صحيح (بدون فاصلة عشرية) ويمكن أن تكون قيمته
32767بالموجب أو بالسالب .في معظم األكواد ستستخدم متغيرات من نوع intوسنشرح األنواع
األخرى مع األمثلة القادمة .في الجدول التالي أشهر أنواع المتغيرات التي قد تحتاج لها
عدد البايتات االستخدام نوع المتغير
2 متغير يكون فيه قيمة (رقم) تكون 32700-إلى ( 32700+تقريباً) int
4 متغير يقبل قيمة عددية كبيرة ويقبل الفاصلة العشرية ()-/+ float
;float z=10.12
1 متغير يحمل حالة من حالتين فقط ( 0أو ) LOW , HIGH( )1 bool
;bool x=LOW
مالحظة :إذا كنت قد درست البرمجة في الحاسب سابقا ً و ربما لغة Cيوجد بعض االختالفات في أحجام
المتغيرات بين األردوينو و الكمبيوتر العادي .مثال intفي الكمبيوتر تستهلك Bytes-4وليس 2فقط
قسم Data types اذهب للصفحة :هــــــــنا لمشاهدة جميع أنواع المتغيرات
const intفي بعض األكواد ستالحظ كتابة عبارة ( ) constقبل نوع المتغير … ال
تقلق كل المقصود أن قيمة المتغير هذا ستبقى ثابتة طوال عمل الكود و لن تتغير و في حالة أنك كتبت الكود
بدونها فلن تؤثر على طريقة عمل البرنامج.
unsigned longمعظم المتغيرات السابقة (مثل intأو ) longتقبل قيم موجبة أو
سالبة (مثالً 500أو 2050-يمكن أن تكون قيم لمتغير )intو لكن في بعض التطبيقات نكون متأكدين
أن القيمة لن تكون سالبة بأي حال .كما نريد اإلستفادة القصوى من مساحة الذاكرة .فنستخدم عبارة
unsignedقبل نوع المتغير
مثال :المتغير longيمكنه تخزين رقم يصل إلى 2بليون تقريبا ً
بينما المتغير unsigned longيمكنه تخزين رقم يصل إلى 4بليون تقريبا ً
في بعض التطبيقات (مثل حساب الزمن بالمايكرو ثانية) نحتاج إلى تخزين قيم كبيرة جدا ً و يستحسن
استخدام unsigned longفي هذه الحالة.
static intليس من الشائع مشاهدة هذا النوع ( ) staticلكنه مفيد في حاالت نادرة .
مثل تعريف المتغير داخل حلقة بدون أن يعيد تعيين قيمته في كل دورة .
44
ترميز ASCII
نحتاج كثيرا جداً الستخدام الحروف والكلمات (وليس األرقام فقط) تم اإلتفاق عالميا على نظام ترميز
يستخدم بايت واحد ( 8بت) للتعبير عن جميع الرموز المستخدمة في الكتابة (باللغة االنجليزية)
فعندما تخزن المتغير بالطريقة التالية
char ;’x=’w
في الحقيقة أنت تضع فيه القيمة 119فقط !!
في بعض التطبيقات تتسبب بمشكلة فالرقم 5بنظام ASCIIيتم تخزينه !!! 53 :
في بعض الحاالت (عادة داخل القسم ) void loopنقوم بتعريف متغير محلــّــي local variable
ليعمل كعداد مثال ً :
{)(void loop
;int x=0
;) Serial.print( x
} ;x++
قد تتوقع أن الكود سيطبع على الشاشة العد .....,0,1,2,3لكن في الواقع سيظهر .....,0,0,0,0
السبب أنه في كل مرة يتكرر تنفيذ الحلقة سيعاد إنشاء المتغير وإعطائه القيمة ! 0
أقصر حل لهذه المشكلة هو جعل المتغير من نوع static intهذا سيجعل قيمة المتغير تتحدد
في أول مرة بـ 0و في باقي الدورات يحافظ المتغير على قيمته وال يعود للقيمة . 0
في حالة وجود متغير عام بإسم xو متغير محلي بإسم xفإنه داخل الدالة سيتم استخدام المتغير المحلي ،
و خارجها سيستخدم المتغير العام .هذه الطريقة مفيدة كثيرا عند استخدام دوالfunctions .
;int x=10
} … {)(void setup
} … {)(void loop
{ )(void fun
} ;int x=5
x=10 بينما خارجها ،تكون قيمة داخل الدالة fun :تكون قيمة x=5
أتمنى أن الفكرة اتضحت
46
مهم جدا وهو يعمل على تنفيذ مجموعة أوامر فقط إذا تحقق الشرط بين األقواس( ) األمر if
قد يكون الشرح بالمثال أفضل و أسرع لذا شاهـد المثال التالي ثم سنشرحه: مثال -::
/* Blink , but when switch pressed = fast blink */
;int LED=13 حدد رقم المنفذ الذي سيتصل به الضوء//
;int SW=0 المنفذ الذي سيتصل بالمفتاح_الزر//
;int D1=700 التأخير الطويل//
;int D2=250 التأخير القصير//
{)(void setup
;)pinMode(LED,OUTPUT
تهيئة الطرف كمدخل مع استخدام مقاومة رفعpinMode(SW,INPUT_PULLUP);}//
{)(void loop
;)int x=digitalRead(SW
} ;if(x==0){ int D =D2 الزر سيرسل -صفر -عند الضغط عليه//
} ;else{int D=D1 أنشأنا متغير جديد لتسهيل الكود//
;)digitalWrite(LED,HIGH
;)delay(D
;)digitalWrite(LED,LOW
} ;)delay(D
يشبه برنامج الوميض السابق ،سوى وجود مدخل رقمي .في حال الضغط عليه تزيد سرعة الوميض.
--داخل ( )void setupتحديد عمل المنفذ ( 13تم تسميته )LEDليعمل كمخرج .و المنفذ ( 0تم
تسميته )SWليكون مدخل .الكلمة ( )PULLUPتربط الدخل بمقاومة داخلية وهذا مفيد ومشروح في
الكتاب (مقاومة الرفع والخفض ص)100
int x --داخل ( )void loopالحظ يمكن تعريف المتغيرات هنا .ال يلزم تعريفها في أعلى الكود.
الفكرة باختصار هي وضع قيمة D1أو D2في المتغير الجديد Dحسب حالة المفتاح.
ثم تنفيذ الوميض بقيمة التأخير .… Dأتمنى أنك فهمت الفكرة 😕
من وقت آلخر سأضع لك روابط لالستزادة (ليس ضروريا ً مشاهدتها)
شرح ألمر ( ) ifاضغط هنا شرح لألمر digitalReadاضغط هنا
إصدار صوت من الدائرة اإللكترونية من الطرق السهلة و الفعالة جداً للتنبيه .الحظ أن األردوينو غير
مصمم إلصدار أصوات معقدة مثل الموسيقى أو صوت كالم بشري .لكن بإمكانه إصدار نغمات مختلفة
باستخدام سماعة بسيطة مثل الصور السابقة.
تنقسم السماعات البسيطة إلى نوعين عموما ً :
● سماعات خاملة تحتاج إلشارة كهربائية مترددة حتى تصدر صوت
● سماعات نشطة :تحتاج لجهد مستمر DCفقط لتصدر صوت
معظم السماعات المستخدمة (واألفضل) هي السماعات الخاملة والتي يمكن التحكم بنغمة الصوت بتغيير
التردد.
● الحظ أن السماعة لها قطبية ( +و )-وصل السالب إلى األرضي و الموجب إلى أي منفذ رقمي.
● معظم السماعات البسيطة ( )buzzerتتصل مباشرة بمنفذ األردوينو سوى أن بعضها تتطلب وجود
مقاومة (يستحسن قراءة التعليمات للسماعة إذا وجدت)
يعمل على إصدار صوت من المنفذ 2بتردد 300هيرتزtone(2,300); //
;)noTone(2 يعمل على إيقاف النغمة على المنفذ //2
;)tone(2,300,500 يمكنك إضافة رقم ثالث يكون مدة النغمة بالمللي ثانية //
هـــــنـــــا جرب تشغيل أوامر الصوت في هذا الرابط:
تمرين :صمم أورغ بسيط جدا ً بـ 3أزرار أو _ 6بحيث كلما ضغطنا على زر يصدر نغمة مختلفة.
C=261 , D=293 , E=329, F=349 , G=392
49
هل تعرف الفرق بين اإلشارة الكهربائية الرقمية و اإلشارة الكهربائية التماثلية؟أتمنى أنك تعرف
إذا لم تكن تعرف ،ابحث في الفهرس عن القسم الذي يشرح الفكرة باختصار في هذا الكتاب (ص)16
معظم الحساسات في الواقع ترسل إشارات تماثلية (قياس الضوء ،الحرارة ،الصوت) في هذا المثال سوف
نقيس قيمة جهد تماثلي باستخدام مقاومة متغيرة .و يكون الخرج سماعة بسيطة .سوف يتغير الصوت
(التردد) حسب تغيير الجهد الداخل
*/عند تحريك ذراع المقاومة سيتغير الصوت (تردد الصوت) */
;int spkr=3 المنفذ الذي سيتصل بالسماعة//
{)(void setup
} ;)pinMode(spkr,OUTPUT
{)(void loop
;)int IN=analogRead(A0 هنا سنقرأ قيمة الجهد التماثلي عند المدخل//
هذا األمر سيصدر إشارة صوت على المنفذtone(spkr,IN+31); //3
;)delay(100
} ;)noTone(spkr
مثال لكود بسيط يجعل ضوء ( )LEDيضيء بشكل تدريجي ثم ينطفئ فجأة.
{)(void setup
};)pinMode(10,OUTPUT
51
void loop(){
for(int i=0;i<=255;i++){
analogWrite(10,i);
delay(30);}}
)شاهد تشغيل هذا الكود على المعمل االفتراضي (اضغط هنا
analogWrite شرح لألمر analogRead شرح لألمر : لالستزادة
RGB LED . متعدد األلوانLED استخدم اإلشارات التماثلية للتحكم بلون: 😏 تطبيق خفيف دم
يشبه األمر السابق سوى أنه يستخدم عندما تكون تعرف عدد الدورات التي تريد تنفيذها األمر for
)for(int i=10 ; i>0 ; i--
} … {
وسوف ينفذ األوامر بين األقواس { } عشر مرات و تكون قيمة المتغير ( ) iهي العداد الذي يعد من
10إلى 0
مثال :نود جعل جميع المنافذ مخارج ثم نود تشغيل 5نغمات صوتية.
{)(void setup
}};)for(int i=0;i<14;i++){pinMode(i,OUTPUT
;int z=1
};while(z<6){tone(10,300,200); delay(500);z++
تمرين :صمم كود يعمل على إظهار 10ومضات سريعة ثم 3بطيئة باستخدام األمر for
تمرين :قراءة مقاومة متغيرة إذا كانت القراءة أعلى من 200يصدر صوت ،إذا كانت أقل يعمل وميض
عادي _ استخدم األمر while
53
54
تحدثنا سابقا ً عن شاشة السيلاير كفكرة لكننا لم نتحدث عن األوامر التي ستحتاجها للتعامل مع شاشة
السيلاير .باختصار هي أداة على الكمبيوتر (توجد في برنامج Arduino IDEأو ) Arduino Create
تعمل على التواصل مع األردوينو أثناء تشغيله و يمكنك استخدامها لعرض معلومات من األردوينو إلى
شاشة الكمبيوتر (مثال قيم المتغيرات) أو إرسال أرقام من الكمبيوتر إلى األردوينو (أثناء تشغيله) هي
مفيدة جدا جدا بالذات في مرحلة التشغيل التجريبي للكود و تساعدك كثيرا على تتبع قيم المتغيرات أثناء
عمل البرنامج.
مالحظة :عند استخدام شاشة السيلاير فإن األردوينو يستخدم المنفذين الرقميين 0،1للتواصل مع الحاسب،
لذا ال يمكنك استخدامهما كمنافذ في هذه الحالة.
األوامر األساسية إلظهار كتابة أو قيمة على شاشة السيلاير هي:
;)Serial.begin(9600 قبل استخدام شاشة السيلاير يجب إعطاءها أمر البدء
العدد 9600هي سرعة التراسل وال تقلق نفسك باألمر كل بوردات
األردوينو تعمل بهذه السرعة _ماعدا قليل تجد تفصيلها في الموقع
=char x هذا األمر يعمل على قراءة بايت واحد تم ارساله من
;)(Serial.read المستخدم ،يقرأ البايت كترميز ASCIIفإذا أرسل
}if (x==’y’){... المستخدم 1فإن القيمة التي ستتخزن هي
' '1وهي نفسها 49
;)(int x=Serial.parseInt قراءة عدد ووضعه في متغير من نوع int
=float y قراءة عدد و وضعه في متغير من نوع float
;)(Serial.parseFloat
=String z قراءة عبارة من المستخدم و وضعها في متغير من
;)(Serial.readString نوع String
مثال :الكود التالي يطلب رقم من المستخدم يكون عدد ثواني التأخير لتنفيذ وميض.
;float d
{)(void setup
;)serial.begin(9600
;)pinMode(13,OUTPUT
;)” Serial.println(“please enter the delay time ex:0.5
}{)while(Serial.available()==0
57
} ;)(float d=Serial.parseFloat
{)(void loop
;)digitalWrite(13,1
;)delay(d*1000.0
;)digitalWrite(13,0
} ;)delay(d*1000.0
في التمرين التالي سنحاول استخدام حلقة whileو حلقة forو شاشة السيلاير -:
عمل الكود هو سؤال المستخدم عن عدد الومضات و سرعتها .و بعد ادخال المستخدم لهذه القيم ،سيتم
تنفيذها ثم سؤاله مرة ثانية و هكذا.
;int led = 12
{ )(void setup
;)pinMode(led, OUTPUT
;)Serial.begin(9600 تشغيل التراسل مع شاشة السيريال} //
{ )(void loop
اظهار رسالة على الشاشةSerial.println("how many blinks? ");//
التوقف وانتظار دخل من المستخدمwhile(Serial.available()==0){}//
ينقل الرقم من المستخدم إلى متغيرint n=Serial.parseInt(); //
;)" ?)Serial.println("what is the delay in (ms
}{)while(Serial.available()==0
;)(int d=Serial.parseInt
{)for(int i=n ; i >0 ; i--
;)digitalWrite(led,HIGH
;)delay(d
;)digitalWrite(led,LOW
} ;)delay(d }
األمر Serial.printlnيعمل على إظهار عبارة أو قيمة متغير على شاشة السيلاير
األمر whileمع Serial.availableهنا يوقف الكود بانتظار ادخال قيمة من جهة المستخدم.
58
أن الحسابات هامة جدا جدا في معظم التطبيقات .الحسابات البسيطة (الجمع و الطرح و بالتأكيد
الضرب و القسمة) و حسابات أكثر تعقيدا أحيانا ً (األس ،الجذر ،الزوايا ) sin , cos , tanوعمليات
منطقية ( ) AND , OR , NOTو عمليات دقيقة على مستوى البت الواحد في الرقم (مثل تحريك البت
خطوات لليمين أو اليسار) كما يمكنك التعبير عن الرقم بأنظمة عددية مختلفة غير العشري مثل النظام
الثنائي و السداسي عشر .هذه التحويالت ستظهر فائدتها في مشاريع قادمة.
في هذا الكتاب لن نتعمق في الحسابات باستخدام األردوينو لكننا سنناقشها لبعض الوقت ،فبالتأكيد ستحتاج
لبعض الحسابات في برامجك القادمة.
( ) / * - + إجراء العمليات الحسابية المعروفة operators
;i++ ; i-- أمر مختصر يعمل على زيادة أوطرح 1من قيمة المتغيرi
;x+=3 ;x-=3 أمر مختصر يعمل على زيادة 3أو أي رقم آخر لقيمة المتغير ..
كأنها x = x+3مثالً
مثال :صمم كود يحول درجة الحرارة من درجة مئوية Cإلى فهرنهايت F
;float C=23.48
{)(void setup
;)Serial.begin(9600
وضع األقواس أحيانا يسبب مشاكل float F=C*9.0/5.0+32.0;//
} ;)Serial.println(F
;float F=205.00
{)(void setup
;)Serial.begin(9600
;float C=(F-32.0)*5.0/9.0
} ;)Serial.println(C
مالحظة :برمجة األردوينو غير مخصصة إلجراء الحسابات وقد واجهت نتائج خاطئة كثيراً بسبب ترتيب
األقواس أو كتابة فاصلة عشرية .ترتيب إجراء العمليات و نظام األقواس يختلف عن للغات المتقدمة و
المناسبة جدا إلجراء حسابات (مثل ماتالب أو بايثون) لذلك أنصح دائما بتجربة الكود عدة مرات والتأكد
من النتائج قبل اعتماده.
بعض المشاكل الشائعة-:
اجراء العمليات بين متغيرات intمع float
عند كتابة رقم صحيح في معادلة تحتوي floatاكتبه بالطريقة ( ) 5.0ضع النقطة حتى لو لم تحتجها.
األقواس ال تفهم حسب الطريقة الشائعة ،جرب تغييرها إذا وجدت نتائج غريبة.
األمر ( modulo ) %هذا األمر الغريب (غير موجود في الرياضيات التي درسناها) ولكنه
مفيد في عالم البرمجة و الحسابات ،وسنستخدمه في عدة مشاريع قادمة .فكرته باختصار أنه يعيد لك باقي
القسمة.
مثال 3 = 6 \ 20 :والباقي 2لذا:
;x=20%6 >> x=2
y = 9 % 3 >> y=0 يعيد لك باقي القسمة فقط modulo
x = 10 % 3 >> x=1 مفيد في تطبيقات قليلة وال يعمل مع الـ floats
مثال :لدينا 9583ثانية .نود معرفة كم ساعة و كم دقيقة و كم ثانية
علما ً أن الدقيقة 60ثانية و الساعة 3600ثانية.
int ;x=9583
int ;sec = x%60
int ;min=x%3600/60
int ;hr=x/3600
المصفوفات Arrays
المصفوفة هي وضع مجموعة من القيم بشكل منظم ضمن إطار واحد (مصفوفة واحدة) .تخيل معي طبق
البيض مثالً 😅 ...في البرمجة هذا يساعدنا كثيرا إلجراء عمليات متتابعة بكود سهل .
مثال :لو كان عندنا درجات طالب فبدل أن تكتبها هكذا:
61
إذا درست بعض اإللكترونيات فستكون قد درست هذه العالقات المنطقية .ستعرف أنها عالقة عادة بين
مدخلين ولها خرج .بدون التعمق كثيراً في الموضوع نستخدم هذه العمليات عادة مع الشروط و التي يكون
ناتجها نعم أو ال
&& يجب أن يتحقق الشرطين معا ً AND
|| إذا تحقق أي واحد من الشرطين OR
! يستخدم لعكس الحالة 0إلى 1والعكس NOT
مثال ً :أنت تريد أن يصدر صوت تنبيهي في حال أن المدخل التماثلي يقرأ قيمة أقل من 200وقيمة
المتغير ( x = 0يجب أن يتحقق الشرطان حتى يعمل التنبيه)
;)int a=analogRead(A0
};)if(a<100 && x==0) {tone(2,500,1000
مثال :تريد الضوء أن يعمل إذا كان الدخل التماثلي أقل من 400أو أكثر من 600
;)int a=analogRead(A0
};)if(a<400 || a>600){digitalWrite(13,1
مثال :نريد أن يعد xمن 1إلى 10ثم تتغير حالة الضوء ( )13و يعيد العد من جديد
;int x=1
;bool state=0
{)(void loop
};if(x==11){state=!state; x=1
} ;x++
64
اإلزاحة : bit shiftمثال :لدينا متغيرين (األوضح أن نكتبهما بالنظام الثنائي ،لكن يمكن كتابتهما بأي
نظام عددي)
byte ;x=0b11001011
byte ;y=0b00010011
والمطلوب هـو جمع المتغيرين كـ 16بت في متغير واحد قبل إرساله .هنا سنحتاج لإلزاحة:
;int z= y<<8 + x
result: z=0b1001111001011
توجد العديد من الوسائل (الطرق البرمجية) لحل المشاكل و تحسين طرق عمل الكود بشكل عام .بعضها
سهل وال يحتاج لشرح و بعضها قد يحتاج لبعض الشرح و هذا ما سنحاول أن نشرحه في هذا الجزء.
مثال :افرض أنك تود عمل صوت يتغير حسب حركة يدك فوق مقاومة ضوئية (يتغير التردد حسب شدة
الضوء) عند تصنيع الدائرة وجدت أن قراءة الدخل في الضوء = 150وعندما تغطي الضوء بيدك يصبح
الدخل=585
وبخصوص التردد الذي تريد أن يظهر على السماعة لتعطي تباين جيد في الترددات ()360-200
سيكون من الواضح أن تصميم األمر للتحويل بين النطاقين وتشغيل المشروع هو:
;)x=analogRead(A0
;)y=map(x,150,585,200,360
;)tone(13,y
هذا األمر يبدوا جيدا في العمل .لكن !!! ماذا لو تغيرت شدة اإلضاءة وخرجت عن المتوقع (أقوى أو أقل)
سنحصل على قيم خرج (تردد) خارجة عن التوقعات أيضا ً
هنا يستحسن استخدام األمر constrainوالذي يعمل على إبقاء قيمة داخل حدود بدون أن يمكن أن
تخرج عنه .لذا سنزيد األمر التالي على الكود السابق بعد أمر mapحتى نحل المشكلة السابقة-:
;)y=constrain(y,200,360
تمرين :طالب حصل على معدل 3.78من 4في الجامعة .أود معرفة معدله بالنسبة المئوية و كم سيكون
معدله لو انتقل لجامعة تعتمد نظام المعدل من 5استخدم ( mapاضرب * 100أيضاً)
68
األمر randomيعود لك برقم عشوائي .مثال ً إذا أردت من روبوت (سيارة) أن يسير بشكل عشوائي.
فأنت لن تحدد له زاوية التوجيه .فقط استخدم األمر . randomو إذا أردت أن تتوقف سيارة لوقت
عشوائي فهنا يمكنك استخدام األمر random
تمرين :صمم كود يعمل كأنه نردين المونوبولي ،فيولد قيمتين تتراوح بين 1و 6ثم يجمعهما و
يعرض النتيجة على شاشة السيلاير.
تمرين :صمم كود يولد مصفوفة تحتوي 18عنصر .و ضع في كل عنصر قيمة عشوائية تتراوح
بين 70و 100ثم اعرض جميع القيم على شاشة السيلاير.
69
فكرة الضبط قبل التشغيل هي أحد التكتيكات الجيد استخدامها في بعض التطبيقات التي تحتوي حساس نريد
تشغيله في أماكن مختلفة .
مثال :في البيت عند تغطية الحساس الضوئي تكون قراءة الحساس التماثلية 200و عند كشف الحساس
تكون القراءة . 700لكن في المعرض تتغير القيم بحيث :عند تغطية الحساس تكون القراءة 100و
عند كشفه تكون القراءة 500كيف نصمم الكود ليتم الضبط اآللي عند بداية التشغيل.
مراحل تنفيذ التكتيك:
-1تعريف متغيرين max , minلنضع فيهما القيم المتوقعة األعلى و األقل آليا بعد قليل
-2ضع القيمة 1023في minوالقيمة 0في ( maxتظهر العملية معكوسة ،ال تقلق)
-3عند بداية التشغيل سنخصص عدة ثواني (مثال ً 10ثواني لضبط قيمة minو maxحسب التشغيل)
-4أثناء الثواني الـ 10األولى سيقوم المستخدم بتغطية الحساس ثم الكشف عنه بشكل متكرر .هذا سيعمل
على تعديل قيمة Minو maxحسب التشغيل.
-5بعد انتهاء الـ 10ثواني ،سيعمل الكود اعتمادا على القيم الموجودة في minو . max
-6سنستخدم األمرين mapو constrainلضبط التشغيل.
مثال لكود يعمل على الضبط اآللي بداية التشغيل .
;int min = 1023
;int max = 0
; int sensor
{ )(void setup
{)while ( millis() < 10000
;)sensor = analogRead(A0
};if (sensor > max ) { max = sensor
}}};if (sensor < min ) { min = sensor
{)(void loop
;) sensor = analogRead( A0
;) sensor = map ( sensor , min , max , 0 , 255
} ;) sensor = constrain ( sensor , 0 , 255
71
تمرين :اكتب كود بحيث يحدد نطاق التشغيل المتوقع لمقاومة ضوئية analogReadفي البداية في
متغيرين Minو ( Maxفترة المعايرة )calibrationثم يحدد النطاق المتوقع (مثال ً )350-230
بعد ذلك نود اصدار صوت بترددات متناسبة من الدخل بحيث يكون نطاق الترددات ()400 - 260
تمرين :مثل أي مثال يحتوي ضبط مبدئي calibrationالمطلوب هو إضافة زر رقمي (ضاغط) يعمل
على إعادة الضبط في أي وقت
72
هي طريقة مفيدة في بعض األحيان الختصار و تبسيط الكود. الدوال : functions
فهي عبارة عن كود جانبي يتم استدعاءه لتنفيذ عمل معين وقت الحاجة ،ثم العودة للكود الرئيسي.
يتم التعرف على الدوال من القوسين اللذين يأتيان بعد اسمها … مثل:
;)(sami
;)x= hey(15
;)y,z= fun(13,12,600
المداخل و المخارج للدالة :بعض الدوال يتم استدعائها بدون إرسال أي
قيمة لها .و تقوم بعمل معين .ثم تنتهي بدون أن تعود بأي قيمة منها
.وهذه الدوال تكون من نوع void
مثال :دالة وميض بسرعة ثابتة أو تأخير زمني أو دالة panicالصدار
تحذير صوتي و مرئي.
لذا فمن المهم معرفة هل ستعود قيمة للدالة أم ال ،و إذا كانت ستعود قيمة
،ما هو نوع القيمة؟ int؟ أو floatوربما … Stringإذا كانت الدالة لن تعيد أي قيمة فيجب
تعريفها بـ void
أمثلة على دوال موجودة و تم تعريفها في برمجة األردوينو سابقاً( :غير موجودة في لغة Cاألصلية)
;) delay(1000هذه الدالة لها دخل واحد ()1000وليس لها أي قيمة راجعة void
74
byte أوint و تكون من نوع255-0 دالة لها دخل واحد والعائد يكون عددanalogRead(A0);
: مع العلم أن:أمثلة لكود و دالة تعمل على تحويل درجة حرارة من فهرنهايت الى مئوية
( F−32)∗5
C=
9
void setup(){
int C1=FtoC(F1); //FtoC will convert Fahrenheit to degrees
int C2=FtoC(F2);
int C3=FtoC(F3); }
void loop(){ }
.) ترسل لها قيمتين عدد مرات الوميض و التأخير الزمنيBlink( مثال لعمل دالة
int LED = 13;
void setup(){
Blink(10,300);
Blink(5,1000);
Blink(2,5000);}
، عدد الومضات، رقم المخرج الرقمي: قيم4 لكن هذه المرة الدالة تستقبل، مثل السابق: مثال آخر
. زمن اإلنطفاء، زمن اإلضاءة
void loop(){
blink2(13,3,500,500);
75
;)blink2(12,5,300,200
} ;)blink2(11,10,200,800
عرف متغيرين في البداية dلتحديد التأخير و ledPinلتحديد رقم المخرج المستخدم. ج
*/ */ أضف مالحظات (شرح )commentsلكل أمر و شرح لعمل الكود في األعلى استخدم // : د
صمم كود يظهر 5نبضات سريعة ثم 3بطيئة (بدون استخدام حلقة) ز
عرف متغير الزمن dداخل الـ setup loopبطريقة static int ط
شغل الوميض بدون استخدام األمر delayاستخدم millisبدال عنه( .متقدم) ي
نفس الفكرة لكن استبدل أحد الـ LEDsبــ صوت (استخدم األمر ) tone ب
صمم الكود بحيث يغمز الليد األول لـ 5مرات و الثاني لـ 7مرات (ال تستخدم حلقات )loops ج
اجعل كل LEDيومض بسرعة مستقلة عن اآلخر مثال d1=300 d2=500يجب استخدام أمر millis هـ
مثل الفقرة السابقة ولكن صمم مصفوفتين ،مصفوفة خاصة بكل ليد ! ز
78
لدينا 10ليدات نريدها تعمل معا ً عند الضغط على زر swالمطلوب يكون بينها تأخير زمني بسيط (األول ثم ج
الثاني ثم الثالث وهكذا) كما أنها تنطفئ بنفس الطريقة عند ترك الزر.
صمم ما يشبه الساعة الرملية (بأضواء )LEDsمع زر يعمل كأنه يقلب الساعة. د
و زر ينقص ، 1اعرض قيمة xعلى شاشة السيلاير. تغيير قيمة متغير xزر يزيد 1 ب
اضبط 3مداخل رقمية وسماعة بسيطة واحدة ،بحيث كلما ضغطت على زر يصدر صوت مختلف. ج
اإلمساك على مفتاح UPيزيد قيمة الجهد في مخرج تماثلي ،و الزر DNيقلله .و يكون بتدريج بطيء. ج
زرين UPو DNإلخراج جهد تماثلي من األردوينو (من 0إلى 5فولت) د
اضبط مقاومة متغيرة كمقسم جهد إلى مدخل تماثلي ،اعرض القراءة على شاشة السيلاير. أ
الدخل مقاومة متغيرة و الخرج 4ليدات تعمل بطريقة رقمية .مثال الجهد ، 0ال يعمل أي ليد ،الدخل 1فولت ب
يعمل ليد واحد الدخل 2فولت يعمل 2و هكذا …
إضافة للفقرة السابقة ،عندما يزيد الدخل عن 4فولت ،اجعل جميع الـ ليدات تظهر وميض سريع. ج
مقسم جهد يحتوي مقاومة ضوئية _ يصنع ما يشبه اإلضاءة اآللية ( تشتغل في الظالم ،و تنطفئ في النهار) د
الدخل عصا تحكم تماثلي و الخرج عدد LEDs 9الهدف أن نتحكم بالعصى لنجعل LEDواحد يعمل يعبر عن ب
اتجاه العصا.
3مقاومات متغيرة تتحكم بشدة إضاءة 3ليدات ملونة (أو ليد متعدد األلوان) ج
(حسابي متقدم) لدينا جهاز يحسب الزمن بالثواني وعند قراءة الزمن ،أعطاك رقم كبير جدا ً ( عدة ماليين) ضع هـ
القيمة في متغير unsigned longاستخدم األردوينو إلظهار الزمن بطريقة أيام ،ساعات ،دقائق ،ثواني .
(واستخدم األمر ) % modulo
تذكر :الدقيقة = 60ثانية ،الساعة = 3600ثانية و اليوم = 86400ثانية
المطلوب صنع نرد بسيط إلكتروني يظهر رقم عشوائي عند الضغط على زر ضاغط ()6-1 و
مثل المثال السابق لكن اجعل كل ضغطة تظهر عددين عشوائيين (كأنه نرد المونوبولي) ز
حول المعدل من 100إلى معدل من 5واعرض الناتج على الشاشة SerialMonitorاستخدم mapو ح
float
نود قراءة قيمة من مدخل تماثلي ثم إخراج قيمة مساوية لها من المخرج التماثلي .الحظ الدخل 255-0 ط
والخرج 1023-0صمم الدائرة و الكود .استخدم األمر map
80
مثلث قائم الزاوية اذا كان ارتفاعه 6mو قاعدته 4mاحسب طول الـ وتر hypotenuse ي
قوة مقدارها 77نيوتن تؤثر على جسم بزاوية 60احسب مقدار القوة على محور xو على محور y ك
التحكم بــ LEDبواسطة شاشة SerialMonitorمثال أدخل رقم 1لتشغيل الضوء و 0إلطفائه. ج
اجعل الشاشة ترسل لك التعليمات قبل كل أمر.
للتحكم بالـ LEDs اجعل التحكم بـ LEDs 2و يكون الدخل من شاشة السيلاير مثال ً 4 . 3 . 2 . 1 د
صمم كود بحيث يدخل المستخدم اسم لون red green blueفيضيء اللون المطلوب في RGB LED هـ
على شاشة serialMonitorيطلب قيمة ،تحدد سرعة الوميض ،ثم تطلب تردد الصوت . و
يقوم المستخدم بإدخال قيم لأللوان األحمر و األخضر و األزرق _ ثم يعرض اللون المطلوب على RGB LED ز
ادخل أسماء 10طالب في مصفوفة ،و درجاتهم في مصفوفة مختلفة. ح
زد لكل طالب 5درجات ،على أال تزيد الدرجات عن 100أبداً (استخدم )constrain :
ثم على الشاشة أظهر المتوسط .وأعلى طالب و أقل طالب.
بالتأكيد اإللكترونيات عالم كبير لكننا هنا سنتكلم عما يلزمنا عند استخدام األردوينو فقط.
الدوائر اإللكترونية هي مجموعة من العناصر و بينها توصيالت (اسالك) عندما يمر بها التيار الكهربائي
فإنها تقوم بعمل معين.
أهم العناصر اإللكترونية التي سنستخدمها -:
مبين ضوئي (لــيـــد)
يعمل على إظهار ضوء عندما نخرج
الجهد المناسب من أطراف األردوينو
الرجل الطويلة :آنود
و يجب توصيل مقاومة للحماية
LED
مقاومة
تقلل مرور التيار و تحمي العناصر
التي ال تتحمل 5v
Resistor
83
زر ضاغط
يعمل على توصيل التيار الكهربائي
عند الضغط عليه.
يستخدم كمدخل رقمي لألردوينو
Push button
مقاومة متغيرة
تعمل عادة كمدخل تماثلي
حيث يمكنك يدويا تغيير الجهد الداخل
لألردوينو
Potentiometer
مقاومة ضوئية
حساس ضوئي ،يعمل كمقاومة تقل
قيمتها كلما تعرضت لضوء أعلى.
LDR
أسالك توصيل
تعمل على توصيل التيار الكهربائي
بين أي نقطتين
Wires- Leads-
jumpers
84
بطارية 9فولت
تشغيل األردوينو
أو بعض العناصر األخرى التي
تحتاج تيار عالي
محرك ،مرحل
Battery
سماعة بسيطة
تعمل على إصدار صوت بسيط
حسب التردد الداخل إليها.
وليست مصممة إلصدار أصوات
دقيقة مثل سماعة الهاتف
Buzzer
ترانزيستور
يعمل على تكبير الطاقة الكهربائية
التي تخرج من األردوينو ،حين أنه
في كثير من األحيان نحتاج لتيار
أعلى من 40mA
موديل مقترح TIP120
Transistor
مرحـِّــل
يعمل على تكبير الجهد و التيار
بدرجة كبير يمكن أن تكون 220vو
نحوه
Relay
85
كما ترى توجد نقاط صغيرة .هذه النقاط متصلة من الداخل حسب الخطوط الموضحة.
ففي الصف األول ( )1يتصل a,b,c,d,eمعا ً و هذه الخمسة غير متصلة مع f,g,h,i,j
لمشاهدة فيديو عن توصيل الدوائر اإللكترونية على لوحة االختبار :اضغط هنا
86
واآلن قارن بين الرسمتين السابقتين ،و تذكر طريقة عمل لوحة التوصيل الـ تيستبورد
ستجد أن هذه الدائرة العملية .هي نفس الدائرة النظرية السابقة...
يصعب أن نشرح كتابيا ً كيفية استخدام لوحة التوصيل الـ تيستبورد .لكن بقليل من التمرين ستتقن هذه
المهارة … صدقني
يمكنك في أي وقت التمرن على توصيل أي دائرة على التيستبورد على الموقع الرائع-:
https://www.tinkercad.com/learn/
88
قارن بين الصورتين العلويتين و الصورة باألسفل .لن نتجادل أيهما أجمل .لكن المظهر في الدائرة األسفل
يظهر أنك قمت بتوصيل األسالك فقط .بينما في الدائرتين العلويتين (اليسرى خصوصا) يظهر أنك
صممت الدائرة وصنعتها بنفسك .كثير من المكونات الموجودة على البورد الـ UNOلن تضعها هنا ألنك
لن تحتاجها.
*مالحظة :في هذا المنهج لن نتحدث عن تصنيع الدوائر المطبوعة pcbحتى ال نشتت تركيزك.
89
ليعمل مثبت الجهد يجب توصيله في دائرة بسيطة كما يظهر بالشكل التالي:
المكثفات Capacitors
لعلك الحظت عنصرين متصلين مع مثبت الجهد ،و عنصرين
متصلين مع الكريستالة .هذا عنصر إلكتروني بسيط اسمه
مكثف .ويعمل على استقرار الجهد الكهربائي عند نقطة في
الدائرة .تتوفر المكثفات في السوق بأسعار منخفضة وقيم كثيرة.
وفي الجدول التالي سنكتب لك القيم التي ينصح بها المصنعون
تمرين :اكتب كود بسيط يعمل على تشغيل ضوئين LEDبحيث يومض أحدهما و اآلخر تتغير شدته
ببطء pwmثم انزع الشريحة Atmegaو شغل الدائرة على لوحة االختبار الـ testboardمع
العناصر الالزمة.
92
كما ذكرنا فاألردوينو يعمل على إصدار إشارات كهربائية على أطرافه .لكن هذه األطراف لها قدرة
كهربائية محدودة .يمكنك تشغيل ضوء بسيط LEDمن الطاقة الصادرة من األردوينو ،لكنك بالتأكيد لن
تتمكن من تشغيل محرك بهذه الطاقة البسيطة ( 5vوحوالي )40mAلذا فكثيرا ما نحتاج لدوائر التكبير.
سوف نبدأ بشرح الطريقة األسهل (استخدام دائرة مرحل) ثم سنذكر طرق متقدمة إلكترونيا ً استخدمها إذا
أحببت ،و تجاهلها إذا أحببت 😏
الطريقة األسهل هي شراء دائرة مرحالت مخصصة لألردوينو Arduino Relay Module
ستجد مقاسات مختلفة تناسب التطبيقات المختلفة (مرحل واحد ) 8 ، 4 ، 2 ،
94
ومخرج GND الحظ في الصورة :األردوينو يتصل بدائرة المرحل بثالثة أسالك ( +5v
رقمي)
اآلن بإمكانك بكل بساطة التحكم باألجهزة الكهربائية المنزلية بواسطة األردوينو.
تنبيه _ كل مرحل له طاقة تحمل (جهد و تيار) تأكد أن المرحل الذي تستخدمه يتحمل تشغيل الجهاز الذي
تريد تشغيله … مثال كثير من المرحالت تتحمل 5Aبينما المكيف يستهلك ..!! 15A
95
الترانزيستور عنصر صغير و هام في الدوائر اإللكترونية و من الممكن أن تـــُـضيع الكثير من الوقت و
أنت تتفحص مئات بل آالف األنواع من الترانزيستورات .طريقة عملها وخصائصها .
الحقيقة؛ أنت لن تحتاج لدراسة كل شيء عن الترانزيستورات .
الترانزيستور يمكنه ببساطة تكبير اإلشارة الخارجة من األردوينو .
انظر الشكل--:
-3وصل الموجب للحمل (محرك مثال) والطرف الثاني للمحرك وصله بالطرف Cفي الترانزيستور.
-4وصل الطرف Eباألرضي 0vللبطارية و لألردوينو( .انتهينا 😝)
96
ترانزيستور 2n2222
ويتمكن من توصيل تيار يصل إلى
C=600mA I
مقارنة بـ 40mAفقط يتمكن منفذ األردوينو من
إخراجها.
عادة نوصل مقاومة RB=1Kلضبط قيمة التيار
من األردوينو .شاهد الرسم
ترانزيستور TIP120
هذا الترانزيستور أكبر و يتحمل طاقة أعلى
يتحمل مرور تيار عالي IC=5A
التالي يوضح كيفية تشغيل محرك باألردوينو .مع استخدام الحظ الرسم
TIP120كمكبر للتيار.
ينصح بوضع (دايود) بين طرفي المحرك كما يظهر بالصورة هذا يعمل على حماية الدائرة
99
نظرية عمل المرحل بسيطة ،ولن نشرحها في هذا الكتاب .لكن ببساطة المرحل عبارة عن مفتاح يتم
توصيله و غلقه بالكهرباء و ليس يدويا ً .شاهد الصورة
هذا يجعل المرحل (الريالي) يتمكن من تشغيل األجهزة سواء كانت تعمل بالكهرباء المستمرة DCأو
الكهرباء المترددة AC
● السبب الثاني أن المرحل ( )relayيتحمل مرور تيار أعلى بكثير (مثال )10Aمن الترانزيستور
عادة.
يشبه عمل المرحل السابق سوى أنه يحتوي مفتاحين بدل مفتاح واحد .وهذا مفيد في بعض التطبيقات.
يسحب المرحل الصغير عادة 50mAوهذه القيمة نسبيا عالية على مخرج األردوينو.
بإمكانك توصيل ملف المرحل إلى األردوينو مباشرة ولكنني لست مسؤول إذا تلف األردوينو بسبب سحب
التيار العالي.
الحل األسلم هو تشغيل المرحل بواسطة ترانزيستور
(مثال )2n2222
نصيحة :يستحسن إضافة دايود بين طرفي الملف ،
هذا يعمل على حماية الدائرة.
(انتبه على اتجاه الدايود يجب أن يكون اآلنود
متصل مع جهة األرضي)
101
بعض األشياء تعمل بطريقة أكثر تعقيدا مما يظهر عليها من الوهلة األولى .وقد تكون مقاومات الرفع و
مقاومات الخفض أحدها .
عندما نريد إدخال إشارة رقمية إلى األردوينو
فإننا نستخدم مفتاح ضاغط push button
كن المالحظ أنه في حالة عدم الضغط على ل
لزر فإن الجهد يكون غير واضح القراءة و قد ا
يعطي نتائج خاطئة.
ينصح باستخدام أحد هاتين الطريقتين بإضافة
مقاومة (تقريبا ً )10K
مالحظة:
قد ال يعمل هذا األمر بشكل جيد مع الطرف 13بسبب وجود LEDمتصل بالمنفذ 13على البورد.
102
يمكنك أن تحل هذه المشكلة بأكثر من طريقة _ أسهلها هو التأخير الزمني بعد كل حافة صاعدة.
**إضافة حل مشكلة الديباونس بمقاومة و مكثف.
103
;int x=0
{)(void setup
;)Serial.begin(9600
منفذ 2متصل بالمفتاحpinMode(2,INPUT_PULLUP);}//
{)(void loop
}{)while(digitalRead(2)==1
;x++
;) Serial.println( x
التأخير هنا يعمل على تالفي المشكلةdelay(500);} //
الطريقة السابقة مفيدة سوى أنه توجد طريقة (أفضل من الناحية البرمجية)
تنفيذ العمل بدون استخدام األمر ()delay
هل تتذكر الكود الذي شرحناه سابقا (الوميض بدون استخدام األمر )delayالفكرة مشابهة كثيراً.
تشغيل و إطفاء بزر واحد مع حل مشكلة التذبذب (مع تأخير زمني صغير جدا)
فكرة الكود كتابيا ً -:نحتاج 3متغيرات - :حالة الضوء -حالة المفتاح -الحالة السابقة للمفتاح.
إذا تغير حال المفتاح من 1إلى 0؛ غير حالة الضوء
إذا استمر المفتاح على حالته سوا ًء 0أو 1ال تغير حالة الضوء.
إذا تغيرت حالة المفتاح من 0إلى 1ال تغير حالة الضوء.
بعد كل تغير على حالة المفتاح نحتاج لتأخير زمني صغير لنتجاوز فترة التذبذب
bool ;LedState=0
bool ;buttonState=1
bool ;lastButtonState=1
{)(void setup
;)pinMode(2,INPUT_PULLUP
} ;)pinMode(13,OUTPUT
{)(void loop
;)buttonState=digitalRead(2
{)if(buttonState==0 && last buttonState==1
;LedState= !LedState
;)digitalWrite(13,LedState
;lastButtonState=buttonState
};)delay(50
{)else if(buttonState==1 && lastButtonState==0
;lastButtonState=buttonState
} };)delay(50
مميزات الكود (السابق) :
-1عدم التوقف عند األمر delayماعدا وقت قصير جداً ( ) 50msفقط لالبتعاد عن وقت التذبذب
104
-2يمكنك تبديل الحالة بسرعة وال يلزمك االنتظار لنصف ثانية كل مرة.
-3إذا استمريت في اإلمساك بالزر لن يستمر الضوء في تبديل حالته ،بل سيبقى على حالته حتى ترفع يدك
و تضغط مرة ثانية.
عداد تصاعدي مع حل مشكلة التذبذب مع تأخير زمني صغير جداً
فكرة الكود كتابيا ً -:تشبه فكرة الكود السابق يجب أن يوجد متغيرين (حالة المفتاح ،حالة المفتاح السابقة)
و حسب المقارنة بينهما يتم العد .
;bool SW=1
;bool LSW=1
;int counter=0
{)(void setup
;)pinMode(2,INPUT_PULLUP
} ;)Serial.begin(9600
{)(void loop
;)SW=digitalRead(2
{)if(SW==0 && LSW==1
;counter++
;LSW=SW
;)delay(50
} ;) Serial.println( counter
{)else if(SW==1 && LSW==0
;LSW=SW
} };)delay(50
مميزات هذا الكود عن العداد السابق-:
-1ال يستخدم التأخير الزمني إال وقت قصير جدا ً
-2إذا أمسكت على الزر فإن العد ال يزيد بل ينتظر أن ترفع يدك و تضغطها مرة أخرى.
-3بإمكانك أن تضغط ضغطات سريعة و سيعد معك ،لن ينتظر نصف ثانية بين كل عدة.
إذا أحببت يمكنك استخدام مكتبة من األوامر مخصصة لحل مشكلة التذبذب :زر الرابط هنا
استخدم مفتاح الضاغط كـمفتاح تشغيل و إطفاء ON/offانتبه لمشكلة الـ Debounce تمرين1
استخدم المفتاح الرقمي للعـد التصاعدي على شاشة الـ ، Serialانتبه لمشكلة الـ Debounce تمرين2
تحتوي الشريحة 74HC959على 3أطراف أساسية يجب توصيلها لمخارج األردوينو DSلنقل البيانات
STCP ،يجب أن يكون 0أثناء نقل البيانات ثم 1لعرض البيانات ،و SHCPلضبط التوقيت clk
انظر للدائرة التالية و الكود .و أعتقد أنك ستفهم ما تحتاج.
106
. أعداد ثنائية بتتابع يغيرها المستخدم أعلى الكود3 ونود أن يعرض74HC595 لدينا مسجل إزاحة تمرين
. ونود عرض أرقام ثنائية عليها، مسجالت إزاحة3 لدينا تمرين
107
توجد أنواع عديدة من المحركات ؛ أشهرها وأبسطها هو محرك (التيار المستمر) . DC-motorيتميز
محرك دي سي بأن له سلكين فقط .و عند تطبيق الجهد المناسب عليهما فإن المحرك سيبدأ بالدوران ،و
عند عكس قطبية الجهد (الموجب و السالب) سوف ينعكس اتجاه الدوران.
ستجد محرك دي سي في العديد من األجهزة الكهربائية (مكيف ،مسجل ،داخل الكمبيوتر…) .وفي كثير
من التطبيقات ستجد المحرك متصل معه علبة تروس تجعل الحركة أبطأ و لكنها أقوى كثيرا .
سنتحدث في أجزاء متقدمة من الكتاب عن أنواع أخرى :
servo motorله ثالثة أسالك محرك سيرفو
أهم المالحظات عند تشغيل محرك دي سي هو سحبه لتيار (أمبير) عالي (أعلى من قدرة األردوينو) لذا
نستخدم طرق مختلفة لتكبير التيار (والجهد أحيانا) :ترانزيستور قدرة ،مرحل (ريالي) ،أو متحكم H
في محرك دي سي عادي قسنا التيار فكان
في التشغيل الحـُـر(بدون حمل) 50mA :
في حالة الحمل األقصى700mA :
الطريقة األسهل هي استخدام دائرة متحكم بالمحرك دي سي :وتعرف عادة
بـ H-Bridgeفقط تأكد من خصائص دائرة التحكم أنها تمد تيار كافي
لسحب التيار المتوقع.
الموديل في الصورة L298Nيتمكن من تشغيل محركين دي سي ويتحمل تيار يصل إلى 3A
بالتأكيد توجد موديالت مختلفة من متحكمات المحركات _ لذا ينبغي فهم خصائصها قبل استخدامها.
109
إذا أحببت تصنيع الدائرة اإللكترونية فإن من أشهر العناصر اإللكترونية (الشرائح) المخصصة للتحكم
بمحركات دي سي هي الشريحة L293Dولكن الكتاب لن يتسع لنشرحها هنا.
هذا الحساس يعمل على قياس بعد األجسام الكبيرة (مثل جدار أو لوح) عن الحساس بطريقة انعكاس موجة
فوق صوتية .شاهد الرسم في األعلى لفهم طريقة عمل الحساس .
بمعرفة سرعة الصوت ،يمكن حساب المسافة التي استغرقها الصوت لالنعكاس.
الطرف triggerهو الدخل من األردوينو للحساس و عادة نرسل نبضة Hزمنها 2μs
الطرف Echoهو الخرج و ينصح بتوصيل مقاومة 1Kمعه.
وهو يعمل على قياس عرض النبضة القادمة الستخدام الحساس يفضل االستفادة من األمر pulseIn
من الحساس إلى األردوينو بالمايكرو ثانية .
;)int x=pulseIn(10,HIGH
السطر الماضي يقيس عرض (زمن اإلشارة) القادمة من الحساس و يضع القيمة بالمايكروثانية في x
تذكر سرعة الصوت 340m/s :و بعرفة الزمن و السرعة يمكن حساب المسافة.
:اضغط هنا لالنتقال لصفحة تشرح أمر pulseIn
شاهد فيديو قصير تعريفي بالحساس
111
)trigger( ويجب إرسال النبضة، أطراف فقط3 يوجد أنواع من هذا الحساس بـ
! ) مع نفس المنفذ ! يجب تحويل المنفذ من خرج إلى دخلecho( ثم استقبال نبضة الـ
شاهد الكود في األسفل أو شاهد الكود في المعمل االفتراضي
unsigned long du; // du : is the duration of the echo
void setup(){
Serial.begin(9600); }
void loop(){
pinMode(3,OUTPUT);
digitalWrite(3,LOW);
delay(2);
digitalWrite(3,HIGH);
delayMicroseconds(2);
digitalWrite(3,LOW);
pinMode(3,INPUT);
du=pulseIn(3,HIGH);
Serial.println("\n");
Serial.println(du);
delay(3000); }
112
صمم جهاز يشبه حساس السيارة _كلما اقترب الحساس من جسم يصدر صوت متقطع أسرع: تمرين
113
المكتبات ليست إال عدد من الدوال ( ) functionsتمت إضافتها معا ً في ما يسمى بالمكتبة لتسهيل
الوصول لها حال الحاجة لها .المكتبات تستخدم لغة ( Cمثل األوامر التي شرحناها سابقاً) لكنها في العادة
تستخدم طرق برمجة متقدمة ضمن لغة . C++في بعض الحاالت تكون المكتبات ضرورية لتنفيذ أمر
معين (مثل الكتابة على ذاكرة EEPROMأو )SD card
فبدل أن تكتب كل شيء و تفهم كل شيء ،أضف المكتبة ،استخدم األوامر الالزمة .و استفد من خبرات
المبرمجين السابقين الذين صمموا لك المكتبات.
أمثلة لدوال مضافة في برنامج األردوينو وال تحتاج لتضمين أي مكتبة:
) (pinMode( , ) digitalWrite( , ) max( , ) tan( ) , tone( , , ) , delay
أمثلة لدوال Functionsلن تعمل حتى تضيف المكتبات التي تتضمن هذه الدوال:
) (EEPROM.read( ) , motor.attach( ) , lcd.clear
س /لماذا ال أستخدم الدوال مباشرة ؟ لماذا أحتاج لتضمين (إضافة) المكتبة أوال ً ؟
عدد الدوال كبير جدا جدا ً ،بل كل يوم تظهر دوال جديدة لعمل أعمال معينة ،ليس من المنطقي تعريف
البرنامج على جميع الدوال التي قد ال تحتاجها.
فالذاكرة محدودة والمطلوب تضمين المكتبات التي تحتاجها فقط.
يمكن تقسيم المكتبات إلى قسمين:
مكتبات رسمية معتمدة من شركة أردوينو Official Arduino Libraries
و مكتبات تم كتابتها من مبرمجين ال يتبعون لشركة أردوينوcommunity contributed libraries :
for Arduino
ال يمكنك القول أن هذه المكتبات أفضل من تلك ،فالعبرة بالحاجة .مثال لو قامت شركة adafruit
بتصنيع شاشة صغيرة مميزة يمكن تشغيلها باألردوينو ،فإنها في األغلب ستنشر على االنترنت مكتبة من
114
األوامر الخاصة بالتحكم بهذه الشاشة .هذه المكتبة ليست رسمية من شركة أردوينو لكنها ضرورية إذا
أردت استخدام الشاشة الجديدة .
المكتبات كثيرة وال يمكن شرحها جميعا في هذا الكتاب .سنشرح أشهرها و أهمها .لمعرفة المزيد من
المكتبات .راجع الصفحة على موقع األردوينو:
https://www.arduino.cc/en/Reference/Libraries
صفحة تحتوي المكتبات الرسمية المعتمدة من أردوينو
https://playground.arduino.cc/Main/GeneralCodeLibrary
صفحة تحتوي عدد كبير من المكتبات التي طورها
المهتمين باألردوينو في مختلف المجاالت
https://playground.arduino.cc/Main/LibraryList
صفحة اضافية...
مالحظة :معظم المكتبات تستخدم خصائص لغة ، C++لذا سنتعلم بعض خصائصها.
مثل :تضمين مكتبة ،تعريف كائن ،تحديد خواص الكائن ،وتعريف ماكرو
فهم أوامر المكتبات :المكتبات عادة تساعدك كثيراً لتنفيذ العمل .لكن في استخدامها عيب .وهــو وجود
عدد كبير جدا من المكتبات ،و في كل مكتبة عدد كبير من األوامر (الدوال) وطرق استخدامها طرق
مختلفة وليست دائما ً بنفس طرق استخدام األوامر المعتادة .كما أن المكتبات يتم تحديثها باستمرار عادة ،
لذلك قد تستخدم أوامر جديدة أو قديمة (حسب المكتبة المضافة) مصادر تعلم المكتبات عادة :
-1ادرس األمثلة المرفقة مع كل مكتبة بعناية
-2ملف pdfبإسم documentationيأتي مع بعض المرفقات و عادة يكون فيه شرح مفصل
أحد الحلول للتعامل مع المكتبات الحديثة (اإلصدار الحديث) هو البرمجة باستخدام Arduino create
والذي شرحناه سابقاً.
-1اذهب إلى موقع األردوينو الرسمي Arduino.cc
116
ثم انقر على Try it now -2من األعلى اختر القسم software
ابحث عن المكتبة المطلوبة في Library managerو أضفها إلى -3في صفحة Arduino Create
المكتبات المفضلة.
-4بعد اضافة المكتبة للمفضلة .ستجد العديد من األمثلة مرفقة مع المكتبة .شاهدها و اقرأ الشروحات
والمالحظات المرفقة مع كل كود.
تضمين مكتبة including a library
117
هذا الموضوع قد يكون سهل جدا وقد يكون صعب 😛 في الحقيقة معظم األشخاص الذين زاروني طلبا
للمساعدة (لتنفيذ مشاريع األردوينو الخاصة بهم) كانت مشكلتهم عـدم إضافة المكتبة الصحيحة فقط !
فمثال ً عندما تكتب األمر:
>#include <LiquidCrystal.h
في برنامج برمجة األردوينو IDEفإنه سيتقبل إضافة المكتبة بدون مشاكل 👍
بينما لو كتبت األمر التالي-:
>#include <Debounce2.h
فاألغلب أن البرنامج سيعيد لك رسالة خطأ .لماذا ؟!!
السبب أنه عند تثبيت البرنامج ( ) Arduino IDEفإن البرنامج قد أضاف بعض المكتبات الشائعة في
مجلد البرنامج .ولتستخدم األوامر يكفيك أن تكتب سطر واحد فقط في أعلى الكود .ثم تستخدم أوامر
المكتبة .بينما لو كانت المكتبة غير موجودة في مجلد برنامج األردوينو IDEفيجب إضافتها .
توجد أكثر من طريقة إلضافة مكتبة إلى برنامج -: IDE
● استخدام مدير المكتبات manage librariesللبحث و إضافة المكتبات
● إضافة مجلد مضغوط add .ZIP library
● تحميل المكتبة وفك ضغطها ثم وضعها في مسار مجلد األردوينو (يجب أن يكون اسم المجلد مطابق
السم المكتبة)
File >> preferences إليجاد مسار المكتبات إذهب إلى
حسب تجربتي فاستخدام المبرمج على االنترنت Arduino Createأفضل و أسهل من استخدام
البرنامج العادي .فهو يبحث عن آخر اإلصدارات من االنترنت مباشرة.
)Arduino.cc >> software >> Web editor (try now
تمرين :قم بإضافة جميع المكتبات الموجودة في صفحتي 112 :و 113في كود واحد
الكائنات ( ) objectsليست إال طريقة لتنظيم األوامر وربطها مع مكونات النظام في لغة C++
مثالً لديك شاشتين LCDأو 3لوحات مفاتيح .أو 4محركات .كل مكون يمكن التحكم به بطريقة:
-1ادراج المكتبة الالزمة include library
وقد شرحنا كيفية إدراج مكتبة في الصفحات السابقة
-2تعريف الكائن Object , instance
وهذا السطر يسمى constructorوفيه يجمع المعلومات الالزمة لتكوين الكائن Object
className ;)objectName = className(arguments
className اختصار األمر السابقobjectName(arguments);//
الماكرو هو كود جانبي (قصير عادة) يعمل مثل الدوال أحيانا ً .
في هذا الكتاب لن نتعمق في لغات البرمجة المتقدمة وال في تعريف الماكرو .
لكن في األردوينو نستخدم ( ) #defineفي أعلى الكود لربط إسم بقيمة عادة .فالبرنامج قبل التنفيذ
) #define sam سوف يستبدل العبارة اليسرى بالقيمة اليمنى مثالً ( 10
في أي مكان من الكود عندما يوجد عبارة ( ) samسوف يحذفها و يضع مكانها ( ) 10
السطرين التاليين يقومان بنفس العمل .سوى أن الطريقة #defineأوفر في استخدام الذاكرة.
#define led 1 int ;led = 1
#define led2 5 int ;led2 = 5
فكلما كتبنا كلمة ( ) ledفي الكود فإن البرنامج سيحولها إلى القيمة ( ) 1قبل رفعها لألردوينو
المفتاح (الزر) الرقمي طريقة ادخال شائعة و بسيطة .لكن في الكثير من التطبيقات نحتاج إلدخال معلومات
أكثر (أرقام وحروف) للتحكم بتشغيل األردوينو .ومن أشهر الحلول استخدام شبكة من األزرار الرقمية
Keypadتحتوي 16زر لكنها تستخدم 8منافذ رقمية فقط.
لمشاهدة صفحة تشرح المكتبة و األوامر وتحتوي رابط التحميل اضغط هنا :
https://playground.arduino.cc/Code/Keypad
يمكنك جعل عدد األعمدة 3إذا لم تستخدم األحرف .ويجب تعديل الكود قليالً. ●
في العادة ستجد عدم توافق بين الضغطات و الناتج (مثال تضغط ( )1فيظهر ( )Aاألفضل التجربة ●
ثم التعديل على المصفوفة ( )Keysحتى تتوافق الضغطات مع الناتج على شاشة السيلاير.
مثال :2استخدم لوحة المفاتيح keypadبحيث تشغل LEDبالضغط على (*) و تطفئه بـ ()#
أول 9أسطر تتطابقـ مع التمرين السابق
};)void setup(){pinMode(13,OUTPUT
{)(void loop
;)(char x = KP.getKey
};)if (x=='*'){digitalWrite(13,HIGH
}};)if (x=='#'){digitalWrite(13,LOW
مثال :3استخدم لوحة المفاتيح إلدخال قيمة التأخير الزمني ( )msو تشغيل وميض Blink
أول 9أسطر تتطابقـ مع التمرين السابق
;int x1=0,x2=0,x3=0,x4=0,x=0
{)(void setup
لتسجيل خانة األلوفwhile(x1==0){x1=kp.getKey();} //
;x1=x1-48 ألننا نريد استخدام قيمة رقم وليس كود أسكي//
لتسجيل خانة المئاتwhile(x2==0){x2=kp.getKey();} //
;x2=x2-48 //change ASCII code to number INT
لتسجيل خانة العشراتwhile(x3==0){x3=kp.getKey();} //
;x3=x3-48
لتسجيل خانة اآلحادwhile(x4==0){x4=kp.getKey();} //
;x4=x4-48
تكوين الرقم النهائي من جميع الخاناتx=x1*1000+x2*100+x3*10+x4;} //
الباقي سهل ،فقط استخدم قيمة xكتأخير في كود وميض
تمرين :استخدام لوحة األرقام إلدخال قيمة التردد لألمر toneثم تشغيل تنبيه صوتي بالتردد المدخل
122
اإلشارات السبعة ( )seven segmentهي شاشة بسيطة في التكوين تعمل على عرض األرقام .بالتأكيد
رأيتها سابقا في الكثير من األجهزة .فكرتها أنها تتكون من 7أضواء منفصلة 1+للنقطة و يمكنك تشغيل
أي ضوء تحب لكي يظهر الرقم المطلوب .وأحيانا ً توجد وحدتين 7segأو أربع وحدات متصلة معاً.
األنواع الموجودة في السوق تكون عادة أحد نوعين :
Common Anodeيجب أن ترسل 0vلتشغيل أي ضوء وهو األكثر انتشاراً آنود مشترك
Common Cathodeيجب أن ترسل 5vلتشغيل أي ضوء وهو النوع األسهل كاثود مشترك
يجب التأكد بالتجربة من الجهد المناسب للتشغيل وفي حال زيادة الجهد عن المناسب يجب استخدام مقاومات
لتقليل مرور التيار.
123
في البداية نود فهم كيف يتم عرض األرقام حسب الجدول التالي:
تخيل أن لديك متغير تزيد قيمته كل ثانية 9 …… ، 2 ، 1 ، 0 :وتريد عرض هذه القيمة على سيفين
سيقمينت seven segment .كيف سيكون األمر باستخدام األوامر المعروفة فقط ( بدون مكتبة)
توجد أكثر من طريقة لكتابة كود يعمل على عرض األرقام بالتسلسل على الـ سيفن سيقمينت .هذه أحدها.
;int A=2,B=3,C=4,D=5,E=6,F=7,G=8
int x=0; // x will be the counter
void setup(){ //we used for loop to make the code shorter
}};)for(int i=2;i<9;i++){pinMode(i,OUTPUT
{)(void loop
};)for(int i=2;i<9;i++){digitalWrite(i,LOW
digitalWrite(E,HIGH);//because E is mostly off unlike the others
};)if(x==1 || x==4){ digitalWrite(A,HIGH
};)if(x==5||x==6){ digitalWrite(B,HIGH
};)if(x==2) {digitalWrite(C,HIGH
};)if(x==1||x==4||x==7){ digitalWrite(D,HIGH
};)if(x==0||x==2||x==6||x==8){ digitalWrite(E,LOW
};)if(x==1||x==2||x==3||x==7){ digitalWrite(F,HIGH
};)if(x==0||x==1||x==7){ digitalWrite(G,HIGH
} };delay(1000); x++; if(x>9){x=0
شاهد تشغيل الكود :اضغط هـــنا
الحظ :الكود السابق هو الكود األقصر بدون استخدام مكتبة Libraryوطوله 30سطر .تم تنفيذ عدة طرق
لجعل الكود أقصر (وربما أصعب للفهم) هذا الكود يستخدم لتشغيل وحدة واحدة فقط.
شاهدت بعض المبرمجين يستخدمون كود طوله ( )96سطر … لتنفيذ نفس العمل😆.
124
. خانات ! مشكلة4 بالتأكيد أن الكود طويل و صعب التتبع _ أيضا هذا الكود يشغل خانة واحدة وليس
: ذات األربع خانات شاهد الصورةseven segment لنفهم تكوين وطريقة تشغيل الـ
تمرين :صمم شاشة (سيفن سيق) عـداد مع ثالثة أزرار ضاغطة up, down , reset
تمرين :صمم ساعة رقمية لتعد الثواني و الدقائق
اذا كنت تحتاج 8وحدات من السيفين سيقمينت أو 16أو 24و باستخدام 3منافذ من األردوينو فقط
(+طرفي التغذية) فاألسهل و األرخص استخدام هذه اللوحة المتكاملة .لن يتسع المجال في الكتاب لشرحها
https://www.youtube.com/watch?v=VgNIkGzxGAU يمكنك مشاهدة الرابط هنا :
126
انظر إلى رسم إشارة التحكم (بين كل بدايتي نبضة )20msهل بإمكانك توليد إشارة كهذه بدون استخدام
مكتبة؟
الحظ أن المحركات الرخيصة غير موثوقة كثيرا ً وبعضها تكون تالفة قبل استخدامها.
127
الحظ أن المحركات عادة تأتي بنطاق تشغيل من الزوايا (مثالً 0إلى 180درجة -نصف دورة فقط) لكن
في الواقع هي ال تتحمل هذه الزوايا .مع التجربة يمكنك مالحظة النطاق اآلمن و الذي ال يسبب اهتزاز
المحرك (تقريبا 170-15درجة)
لمشاهدة أمثلة للتحكم بمحرك سيرفو يمكنك مشاهدة األمثلة المرفـقـة مع برنامج األردوينو
File >> Examples >> Servo >> Sweep
سنستخدم مكتبة Servo.hللتحكم بمحرك سيرفو بسيط (زاوية وليس دوراني).
>#include <Servo.h
Servo moto; //any name should do
{)(void setup
;)moto.attach(7
لتحديد الزاويةmoto.write(170);} //
}{)(void loop
شاهد كود قريب من السابق اضغط هنا
في حالة أن المحرك سيرفو دوراني (يدور دورة كاملة وليس زوايا فقط) full rotation servosتختلف
طريقة التحكم (يمكنك التحكم بسرعة الدوران و اإلتجاه بشكل أسهل من محرك الدي سي).
بعد تضمين المكتبة وتعريف الكائن (المحرك) بإمكاننا استخدام األوامر التالية للتحكم بدوران المحرك:
;)moto.attach(10 تحديد المنفذ المتصل للتحكم بالمحرك
;)moto.write(170 الدوران بأقصى سرعة مع عقارب الساعة
;)moto.Write(15 الدوران بأقصى سرعة عكس عقارب الساعة
;)moto.writeMicroseconds(1300 أمر آخر للتحكم بدقة في حركة المحرك
عادة القيم ( )1000،1500،2000تستخدم للحركة بأي اتجاه أو إيقاف المحرك ،لكن يجب عليك تجربة محركك
;)(moto.detach إيقاف المحرك
اقرأ المزيد عن مكتبة محرك السيرفو
مثال مناسب لمحرك سيرفو الدورة الكاملة -:full rotation
>#include <Servo.h
;Servo moto
moto.attach(2); //pin connected to motor
moto.writeMicroseconds(1300); //1300=clockwise
;)delay(2000
moto.writeMicroseconds(1700);//1700=counterClockWise
;)delay(2000
moto.detach(); //stops the motor
يوجد ثالث طرق للتحكم بخطوات المحرك (خطوة بقطب ،خطوة بقطبين ،نصف خطوة) ال تحتاج للتعمق
في كل هذه الطرق شاهد الرابط التالي إذا أردت فهم الطرق المختلفة ( هــــــنا )
أيضا ً يمكنك التحكم بمحرك الخطوة بسلكين أو بأربعة (سنركز على األسهل هنا وهو 4أسالك)
يستهلك السلك الواحد لمحرك الخطوة حوالي 150mAومنافذ األردوينو ال تتمكن من إخراج هذا التيار.
يمكن تقسيم محركات الخطوة إلى قسمين بشكل عام :
Bipolarوجود طرفين لكل ملف يمكن يحتاج لـ H-bridgeمثل L2093Dو يعطيك عزم
أقوى ()torque التحكم بهما وعكس القطبية
المزيد
يحتاج دائرة تكبير بسيطة مثل ULN2003A Unipolarوجود طرف واحد للتحكم
المزيد بكل ملف.
صندوق التروس Gear boxوعدد الخطوات :steps/rev
129
كما رأينا في الرسم السابق فإن الدورة الواحدة تتكون من 4أقطاب وتحتاج 4خطوات .ولكن في معظم
المحركات نحن نستخدم صندوق التروس gear boxلزيادة القوة مع إنقاص السرعة .هذا يجعل الدورة
الواحدة التي تراها تحتاج إلى 100أو 200خطوة ! ستجد عدد الخطوات الالزمة إلكمال دورة في
مواصفات كل محرك .واذا لم تعرف خطوات المحرك الذي معك ولكن وجدت زاوية الخطوة (مثال)7.2:
فاقسم 360على الزاوية لتعرف عدد الخطوات.
المحرك الذي سنستخدمه في التجربة ( )28BYJ-48من نوع Unipolarوتنقسم الدورة الواحدة فيه إلى
64خطوة وسوف نشغله بسرعة 60خطوة في الثانية وبطريقة ( )4أسالك تحكم.
>#include <Stepper.h
;int spr = 64
;)Stepper moto(spr, 8, 10, 9, 11
{ )(void setup
};)moto.setSpeed(60
شرح هذا الجزء-1 :تضمين المكتبة
-2تحديد عدد الخطوات للدورة الواحدة في المحرك steps per revolution
-3إنشاء كائن object -instanceمع تعريف الخصائص (الخطوات ،و المنافذ المستخدمة)
الحظ :ترتيب األرقام للمنافذ مهم _ إذا لم يدر المحرك بالشكل المطلوب غير ترتيب المنافذ.
-4داخل setupنحدد سرعة الدوران (كم دورة في الدقيقة ) rpmلكل محرك حد أقصى للسرعة
مالحظة :إذا أحببت متابعة كل طرف و التأكد من خطوات التشغيل ؛ أنقص السرعة إلى ( ) 1
{ )(void loop
;)moto.step(3*spr
;)delay(500
;)moto.step(-500
} ;)delay(500
األمر object.stepتحدد له عدد الخطوات ،و في المثال سـيدور المحرك ثالث دورات .
ثم يتوقف لنصف ثانية ،ثم يدور في االتجاه المعاكس لـ 500خطوة.
لقراءة صفحة محرك الخطوة اضغط هنا
تمرين :صمم كود للتحكم بمحرك خطوة بوجود 4أزرار للتحكم
يمين سريع ،يمين بطيء ،يسار سريع ،يسار بطيء
130
الحاجة لذاكرة الـ ايبروم :تخيل أنك صممت جهاز ليقرأ درجة الحرارة كل 10دقائق ويضع هذه
int x , int y , intمثالً. القيم (درجات الحرارة) في متغيرات z :
قمت بكتابة الكود ورفعته إلى األردوينو ،فتم تخزينها في ذاكرة Flash memory
ثم وضعته في مكان التشغيل (مثال مصنع) و شغلته باستخدام بطارية .ثم إنك أحببت أخذ هذه القيم إلى
الكمبيوتر.
المشكلة أنك بمجرد فصل الطاقة عن األردوينو فإن جميع هذه القيم ستختفي .إلنها فعليا ً كانت مخزنة في الـ
رام فقط .وذاكرة الـ RAMتفقد كل محتوياتها بمجرد فصل الطاقة عنها.
ذاكرة اإليبروم EEPROMمخصصة لالحتفاظ بالبيانات حتى بعد فصل الطاقة عنها .وهي مفيدة كثيرا
في كثير من المشاريع المتقدمة.
131
وبدالً عن ذلك استخدم مصفوفة حروف محددة الحجمString ال يمكن تخزين عبارة بصيغة:مالحظة
::مثال
char x[12]=”sami grami..”;
EEPROM.put(500,x); //Writing on location 500
char y[12];
EEPROM.get(500,y); //Reading from location 500
تمرين-:
أ -صمم كود يقيس شدة االستضاءة في غرفة ويخزن القراءة في االيبروم ويكرر العملية كل 10ثواني .
وفي حال امتالء الذاكرة االيبروم .يتوقف الكود عن التخزين.
أطفئ األردوينو .األفضل جعل العداد addressمخزن في االيبروم بحيث في حال انقطاع الكهرباء
فإن التخزين يكمل من مكان التوقف و ال يعيد من جديد.
ب -صمم كود آخر لقراءة محتويات الذاكرة EEPROMو عرضها على شاشة السيلاير
134
الشاشة من أهم المكونات التي تساعدك لعمل مشاريع رائعة فبدل أن تربط األردوينو بالكمبيوتر لعرض القيم
و العبارات .يمكنك أن تعرض العبارات و المعلومات على شاشة بسيطة في أي مكان و بتكلفة منخفضة.
السعر على أمازون حوالي ( 30 = )$8لاير تقريبا ً
أشهر شاشات الكريستال تتمكن من عرض صفين في كل صف 16حرف لذا تسمى LCD 2*16
بينما توجد شاشات بمقاسات مختلفة مثل 4*20 :
توجد شاشات أدق و لكنها أصعب تسمى OLEDلن نشرحها في هذا الكتاب
في البداية يجب عليك معرفة األطراف و كيفية توصيلها .و بعض الشاشات تكتب لك أسماء األطراف
بوضوح ،بينما للبعض اآلخر يجب عليك البحث في ورقة مواصفات الشاشة
(قد تكون مرفقة ،و قد يتوجب عليك ايجادها في االنترنت)
طريقة التوصيل ألحد األنواع الشائعة
قمنا بتوصيل التغذية 5+و GNDباللونين األحمر و األسود وصلنا الـ RWإلى GND
135
الطرف ( VOيسمى VEEأحياناً) يجب توصيله إلى الـ GNDفي بعض الشاشات .ويجب توصيله إلى
مقاومة متغيرة في شاشات أخرى لضبط إضاءة الشاشة (التباين)
الجميل أن باقي األطراف يمكنك توصيلها ألي منفذ رقمي بحيث تقوم بتعريفها في بداية الكود كما يظهر:
>#include <LiquidCrystal.h
)LiquidCrystal lcd(3,5,8,9,10,11); // (RS,E,D4,D5,D6,D7
ترتيب االرقام هنا هام _ ويجب أن يتوافق حسب توصيلك (الحظ ترتيب األرقام في الكود مع التوصيل)
لقراءة المزيد عن خيارات األمر السابق ( ) constructorاضغط هنا
بعد تعريف الشاشة ستحتاج لبعض األوامر البسيطة للكتابة على الشاشة
;int x=100
{ )(void setup
)lcd.begin(16,2); // (columns , rows
إلظهار عبارة مكتوبة lcd.print("hello, world ! "); //
يذهب للسطر الثانيlcd.setCursor(0,1); //
;)delay(3000
لمسح كل ما يظهر على الشاشةlcd.clear(); //
في حالة رغبتك في عرض عبارة طويلة (أكثر من 16حرف للسطر) يمكنك االستفادة من األمر:
( )scrollDisplayLeft
;)"lcd.print("hello, world! my name is Sami Grami
;)delay(500
عدد خطوات االزاحة هنا for(int i=0;i<20;i++){ //20
;)(lcd.scrollDisplayLeft
};)delay(300
LiquidCrystal lcd تكتب قبل void setupو فيها تتغير األرقام حسب
;)(8,9,4,5,6,7 الحاجة ( ) RS,E,D4,D5,D6,D7
;)lcd.begin(2,16 2هو عدد األصفف و 16عدد األعمدة
;)(lcd.clear مسح جميع محتويات الشاشة.
;)lcd.setCursor(0,0 وضع المؤشر في أي مكان في الشاشة ()c,r
تمرين :صمم ساعة رقمية تعرض الثواني و الدقائق و الساعات على شاشة LCD
137
وااااااااااااو … من أروع مميزات األردوينو (في رأيي) أنه يتيح لك التحكم واو … 😲
الالسلكي باستخدام ريموت كنترول بسيط .يمكنك اآلن بسهولة التحكم بتشغيل األجهزة الكهربائية بريموت
التلفزيون أو الرسيفر (ياناس أحب األردوينو ذا) 😍
سنشرح قليال ً عمل الريموت قبل أن نبدأ بالبرمجة و االستخدام:
يعمل الريموت (المرسل) على إرسال إشارة (ذبذبات) بضوء غـير مرئي (تحت الحمراء) وحسب كل زر
تضغطه فإنه يرسل الذبذبات بطريقة معينة .هذه الذبذبات يستحسن أن تترجم من شكل اإلشارة إلى رقم
(بالصيغة السداسية عشر)
الخبر الجيد أنه أن األردوينو يمكنه التعرف على أي ريموت .فقط اتبع الخطوات التالية -:
المرحلة األولى :معرفة الكود الذي يتم ارساله عند الضغط على كل مفتاح
(مثالً 0xFA58H3عند الضغط على السهم األيمن)
138
المرحلة الثانية :تغيير الكود بحيث نكتشف الزر الذي تم الضغط عليه (بقراءة الكود)
ثم تنفيذ العمل المطلوب (مثالً تشغيل أو إطفاء لمبة)
األوامر الرئيسية-:
IRrecv ;)rec(10 تعريف كائن مستقبل اسمه recومتصل بالمنفذ 10
decode_results ;res كائن اسمه resوهو مساحة في الذاكرة لتخزين الشفرة
;)(rec.enableIRIn تشغيل المستقبل للـ IRوانتظار إشارة من الريموت
==)while(rec.decode(&res ايقاف البرنامج بانتظار إشارة من الريموت
}{)0
سنقوم اآلن بكتابة كود بسيط لتشغيل LEDو إطفائه باستخدام نفس الزرين في الريموت.
>#include <IRremote.h
IRrecv rec(7); //here put receiver pin
;decode_results res
{ )(void setup
139
;)(rec.enableIRIn
;)pinMode(13,OUTPUT
};)digitalWrite(13,LOW
{ )(void loop
{))if (rec.decode(&res
{)if(res.value==0x707005FA
};)digitalWrite(13,HIGH
{)else if(res.value==0x7070857A
} ;)digitalWrite(13,LOW
} } ;)(rec.resume
تمرين :صمم دائرة باستخدام األردوينو بحيث تربط ريموت كنترول باألردوينو .و تستقبل جميع
األرقام 9-0و يكون الخرج هو سماعة بسيطة .و العمل أن تصدر نغمة مختلفة عند الضغط على كل
رقم.
140
في بعض المشاريع تحتاج لتسجيل مقدار كبير من المعلومات (القراءات) بدون أن تبقى باتصال مع
الكمبيوتر .مثال :قياس درجة الحرارة طوال السنة .هذا العمل يسمى . logging
بإمكانك استخدام الذاكرة الدائمة داخل شريحة األردوينو EEPROMلكن حجمها صغير ( )1KBكما
أن استخراج المعلومات منها يعتبر نسبيا صعب لغير المتخصص.
الخيار األمثل في هذه الحالة هو استخدام ذاكرات الـ SDفهي رخيصة واستخدامها سهل.
الرائع في األمر أنه بإمكانك أخذ مئات أو آالف القراءات بسهولة من األردوينو إلى الذاكرة SDإلى
الكمبيوتر إلى برنامج أكسيل ؛ ثم رسم شكل بياني يبين لك خالصة كل تلك القراءات.
األردوينو أونو ال يأتي مع منفذ للذاكرة لذا يجب شراء الدائرة الملحقة التي تربط األردوينو بذاكرة الـ SD
توجد أنواع عديدة من هذه الدوائر ،لذا تأكد من قراءة التعليمات قبل استخدامها وتوصيلها.
141
MISO master in / Slave out pin12 نقل البيانات من الذاكرة إلى األردوينو
CS Chip select *any اختيار الملحق الفعال (في حال الربط بأكثر من ملحق)
عند توصيل الدائرة اإلضافية (مدخل الذاكرة )SDوصل جميع األسالك التي تحدثنا عنها في أماكنها
المذكورة في الجدولMOSI , MISO , CLK :
CSفي أي منفذ آخر
5vو GNDبشكل طبيعي .وال توصل 3.3v
الطريقة التي ينصح بها للكتابة على ذاكرة SD cardتتكون من عدة خطوات :شاهدها في المثال.
142
>#include <SPI.h
>#include <SD.h
{ )(void setup
التأكد من تشغيل الذاكرة بشكل سليم if (!SD.begin(CS)) {return;} //
فتح الملفsami = SD.open("semsem.txt", FILE_WRITE); //
ال تكتب إال إذا فتح الملفif (sami) { //
;)"!sami.println("I will upload once only
اكتب عبارة أو قيمة متغيرsami.println(x);//
يجب إغالق الملف بعد كل كتابةsami.close(); }}//
}{ )(void loop
الحظ أن samiهو اسم الكائن (في الكود) بينما اسم الملف في الذاكرة سيكون semsem.txt
لالستزادة شاهد :درس يوتيوب أو اقرأ صفحة القراءة و الكتابة من الموقع الرسمي :هـــنا
لمعرفة كيفية تحويل القراءات إلى رسم شاهد الفيديو (اضغط هنا)
143
تمرين :اربط مقاومة متغيرة باألردوينو ،اقرأ قيمة الجهد التماثلية و اكتبها على ذاكرة SD
و اكتب معه قيمة الزمن بأمر millisكرر العملية كل 100ميللي ثانية
ثم افتح الملف في الكمبيوتر .
الحل -:وصل موديول القراءة و الكتابة على الذاكرة SDإلى المنفذ الرقمي 4
وصل المقاومة المتغيرة على الطرف A5
>#include <SPI.h
>#include <SD.h
;File sami
تحديد المنفذ المتصل بالذاكرةint CS=4; //
هذا المتغير سيحمل قيمة القراءة في كل مرةint x; //
{ )(void setup
} };if (!SD.begin(CS)) {return
{ )(void loop
;)x=analogRead(A5
;)sami = SD.open("log3.txt", FILE_WRITE
{ )if (sami
;)sami.print(x
;)"sami.print(",
;))(sami.println(millis
;)(sami.close
};)delay(100
}
144
هذا هو الباب األخير في هذا الكتاب .وهو لن يكون عن األوامر البرمجية والمكتبات .بل لن يكون درسا!
سيكون أقرب لحوار خفيف على كوب شاي… أتمنى ذلك👦 .
المشاريع اإللكترونية هي أجهزة إلكترونية يصنعها الهواة و الطالب و المهندسين ألهداف معينة .أحيانا
لتنفيذ نموذج مبدئي لجهاز يحل مشكلة معينة .و أحيانا ً لحل مشكلة يواجهها الشخص في البيت أو في
الحياة عموماً .بعض المشاريع الهدف منها التعلم و زيادة الخبرة .وربما قد يعتبر مشروعك هـو سيرتك
الذاتية التي سوف تحصل بها على وظيفة أحالمك.
كثير من األعمال التي نفذناها باألردوينو سابقا ً هي ال تحتاج في الحقيقة لألردوينو لتنفيذها !! بل يمكن
تنفيذها بدوائر أبسط وأرخص !! مثل الوميض أو إصدار الصوت أو تشغيل محرك دي سي أو بعض
األوامر البسيطة األخرى .األردوينو مفيد جدا ً ال شك .سوى أن الفائدة
الحقيقية في النهاية هي ماذا إستطعت أن تفعل باألردوينو ؟
بالنسبة للمستخدم العادي :هـل مشروعك يحقق له فائدة يحتاجها ؟ أم ال؟
بالنسبة للشركات تكون المعادلة :هل هذا المشروع قابل للتسويق و تحقيق
أرباح؟ أم ال ؟
في الحقيقة هناك مجاالت عديدة عامة قد تندرج تحتها عشرات و مئات األفكار و المشاريع مثل:
األتمتة ( ⌛automationالكلمة صعبة ،أعلم ):
جعل الكهرباء و اإللكترونيات تقوم بعمل بسيط
اعتاد اإلنسان القيام به مثل ري األشجار ،أو تشغيل
اإلضاءة .أو إطعام الحيوانات .أو تنظيف البيت .
الغسالة الفل اوتوماتيك مثال أيضا.
توفير الطاقة أو الماء💧 :مجال كبير و هام
فاستهالك الطاقة الكهربائية كبير جداً ،و كثير من
هذا االستهالك يضيع دون استفادة حقيقية .يمكن
ببعض الذكاء اإللكتروني التقليل من هذا الفقد.
السالمة :😓 Safetyعادة لن نفكر بهذه المشكلة
إال بعد أن نرى اإلصابات و الخسائر .توجد مخاطر
عديدة ،في المصنع في المنزل في الحديقة في
المسبح .يمكن تصميم أنظمة آلية لحماية األشخاص
و الممتلكات من هذه المخاطر.
خدمة أصحاب
االحتياجات الخاصة🙆 :يوجد أشخاص لديهم إعاقات سمعية أو بصرية أو
حركية .و اآللة قد تجعل حياتهم أسهل بكثير .هذا مجال جميل و رائع.
تسهيل الوصول (مثل ريموت التحكم عن بعد) 🎮 :أن تفتح الباب بدون
استخدام المفتاح .أو أن تغير درجة حرارة المكيف دون أن تقف (لمكيف
بدون ريموت) أو أن تستخدم االنترنت للتحكم بأجهزة كهربائية و أنت خارج
المنزل.
جمع المعلومات 📈 :في كثير من التطبيقات يحتاج اتخاذ القرار إلى كم كبير
من المعلومات .مثال ً نود بناء محطة طاقة شمسية أو محطة طاقة رياح .
أين هو المكان األمثل بعد دراسة لمدة سنة كاملة لمعرفة المكان األمثل.
تقليل السعر 💸 :توجد منتجات كهربائية مرتفعة السعر ،إذا استطعت إنتاج
منتج مشابه بتكلفة أقل .فأنت رائع.
بإمكانك هذه اللحظة التوجه إلى صفحة البحث قووقل أو يوتيوب .و البحث عن Arduino projects
ستجد مئات األفكار بعضها استعراضية و بعضها ذات تطبيقات مفيدة في الحياة شاهد هذا الفيديو على
سبيل المثال أيضا ً شاهد instructables :موقع خاص بتنفيذ األفكار و شرحها
ال يتسع المجال هنا لشرح كيفية تصميم جهازك اإللكتروني و هل ستصنع دائرة إلكترونية؟ و كيف ستصنع
الصندوق الحاوي لمكونات الجهاز .كيف ستثبت كل قطعة في مكانها .ستحتاج لمهارات فنية في تصميم
الجهاز وتشكيل المواد و تجميع القطع ولحام العناصر اإللكترونية و التوصيالت .كل هذا يتجاوز مجال هذا
الكتاب .وقد نناقشه في دورات و كتب قادمة.
الرابط التالي لفيديو لعملية وضع دائرة إلكترونية في صندوق مناسب وتشكيل الواجهة:
Circuit Skills: Electronics Enclosures
مجرد التأمل في اإلضافات الكثيرة التي يمكن ربطها باألردوينو قد يجعلك تجد أفكار عديدة قابلة للتحسين
http://arduinomodules.info/ موقع رائع لمشاهدة اإلضافات لألردوينو
151
استفدت أنا كثيرا و أنا أبحث في مواضيع هذا الكتاب ،و أكتبه و أنسقه ،لكن مجاالت األردوينو أكثر بكثير.
إذا اتسع لي الوقت فسوف أنفـذ دورة أخرى و أكتب كتاب آخر أتمنى أن يحتوي على المواضيع التالية
والمزيد .
القراءة من ذاكرة ، SDإرسال إشارات IRمن األردوينو
توصيل األردوينو بالبلوتوث Bluetooth
توصيل األردوينو بسلك الشبكة Ethernet
توصيل األردوينو بالـ واي فاي
التحكم باألردوينو عبر اإلنترنت (جعل األردوينو يعمل كسيرفر)
التواصل المتقدم مع المكونات والشرائح اإللكترونية SPIنموذجا ً
استخدام الـ GPS
استخدام الساعة الدائمة RTC
استخدام شاشة الـ OLED
االتصال مع شبكة الجوال GSM
كيف تبني مكتبة Libraryخاصة بك
كيف تستخدم المداخل التماثلية كمنافذ رقمية
كيف تجعل األردوينو يعمل كـ كيبورد أو ماوس
152
خاتمة-:
األردوينو سهل اإلستخدام (نوعا ً ما) لكن ال حدود الستخداماته وإمكانياته إال الخيال …
يمكنك أن تحل عشرات المشاكل في الحياة العامة باستخدام شريحة األردوينو الجميلة واإلضافات التي
تعلمناها معا ً .البرمجة هي لغة المستقبل ،هي اللغة التي نتحدث فيها مع اآلالت مباشرة.
المشاريع الصغيرة تبني الخبرة و الثقة و تمرنك على أهم المهارات العملية التي يحتاجها المهندس في
مسيرته المهنية :البرمجة ،اإللكترونيات ،الكهرباء ،القياس ،االختبار ،حـ ّل المشاكل والتحسين المستمر.
التواصل مع المهتمين بالمجال أهم مفاتيح التعلم و التطور :يوجد عدد كبير من المهتمين باألردوينو عبر
العالم .ستحتاجهم و سيحتاجوك .اللغة االنجليزية أيضا ً مهمة جدا اليجاد الحلول بسرعة,
تعريف بالمؤلف:
153
المؤهالت العلمية-:
ماجستير في الهندسة الكهربائية _ جامعة كولورادو دينفر_2014
بكالريوس الكلية التقنية بالرياض_إلكترونيات صناعية و تحكم_2006
دبلوم كلية االتصاالت بجدة_إلكترونيات صناعية و تحكم_2003
المعهد الثانوي الصناعي بجدة_إلكترونيات صناعية_1999
دورات واهتمامات-:
األنظمة الكمبيوترية الصغيرة (مثل األردوينو و الرازبري باي)
البرمجة (البايثون ،الماتالب ،الـ ) C++
التعليم اإللكتروني -مؤسس موقع jeem2التعليمي للهندسة
تصميم مواقع االنترنت (ووردبريس)
تصوير الفيديو +المونتاج +الفوتوشوب
التحدث (الخطابة) باللغتين العربية و االنجليزية
عضو مؤسس في نادي التوستماسترز بجدة (عربي/انجليزي)
154