Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 154

‫‪1‬‬

‫الكتاب مجاني لالستخدام الشخصي فقط _ وال يـُـسمح للجهات التعليمية استخدامه‬
‫أو طباعته بال موافقة المؤلف‬
‫‪2‬‬

‫الصفحة‬ ‫الموضوع‬

‫‪4‬‬ ‫أوامر البرمجة األساسية (أوراق تذكيرية مختصرة)‬

‫‪9‬‬ ‫الباب األول ‪ :‬تعرف على األردوينو ‪-‬البداية ‪ -‬المميزات و العيوب‬

‫‪13‬‬ ‫التعرف على بورد األردوينو أونو‬

‫‪16‬‬ ‫الفرق بين اإلشارات الرقمية و التماثلية ‪ +‬طرق تشغيل األردوينو ‪ +‬حساب التيار‬

‫‪18‬‬ ‫موديالت األردوينو المختلفة (من الشركة األصلية ‪ ،‬و من الشركات األخرى)‬

‫‪26‬‬ ‫الباب الثاني‪ :‬البرمجة ‪ +‬طرق برمجة األردوينو ‪IDE , Create , Tinker‬‬

‫‪35‬‬ ‫فهم أبسط كود أردوينو (الوميض ‪ + )Blink‬استخدام األمثلة ‪examples‬‬

‫‪38‬‬ ‫تمهيد للبرمجة ‪ ،‬أقسام األخطاء ‪ ،‬نصائح عامة للبرمجة‬

‫‪42‬‬ ‫أنواع المتغيرات ‪ + variables‬المتغيرات العامة و المحلية‬

‫‪46‬‬ ‫المنافذ الرقمية و األمر الشرطي ‪if‬‬

‫‪48‬‬ ‫اصدار صوت باستخدام األمر ‪tone‬‬

‫‪49‬‬ ‫ادخال أو إخراج إشارة تماثلية ‪analog‬‬

‫‪52‬‬ ‫‪for ,‬‬ ‫‪while‬‬ ‫حلقات ‪loops‬‬

‫‪53‬‬ ‫الذهاب إلى وسم ‪goto label‬‬

‫‪54‬‬ ‫استخدام شاشة السيلاير إلرسال المعلومات من و إلى األردوينو‬

‫‪58‬‬ ‫إجراء العمليات في األردوينو‬

‫‪60‬‬ ‫المصفوفات ‪arrays‬‬

‫‪62‬‬ ‫العمليات المنطقية ‪AND , OR , NOT‬‬

‫‪63‬‬ ‫العمليات على مستوى البت ‪ :‬االزاحة‪ ،‬القراءة و الكتابة ‪ ،‬المنطق‬

‫‪65‬‬ ‫تكتيكات برمجية ‪ :‬التحويل بين النطاقات ‪map , constrain‬‬

‫‪67‬‬ ‫توليد عدد عشوائي باستخدام األمر ‪random‬‬

‫‪68‬‬ ‫ايجاد القيمة األكبر أو األصغر باستخدام األمرين ‪min , max‬‬

‫‪69‬‬ ‫تكتيك الضبط عند بداية التشغيل ‪calibration‬‬

‫‪71‬‬ ‫الوميض بدون استخدام التأخير ‪ -‬استخدام األمر ‪millis‬‬

‫‪72‬‬ ‫كتابة الدوال في الكود ‪ + functions‬طريقة ‪case, switch‬‬


‫‪3‬‬

‫‪76‬‬ ‫تمارين برمجية على الباب الثاني‬

‫‪81‬‬ ‫الباب الثالث ‪ :‬إلكترونيات (أهم العناصر ‪ ،‬لوحة التوصيل‪ ،‬المخططات ‪ ،‬المحاكاة)‬

‫‪87‬‬ ‫استخدام الشريحة ‪ ATmega328p‬بدون األردوينو‬

‫‪91‬‬ ‫الملتيميتر الرقمي ‪Digital multimeter‬‬

‫‪92‬‬ ‫تكبير اإلشارة الكهربائية (الريالي ‪ ،‬الترانزيستور)‬

‫‪100‬‬ ‫مقاومة رفع الجهد و مقاومة خفض الجهد ‪pull up/down resistor‬‬

‫‪101‬‬ ‫تذبذب إشارة الدخل ‪Debounce‬‬

‫‪104‬‬ ‫مسجالت اإلزاحة ‪shift register‬‬

‫‪106‬‬ ‫محركات التيار المستمر ‪ DC motor‬و استخدام ‪H-bridge‬‬

‫‪109‬‬ ‫حساس المسافة الصوتي ‪ping / ultrasonic‬‬

‫‪111‬‬ ‫الباب الرابع‪ :‬المكتبات و لغة ‪- C++‬تضمين مكتبة ‪ ،‬تعريف كائن ‪object‬‬

‫‪118‬‬ ‫ربط لوحة األزرار مع األردوينو ‪keypad‬‬

‫‪120‬‬ ‫شاشة األضواء السبعة ‪seven segment‬‬

‫‪124‬‬ ‫محرك السيرفو ‪Servo motor‬‬

‫‪126‬‬ ‫محرك الخطوة ‪stepper motor‬‬

‫‪128‬‬ ‫استخدام الذاكرة الدائمة ‪EEPROM‬‬

‫‪132‬‬ ‫استخدام شاشة الكريستال ‪LCD display‬‬

‫‪135‬‬ ‫استقبال إشارة الريموت كنترول ‪IR remote‬‬

‫‪138‬‬ ‫التخزين على ذاكرة ‪SD‬‬

‫‪142‬‬ ‫الباب الخامس ‪ :‬المشاريع اإللكترونية (المجاالت‪ ،‬التصميم‪ ،‬التصنيع)‬

‫‪146‬‬ ‫اضافات عديدة يمكن ربطها باألردوينو (حساسات ‪ ،‬مشغالت)‬

‫‪149‬‬ ‫مواضيع إضافية سنشرحها بالمستقبل‬

‫‪150‬‬ ‫الخاتمة ‪ +‬تعريف بالمؤلف‬

‫سوف نبدأ بوضع األوامر األساسية والشائعة في برمجة األردوينو مع شرح مختصر في جداول لتكون‬
‫مرجعا لك أثناء البرمجة‪ .‬كتاب برمجة األردوينو الفعلي يبدأ عند الصفحة ( ‪) 9‬‬
‫أساسيات كود األردوينو ‪Sketch‬‬
‫‪4‬‬

‫>‪ #include <EEPROM.h‬المنطقة باألعلى (فوق ‪ )void setup‬يتم فيها‬


‫‪ int‬تعريف المتغيرات و ادراج المكتبات عادة‬ ‫;‪x =0‬‬
‫الحظ أن مكان تعريف المتغير تؤثر على طريقة عمله‬

‫} … { )(‪void setup‬‬ ‫كل األوامر داخل األقواس {‪ }...‬سيتم تنفيذها مرة واحدة‬
‫في بداية تشغيل الكود‬

‫} … { )( ‪void loop‬‬ ‫األوامر الموجودة بين القوسين { … } سيتم تنفيذها بشكل‬


‫مكرر مادام األردوينو يعمل‪.‬‬

‫} … {)(‪ void fun1‬المنطقة أسفل دالة ‪ void loop‬تستخدم لكتابة دوال جديدة‬
‫} … { )‪ int fun2(int x‬عادة‬

‫…‪// .‬‬ ‫لكتابة مالحظات من سطر واحد ‪//‬‬


‫‪/* ..… */‬‬ ‫*‪/‬‬ ‫لكتابة مالحظات من عدة أسطر ‪..… */‬‬

‫و تكتب عادة في جزء الـ سيتاب‬ ‫تحديد عمل المنافذ الرقمية ‪ (13-0‬دخل ‪ /‬خرج )‬
‫} … {) (‪void setup‬‬
‫;)‪pinMode(13,OUTPUT‬‬ ‫تهيئة الطرف رقم ‪ 13‬ليكون مخرج‬
‫الحظ أن األطراف ‪ 3,5,6,9,10,11‬تقبل الخرج التماثلي‬

‫;)‪pinMode(12,INPUT‬‬ ‫تهيئة الطرف ‪ 12‬ليكون مدخل (لقراءة الجهد)‬


‫;)‪pinMode(11,INPUT_PULLUP‬‬ ‫تهيئة الطرف ليكون دخل مع ربطه بمقاومة رفع‬
‫داخلية إلى ‪ _ 5v‬عادة اليستخدم مع الطرف ‪13‬‬

‫‪input & outputs‬‬ ‫أوامر اإلدخال (القراءة) أو اإلخراج (الكتابة)‬


‫;)‪digitalWrite(13,HIGH‬‬ ‫يخرج ‪ 5v‬على الطرف ‪ ، 13‬إلخراج ‪ 0v‬اكتب ‪LOW‬‬
‫يمكن كتابة ‪ 1‬بدل ‪ HIGH‬أو ‪ 0‬بدل ‪LOW‬‬

‫;)‪digitalRead(13‬‬ ‫يقرأ الحالة الرقمية على الطرف ‪ ، 13‬و تكون ‪ 0‬أو ‪1‬‬

‫;)‪analogRead(A0‬‬ ‫يقرأ قيمة الجهد على مدخل تماثلي و يكون الناتج ‪1023-0‬‬

‫;)‪analogWrite(3,255‬‬ ‫يخرج جهد تماثلي على المخرج ‪ 3‬قيمته ‪5v‬‬


‫الحظ أن األطراف ‪ 3,5,6,9,10,11‬تقبل الخرج التماثلي‬

‫;)‪tone(4,300,1000‬‬ ‫المزيد‬ ‫‪ 4‬رقم المخرج ‪ 300 ،‬التردد ‪ 1000 ،‬زمن النغمة‬

‫;)‪noTone(4‬‬ ‫إطفاء النغمة على المخرج ‪4‬‬

‫أوامر للتأخير وحساب الزمن ‪Delay & Time commands‬‬


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

‫= ‪unsigned long x‬‬ ‫يجب أن يكون نوع المتغير ‪unsigned long‬‬


‫;)(‪millis‬‬ ‫ويوضع فيه عدد ‪ ms‬منذ بداية تشغيل البرنامج‪.‬‬
‫;)(‪unsigned long y=micros‬‬ ‫مثل األمر السابق لكن بالمايكرو ثانية ‪μs‬‬
‫;)‪delayMicroseconds(12500‬‬ ‫تأخير زمني بالمايكرو ثانية‬
‫)‪pulseIn(10,HIGH‬‬ ‫المزيد‬ ‫يقيس زمن النبضة بالمايكروثانية‬
‫المتغيرات ‪ Variables‬هي أسماء ‪ ،‬قد تكون حرف مثل ( ‪ ) X‬أو كلمة مثل (‪ )input‬وتكون‬
‫لها قيمة عددية عادة مثال ‪ x=10 :‬أو ‪sensorPin = 0‬‬
‫مالحظة ‪ :‬تختلف األحرف الكبيرة عن األحرف الصغيرة ‪ ،‬لذا قد تجد أن ‪ x=10‬و ‪X=15‬‬
‫;‪int x = 0‬‬ ‫متغير يحمل رقم صحيح ‪ 32K-‬إلى ‪ 32K‬تقريبا ً‬

‫;‪const int m=7‬‬ ‫إذا كانت قيمة المتغير لن تتغير أثناء عمل الكود (غير ضروري)‬

‫;‪static int n=10‬‬ ‫تعريف متغير في ‪ loop‬بدون أن يعيد وضع قيمة لنفسه كل دورة‬

‫; ‪float y =16.25‬‬ ‫متغير يحمل رقم كبير و يقبل الفاصلة العشرية ‪15.78‬‬
‫(‪ )4B_4B-‬مالحظة يجب كتابة ‪ 5.0‬وليس ‪ 5‬فقط ‪.‬‬

‫;‪byte a = 10‬‬ ‫‪ 0-255‬مثل القيمة التي يطلبها األمر ‪analogWrite‬‬

‫;‪long var = 123456789‬‬ ‫متغير يحمل رقم كبير (يستخدم ‪ 4‬بايت) ‪ 2B-‬إلى ‪2B‬‬

‫;‪unsigned long X=120000000‬‬ ‫متغير يمكنه حمل رقم كبير ‪ 0‬إلى ‪ 4.3‬بليون‬

‫;‪bool z=0‬‬ ‫;‪z=1; z=0‬‬ ‫; ‪z=HIGH; z=LOW‬‬


‫متغير يحمل قيمة منطقين (نعم أو ال) ‪ 1‬أو ‪0‬‬

‫;’‪char v = ‘W‬‬ ‫متغير يحمل قيمة حرف ‪ASCII‬‬

‫; “ ‪String s= ”hey everyone‬‬ ‫مجموعة من الحروف (‪ )ASCII‬تسمى ‪String‬‬


‫;“!‪char z[] = “Hello world‬‬ ‫مصفوفة من الحروف و تسمى ‪string‬‬
‫;}‪int Pins[]= {2, 4, 8, 3, 6‬‬ ‫مصفوفة أرقام ‪ ،array‬و للحصول على أحد العناصر اكتب‬
‫‪x = Pins[2] >>> 8‬‬
‫‪int‬‬ ‫; ‪x=2 , y , z‬‬ ‫يمكنك تعريف عدة متغيرات من نفس النوع في أمر واحد‬

‫العمليات الحسابية ‪arithmetics‬‬


‫; ‪int x = 35‬‬ ‫إعطاء قيمة لمتغير ‪assigning a value‬‬
‫‪6‬‬

‫‪/‬‬ ‫*‬ ‫‪-‬‬ ‫‪+‬‬ ‫إجراء العمليات الحسابية المعروفة ‪operators‬‬


‫‪y = 9 % 3‬‬ ‫‪>> y=0‬‬ ‫يعيد لك باقي القسمة فقط ‪modulo‬‬
‫‪x = 10 % 3‬‬ ‫‪>> x=1‬‬ ‫مفيد في تطبيقات قليلة وال يعمل مع الـ ‪floats‬‬
‫;‪i++‬‬ ‫; ‪i--‬‬ ‫أمر مختصر يعمل على زيادة أوطرح ‪ 1‬من قيمة المتغير‪i‬‬
‫;‪x+=3‬‬ ‫;‪x-=3‬‬ ‫أمر مختصر يعمل على زيادة ‪ 3‬أو أي رقم آخر لقيمة‬
‫المتغير ‪ ..‬كأنها ‪ x = x+3‬مثالً‬

‫;)‪pow(5,2‬‬ ‫يحسب ‪ 5‬أس (للقوة) ‪25 = 2‬‬


‫;)‪sqrt(16‬‬ ‫يحسب الجذر التربيعي لـ ‪ 16‬و يساوي ‪4‬‬
‫;)‪abs(x‬‬ ‫يعيد القيمة المطلقة (بدون سالب) لـ ‪x‬‬
‫;) (‪sin( );cos( ); tan‬‬ ‫حساب الدوال المعروفة ‪sin , cos , tan‬‬
‫;) (‪log‬‬ ‫حساب اللوغاريتم ‪logarithm‬‬
‫;)‪random(10‬‬ ‫يعود بقيمة عشوائية من صفر إلى ‪9‬‬
‫;) ‪random( 5 , 15‬‬ ‫يعود بقيمة عشوائية من ‪ 5‬إلى ‪14‬‬
‫;)‪max(x,y‬‬ ‫يعود بأعلى قيمة من بين القيمتين‬
‫;)‪min(x,y‬‬ ‫يعود بأقل قيمة من القيمتين‬
‫;)‪map(x,0,255,0,5000‬‬ ‫تحويل قيمة من نطاق رقمي إلى نطاق رقمي آخر‬
‫مثال‪ :‬تحويل قيمة من مدخل تماثلي (‪ )1023‬إلى قيمة لمخرج تماثلي‬
‫(‪)255‬‬
‫ال يعمل مع أعداد كسرية‬

‫;) ‪constrain(x,0,100‬‬ ‫إذا تجاوزت قيمة ‪ x‬الحدود ‪ 0‬و ‪ 100‬فإن األمر يعيد القيمة لتبقى‬
‫داخل الـنطاق المطلوب‬

‫‪ :‬مقارنة تحدد تنفيذ األوامر في الكود‪.‬‬ ‫الشروط ‪ conditions‬والحلقات ‪loops‬‬


‫} … { )‪if (x == 10‬‬ ‫سوف يتم تنفيذ ما بين األقواس { ‪} ...‬‬
‫فقط إذا تحقق الشرط بين األقواس ( )‬
‫} … { ) ‪else if ( x > 20‬‬ ‫يمكن إضافة هذا األمر بعد الـ ‪if‬‬
‫} … { ‪else‬‬ ‫يمكن أضافة األمر بعد الــ ‪if‬‬
‫‪while ( x‬‬ ‫} … { )‪<= 5‬‬ ‫أبسط نوع من الـ ‪ loop‬سيتم تنفيذ ما بين القوسين‬
‫‪7‬‬

‫بشكل مستمر { ‪} ..‬‬


‫فقط مادام الشرط محقق ( … )‬
‫}…{)‪for(int i=0;i<100;i++‬‬ ‫دائرة ‪ for‬تستخدم عند الرغبة في تكرار أمر لعدد‬
‫محدد من المرات‬
‫;‪break‬‬ ‫يعمل على الخروج من الـ دائرة ‪ loop‬الحالية‬
‫‪goto label‬‬ ‫ينتقل مباشرة إلى مكان آخر في الكود‬
‫‪label: ...‬‬
‫;‪return‬‬ ‫ينهي استدعاء دالة أو يعيد قيمة‬
‫(متقدم‪ ،‬عند كتابة دوال)‬

‫جميع الشروط ‪: conditions‬‬


‫)‪(x>10‬‬ ‫يتحقق الشرط إذا كانت قيمة ‪ x‬أكبر من ‪ 10‬ويكون‬
‫الجواب نعم (‪ )1‬أو ال (‪)0‬‬
‫>‬ ‫<‬ ‫=>‬ ‫=<‬ ‫==‬ ‫=!‬ ‫باقي الشروط ( انتبه لعالمة == )‬
‫‪(x>10‬‬ ‫&&‬ ‫)‪y!=0‬‬ ‫يجب أن يتحقق الشرطين معا ً (‪)AND‬‬
‫‪(x<10‬‬ ‫||‬ ‫)‪x>30‬‬ ‫يجب أن يتحقق أحد الشرطين (‪)OR‬‬
‫التعامل مع شاشة المتسلسلة ‪Serial monitor‬‬
‫;)‪Serial.begin(9600‬‬ ‫تشغيل الشاشة المتسلسلة مرة واحدة في البداية‬
‫الحظ‪ :‬عند تشغيل السيلاير ال يمكن استخدام األطراف ‪ 0‬و ‪1‬‬

‫;) ‪Serial.println( x‬‬ ‫إظهار قيمة ( ‪ ) x‬على الشاشة ثم سطر جديد‬


‫‪Serial.print( “\t \n hello‬‬ ‫كتابة عبارة (‪)string‬‬
‫;)”‪world‬‬ ‫‪\t : tab‬‬ ‫‪\n : new line‬‬
‫}{))(‪while(!Serial.available‬‬ ‫طريقة إليقاف الكود في انتظار قيمة من المستخدم‬
‫}{)‪while(Serial.available()==0‬‬

‫)‪if (Serial.available()>0‬‬ ‫طريقة الستقبال أي قيمة من المستخدم عبر الشاشة‬


‫}‪{...‬‬ ‫المتسلسلة ‪serial monitor‬‬
‫;)(‪char x=Serial.read‬‬ ‫قراءة بايت من الشاشة المتسلسلة ككود ‪ASCII‬‬
‫}‪if (x==’y’){...‬‬ ‫لمعرفة الرقم المدخل اطرح ‪ 48‬من القراءة‬

‫;)(‪Serial.parseInt‬‬ ‫لقراءة قيمة ووضعها في متغير ‪int‬‬


‫‪8‬‬

‫;)(‪Serial.parseFloat‬‬ ‫لقراءة قيمة و وضعها في متغير ‪float‬‬


‫;)(‪Serial.readString‬‬ ‫لقراءة متغير (عبارة) و وضعها في ‪String‬‬
‫أوامر متقدمة نسبيا ً …‬
‫; ‪int x = 0x8C‬‬ ‫كتابة قيمة بالنظام السداسي عشر ‪.‬‬

‫; ‪int y=0b10001100‬‬ ‫كتابة قيمة بالنظام الرقمي الثنائي‬

‫;)‪int z= bitRead(y,2‬‬ ‫الستخالص بيت واحد من قيمة‬

‫;)‪bitWrite(y,0,1‬‬ ‫للكتابة على بت واحد ‪-‬المثال يكتب ‪ 1‬في الـ ‪LSB‬‬

‫‪shiftOut(13,12,‬‬ ‫مصمم للتعامل مع مسجالت اإلزاحة ‪shift registers‬‬


‫;)‪LSBFIRST,0b11001000‬‬ ‫‪ 13‬يستخدم إلرسال اإلشارة (البيانات)‬
‫‪ 12‬سيستخدم كساعة تزامن‬
‫‪ LSBFIRST‬أو ‪MSBFIRST‬‬
‫القيمة يستحسن أن تكون بالنظام الثنائي ‪0b11101‬‬

‫‪attachInturrupt(0,goFast,‬‬ ‫لتنفيذ مقاطعة عند تطبيق إشارة على األطراف ‪D2,D3‬‬


‫;)‪FALLING‬‬ ‫المعطى األول ‪ _ D2 : 0‬أو ‪D3 :1‬‬
‫_ سوف يستدعي الدالة اسمها ‪goFast‬‬
‫المعطى الثالث يمكن أن يكون‬
‫‪FALLING , RISING , CHANGE‬‬

‫;)(‪noInterrupts‬‬ ‫يوقف تنفيذ أي مقاطعة (االفتراضي استشعار المقاطعات)‬

‫;)(‪interrupts‬‬ ‫يعود الستشعار المقاطعات (بعد األمر السابق)‬


‫‪https://www.arduino.cc/en/Reference/HomePage‬‬
‫ولمشاهدة قائمة األوامر من الموقع الرسمي ‪:‬‬

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

‫سنجيب عن األسئلة ‪ :‬ماهو األردوينو ؟ أنواعه ؟‬


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

‫أنا اآلن في األسطر األولى من الكتاب ‪ ،‬لكن يظهر لي أن الكتاب سيكون طويل …‬

‫✌👍👌‬
‫عفواً … كنت أجرب اإليموجي في هذا البرنامج … أتمنى أن تستمتع معي في هذا الكتاب‪.‬‬

‫م‪.‬سامي قرامي (كتبه في ‪ 2017-3-29 :‬الساعة ‪ 11:46‬بنص الليل )‬


‫‪10‬‬

‫ماهو األردوينو ؟ ‪what is the Arduino‬‬


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

‫أهم مميزات األردوينو ‪advantages :‬‬


‫انخفاض السعر (أردوينو أونو سعره حوالي ‪ 40 = $10‬لاير)‬
‫سهولة اإلستخدام (مقارنة بغيره من الدوائر المبرمجة)‬
‫كثرة اإلضافات المتوافقة مع األردوينو و التي تقوم بأعمال متنوعة وتسمى ‪shields‬‬
‫موقع اإلنترنت الخاص باألردوينو منظم ومفيد جدا ً ‪arduino.cc‬‬
‫الشهرة الواسعة وآالف المستخدمين و الدروس و المشاريع عبر العالم‬

‫العيوب ‪Disadvantages :‬‬


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

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

‫يوجد أنواع عديدة من األردوينو ( ‪ ) standard boards‬مثل ‪ UNO‬و ‪ MEGA‬و ‪micro‬‬


‫وغـيرها ‪ ،‬و الرائع أنه يمكن إضافة خصائص إضافية على األردوينو بتركيب دوائر ملحقة بالبورد‬
‫األساسي و تسمى‪shield boards :‬‬
‫هذه اإلضافات كثيرة و لها مهام متعددة مثل‪:‬‬
‫)‪Ethernet Shield ($45‬‬
‫)‪4 Relay Shield ($20‬‬
‫)‪Protoshield (~$15‬‬
‫)‪LCD Screen ($20‬‬
‫‪Motor drivers‬‬
‫‪USB Host to control USB devices‬‬
‫‪12‬‬

‫‪where did it all start‬‬ ‫كيف بدأ األردوينو ؟‬


‫تم تطوير األردوينو عام ‪ 2005‬ليساعد في تعليم الطالب اإللكترونيات و البرمجة‪ .‬كان ذلك في إيطاليا ‪.‬‬

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

‫يمكن إدخال أو اخراج إشارة تماثلية أو رقمية إلى الشريحة (المايكروكنترولر)‬


‫‪13‬‬

‫تعرف على بورد األردوينو أونو‪Arduino UNO :‬‬

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


‫الحظ أعلى اليسار مدخل سلك الـ ‪ USB‬لونه فضي‪ -‬يستخدم لتشغيل األردوينو وربطه بالحاسب للبرمجة‬
‫مدخل الطاقة ‪ external power‬يمكن استخدامه لتوصيل الطاقة لألردوينو من شاحن أو بطارية‬
‫أعلى اليسار يوجد زر ‪ Reset‬أحمر ‪ .‬عند الضغط عليه يعيد األردوينو تشغيله (إعادة تنفيذ البرنامج)‬
‫بجانب زر ‪ Reset‬يوجد ‪ 6‬دبابيس معدنية ‪ .‬يمكن استخدامها بدل منفذ الـ ‪ USB‬لالتصال مع‬
‫الكمبيوتر‪ ،‬لكننا لن نحتاجها في هذه الدورة‪.‬‬

‫داخليا ً تحتوي شريحة الـ ‪ ATmega328p‬على التالي‪:‬‬


‫معالج ‪ CPU‬يعمل بتردد ‪16MHz‬‬
‫ذاكرة ‪ RAM‬سعتها ‪2KB‬‬
‫ذاكرة فالش ‪ Flash Memory‬وسعتها ‪ 32KB‬وتستخدم‬
‫لتخزين الكود ‪sketches‬‬
‫ذاكرة ‪ EEPROM‬سعتها ‪ 1KB‬وتستخدم لتخزين بيانات إضافية (غير الكود)‬
‫دائرة للربط مع المنفذ التسلسلي المستخدم في البرمجة وتسمى ‪UART‬‬
‫دوائر لـتشغيل منافذ الدخل و الخرج ‪I/O ports‬‬
‫ويمكنك شراء شريحة ‪ ATmega328P‬بحوالي ‪ 20 = $5 :‬لاير سعودي تقريبا ً‬
‫‪14‬‬

‫‪i/o ports‬‬ ‫‪pins‬‬ ‫المنافـــذ‬


‫الحظ أن اللوحة الزرقاء (البورد) تحتوي كتابات توضيحية كثيرة أمام كل منـفـذ ‪ .‬و هذا يساعدك على‬
‫معرفة عمل كل طرف‪ .‬و سنتحدث عن هذه مجموعات المنافـذ اآلن ‪.‬‬

‫المنافـذ الرقمية ‪Digital Pins‬‬

‫المنافـذ الرقمية عددها ‪ 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‬‬

‫منافذ الطاقة ‪ :‬في الجهة السفلية يسار ( ‪) Power Pins‬‬

‫بعد تشغيل األردوينو و توصيل الطاقة المناسبة له ‪ ،‬يمكنك أن تستخدم هذه المجموعة لتمد دائرتك‬
‫اإللكترونية بالطاقة المناسبة ( ‪ 5v‬أو ‪ ) 3.3v‬الطرفين ‪ GND‬تسمى األرضي و جهدها ‪0v‬‬
‫الحظ أيضا ً يمكنك أن تم ّد األردوينو بالطاقة عبر توصيل جهد مناسب (‪ ) 7v - 12v‬إلى الطرف ‪Vin‬‬
‫كما يمكنك أن تعمل ‪ Reset‬إعادة تشغيل لألردوينو عبر استخدام المنفذ ‪Reset‬‬
‫(لعمل هذا ‪ :‬وصل المنفذ ‪ reset‬بـ ‪) GND‬‬

‫المداخل التماثلية ‪Analog inputs‬‬

‫عددها ‪ )A0-A5( 6‬و يمكنها قياس الجهد (تماثلياً) _ ويكون التعامل معها بتوصيلها مع السلك المطلوب‬
‫قياس الجهد عنده ‪ ،‬ثم التحكم بها في البرنامج ‪.‬‬
‫مالحظة ‪ :‬يمكن استخدام هذه األطراف كمداخل رقمية أو مخارج رقمية ‪ .‬سنشرح الحقاً‪.‬‬
‫‪16‬‬

‫الفرق بين اإلشارات التماثلية و اإلشارات الرقمية‪-:‬‬


‫باختصار اإلشارة الرقمية ‪ ON/OFF‬مثال‪ :‬الضوء‬
‫شغال او طافي فقط‬
‫بينما اإلشارة التماثلية يمكن أن نتحكم بقيمة الجهد فيها‬
‫فيكون مثالً ‪0v , 1v , 3.3v 4.9v :‬‬
‫بهذا يمكن تشغيل اللمبة بتدريج (ضوء عالي ‪ ،‬منخفض‪،‬‬
‫منخفض جدَاًًَ ‪ ،‬و هكذا …)‬

‫مثال للتفرقة بين التماثلي و الرقمي ‪::‬‬


‫رقمي_ اللمبات العادية (‪ )ON-OFF‬فقط‬
‫تماثلي _ اللمبات التي تقبل التحكم بشدة اإلضاءة _ ‪dimmer‬‬

‫;)‪digitalWrite(13,1‬‬
‫;)‪analogWrite(3,127‬‬

‫يمكن تشغيل األردوينو (توصيله بالطاقة) بثالثة طرق‬

‫‪ -1‬من الكمبيوتر أو شاحن إلى مدخل الـ ‪USB‬‬


‫‪ -2‬مدخل الطاقة ‪ 5.5mm-2.1mm jack‬ويجب البحث عن المحول المناسب ‪7v - 12v‬‬
‫‪ -3‬تطبيق جهد الدخل ‪ 7v - 12v‬مباشرة على المنـفـذين ‪ Vin‬و ‪GND‬‬
17
‫‪18‬‬

‫حساب التيار الذي يسحبه األردوينو و باقي الدائرة‬

‫كما تعلم فــليست جميع الشواحن متساوية في الجهد‬


‫والتيار الكهربائيين (شاهد مثال شاحن االيفون و شاحن‬
‫االيباد)‬

‫األردوينو أونو يسحب ‪ 45mA‬عادة ‪ .‬لكن كلما شغلت ملحقات أكثر فإن سحب التيار سيزيد‬
‫(مثالً إضاءة ‪ ،‬صوت ‪ ،‬مرحالت…)‬

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

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


‫المنفذ الرقمي الواحد حوالي ‪20mA‬‬
‫والتيار الذي يمكن سحبه من الطرفين ‪ Vcc‬و ‪GND‬‬
‫يكون حوالي ‪200mA‬‬
‫‪19‬‬

‫‪Arduino Family‬‬ ‫عـائلة أردوينو‬


‫توجد إصدارات متعددة من بوردات األردوينو و بينها اختالفات‬
‫في الحجم والخصائص التقنية (مثل الذاكرة وعدد المنافذ)‬
‫جميع البوردات تتبرمج بنفس الطريقة فال تقلق 👌‬
‫‪Arduino UNO R3‬‬
‫أشهر نوع من بوردات األردوينو وقد شرحناه وعرضنا صوره‬
‫بالتفصيل سابقا ً ‪ .‬معظم هذا الكتاب سنركز عليه‪.‬‬
‫أهم ميزة رائعة في هذا البورد هو إمكانية استبدال شريحة الـ‬
‫مايكروكنترولر‪ .‬هذا يتيح لك تصنيع دائرتك الخاصة بعد برمجة‬
‫الشريحة‪.‬سوف‬
‫متقدمة في‬ ‫نشرح هذه الميزة الرائعة في مراحل‬
‫الدورة وفي الكتاب‪.‬‬
‫‪Arduino Leonardo‬‬
‫‪ UNO‬إال أن‬ ‫ال يختلف في شيء عن الـ ‪arduino‬‬
‫استبدالها ‪.‬‬ ‫شريحة المايكروكنترولر مثبتة وال يمكن‬
‫‪ USB‬وليس‬ ‫والمنفذ الـ ‪ USB‬المستخدم هو ‪micro‬‬
‫أرخص من الـ‬ ‫‪ USB typeB‬مثل السابق‪ .‬سعره‬
‫‪ UNO‬أيضا ً‬
‫أردوينو يون ‪Arduino YUN‬‬
‫يتميز اللـ ‪ YUN‬بأنه مدمج مع واي فاي ‪ . WiFi‬كما أن الـ‬
‫"يون" يتيح خيارات برمجية متقدمة بنظام لينيكس‪.‬لكن‬
‫برمجة الـ " يون " تكون في العادة مثل أي أردوينو بواسطة‬
‫برنامج برمجة األردوينو ‪ . Arduino IDE‬كما يمكن‬
‫برمجته السلكيا ً إذا تم تعريف الوايفاي على نفس الشبكة التي‬
‫يتصل بها الكمبيوتر‪.‬‬
‫عند بداية تشغيل الـ يوون سينشئ شبكة السلكية اسمها‬
‫‪arduinoYun-xxxx‬‬
‫اتصل بها ‪ ،‬ادخل المستعرض ثم أدخل العنوان‬
‫‪192.168.240.1‬‬
‫وأدخل الرقم السري‪ arduino :‬ستواجهك صفحة فيها اعدادات الـ يوون ‪.‬‬
‫‪20‬‬

‫األردوينو ميغا ‪Arduino Mega‬‬

‫يختلف األردوينو ميغا عن األونو بأن له مداخل و مخارج أكثر بكثير والجميل أن الجهة اليسرى من اللوحة‬
‫تتشابه مع األونو‪ ،‬و هذا يجعل من السهل استخدام نفس البرنامج ‪ ،‬وتوصيل األسالك بنفس الطريقة ‪ .‬أيضا‬
‫هذا يتيح استخدام نفس الدوائر اإلضافية التي تعمل على األنواع الشائعة من األردوينو ‪.‬‬
‫*مقارنة بين األردوينو أونو و األردوينو ميغا ‪UNO vs MEGA‬‬
‫األبعاد ‪cm‬‬ ‫‪EEPROM‬‬ ‫ذاكرة ‪RAM‬‬ ‫ذاكرة الكود‬ ‫المداخل التماثلية‬ ‫المنافذ الرقمية‬ ‫موديل األردوينو‬

‫‪6.8*5.3‬‬ ‫‪1KB‬‬ ‫‪2KB‬‬ ‫‪32KB‬‬ ‫‪8‬‬ ‫‪14‬‬ ‫‪UNO‬‬


‫‪10*5.3‬‬ ‫‪4KB‬‬ ‫‪8KB‬‬ ‫‪128KB‬‬ ‫‪16‬‬ ‫‪54‬‬ ‫‪Mega‬‬

‫األردوينو دوو ‪Arduino Due‬‬

‫األردوينو دوو يتشابه مع الميغا في الحجم و عدد المنافذ‪ .‬لكنه يحتوي معالج مختلف يعمل بسرعة أعلى (‬
‫‪ )84MHz‬كما أنه يعمل على جهد ‪ 3.3v‬وليس ‪ 5v‬مثل األنواع الباقية من األردوينو ‪ .‬هذا يجعل‬
‫بعض الدوائر اإلضافية ال تعمل على األردوينو دوو‪.‬‬

‫األردوينو مايكرو ‪ ،‬نانو ‪ ،‬ميني‬ ‫اإلصدارات الصغيرة من األردوينو‬


‫‪21‬‬

‫في بعض التطبيقات ستحتاج لتصغير الدائرة قدر اإلمكان ‪ .‬توجد موديالت عديدة صغيرة الحجم من‬
‫األردوينو ‪ .‬و عيبها هو صعوبة استخدام الدوائر اإلضافية ‪ Shields‬المعتادة معها‪.‬‬
‫(مالحظة هنا سنضع منتجات شركة أردوينو األم ‪ .‬لن نضع األنواع التي تنتجها شركات أخرى)‬
‫أردوينو مايكرو ‪Micro‬‬
‫األبعاد‪mm 18 * 48 :‬‬
‫المنافذ الرقمية ‪ _ 20 :‬منها ‪pwm 7‬‬
‫المداخل التماثلية‪12 :‬‬

‫أردوينو نانو ‪Nano‬‬


‫األبعاد‪mm 18 * 45 :‬‬
‫المنافذ الرقمية ‪ _ 22 :‬منها ‪pwm 6‬‬
‫المداخل التماثلية‪6 :‬‬

‫أردوينو ميني ‪Mini‬‬


‫األبعاد‪mm 18 *30 :‬‬
‫المنافذ الرقمية‪ _ 14 :‬منها ‪pwm 6‬‬
‫المداخل التماثلية‪8 :‬‬
‫مالحظة‪ :‬ال يمكن توصيل الـ ميني إلى الكمبيوتر مباشرة‪،‬‬
‫يجب استخدام دائرة وسيطة‪.‬‬
‫مالحظة‪ :‬لكل نوع يجب أن تعرف توزيع األطراف ‪ :‬موقع المنافذ‬
‫التماثلية و موقع أطراف التغذية الكهربائية و هكذا ‪ .‬في هذا الكتاب‬
‫لن نضع صور لكل هذا ‪ ،‬بل سنعلمك الطريقة 😄‬
‫فقط استخدم موقع أردوينو‬
‫‪Arduino.cc >> products‬‬
‫ثم اضغط على اسم األردوينو المطلوب‪.‬‬

‫أو بحث الصور في قوقل و اكتب اسم الموديل ثم ‪_ pinout :‬‬


‫ستجد كل شيء 😘‬
‫‪22‬‬

‫أردوينو اسبلورا ‪arduino esplora‬‬


‫فكرة األردوينو إسبلورا أنه لوحة أردوينو‬
‫مدمج معها العديد من اإلضافات المتنوعة‬
‫ولهذا يمكن اعتبار اإلسبلورا مختبر لدمج‬
‫الحساسات مع البرمجة‪.‬‬
‫وهو مفيد للتطبيقات التعليمية‪.‬‬
‫يحتوي الكثير من االضافات ‪:‬‬
‫حساسات ضوء‪ ،‬حرارة ‪ ،‬صوت ‪ ،‬حركة‬
‫وميالن‬
‫عصا تحكم تماثلية ‪Analog‬‬
‫‪ 4‬أزرار ضاغطة‬
‫مقاومة متغيرة خطية ‪slider‬‬
‫جرس (‪) buzzer‬‬
‫مدخل لذاكرة ‪SD card‬‬
‫‪23‬‬

‫أردوينو ليليباد ‪Arduino Lilypad‬‬

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


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

‫جميع أنواع األردوينو الرسمية (من الشركة األم ) اذهب إلى موقع ‪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‬‬

‫الـبــرمــجـــة ‪Coding‬‬ ‫الباب الثاني‪:‬‬

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

‫الطفل يستخدم التطبيقات ___________________ التي برمجها المبرمجون‬

‫اذا كانت لديك خلفية بسيطة في البرمجة ستعرف أنه توجد لغات برمجة كثيرة مثل‪:‬‬
‫‪Java , Python , HTML , Objective-C‬‬

‫‪++C‬‬ ‫بالنسبة لألردوينو فتتم برمجته بلغة ‪ C :‬ولغة‬


‫وهي من اللغات األساسية للبرمجة ومشهورة للغاية‪.‬‬
‫لذا إذا أحببت تعلم البرمجة فمن أفضل الطرق أن تبدأ مع األردوينو و لغة ‪.C‬‬
‫‪28‬‬

‫كيف أبدأ بكتابة كود لألردوينو‬


‫إذا كنت قد اشتريت األردوينو وتريد تشغيله فأمامك طريقتين للبرمجة‪:‬‬

‫‪-1‬تحميل برنامج األردوينو ‪ Arduino IDE‬على جهاز الكمبيوتر الخاص بك‪.‬‬


‫في موقع ‪ google‬اكتب ‪ arduino‬وادخل الموقع الرسمي ‪arduino.cc‬‬
‫في أعلى الصفحة ستجد زر في القائمة اسمه ‪ software‬اضغط عليه‬
‫ستجد خيارات عديدة للبرنامج ‪ :‬تحميل لويندوز أو ماك أو لينيكس‪.‬‬

‫‪ -2‬استخدام مبرمج األردوينو الحديث على االنترنت ‪Arduino Create‬‬


‫يعتبر تطور كبير على الطريقة السابقة من ناحية التحديثات و التنظيم و سهولة إضافة المكتبات‪ .‬يعيب هذه‬
‫الطريقة تعطل السيرفر أو مستعرض االنترنت أحيانا ً‬
‫(أنا شخصيا ً أفضل هذه الطريقة على الطريقة السابقة)‬
‫مالحظة ‪ :‬سيطلب منك انشاء حساب في الموقع ‪ ،‬كما سيطلب منك تثبيت ملف صغير على الكمبيوتر قبل‬
‫استخدام ‪Arduino Create _ web editor‬‬

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


‫‪29‬‬

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

‫في موقع ‪ Google‬اكتب ‪ tinkercad‬وسوف يقودك للموقع ‪tinkercad.com -:‬‬

‫اختر ( ‪ ) LEARN‬ثم اضغط على ( ‪ ) CIRCUITS‬وهنا تتبع الخطوات و أنشئ حسابا ً‬

‫في الحقيقة أنا استـفـدت كثيراً من هذا الموقع كمعمل إلكترونيات رائع ‪ ،‬و كمبرمج لألردوينو‪ .‬أتمنى أن‬
‫تستمتع باستخدامه‪ .‬شكرا ً ‪🙏 autodesk‬‬
‫مالحظة‪ :‬ال يمكننا شرح استخدام البرنامج في هذا الكتاب ‪ ،‬لكننا سنشرحه في دورة فيديو على ‪jeem2‬‬
‫‪30‬‬

‫تعـرف عـلى برنامج ‪Arduino IDE‬‬


‫سنشرح الطريقة األولى لبرمجة األردوينو (تثبيت برنامج ‪ ) Arduino IDE‬على‬
‫الكمبيوتر‪.‬‬
‫بعد تثبيت برنامج ‪ ArduinoIDE‬من موقع ‪ Arduino.cc‬افتح البرنامج …‬

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

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

‫فتح أمثلة كثيرة من األكواد ‪( Examples‬مفيد جداً)‬ ‫‪File‬‬


‫ضبط خيارات الخط‬
‫قص نسخ لصق ‪ ،‬البحث عن كلمة في الكود ‪🔍Find‬‬ ‫‪Edit‬‬
‫إضافة مكتبات األوامر ‪ ( Library‬سنشرح المكتبات قريباً)‬ ‫‪Sketch‬‬
‫اختيار موديل األردوينو المطلوب برمجته ‪Board‬‬ ‫‪Tools‬‬
‫اختيار المنفذ شيء يسمى ‪ . Port‬في حال وجود أكثر من أردوينو متصل للكمبيوتر‬
‫مجموعة روابط مساعدة‪.‬‬ ‫‪Help‬‬
‫فحص الكود‬
‫في حال وجود خطأ في القواعد الكتابية سينبهك أسفل الصفحة (المربع األسود)‬
‫فحص الكود ثم رفعه إلى األردوينو‬

‫فتح صفحة جديدة فارغة‬

‫فتح كود مخزن سابقا ً‬

‫حفظ الكود الحالي‬

‫فتح شاشة السيلاير ( مهم جدا ً) ‪Serial monitor‬‬

‫نصيحة‪ :‬قبل البدء بكتابة الكود اذهب لـ ‪ Tools‬واختر الموديل (مثال ‪)UNO‬‬
‫و تأكد من ظهور رقم واختياره عند الـ ‪port‬‬
‫‪32‬‬

‫في المساحة البيضاء ستكتب الكود‬


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

‫تعرف على شاشة السيلاير‪( Serial monitor :‬قبل البرمجة)‬

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

‫برمجة األردوينو عبر االنترنت ‪Arduino Create‬‬


‫‪34‬‬

‫اذا طلبت مني برمجة أردوينو اليوم فإني أفضل برمجتها باستخدام أداة البرمجة المتوفرة أونالين‬
‫‪ arduino-Create‬الواجهة أكثر تنظيما ً ‪ ،‬الوصول للمكتبات أسهل ‪ .‬وجميع األكواد مخزنة مع‬
‫حسابك و يمكنك الوصول لها من أي كمبيوتر متصل باالنترنت‪ .‬أيضا ً يمكنك تغيير األلوان لتكون غامقة و‬
‫مريحة للعين أكثر‪.‬‬
‫فقط اذهب لموقع األردوينو ‪ Arduino.cc‬وستجد رابط‬
‫‪Arduino >> software >> web editor‬‬
‫سيطلب منك انشاء حساب ‪ ،‬و تثبيت ملف صغير على الكمبيوتر‪ .‬الواجهة سهلة ‪ .‬إذا كنت تعرف العمل‬
‫على البرنامج العادي ‪ Arduino IDE‬فستحتاج لدقائق لالعتياد على الواجهة الجديدة‪.‬‬

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

‫أسهل كود أردوينو ‪Easiest code ever‬‬


‫‪35‬‬

‫انظر مثال ُ إلى هذه األسطر ‪ 👀 :‬ربما تكون هذه األسطر أسهل و أشهر برنامج (كود) لألردوينو‬
‫إنه كود الوميض ( ‪ ) 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‬‬
‫هذه األوامر يتم تنفيذها بشكل متكرر طوال فترة تشغيل األردوينو‪.‬‬

‫اآلن لندخل قليالً ونفهم األوامر في قسم الـ ‪setup‬‬


‫{)(‪void setup‬‬
‫} ;)‪pinMode(13,OUTPUT‬‬
‫كما قـلـنا سابقا ً يحتوي األردوينو أونو على ‪ 14‬منفذ رقمي ‪ .‬هذه المنافذ يمكن أن تعمل كمداخل أو‬
‫مخارج‪ .‬لذا يجب عليك تحديد عمل المنفذ قبل استخدامه‪ ،‬الحظ األمر ‪ pinMode‬يعمل على تهيئة المنفذ‬
‫‪ 13‬ليصبح مخرج ‪.‬‬
‫الحظ وجود العالمة ( ; ) بعد األمر ‪ .‬يجب أن ينتهي كل أمر بهذه العالمة حتى يقبله األردوينو‬

‫واآلن سنفهم األوامر في قسم الـ ‪loop‬‬


‫{)(‪void loop‬‬
‫;)‪digitalWrite(13,HIGH‬‬
‫;)‪delay(500‬‬
‫;)‪digitalWrite(13,LOW‬‬
‫;)‪delay(1000‬‬ ‫}‬
‫األمر ‪ digitalWrite‬يعمل على إخراج إشارة كهربائية على الطرف ‪13‬‬
‫‪ 5v=HIGH‬أو ‪0v=LOW‬‬
‫وبما أن المخرج ‪ 13‬مرتبط بـ ضوء في األردوينو فسوف ترى هذا الضوء يعمل‪.‬‬
‫األمر ‪ delay‬يعمل على تأخير زمني لمدة نصف ثانية‬
‫(‪ )500‬ميللي ثانية = نصف ثانية‬
‫وذلك أننا لو شغلنا الضوء و أطفأناه بدون تأخير فلن نالحظ الوميض بسبب سرعة األردوينو‬
‫أعتقد أن باقي الكود واضح وال يحتاج لشرح ‪ .‬سوف ينطفئ الضوء لمدة ثانية واحدة ثم يتكرر الوميض‪.‬‬
‫‪https://circuits.io/circuits/5246043-jeem2_book_ex1‬‬ ‫لمشاهدة الكود في المختبر‬
‫‪37‬‬

‫لقد فهمت الكود األول وبإمكانك تجربته على األردوينو و التالعب بزمن التأخير للتحكم‬ ‫مبروك !!‬
‫بالسرعة جرب مثال (‪ )300‬بدل (‪ )1000‬والحظ الفرق‪ .‬افرح فأنت اآلن تبرمج ‪...‬‬

‫رحلة البرمجة … التخاطب مع الكمبيوتر‬

‫كم تحتاج من الوقت لتصير مبرمجا ً جيداً ؟ …‬


‫ليس أياما ً وال أسابيع‪ .‬البرمجة عالم واسع وعلم متجدد‪ .‬البرمجة مهارة العصر الحديث؛ عصر المعلومات‬
‫و االتصاالت و االنترنت‪ .‬البرمجة هي التخاطب المباشر مع اآللة‪ .‬مع اإللكترونيات و الكهرباء‪ .‬البرمجة‬
‫تحتاج أشهر أو سنوات لتتعلمها وتتقنها‪.‬‬
‫ال غرابة أن أعلى الرواتب في كثير من الشركات العظمى تكون للمبرمجين 😐 … هـل أخفتك؟‬
‫ال يمكن في هذا الكتاب وال في أي كتاب شرح جميع األكواد‪ .‬األكواد ال حصر لها 😦‬
‫الكتاب مصمم ليواكب دورة مرئية (فيديو) على موقع ‪ jeem2‬وعلى اليوتيوب‪.‬‬
‫في دورة الفيديو سوف نبرمج العديد من الحاالت المختلفة ‪ .‬سنبرمج أكثر مما سنكتب هنا‪.‬‬
‫أنصحك بمتابعتنا هناك‪ .‬بالفيديو يمكننا شرح األكواد بشكل أفضل من الكتابة هـنا‪.‬‬

‫االستفادة من األمثلة (األكواد) المخزنة‬


‫‪38‬‬

‫اآلن لن نبني برنامج من جديد ‪ ،‬لكننا سنتعلم من مثال موجود و مخزن مع البرنامج‪ .‬اتبع الخطوات لفتح‬
‫الكود‪:‬‬
‫‪File >> Examples >> basics >> Blink‬‬

‫األخطاء في كتابة الكود ‪Errors , bugs‬‬


‫يتكون الكود من مجموعة من األوامر تسير عبر منطق معين لتنفيذ هدف معين‪( .‬مثل عمل إشارة المرور)‬
‫ويكون الكود مكتوب بلغة من لغات البرمجة (في حالة األردوينو اللغة هي ‪ C‬و ‪) C++‬‬
‫أنواع األخطاء عند كتابة الكود ‪:‬‬
‫‪ -1‬أخطاء في قواعد كتابة الكود ‪ Syntax bugs‬وهذه أخطاء يسهل إيجادها بواسطة البرنامج ‪IDE‬‬
‫مثل‪ :‬نسيان كتابة ( ; ) بعد أحد األوامر ‪ ،‬أو استخدام متغير لم يتم تعريفه مسبقا ً ‪.‬‬

‫‪ -2‬أخطاء منطقية ‪ Logic bugs :‬وهي أخطاء تجعل الكود ال ينفذ العمل المطلوب ‪ ،‬مع أن قواعد‬
‫الكتابة صحيحة‪.‬‬
‫‪39‬‬

‫أخالقيات البرمجة ‪Coding ethics‬‬

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

‫{)(‪void setup‬‬
‫} ;)‪pinMode(13,OUTPUT‬‬
‫{)(‪void loop‬‬
‫;)‪digitalWrite(13,HIGH‬‬
‫;)‪delay(1000‬‬
‫;)‪digitalWrite(13,LOW‬‬
‫;)‪delay(1000‬‬ ‫}‬

‫‪ -1‬كتابة المالحظات ‪-: 💬 Comments‬‬


‫يعمل المبرمجين على جعل األكواد مفهومة للمبرمجين اآلخرين ‪ ،‬لذا فهم يكتبون مالحظات لتشرح الكود‬
‫كامال ً ‪ .‬أو لشرح بعض األوامر‪ .‬هذه المالحظات ال تؤثر على طريقة عمل األردوينو أبداً ‪ .‬توجد طريقتين‬
‫لكتابة المالحظات‬
‫*‪/‬‬ ‫هنا اكتب أي مالحظات تحب‬ ‫‪*/‬‬ ‫لعمل مالحظات من عدة أسطر اكتب ‪:‬‬ ‫‪-‬‬
‫هنا اكتب أي مالحظات‬ ‫‪//‬‬ ‫لعمل مالحظات من سطر واحد اكتب ‪:‬‬ ‫‪-‬‬

‫الكود الماضي قصير جدا ً‬ ‫‪ -2‬تعريف المتغيرات الهامة أعلى الكود ☝‪-:‬‬
‫لكن الحال لن يكون هكذا دائما ً ‪ .‬ينصح المبرمجين بتعريف متغير في أعلى الكود يحتوي القيم التي يمكن‬
‫تغييرها للتحكم بطريقة التشغيل‪ .‬هذا يسهــّــل التعامل مع الكود في المستقبل من أي شخص‪.‬‬
‫في الكود الماضي ‪ ،‬الطرف الذي يومض هو ‪ ، 13‬و التأخير هو ثانية واحدة ‪.‬‬
‫‪40‬‬

‫من المهم أن يكون‬ ‫‪-3‬ترك مسافات بداية األسطر ‪-:👉 indenting‬‬


‫الكود سهل القراءة والتتبع‪ .‬لذا فإن المبرمجين يتركون مسافات بدايات األسطر تجعل من السهل معرفة‬
‫أقسام الكود‪ .‬ستظهر فائدة استخدام المسافات أكثر عندما نتعلم األوامر ‪ if‬و ‪for‬‬

‫في كثير من‬ ‫‪-4‬تسمية المتغيرات بطريقة ‪-:👍 camelCase‬‬


‫األحيان سنحتاج لتعريف متغيرات في الكود‪ .‬وبإمكانك أن تسمي المتغير أي إسم (مثال ‪ x‬أو ‪ ) z3‬لكن‬
‫إذا كان الكود كبيرا ينصح بتسمية المتغيرات أسماء معبرة عن عملها‪ .‬و إذا كانت أكثر من كلمة استخدم‬
‫حرف كبير بداية الكلمة الثانية و الثالثة ألأنه ال يمكنك ترك مسافة في اسم المتغير‪ .‬مثال‬
‫‪int‬‬ ‫;‪ledPin=10‬‬ ‫‪int‬‬ ‫;‪delayTime=750‬‬

‫هل الحظت كتابة األوامر بهذه الطريقة ؟‬


‫) (‪digitalRead‬‬ ‫‪,‬‬ ‫) (‪pinMode‬‬
‫لكن في بعض العبارات ال تنطبق هذه القاعدة و تكون جميع الحروف كبيرة !‬
‫‪41‬‬

‫الطريقة التي ينصح بها هي‪-:‬‬


‫*‪/‬‬
‫هذا الكود يعمل على تشغيل وميض على منفذ رقمي‬
‫‪*/‬‬
‫اختر المنفذ الذي سيرتبط به الضوء‪int LED=13; //‬‬
‫اكتب التأخير الزمني بالمللي ثانية‪int D=1000; //‬‬
‫{)(‪void setup‬‬
‫} ;)‪pinMode(LED,OUTPUT‬‬
‫{)(‪void loop‬‬
‫;)‪digitalWrite(LED,HIGH‬‬
‫;)‪delay(D‬‬
‫;)‪digitalWrite(LED,LOW‬‬
‫;)‪delay(D‬‬ ‫}‬
‫الحظ كتابة المالحظات أعلى الكود و أمام بعض األوامر (عادة يتغير لونها آليا ً في البرنامج)‬
‫الحظ أيضا تعريف المتغيرين ‪ LED‬و ‪ D‬أعلى الكود لجعل التحكم بالكود أسهل و أوضح‪.‬‬
‫الحظ أيضا ً في الكود تم استبدال رقم ‪ 13‬باسم المتغير ‪ LED‬في باقي الكود‬
‫و استبدال القيمة ‪ 1000‬باسم المتغير ‪D‬‬
‫الحظ أن بعض األسطر تبدأ من البداية ‪ ،‬و بعضها تترك مسافة (فارغة) قبل كتابة‬
‫األمر ‪ ،‬هذا يسمى ‪ indenting‬وهي تساعد في تسهيل قراءة الكود و تقسيمه إلى‬
‫أجزاء عند النظر إليه‪.‬‬

‫هـــل تشعر أنك فهمت الكود السابق بشكل جيد (كود الوميض) ؟‬

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


‫مستعداً … 💪‬
‫‪42‬‬

‫أنواع المتغيرات ‪Variables Types‬‬

‫في األكواد السابقة … الحظ وجود ( ‪ ) int‬قبل تعريف كل متغير ‪ .‬للمتغيرات أنواع كثيرة أشهرها‬
‫‪ int‬وهو لتعريف متغير (‪ )variable‬يحمل رقم صحيح (بدون فاصلة عشرية) ويمكن أن تكون قيمته‬
‫‪ 32767‬بالموجب أو بالسالب‪ .‬في معظم األكواد ستستخدم متغيرات من نوع ‪ int‬وسنشرح األنواع‬
‫األخرى مع األمثلة القادمة‪ .‬في الجدول التالي أشهر أنواع المتغيرات التي قد تحتاج لها‬
‫عدد البايتات‬ ‫االستخدام‬ ‫نوع المتغير‬
‫‪2‬‬ ‫متغير يكون فيه قيمة (رقم) تكون ‪ 32700-‬إلى ‪( 32700+‬تقريباً)‬ ‫‪int‬‬

‫‪4‬‬ ‫متغير يقبل قيمة عددية كبيرة ويقبل الفاصلة العشرية (‪)-/+‬‬ ‫‪float‬‬
‫;‪float z=10.12‬‬

‫‪1‬‬ ‫متغير يقبل قيمة عددية صغيرة (‪ )255-0‬فقط‬ ‫‪Byte‬‬


‫‪Byte‬‬ ‫;‪x=255‬‬

‫‪1‬‬ ‫متغير يحمل حالة من حالتين فقط (‪ 0‬أو ‪) LOW , HIGH( )1‬‬ ‫‪bool‬‬
‫;‪bool x=LOW‬‬

‫‪4‬‬ ‫‪ ) 2B‬تقريبا ً‬ ‫متغير يحمل رقم كبير ( ‪ 2B-‬إلى‬ ‫‪long‬‬


‫;‪long x=1000000‬‬

‫‪1‬‬ ‫متغير يحمل رقم ويعبر عن حرف بترميز ‪ASCII‬‬ ‫‪char‬‬


‫;’‪char x=’m‬‬

‫‪any‬‬ ‫مصفوفة من الحروف (كلمة أو جملة)‬ ‫‪String‬‬


‫‪String‬‬ ‫; “ … ‪x=”hello World‬‬
‫‪43‬‬

‫مالحظة ‪ :‬إذا كنت قد درست البرمجة في الحاسب سابقا ً و ربما لغة ‪ 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 :‬‬

‫ال تحاول حفظ الجدول !! الجدول لتوضيح الفكرة فقط 😂‬


‫‪45‬‬

‫المتغيرات العامة والمتغيرات المحليـّـة ‪Global vs Local variables‬‬


‫في األكواد السابقة قمنا بتعريف (‪ )Declare & assign‬المتغيرات أعلى الكود ‪-‬قبل ‪ void setup‬هذه‬
‫المتغيرات تسمى متغيرات عامة ( ‪ )Global Variables‬و يمكن استخدامها في أي مكان من الكود و‬
‫ستحتفظ بقيمتها‪ .‬بينما يوجد خيار ثاني وهو تعريف المتغيرات داخل الدوال ‪ .‬وهذا يجعلها قابلة‬
‫لالستخدام في الدالة فقط‪ .‬توجد فوائد كبيرة لهذه الطريقة ولكن يجب عليك أن تفهمها بشكل جيد‪.‬‬

‫في بعض الحاالت (عادة داخل القسم ‪ ) 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‬‬ ‫‪digital inputs‬‬ ‫المداخل الرقمية‬

‫األزرار ‪ buttons‬هي أبسط طريقة إلدخال إشارات رقمية إلى األردوينو‪.‬‬


‫تكون اإلشارة الكهربائية ‪ LOW‬أو ‪( HIGH‬صفر أو ‪ ) 5v‬وعادة نعبر عنها بـ ‪0,1‬‬
‫من المهم جدا استخدامها للتحكم بعمل األردوينو أثناء تشغيله ‪ .‬لذا نستخدم األمر ‪digitalRead‬‬

‫مهم جدا وهو يعمل على تنفيذ مجموعة أوامر فقط إذا تحقق الشرط بين األقواس( )‬ ‫األمر ‪if‬‬

‫=>‬ ‫=<‬ ‫!=‬ ‫==‬ ‫>‬ ‫<‬ ‫الشرط‬


‫أصغر من أو يساوي‬ ‫أكبر من أو يساوي‬ ‫المعنى أكبر من أصغر من يساوي ال يساوي‬
‫الحظ‪ :‬يمكن دمج شرطين أو أكثر في شرط واحد بعالقة (آند ‪ AND‬أو أور ‪ )OR‬أتمنى أنك تعرف‬
‫هذين األمرين‪ .‬مثال أنت تريد تشغيل الضوء بشرط أن يكون ‪ x=10‬و ‪y>100‬‬
‫‪if(x==10‬‬ ‫&&‬ ‫};)‪y>100) {digitalWrite(13,1‬‬
‫وبإمكانك تنفيذ أمر إذا تحقق أحد شرطين الشرط األول أو الشرط الثاني‬
‫مثال ‪ :‬تريد تشغيل الضوء إذا كان ‪ x<10‬أو ‪y<10‬‬
‫‪if(x>10‬‬ ‫||‬ ‫};)‪y>10) {digitalWrite(13,1‬‬
‫حتى يتم تنفيذ أحد هذه الشروط وليس‬ ‫‪else‬‬ ‫أيضا بإمكانك إتباع األمر ‪ if‬باألمر ‪ else if‬أو‬
‫جميعها ‪ .‬شاهد المثال‪:‬‬
‫} … { )‪if (x==0‬‬ ‫التنفيذ فقط إذا المتغير يساوي ‪//0‬‬
‫} … { )‪if (x>5 && y<x‬‬ ‫يجب أن يتحقق الشرطين للتنفيذ‪//‬‬
‫التنفيذ حال تحقق أي من الشرطين‪else if(x>=25||x<= -25){ … } //‬‬
‫} … { ‪else‬‬
‫‪47‬‬

‫قد يكون الشرح بالمثال أفضل و أسرع لذا شاهـد المثال التالي ثم سنشرحه‪:‬‬ ‫مثال ‪-::‬‬
‫‪/* 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‬اضغط هنا‬

‫‪https://circuits.io/circuits/5246020-jeem_book_ex2‬‬ ‫لمشاهدة هذا الكود في المختبر االفتراضي‪::‬‬


‫‪48‬‬

‫إصدار صوت باستخدام األمر ‪tone‬‬

‫إصدار صوت من الدائرة اإللكترونية من الطرق السهلة و الفعالة جداً للتنبيه‪ .‬الحظ أن األردوينو غير‬
‫مصمم إلصدار أصوات معقدة مثل الموسيقى أو صوت كالم بشري‪ .‬لكن بإمكانه إصدار نغمات مختلفة‬
‫باستخدام سماعة بسيطة مثل الصور السابقة‪.‬‬
‫تنقسم السماعات البسيطة إلى نوعين عموما ً ‪:‬‬
‫● سماعات خاملة تحتاج إلشارة كهربائية مترددة حتى تصدر صوت‬
‫● سماعات نشطة ‪ :‬تحتاج لجهد مستمر ‪ DC‬فقط لتصدر صوت‬
‫معظم السماعات المستخدمة (واألفضل) هي السماعات الخاملة والتي يمكن التحكم بنغمة الصوت بتغيير‬
‫التردد‪.‬‬
‫● الحظ أن السماعة لها قطبية (‪ +‬و ‪ )-‬وصل السالب إلى األرضي و الموجب إلى أي منفذ رقمي‪.‬‬
‫● معظم السماعات البسيطة (‪ )buzzer‬تتصل مباشرة بمنفذ األردوينو سوى أن بعضها تتطلب وجود‬
‫مقاومة (يستحسن قراءة التعليمات للسماعة إذا وجدت)‬
‫يعمل على إصدار صوت من المنفذ‪ 2‬بتردد ‪ 300‬هيرتز‪tone(2,300); //‬‬
‫;)‪noTone(2‬‬ ‫يعمل على إيقاف النغمة على المنفذ ‪//2‬‬

‫;)‪tone(2,300,500‬‬ ‫يمكنك إضافة رقم ثالث يكون مدة النغمة بالمللي ثانية ‪//‬‬
‫هـــــنـــــا‬ ‫جرب تشغيل أوامر الصوت في هذا الرابط‪:‬‬

‫شرح لألمر ‪tone‬‬ ‫لالستزادة ‪:‬‬

‫تمرين‪ :‬صمم أورغ بسيط جدا ً بـ ‪ 3‬أزرار أو ‪ _ 6‬بحيث كلما ضغطنا على زر يصدر نغمة مختلفة‪.‬‬
‫‪C=261 , D=293 , E=329, F=349 , G=392‬‬
‫‪49‬‬

‫المداخل والمخارج التماثلية ‪Analog inputs/outputs‬‬

‫هل تعرف الفرق بين اإلشارة الكهربائية الرقمية و اإلشارة الكهربائية التماثلية؟أتمنى أنك تعرف‬
‫إذا لم تكن تعرف ‪ ،‬ابحث في الفهرس عن القسم الذي يشرح الفكرة باختصار في هذا الكتاب (ص‪)16‬‬
‫معظم الحساسات في الواقع ترسل إشارات تماثلية (قياس الضوء ‪ ،‬الحرارة ‪ ،‬الصوت) في هذا المثال سوف‬
‫نقيس قيمة جهد تماثلي باستخدام مقاومة متغيرة ‪ .‬و يكون الخرج سماعة بسيطة ‪ .‬سوف يتغير الصوت‬
‫(التردد) حسب تغيير الجهد الداخل‬
‫‪ */‬عند تحريك ذراع المقاومة سيتغير الصوت (تردد الصوت) *‪/‬‬
‫;‪int spkr=3‬‬ ‫المنفذ الذي سيتصل بالسماعة‪//‬‬

‫{)(‪void setup‬‬
‫} ;)‪pinMode(spkr,OUTPUT‬‬
‫{)(‪void loop‬‬
‫;)‪int IN=analogRead(A0‬‬ ‫هنا سنقرأ قيمة الجهد التماثلي عند المدخل‪//‬‬
‫هذا األمر سيصدر إشارة صوت على المنفذ‪tone(spkr,IN+31); //3‬‬
‫;)‪delay(100‬‬
‫} ;)‪noTone(spkr‬‬

‫‪https://circuits.io/circuits/5246595-jeem2_book_ex3‬‬ ‫لمشاهدة تشغيل الكود في المختبر االفتراضي ‪:‬‬


‫‪50‬‬

‫الحظ األمر ‪ analogRead‬يدخل قيمة من‬


‫المقاومة المتغيرة (‪ . )1023-0‬وضعنا القيمة في‬
‫متغير اسمه ( ‪) IN‬‬
‫ثم استخدمنا األمر ‪ tone‬إلخراج اإلشارة إلى‬
‫السماعة بحيث تكون قيمة ( ‪ ) IN‬تردد الصوت‪.‬‬
‫يستمر الصوت لمدة ‪ 0.1‬ثانية ثم تنطفئ النغمة وتتكرر‬
‫العملية في الحلقة ‪loop‬‬

‫مثال لتوصيل مقاومتين ضوئية و ثابتة إلى مدخل‬


‫تماثلي ‪ Analog‬بحيث يمكن معرفة (قراءة) شدة‬
‫الضوء في المكان ‪.‬‬

‫إخراج قيمة جهد تماثلية ‪ PWM‬باستخدام األمر ‪analogWrite‬‬


‫إذا كان الجهد الرقمي يكون ‪ 0v‬أو ‪ 5v‬فقط ‪ ،‬فإن الجهد التماثلي يمكن أن يكون أي قيمة بينهما‪ .‬مثال‬
‫‪ 3.5v‬أو ‪1.25v‬‬
‫إذا دققت النظر بجانب المنافذ الرقمية ستجد بعضها يظهر بجانبه العالمة ( ‪ ) ᔕ‬وهي تدل أن هذا المنفذ‬
‫يمكن استخدامه إلصدار جهد تماثلي (بطريقة‪ )pwm‬وهي في األردوينو أونو (‪)3,5,6,9,10,11‬‬

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


‫;)‪analogWrite(10,125‬‬ ‫)‪//(pin, value 0-255‬‬
‫لذا ففي المثال السابق سنجد أن الجهد الصادر من‬ ‫الحظ أن القيمة التي يستقبلها األمر تكون ‪255-0‬‬
‫المنفذ حوالي ‪2.5v‬‬

‫مثال لكود بسيط يجعل ضوء (‪ )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 ‫استخدم اإلشارات التماثلية للتحكم بلون‬: 😏 ‫تطبيق خفيف دم‬

int G=5 , B=6 , R=3;


void setup(){
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT); }
void loop(){
int GV=random(0,255);
int BV=random(0,255);
int RV=random(0,255);
analogWrite(G,GV);
analogWrite(B,BV);
analogWrite(R,RV);
delay(1000); }
‫ اضغــط هــنـــا‬: ‫شاهد تشغيل هذا التطبيق‬
‫‪52‬‬

‫حلقات ‪ while‬و ‪for‬‬


‫األمر ‪ while‬يعمل على تكرار جزء من الكود‬
‫بين األقواس { } مادام الشرط متحقق‪.‬‬
‫} … { )‪while(x<100‬‬
‫وفي حال تغير قيمة ‪ x‬حتى تصير أكبر من ‪100‬‬
‫فسيخرج من الحلقة‬
‫*نادراً تتم كتابة األمر بهذه الطريقة‪:‬‬
‫;)‪do{ … } while( a<10‬‬

‫يشبه األمر السابق سوى أنه يستخدم عندما تكون تعرف عدد الدورات التي تريد تنفيذها‬ ‫األمر ‪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++‬‬

‫شرح‪for‬‬ ‫شرح‪while‬‬ ‫لالستزادة ‪:‬‬

‫تمرين‪ :‬صمم كود يعمل على إظهار ‪ 10‬ومضات سريعة ثم ‪ 3‬بطيئة باستخدام األمر ‪for‬‬
‫تمرين‪ :‬قراءة مقاومة متغيرة إذا كانت القراءة أعلى من ‪ 200‬يصدر صوت‪ ،‬إذا كانت أقل يعمل وميض‬
‫عادي _ استخدم األمر ‪while‬‬
53
‫‪54‬‬

‫الذهاب إلى َوســم ‪goto label‬‬


‫هذه الطريقة نادرة االستخدام لكنها تستحق الذكر في الكتاب‪.‬‬
‫يسير األردوينو على تنفيذ األوامر بالتوالي حسب كتابة الكود‪ .‬لكن األمر ‪ goto‬ينقل تنفيذ األمر مباشرة‬
‫إلى أي مكان آخر في الكود ؛ شرط أن يتم تسمية ذلك المكان ثم وضع ( ‪ ) :‬بعد اإلسم‪.‬‬
‫مثال‪:‬‬
‫{)(‪void setup‬‬
‫;)‪pinMode(3,OUTPUT‬‬
‫;‪goto label1‬‬
‫;)‪label2: tone(3,1000‬‬
‫} ;)‪delay(500‬‬
‫{)(‪void loop‬‬
‫;)‪label1: int x=analogRead(A0‬‬
‫};‪if(x>800) { goto label2‬‬
‫;)‪tone(3,300‬‬
‫;)‪delay(500‬‬
‫;)‪tone(3,400‬‬
‫} ;)‪delay(500‬‬
‫عمل الكود هـو ‪ :‬إصدار صوت متتابع من ترددين (‪ )300،400‬مع مراقبة دخل تماثلي ‪ ،‬في حالة زيادة‬
‫القراءة عن (‪ )800‬فإن التنفيذ سوف يعود إلى الوسم ‪ label1‬ويصدر صوت بتردد عالي (‪)1000Hz‬‬

‫‪ goto‬اتبع الرابط‬ ‫لالستزادة من أمر‬

‫تمرين‪ ::‬يشبه فكرة سندرسها مستقبالً هي الـضبط المبدئي (‪ )calibration‬لكن أبسط‪.‬‬


‫المطلوب ‪ :‬كود يعمل وميض و كلما ضغطنا على زر رقمي يتوقف الوميض ويصدر صوت لمدة ‪5‬‬
‫ثواني‪ .‬ثم يعود للوميض _ استخدم األمر ‪goto‬‬
‫‪55‬‬

‫شاشة السيلاير ‪Serial Monitor‬‬

‫تحدثنا سابقا ً عن شاشة السيلاير كفكرة لكننا لم نتحدث عن األوامر التي ستحتاجها للتعامل مع شاشة‬
‫السيلاير‪ .‬باختصار هي أداة على الكمبيوتر (توجد في برنامج ‪ Arduino IDE‬أو ‪) Arduino Create‬‬
‫تعمل على التواصل مع األردوينو أثناء تشغيله و يمكنك استخدامها لعرض معلومات من األردوينو إلى‬
‫شاشة الكمبيوتر (مثال قيم المتغيرات) أو إرسال أرقام من الكمبيوتر إلى األردوينو (أثناء تشغيله) هي‬
‫مفيدة جدا جدا بالذات في مرحلة التشغيل التجريبي للكود و تساعدك كثيرا على تتبع قيم المتغيرات أثناء‬
‫عمل البرنامج‪.‬‬
‫مالحظة‪ :‬عند استخدام شاشة السيلاير فإن األردوينو يستخدم المنفذين الرقميين ‪ 0،1‬للتواصل مع الحاسب‪،‬‬
‫لذا ال يمكنك استخدامهما كمنافذ في هذه الحالة‪.‬‬
‫األوامر األساسية إلظهار كتابة أو قيمة على شاشة السيلاير هي‪:‬‬
‫;)‪Serial.begin(9600‬‬ ‫قبل استخدام شاشة السيلاير يجب إعطاءها أمر البدء‬
‫العدد ‪ 9600‬هي سرعة التراسل وال تقلق نفسك باألمر كل بوردات‬
‫األردوينو تعمل بهذه السرعة _ماعدا قليل تجد تفصيلها في الموقع‬

‫;)”‪Serial.print(“hey‬‬ ‫أمر ‪ print‬إلظهار عبارة من األردوينو إلى شاشة الكمبيوتر‬


‫;)”‪Serial.print(“\n\t‬‬ ‫\‪ n‬لبدء سطر جديد و \‪ t‬لترك مسافة ‪tab‬‬
‫;)‪Serial.println(x‬‬ ‫عند اضافة الحرفين (‪ )ln‬بعد األمر السابق فإنه يظهر العبارة‬
‫ثم ينتقل لسطر جديد ‪.‬‬
‫مثال ‪ :‬الكود التالي يظهر عبارة ترحيبية ‪ ،‬ثم يقوم بالعد التصاعدي كل ثانية‪.‬‬
‫;‪int i‬‬
‫{)(‪void setup‬‬
‫;)‪Serial.begin(9600‬‬
‫};)“ ‪Serial.println(“welcome Sami‬‬
‫{)(‪void loop‬‬
‫;)‪Serial.println(i‬‬
‫;)‪delay(1000‬‬
‫} ;‪i++‬‬
‫لتجربة الكود في المعمل االفتراضي اضغط هنا‬
‫شرح‪Serial.print‬‬ ‫لالستزادة ‪:‬‬
‫خيارات إضافية إلظهار القيم باألمر ‪print‬‬
‫‪56‬‬

‫"‪Serial.print(78, BIN) gives "1001110‬‬


‫"‪Serial.print(78, OCT) gives "116‬‬
‫"‪Serial.print(78, DEC) gives "78‬‬
‫"‪Serial.print(78, HEX) gives "4E‬‬
‫"‪Serial.println(1.23456, 0) gives "1‬‬
‫"‪Serial.println(1.23456, 2) gives "1.23‬‬
‫"‪Serial.println(1.23456, 4) gives "1.2346‬‬

‫إرسال القيم من شاشة السيلاير إلى األردوينو أثناء تشغيله‬


‫الستقبال أي قيمة أو عبارة من المستخدم عبر شاشة السيلاير إلى األردوينو فإننا عادة ننفذ ثالث خطوات‪:‬‬
‫‪ -1‬إرسال رسالة تظهر على الشاشة و تشرح المطلوب من المستخدم‬
‫‪ -2‬نوقف تنفيذ الكود بانتظار المستخدم ليدخل قيمة‬
‫‪ -3‬نستخدم األمر المناسب لقراءة القيمة المرسلة من المستخدم ( ‪)int, float,char,String‬‬
‫;)(‪Serial.available‬‬ ‫يستخدم هذا األمر للكشف إذا قام المستخدم بإرسال أي قيمة‬
‫}{)‪while(Serial.available()==0‬‬ ‫أثناء تشغيل األردوينو عبر شاشة السيلاير‪.‬‬
‫)‪if(Serial.available()>0){...‬‬ ‫الطريقة ‪ while‬توقف تنفيذ الكود بانتظار دخل (األسهل)‬
‫‪ if‬طريقة أخرى للكشف عن الدخل لكنها التوقف تنفيذ الكود‬

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

‫‪https://circuits.io/circuits/5247139-jeem2_book_ex4‬‬ ‫لمشاهدة الكود في المختبر االفتراضي‪:‬‬


‫شرح الكود السابق‪:‬‬
‫الـ ‪ LED‬سيتصل مع المنفذ ‪ 12‬لذا نحتاج مقاومة ‪ 220‬لحماية الـ ‪LED‬‬

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


‫‪ -1‬اظهار رسالة للمستخدم تطلب معلومة معينة‬
‫‪ -2‬انتظار المستخدم حتى يدخل القيمة المطلوبة‬
‫‪ -3‬وضع القيمة في المتغير المناسب (رقم صحيح ‪ ،‬رقم كسري ‪ ،‬نص كتابي )‬

‫األمر ‪ Serial.println‬يعمل على إظهار عبارة أو قيمة متغير على شاشة السيلاير‬
‫األمر ‪ while‬مع ‪ Serial.available‬هنا يوقف الكود بانتظار ادخال قيمة من جهة المستخدم‪.‬‬
‫‪58‬‬

‫األمر ‪ Serial.parseInt‬يعمل على قراءة رقم صحيح مرسلة من الكمبيوتر‪.‬‬


‫الحظ طريقة عمل الـ ‪ for‬بحيث يكرر الحلقة لعدد ‪ n‬من المرات‪.‬‬
‫‪59‬‬

‫الحسابات والعمليات المنطقية ‪calculations and logic‬‬

‫أن الحسابات هامة جدا جدا في معظم التطبيقات ‪ .‬الحسابات البسيطة (الجمع و الطرح و‬ ‫بالتأكيد‬
‫الضرب و القسمة) و حسابات أكثر تعقيدا أحيانا ً (األس ‪ ،‬الجذر ‪ ،‬الزوايا ‪ ) 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‬‬

‫وللتحويل بالعكس شاهد الكود‬


‫‪60‬‬

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

‫;‪int x=85 , y=89 , z=76‬‬


‫فاألفضل أن تكتب في مصفوفة كما بالشكل‪:‬‬
‫‪int‬‬ ‫;}‪a[ ]={85,89,76‬‬
‫مالحظة ‪ :‬للوصول ألحد عناصر المصفوفة استخدم طريقة التالية‪-:‬‬
‫‪a[0] >> 85‬‬
‫‪a[1] >> 89‬‬
‫‪a[2] >> 76‬‬
‫*الحظ أن العنصر األول برقم ‪ 0‬وليس ‪1‬‬
‫في االستخدامات المتقدمة (مثل بعض المكتبات) يجب عليك إرسال بعض المعلومات على شكل مصفوفات ‪.‬‬
‫و سنشرحها في وقتها‪.‬‬
‫مثال‪ :‬نود جعل المنافذ ‪ 0،1،3،4،6،7،9،10،12،13‬مخارج ‪OUTPUTS‬‬
‫بينما المنافذ ‪ 2،5،8،11‬نريدها أن تكون منافذ دخل مع ربطها بمقاومة رفع الجهد الداخلية ‪PULLUP‬‬
‫بدل أن نكتب األوامر في ‪ 14‬سطر ‪ ،‬بإمكاننا االستفادة من المصفوفات كما يلي‪:‬‬
‫;}‪int OT[]={0,1,3,4,6,7,9,10,12,13‬‬
‫;}‪int IN[]={2,5,8,11‬‬
‫};)‪for(int i=0; i<10; i++){ pinMode(OT[i] ,OUTPUT‬‬
‫};)‪for( i=0; i<4;i++){ pinMode(IN[i],INPUT‬‬

‫تمرين ‪ :‬ضع درجات ‪ 10‬طالب في مصفوفة‪ ،‬ثم احسب متوسط الدرجات‬


‫‪62‬‬

‫هذه األوامر حسابية معروفة ‪ ،‬و لن نشرحها في هذا الكتاب !!‬


‫;)‪pow(5,2‬‬ ‫يحسب ‪ 5‬أس (للقوة) ‪25 = 2‬‬
‫;)‪sqrt(16‬‬ ‫يحسب الجذر التربيعي لـ ‪ 16‬و يساوي ‪4‬‬
‫;)‪abs(x‬‬ ‫يعيد القيمة المطلقة (بدون سالب) لـ ‪x‬‬
‫;) (‪sin( );cos( ); tan‬‬ ‫حساب الدوال المعروفة ‪sin , cos , tan‬‬
‫;) (‪log‬‬ ‫حساب اللوغاريتم ‪logarithm‬‬

‫كتابة القيم باألنظمة العددية ‪ :‬الثنائي‪ ،‬السداسي عشر ‪Binary , HEX‬‬


‫توجد عدة أنظمة عددية و يستخدمها الكمبيوتر و المبرمجين وقت الحاجة‪ .‬النظام العددي المعروف يسمى‬
‫النظام العشري ‪ decimal‬بينما الكمبيوترات وجميع اإللكترونيات الرقمية تعمل بنظام عد يسمى الثنائي‬
‫‪ Binary‬كما يوجد أنظمة أخرى مثل السداسي عشر ‪ HEX‬وهو نظام وسيط بين البشر و الكمبيوتر وله‬
‫استخدامات عديدة‪.‬‬
‫عندما تضع قيمة في متغير (مثالً ‪ ) x‬فبإمكانك أن تضعها بأي نظام عددي حسب الحاجة‪.‬‬
‫;‪int x=100‬‬ ‫الـ ‪ x‬يحتوي قيمة تساوي ‪ 100‬النظام العشري (العادي)‬
‫;‪int y=0b100‬‬ ‫الـ ‪ y‬يحتوي القيمة ‪ 4‬لكن تم كتابتها بالنظام الثنائي‬
‫;‪int z=0x100‬‬ ‫الـ ‪ z‬يحتوي قيمة ‪ 256‬لكن تمت كتابتها بالنظام السداسي عشر‬
‫بالمناسبة ‪ :‬عندما تظهر قيمة على شاشة السيلاير يمكنك إظهارها بأي نظام تود‪.‬‬
‫)‪Serial.print(78‬‬ ‫"‪gives "78‬‬
‫"‪Serial.print(78, BIN) gives "1001110‬‬
‫"‪Serial.print(78, OCT) gives "116‬‬
‫"‪Serial.print(78, HEX) gives "4E‬‬
‫‪63‬‬

‫العمليات المنطقية ‪NOT , OR , AND‬‬

‫إذا درست بعض اإللكترونيات فستكون قد درست هذه العالقات المنطقية ‪ .‬ستعرف أنها عالقة عادة بين‬
‫مدخلين ولها خرج‪ .‬بدون التعمق كثيراً في الموضوع نستخدم هذه العمليات عادة مع الشروط و التي يكون‬
‫ناتجها نعم أو ال‬
‫&&‬ ‫يجب أن يتحقق الشرطين معا ً‬ ‫‪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 operators‬‬


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

‫الكتابة و القراءة من بت واحد‪:‬‬


‫كل متغير من أي نوع سواء كان ‪ int‬أو غيره يتكون في النهاية من عدد من البت ‪ bits‬و يمكنك تغيير‬
‫واحد منها مثل المثال‪:‬‬
‫;‪int x=0b10110111011110‬‬
‫سوف يغير آخر خانة في اليمين إلى ‪bitWrite(x,0,1); // 1‬‬
‫يقرأ البت السادس من اليمين في قيمة إكس‪bool y=bitRead(x,5); //‬‬
‫*الحظ ليس من الضروري تخزين ‪ x‬بالصيغة الثنائية ‪ ،‬لكنها أسهل للتبع هنا‪.‬‬

‫اإلزاحة ‪ : bit shift‬مثال ‪ :‬لدينا متغيرين (األوضح أن نكتبهما بالنظام الثنائي ‪ ،‬لكن يمكن كتابتهما بأي‬
‫نظام عددي)‬
‫‪byte‬‬ ‫;‪x=0b11001011‬‬
‫‪byte‬‬ ‫;‪y=0b00010011‬‬
‫والمطلوب هـو جمع المتغيرين كـ ‪ 16‬بت في متغير واحد قبل إرساله ‪ .‬هنا سنحتاج لإلزاحة‪:‬‬
‫;‪int z= y<<8 + x‬‬
‫‪result: z=0b1001111001011‬‬

‫العمليات المنطقية على مستوى البت ‪: Bitwise logic operators‬‬


‫بإمكانك أيضا ً إجراء العمليات المنطقية المعروفة على متغيرات من نفس النوع‪ ،‬مثل ‪AND , OR , :‬‬
‫‪ NOT , XOR‬لن نتعمق في هذا الموضوع ألن الحاجة له نادرة في رأيي‪.‬‬

‫~‬ ‫^‬ ‫|‬ ‫&‬


‫)‪(bitwise not‬‬ ‫)‪(bitwise xor‬‬ ‫)‪(bitwise or‬‬ ‫)‪(bitwise and‬‬
65

y ‫ و‬x ‫ على المتغيرين‬XOR ‫ قم بإجراء عملية‬:‫مثال‬


x ‫ على المتغير‬NOT ‫ثم عملية النفي‬
byte x=0b11001011;
byte y=0b00010011;
byte z=x^y;
byte a=~x;
void setup(){
Serial.begin(9600);
Serial.println(z,BIN);
Serial.println(a,BIN);}
‫‪66‬‬

‫تكتيكات برمجية ‪programing tactics‬‬

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

‫تكتيك التحويل بين النطاقات ‪ .‬باستخدام األمرين ‪map , constrain‬‬


‫كثيرا ما نحتاج للتحويل المتناسب بين نطاقين رقميين مختلفين‪( .‬ال تقلق إذا لم تفهم العبارة السابقة ‪ ،‬ألني‬
‫سأحاول شرحها اآلن) أبسط مثال يحضرني اآلن أنك لو حصلت في الجامعة على معدل ‪ 4.33‬من ‪ 5‬و‬
‫أردت أن تفهمه بشكل أفضل و تحوله للنظام القديم (من مئة) فأنت تأخذ القيمة ‪ 4.33‬من النطاق األول ‪-0‬‬
‫‪ 5‬و تريد معرفة القيمة الموازية في النطاق الجديد ‪.100-0‬‬
‫وفي األردوينو نحتاج فكرة التحويل بين النطاقات بشكل أوسع‪ .‬أحد األمثلة البسيطة‪ .‬نود التحكم بـ شدة‬
‫إضاءة ‪ LED‬كمخرج ‪ ،‬بحيث يكون الدخل ‪ :‬مقاومة متغيرة كمقسم جهد‪.‬‬
‫تكون قراءة الدخل ‪ 1023-0 :‬بينما الخرج التماثلي يجب أن ال يتجاوز ‪255-0‬‬
‫هنا نحتاج للتحويل من النطاق األول للنطاق الثاني‬
‫تخيل أيضا ً أن الضوء ال يبدأ في العمل إال بعد القيمة ‪ 50‬و ال أود تحريك المقاومة بدون مالحظة تغير‬
‫فمن الممكن تعديل النطاق الثاني إلى ‪ . 255-50‬أتمنى أنك فهمت فائدة األمر ‪map‬‬
‫الحظ أن األمر ‪ map‬يعمل مع األعداد الصحيحة فقط وال يعمل مع األعداد الكسرية‪.‬‬
‫;)‪x=analogRead(A0‬‬ ‫‪//0<x<1023‬‬
‫;)‪y=map(x,0,1023,50,255‬‬ ‫‪//50>y>255‬‬

‫الحاجة لألمر ‪constrain‬‬


‫‪67‬‬

‫مثال ‪ :‬افرض أنك تود عمل صوت يتغير حسب حركة يدك فوق مقاومة ضوئية (يتغير التردد حسب شدة‬
‫الضوء) عند تصنيع الدائرة وجدت أن قراءة الدخل في الضوء = ‪ 150‬وعندما تغطي الضوء بيدك يصبح‬
‫الدخل=‪585‬‬
‫وبخصوص التردد الذي تريد أن يظهر على السماعة لتعطي تباين جيد في الترددات (‪)360-200‬‬
‫سيكون من الواضح أن تصميم األمر للتحويل بين النطاقين وتشغيل المشروع هو‪:‬‬
‫;)‪x=analogRead(A0‬‬
‫;)‪y=map(x,150,585,200,360‬‬
‫;)‪tone(13,y‬‬
‫هذا األمر يبدوا جيدا في العمل ‪ .‬لكن !!! ماذا لو تغيرت شدة اإلضاءة وخرجت عن المتوقع (أقوى أو أقل)‬
‫سنحصل على قيم خرج (تردد) خارجة عن التوقعات أيضا ً‬
‫هنا يستحسن استخدام األمر ‪ constrain‬والذي يعمل على إبقاء قيمة داخل حدود بدون أن يمكن أن‬
‫تخرج عنه‪ .‬لذا سنزيد األمر التالي على الكود السابق بعد أمر ‪ map‬حتى نحل المشكلة السابقة‪-:‬‬
‫;)‪y=constrain(y,200,360‬‬

‫لمشاهدة كود يشرح الفكرة وتجربة التغييرات عليه ‪ .‬شاهد الرابط‪:‬‬


‫‪https://circuits.io/circuits/5269652-map-constrain-explained‬‬

‫تمرين‪ :‬طالب حصل على معدل ‪ 3.78‬من ‪ 4‬في الجامعة ‪ .‬أود معرفة معدله بالنسبة المئوية و كم سيكون‬
‫معدله لو انتقل لجامعة تعتمد نظام المعدل من ‪ 5‬استخدم ‪( map‬اضرب *‪ 100‬أيضاً)‬
‫‪68‬‬

‫تكتيك استخدام األعداد العشوائية ‪Random‬‬

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

‫;)‪random(10‬‬ ‫يعود بقيمة عشوائية من صفر إلى ‪9‬‬


‫;) ‪random( 5 , 15‬‬ ‫يعود بقيمة عشوائية من ‪ 5‬إلى ‪14‬‬
‫الحظ في المثال السابق (القيمة العائدة تتضمن القيمة األدنى ‪ ،‬وال تتضمن الحد األعلى)‬

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

‫تمرين ‪ :‬صمم كود يولد مصفوفة تحتوي ‪ 18‬عنصر ‪ .‬و ضع في كل عنصر قيمة عشوائية تتراوح‬
‫بين ‪ 70‬و ‪ 100‬ثم اعرض جميع القيم على شاشة السيلاير‪.‬‬
‫‪69‬‬

‫ايجاد القيمة األكبر أو القيمة األصغر بين قيمتين‬


‫‪min , max‬‬
‫يظهر األمر هذا بسيط جدا ً لكنه مفيد جدا في بعض التطبيقات‬
‫(مثل تطبيق المعايرة في الصفحة التالية) اآلن تعلم كيفية‬
‫استخدام األمرين ‪ min‬و ‪max‬‬

‫;)‪max(x,y‬‬ ‫يعود بأعلى قيمة من بين القيمتين‬


‫;)‪min(x,y‬‬ ‫يعود بأقل قيمة من القيمتين‬
‫مثال ً لدينا درجات مجموعة من الطالب في مصفوفة ‪ .‬و نود ايجاد أعلى درجة و أقل درجة في المصفوفة‬
‫;}‪int x[]={5,6,43,9,4,6,8,2,4,55‬‬
‫;‪int max=0‬‬
‫;‪int min=100‬‬
‫{)(‪void setup‬‬
‫;)‪Serial.begin(9600‬‬
‫{)‪for(int i=0;i<10;i++‬‬
‫;)]‪max=max(max,x[i‬‬
‫};)]‪min=min(min,x[i‬‬
‫;)"=‪Serial.print("max‬‬
‫;)‪Serial.println(max‬‬
‫;)"=‪Serial.print("min‬‬
‫};)‪Serial.println(min‬‬
‫}{)(‪void loop‬‬
‫‪70‬‬

‫تكتيك الضبط عند بداية التشغيل ‪Calibration‬‬

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

‫تنفيذ برنامج الوميض بدون أمر التأخير ‪delay‬‬


‫أعتقد أن الموضوع يبدو غريبا ً _ إذا كان بإمكاني تـنـفـيذ‬
‫الوميض بكل سهولة مثل الكود السابق ‪ ، Blink‬لماذا أنفذها بطريقة‬

‫إذا كان العمل المطلوب من األردوينو بسيط جدا ً و‬ ‫😕‬ ‫أصعب؟‬


‫المطلوب من الدائرة عمل واحد فقط ‪ ،‬فال بأس من استخدام األمر‬
‫‪ delay‬لكن في بعض التطبيقات المتقدمة ال ينبغي إيقاف عمل‬
‫األردوينو بأمر االنتظار ‪ . delay‬فاألمر ‪ delay‬يوقف تنفيذ كل شيء ‪،‬‬
‫بينما في كثير من التطبيقات المتقدمة يجب على األردوينو أن يقرأ و يشغل العديد من األشياء باستمرار‪.‬‬
‫يوجد طرق تجعل الكود يستمر بالوميض بدون أن تتوقف دورة تنفيذ األوامر‬
‫;‪bool x=0‬‬
‫;‪unsigned long T1=0‬‬
‫;‪unsigned long T2=0‬‬
‫{)(‪void setup‬‬
‫};)‪pinMode(13,OUTPUT‬‬
‫{)(‪void loop‬‬
‫;)(‪T1=millis‬‬
‫{)‪if(T1>T2+1000‬‬
‫;‪x=!x‬‬
‫;)‪digitalWrite(13,x‬‬
‫};‪T2=T1‬‬
‫أي أمر في هذا المكان سيتم تنفيذه بدون تأخير ‪//‬‬
‫}‬
‫الفكرة باختصار هي استمرار التنفيذ في حلقة ‪ loop‬مع قراءة قيمة ‪ millis‬كل دورة بدون توقف‪.‬‬
‫األمر ‪ millis‬يقرأ الزمن منذ بداية تشغيل البرنامج بالميللي ثانية‪ .‬إذا مر من الزمن ثانية كاملة ‪ .‬سيكون‬
‫قيمة ‪ T1‬أكبر من ‪ T2‬بألف ميللي ثانية ‪ ،‬إذا حصل ذلك سيغير ‪ x‬حالته ‪ ،‬و نساوي بين ‪ T2‬و ‪T1‬‬
‫لنبدأ حساب الزمن من جديد‪.‬‬
‫الحظ أن ‪ T1‬و ‪ T2‬متغيرات من نوع ‪ unsigned int‬وهذا ليتمكن من قراءة قيمة الزمن لقيم كبيرة‬
‫تمرين‪ :1‬شغل وميض لضوئين بحيث يعمالن بسرعات مختلفة ‪ .‬مثال ً ‪D1=300 D2=1000‬‬
‫تمرين‪ :2‬المداخل زر ضاغط (رقمي) و مقاومة متغيرة _ المخارج ‪ LED‬و سماعة‬
‫المطلوب‪ :‬الضغط على الزر يزيد سرعة الضوء ‪ +‬تغيير المقاومة يغير تردد النغمة‬
‫‪73‬‬

‫‪ ---‬كتابة الدوال ‪--- Functions :‬‬


‫;)‪fun( ); fun2(10); fun3(5,15‬‬

‫هي طريقة مفيدة في بعض األحيان الختصار و تبسيط الكود‪.‬‬ ‫الدوال ‪: functions‬‬
‫فهي عبارة عن كود جانبي يتم استدعاءه لتنفيذ عمل معين وقت الحاجة ‪ ،‬ثم العودة للكود الرئيسي‪.‬‬
‫يتم التعرف على الدوال من القوسين اللذين يأتيان بعد اسمها … مثل‪:‬‬
‫;)(‪sami‬‬
‫;)‪x= hey(15‬‬
‫;)‪y,z= fun(13,12,600‬‬

‫أمثلة ألكواد يمكن جعلها كدوال واستدعائها من الكود الرئيسي‪:‬‬


‫تحويل درجة الحرارة من فهرنهايت إلى درجة مئوية‪.‬‬
‫تحويل االطوال من قدم الى متر‪.‬‬
‫تشغيل ‪ LED‬و إطفاؤه‪.‬‬

‫المداخل و المخارج للدالة‪ :‬بعض الدوال يتم استدعائها بدون إرسال أي‬
‫قيمة لها ‪ .‬و تقوم بعمل معين ‪ .‬ثم تنتهي بدون أن تعود بأي قيمة منها‬
‫‪.‬وهذه الدوال تكون من نوع ‪void‬‬
‫مثال‪ :‬دالة وميض بسرعة ثابتة أو تأخير زمني أو دالة ‪ panic‬الصدار‬
‫تحذير صوتي و مرئي‪.‬‬
‫لذا فمن المهم معرفة هل ستعود قيمة للدالة أم ال ‪ ،‬و إذا كانت ستعود قيمة‬
‫‪ ،‬ما هو نوع القيمة؟ ‪ int‬؟ أو ‪ float‬وربما ‪ … String‬إذا كانت الدالة لن تعيد أي قيمة فيجب‬
‫تعريفها بـ ‪void‬‬

‫أمثلة على دوال موجودة و تم تعريفها في برمجة األردوينو سابقاً‪( :‬غير موجودة في لغة ‪ C‬األصلية)‬
‫;)‪ delay(1000‬هذه الدالة لها دخل واحد (‪)1000‬وليس لها أي قيمة راجعة ‪void‬‬
74

void ‫ هذه الدالة لها دخلين وال تعود منها أي قيمة‬digitalWrite(13,1);


boolean ‫ أو‬int ‫ وممكن تكون‬1-0 ‫) والعائد قيمة‬3( ‫ دالة لها دخل واحد‬digitalRead(3);

byte ‫ أو‬int ‫ و تكون من نوع‬255-0 ‫ دالة لها دخل واحد والعائد يكون عدد‬analogRead(A0);

: ‫ مع العلم أن‬:‫أمثلة لكود و دالة تعمل على تحويل درجة حرارة من فهرنهايت الى مئوية‬
( F−32)∗5
C=
9

int F1=0; //here put the fahrenheit temp


int F2=10;
int F3=25;

void setup(){
int C1=FtoC(F1); //FtoC will convert Fahrenheit to degrees
int C2=FtoC(F2);
int C3=FtoC(F3); }

void loop(){ }

int FtoC(int x){ //FtoC is a function to convert Fahrenheit to degrees


int C = x-32*5/9;
return(C);}

.‫) ترسل لها قيمتين عدد مرات الوميض و التأخير الزمني‬Blink( ‫مثال لعمل دالة‬
int LED = 13;
void setup(){
Blink(10,300);
Blink(5,1000);
Blink(2,5000);}

void Blink(int T, int D){


for ( ; T>0 ; T--){
digitalWrite(LED,HIGH);
delay(D)
digitalWrite(LED, LOW);
delay(D); } }

، ‫ عدد الومضات‬، ‫ رقم المخرج الرقمي‬: ‫ قيم‬4 ‫ لكن هذه المرة الدالة تستقبل‬، ‫ مثل السابق‬: ‫مثال آخر‬
.‫ زمن اإلنطفاء‬، ‫زمن اإلضاءة‬
void loop(){
blink2(13,3,500,500);
‫‪75‬‬

‫;)‪blink2(12,5,300,200‬‬
‫} ;)‪blink2(11,10,200,800‬‬

‫{)‪void blink2(int P, int T , int DON , int DOF‬‬


‫( ‪for‬‬ ‫{)‪; T>0 ; T--‬‬
‫;)‪digitalWrite(P,HIGH‬‬
‫)‪delay(DON‬‬
‫;)‪digitalWrite(P, LOW‬‬
‫} } ;)‪delay(DOF‬‬

‫تمارين‪ :‬كتابة دوال ‪create a function‬‬


‫اكتب دالة بحيث ترسل لها قيمة واحدة فتعمل الدالة على إظهار وميض على المخرج ‪ 13‬و تكون‬ ‫‪1‬‬
‫القيمة هي التأخير الزمني بالمللي ثانية‬
‫اكتب دالة بحيث نرسل لها قيمتين قيمة قيمة التأخير الزمني وقيمة عدد النبضات‬ ‫‪2‬‬
‫اكتب دالة نرسل لها ثالث قيم التأخير الزمني ‪ ،‬عدد النبضات ‪ ،‬رقم المخرج المطلوب‬ ‫‪3‬‬
‫اكتب دالة تحول القيمة من لاير الى دوالر ودالة أخرى تحول من دوالر الى لاير‬ ‫‪4‬‬
‫اكتب دالة واحدة تعمل عمل الدالتين في الفقرة السابقة ‪ ،‬يجب على المستخدم إرسال ‪ RTD‬أو‬ ‫‪5‬‬
‫‪ DTR‬للدالة لتعرف ما المطلوب منها‪.‬‬
‫‪76‬‬

‫استخدام طريقة ‪ case / switch‬في الدوال‪-:‬‬


‫أحد الطرق المستخدمة في بعض الدوال هو تحديد التصرف حسب قيمة متغير‪ .‬وهذه الطريقة ال تختلف‬
‫كثيرا عن استخدام األمر ‪ if‬ولكن ال تتفاجأ إذا شاهدتها‪.‬‬
‫طريقة عمل األمر هو المقارنة بين قيمة المتغير ‪ var‬مع القيمة أمام كل حالة (‪ ) 2 ، 1‬فإذا لم تتطابق‬
‫قيمة ‪ var‬مع أي حالة ؛ يقوم بتنفيذ األوامر عند عبارة ‪default‬‬
‫شاهد الكود التالي كمثال‪:‬‬
‫{ )‪switch (var‬‬
‫‪case 1:‬‬
‫‪//do something when var equals 1‬‬
‫;‪break‬‬
‫‪case 2:‬‬
‫‪//do something when var equals 2‬‬
‫;‪break‬‬
‫‪default:‬‬
‫‪// if nothing else matches, do the default‬‬
‫‪// default is optional‬‬
‫;‪break‬‬
‫}‬

‫لقراءة المزيد زر صفحة لشرح األمر هـــــنـــــا‬


‫‪77‬‬

‫‪ --‬تمارين برمجية على الصفحات السابقة ‪--‬‬


‫تمرين‪ :1‬التحكم بمخرج رقمي ‪digital output‬‬
‫وميض ‪ ___ Blink‬اجعل ‪ LED‬يشتغل وينطفئ بشكل متكرر‪.‬‬ ‫أ‬

‫جرب تغيير الـ مخرج المستخدم و تغيير السرعة‪.‬‬ ‫ب‬

‫عرف متغيرين في البداية ‪ d‬لتحديد التأخير و ‪ ledPin‬لتحديد رقم المخرج المستخدم‪.‬‬ ‫ج‬

‫*‪/‬‬ ‫‪*/‬‬ ‫أضف مالحظات (شرح ‪ )comments‬لكل أمر و شرح لعمل الكود في األعلى استخدم ‪// :‬‬ ‫د‬

‫اجعل الوميض يبدأ سريعا ً ثم يتباطأ مع الوقت‪.‬‬ ‫هـ‬

‫‪ static‬في الكود‪.‬‬ ‫و‬ ‫استخدم طرق تعريف المتغيرات ‪const‬‬ ‫و‬

‫صمم كود يظهر ‪ 5‬نبضات سريعة ثم ‪ 3‬بطيئة (بدون استخدام حلقة)‬ ‫ز‬

‫مثل السابق لكن استخدم الحلقة ‪for‬‬ ‫ح‬

‫عرف متغير الزمن ‪ d‬داخل الـ ‪ setup loop‬بطريقة ‪static int‬‬ ‫ط‬

‫شغل الوميض بدون استخدام األمر ‪ delay‬استخدم ‪ millis‬بدال عنه‪( .‬متقدم)‬ ‫ي‬

‫تمرين‪ : 2‬التحكم بعدة مخارج رقمية ‪multi digital outputs‬‬


‫صمم كود بحيث يتناوب ضوئين (‪ )2LEDs‬على التشغيل بسرعة ثابتة‬ ‫أ‬

‫نفس الفكرة لكن استبدل أحد الـ ‪ LEDs‬بــ صوت (استخدم األمر ‪) tone‬‬ ‫ب‬

‫صمم الكود بحيث يغمز الليد األول لـ ‪ 5‬مرات و الثاني لـ ‪ 7‬مرات (ال تستخدم حلقات ‪)loops‬‬ ‫ج‬

‫مثل الفقرة (ج) لكن استخدم الحلقة ‪for‬‬ ‫د‬

‫اجعل كل ‪ LED‬يومض بسرعة مستقلة عن اآلخر مثال ‪ d1=300 d2=500‬يجب استخدام أمر ‪millis‬‬ ‫هـ‬

‫اصنع مصفوفة في البداية‪ ،‬تحدد عدد نبضات كل ‪ LED‬بالتسلسل‬ ‫و‬


‫;} ‪x[ ] = { 3 , 2 , 4 , 1 , 6 , 3 , 4 , 4‬‬

‫مثل الفقرة السابقة ولكن صمم مصفوفتين ‪ ،‬مصفوفة خاصة بكل ليد !‬ ‫ز‬
‫‪78‬‬

‫تمرين‪ :3‬مدخل رقمي ‪Digital input‬‬


‫استخدم مفتاح ضاغط (‪ )push button‬كمدخل رقمي‪ ،‬و ‪ LED‬كمخرج‪ .‬المطلوب أن يعمل وميض‬ ‫أ‬
‫‪ Blink‬بطيء متكرر ‪ ،‬وعند الضغط على الزر يعمل الوميض بشكل أسرع‪.‬‬
‫في بداية الكود عرف متغيرين ‪ d1=1000‬و ‪ d2=300‬مثالً‬

‫استخدم زر ضاغط لتشغـيل تنبيه صوتي‪ .‬استخدم األمر ‪tone‬‬ ‫ب‬

‫لدينا ‪ 10‬ليدات نريدها تعمل معا ً عند الضغط على زر ‪ sw‬المطلوب يكون بينها تأخير زمني بسيط (األول ثم‬ ‫ج‬
‫الثاني ثم الثالث وهكذا) كما أنها تنطفئ بنفس الطريقة عند ترك الزر‪.‬‬

‫صمم ما يشبه الساعة الرملية (بأضواء ‪ )LEDs‬مع زر يعمل كأنه يقلب الساعة‪.‬‬ ‫د‬

‫تمرين ‪ : 4‬عدة مداخل رقمية‬


‫مفتاح ‪ ON‬و مفتاح ‪ OFF‬للتحكم بــ ‪ LED‬استخدم &&‬ ‫أ‬

‫و زر ينقص ‪ ، 1‬اعرض قيمة ‪ x‬على شاشة السيلاير‪.‬‬ ‫تغيير قيمة متغير ‪ x‬زر يزيد ‪1‬‬ ‫ب‬

‫اضبط ‪ 3‬مداخل رقمية وسماعة بسيطة واحدة ‪ ،‬بحيث كلما ضغطت على زر يصدر صوت مختلف‪.‬‬ ‫ج‬

‫تمرين ‪ : 5‬مخرج تماثلي‬


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

‫اإلمساك على مفتاح ‪ UP‬يزيد قيمة الجهد في مخرج تماثلي ‪ ،‬و الزر ‪ DN‬يقلله ‪ .‬و يكون بتدريج بطيء‪.‬‬ ‫ج‬
‫زرين ‪ UP‬و ‪ DN‬إلخراج جهد تماثلي من األردوينو (من ‪ 0‬إلى ‪ 5‬فولت)‬ ‫د‬

‫تمرين ‪ : 6‬عدة مخارج تماثلية‬


‫لدينا ‪ 3‬أضواء ‪ LEDs‬مختلفة األلوان ‪ ،‬نود أن تزيد إضاءة كل ضوء و تقل بشكل تدريجي‬ ‫أ‬
‫طبق الفقرة السابقة على ضوء ‪ LED‬ثالثي األلوان (بأربع أطراف)‬ ‫ب‬
‫طبق الفقرة السابقة بحيث يمكن في أعلى الكود تحديد سرعة تغير كل لون على حدة‪.‬‬ ‫ج‬
‫استخدم ‪ 6‬مفاتيح رقمية للتحكم بشدة إضاءة كل لون ‪.‬‬ ‫د‬

‫تمرين ‪ : 7‬مدخل تماثلي ‪:‬‬


‫‪79‬‬

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

‫الدخل مقاومة متغيرة و الخرج ‪ 4‬ليدات تعمل بطريقة رقمية ‪ .‬مثال الجهد ‪ ، 0‬ال يعمل أي ليد ‪ ،‬الدخل ‪ 1‬فولت‬ ‫ب‬
‫يعمل ليد واحد الدخل ‪ 2‬فولت يعمل ‪ 2‬و هكذا …‬

‫إضافة للفقرة السابقة ‪ ،‬عندما يزيد الدخل عن ‪ 4‬فولت ‪ ،‬اجعل جميع الـ ليدات تظهر وميض سريع‪.‬‬ ‫ج‬

‫مقسم جهد يحتوي مقاومة ضوئية _ يصنع ما يشبه اإلضاءة اآللية ( تشتغل في الظالم ‪ ،‬و تنطفئ في النهار)‬ ‫د‬

‫استخدم الثيرموكوبل (مقياس حرارة بسيط) كدخل‬ ‫هـ‬


‫وإذا خرجت الحرارة عن القيمة المتوسطة شغل انذار صوتي‪.‬‬

‫تمرين ‪ : 8‬عدة مداخل تماثلية ‪:‬‬


‫الدخل مقاومتين متغيرتين والخرج ‪ LED‬واحد بحيث أحد المقاومتين تحدد زمن التشغيل و األخرى زمن القطع‬ ‫أ‬

‫الدخل عصا تحكم تماثلي و الخرج عدد ‪ LEDs 9‬الهدف أن نتحكم بالعصى لنجعل ‪ LED‬واحد يعمل يعبر عن‬ ‫ب‬
‫اتجاه العصا‪.‬‬

‫‪ 3‬مقاومات متغيرة تتحكم بشدة إضاءة ‪ 3‬ليدات ملونة (أو ليد متعدد األلوان)‬ ‫ج‬

‫تمرين‪( :9‬عمل بعض الحسابات باألردوينو)‬


‫حول درجة الحرارة من فهرنهايت إلى درجة مئوية (استخدم ‪)float‬‬ ‫أ‬
‫حول المعدل من ‪ 100‬إلى معدل من ‪ 5‬واعرض الناتج على الشاشة ‪ SerialMonitor‬استخدم ‪float‬‬ ‫ب‬
‫لدينا مصفوفة تحتوي ‪ 5‬أعداد مختلفة ‪ ،‬نود جمعها ‪ .‬ثم حساب متوسط األعداد‪.‬‬ ‫ج‬
‫(حسابي متقدم) لدينا حساسين ضوئيين بينهما مسافة ثابتة (‪ )10cm‬نود حساب الوقت بدقة بين اإلشارتين على‬ ‫د‬
‫الحساسين ‪ .‬ثم حساب السرعة‪ .‬ثم عرضه على السيلاير مونيتور ‪ .‬استخدم األمر ‪micros‬‬

‫(حسابي متقدم) لدينا جهاز يحسب الزمن بالثواني وعند قراءة الزمن ‪ ،‬أعطاك رقم كبير جدا ً ( عدة ماليين) ضع‬ ‫هـ‬
‫القيمة في متغير ‪ 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‬‬ ‫ك‬

‫تمرين ‪ : 10‬شاشة السيلاير ‪Serial monitor‬‬


‫صمم ساعة رقمية تظهر الثواني و الدقائق على الشاشة (توجد أكثر من طريقة)‬ ‫أ‬
‫دخل تماثلي ‪ 1023-0‬اقرأه و اعرضه على شاشة السيلاير‬ ‫ب‬
‫ثم احسب ما يوازيه إلخراجه من المخرج التماثلي ‪ 255-0‬و اعرض المكافئ على الشاشة أيضا ً‬
‫‪--‬فكر كيف تجعل جهد الخرج يعاكس جهد الدخل ‪ 5v >> 0‬و ‪0v << 5v‬‬

‫التحكم بــ ‪ LED‬بواسطة شاشة ‪ SerialMonitor‬مثال أدخل رقم ‪ 1‬لتشغيل الضوء و ‪ 0‬إلطفائه‪.‬‬ ‫ج‬
‫اجعل الشاشة ترسل لك التعليمات قبل كل أمر‪.‬‬

‫للتحكم بالـ ‪LEDs‬‬ ‫اجعل التحكم بـ ‪ LEDs 2‬و يكون الدخل من شاشة السيلاير مثال ً ‪4 . 3 . 2 . 1‬‬ ‫د‬
‫صمم كود بحيث يدخل المستخدم اسم لون ‪ red green blue‬فيضيء اللون المطلوب في ‪RGB LED‬‬ ‫هـ‬
‫على شاشة ‪ serialMonitor‬يطلب قيمة ‪ ،‬تحدد سرعة الوميض ‪ ،‬ثم تطلب تردد الصوت ‪.‬‬ ‫و‬
‫يقوم المستخدم بإدخال قيم لأللوان األحمر و األخضر و األزرق _ ثم يعرض اللون المطلوب على ‪RGB LED‬‬ ‫ز‬
‫ادخل أسماء ‪ 10‬طالب في مصفوفة ‪ ،‬و درجاتهم في مصفوفة مختلفة‪.‬‬ ‫ح‬
‫زد لكل طالب ‪ 5‬درجات ‪ ،‬على أال تزيد الدرجات عن ‪ 100‬أبداً (استخدم ‪)constrain :‬‬
‫ثم على الشاشة أظهر المتوسط ‪ .‬وأعلى طالب و أقل طالب‪.‬‬

‫تمرين ‪ ::11‬أوامر متقدمة لم أشرحها أمر المقاطعة !‬


‫نود تشغيل وميض عادي‪ ،‬وفي حالة وصول مقاطعة على الطرف ‪ 2D‬يعمل صوت تحذيري‬ ‫د‬
‫مثل المثال السابق سوى أنه يوجد استشعار لمقاطعتين _ ‪ D2‬و ‪ D3‬و كل مقاطعة تصدر صوت مختلف‪.‬‬ ‫هـ‬
‫‪81‬‬

‫اذا استطعت حل المسائل البرمجية السابقة فمبروك …‬

‫أنت مبرمج بلغة ‪ C‬ويحق لك االحتفال 😀‬

‫فقط تذكر … أنت تعلمت البرمجة بلغة ‪C‬‬


‫عندما نتقدم في األردوينو سنضطر لفهم أوامر ‪ C++‬وهي متقدمة أكثر‪.‬‬
‫كما أننا سنستخدم الكثير من مكتبات األوامر والدوال …‬

‫الرحلة طويلة … لكنها بالتأكيد ممتعة 😊‬

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


‫‪82‬‬

‫الباب الثالث‪ :‬إلكترونيات ‪Electronics‬‬

‫بالتأكيد اإللكترونيات عالم كبير لكننا هنا سنتكلم عما يلزمنا عند استخدام األردوينو فقط‪.‬‬
‫الدوائر اإللكترونية هي مجموعة من العناصر و بينها توصيالت (اسالك) عندما يمر بها التيار الكهربائي‬
‫فإنها تقوم بعمل معين‪.‬‬
‫أهم العناصر اإللكترونية التي سنستخدمها ‪-:‬‬
‫مبين ضوئي (لــيـــد)‬
‫يعمل على إظهار ضوء عندما نخرج‬
‫الجهد المناسب من أطراف األردوينو‬
‫الرجل الطويلة ‪ :‬آنود‬
‫و يجب توصيل مقاومة للحماية‬
‫‪LED‬‬
‫مقاومة‬
‫تقلل مرور التيار و تحمي العناصر‬
‫التي ال تتحمل ‪5v‬‬
‫‪Resistor‬‬
‫‪83‬‬

‫زر ضاغط‬
‫يعمل على توصيل التيار الكهربائي‬
‫عند الضغط عليه‪.‬‬
‫يستخدم كمدخل رقمي لألردوينو‬
‫‪Push button‬‬

‫مقاومة متغيرة‬
‫تعمل عادة كمدخل تماثلي‬
‫حيث يمكنك يدويا تغيير الجهد الداخل‬
‫لألردوينو‬
‫‪Potentiometer‬‬

‫مقاومة ضوئية‬
‫حساس ضوئي ‪ ،‬يعمل كمقاومة تقل‬
‫قيمتها كلما تعرضت لضوء أعلى‪.‬‬
‫‪LDR‬‬

‫أسالك توصيل‬
‫تعمل على توصيل التيار الكهربائي‬
‫بين أي نقطتين‬
‫‪Wires- Leads-‬‬
‫‪jumpers‬‬
‫‪84‬‬

‫بطارية ‪ 9‬فولت‬
‫تشغيل األردوينو‬
‫أو بعض العناصر األخرى التي‬
‫تحتاج تيار عالي‬
‫محرك ‪ ،‬مرحل‬
‫‪Battery‬‬

‫سماعة بسيطة‬
‫تعمل على إصدار صوت بسيط‬
‫حسب التردد الداخل إليها‪.‬‬
‫وليست مصممة إلصدار أصوات‬
‫دقيقة مثل سماعة الهاتف‬
‫‪Buzzer‬‬

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

‫مرحـِّــل‬
‫يعمل على تكبير الجهد و التيار‬
‫بدرجة كبير يمكن أن تكون ‪ 220v‬و‬
‫نحوه‬
‫‪Relay‬‬
‫‪85‬‬

‫لوحة االختبار ‪Testboard _ Breadboard‬‬


‫إذا حاولت ربط مكونات دائرة إلكترونية مكونة من عدة عناصر فسيكون من الصعب عليك تتبع هذه‬
‫التوصيالت الحل األمثل لتوصيل الدائرة اإللكترونية يكون على لوحة االختبار ‪ Test board‬ما يسمى‬
‫بـــ ‪Breadboard‬‬

‫كما ترى توجد نقاط صغيرة ‪ .‬هذه النقاط متصلة من الداخل حسب الخطوط الموضحة‪.‬‬
‫ففي الصف األول (‪ )1‬يتصل ‪ a,b,c,d,e‬معا ً و هذه الخمسة غير متصلة مع ‪f,g,h,i,j‬‬

‫لمشاهدة فيديو عن توصيل الدوائر اإللكترونية على لوحة االختبار ‪ :‬اضغط هنا‬
‫‪86‬‬

‫رسم الدوائر النظرية و توصيل الدوائر على لوحة التوصيل ‪Testboard‬‬


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

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

‫يصعب أن نشرح كتابيا ً كيفية استخدام لوحة التوصيل الـ تيستبورد ‪ .‬لكن بقليل من التمرين ستتقن هذه‬
‫المهارة … صدقني‬
‫يمكنك في أي وقت التمرن على توصيل أي دائرة على التيستبورد على الموقع الرائع‪-:‬‬
‫‪https://www.tinkercad.com/learn/‬‬
‫‪88‬‬

‫استخدام الشريحة ‪ATmega328P‬‬


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

‫قارن بين الصورتين العلويتين و الصورة باألسفل ‪ .‬لن نتجادل أيهما أجمل ‪ .‬لكن المظهر في الدائرة األسفل‬
‫يظهر أنك قمت بتوصيل األسالك فقط ‪ .‬بينما في الدائرتين العلويتين (اليسرى خصوصا) يظهر أنك‬
‫صممت الدائرة وصنعتها بنفسك‪ .‬كثير من المكونات الموجودة على البورد الـ ‪ UNO‬لن تضعها هنا ألنك‬
‫لن تحتاجها‪.‬‬
‫*مالحظة‪ :‬في هذا المنهج لن نتحدث عن تصنيع الدوائر المطبوعة ‪ pcb‬حتى ال نشتت تركيزك‪.‬‬
‫‪89‬‬

‫العناصر الالزمة لتشغيل الشريحة ‪ ATMega328P‬خارج األردوينو قليلة و بسيطة‪:‬‬


‫‪ -1‬مثبت جهد ‪Voltage Regulator :‬‬
‫لتعمل الشريحة يجب أن نوصل لها ‪ 5v‬ولكن معظم البطاريات تولد جهد‬
‫مختلف‪ .‬فاألفضل هو توصيل جهد أعلى (مثال ‪ )9v‬ثم تثبيته باستخدام‬
‫مثبت جهد بسيط‪.‬‬
‫المثبت األمثل لهذا العمل هو ‪ LM7805 :‬وهو متوفر بكثرة‬
‫ومنخفض السعر‪.‬‬

‫ليعمل مثبت الجهد يجب توصيله في دائرة بسيطة كما يظهر بالشكل التالي‪:‬‬

‫ولتعمل الشريحة ‪ ATMega‬يجب توصيل خرج الدائرة السابقة كالتالي‪:‬‬


‫الجهد ‪ 5v‬إلى األطراف رقم ‪ 7 :‬و ‪20‬‬
‫وتوصيل األرضي ‪ 0v‬إلى األطراف رقم ‪ 8 :‬و ‪22‬‬

‫‪-2‬الكريستالة ‪16MHz Crystal :‬‬


‫الكريستالة هي عنصر إلكتروني هام لضبط تردد (سرعة) عمل األجهزة‬
‫اإللكترونية‪ .‬لتعمل شريحة ‪ ATMega328p‬يجب توصيل كريستالة‬
‫بين طرفيها رقم ‪ 9‬و ‪ . 10‬شاهد الصورة‪.‬‬
‫‪90‬‬

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

‫قيم المكثفات الموصى بها من بعض جهات التصنيع‬


‫‪330nF‬‬ ‫المكثف قبل مثبت الجهد (جهة الدخل _ البطارية)‬
‫‪100nF‬‬ ‫المكثف بعد مثبت الجهد (جهة الخرج_الشريحة ‪)Atmega‬‬
‫‪22pF‬‬ ‫المكثفين المتصلين بالكريستالة‬
‫(في كثير من األحيان استخدام قيم مختلفة لن يؤثر على عمل الدائرة) لذا فحسب تجربتي يمكن استخدام‬
‫قيمة واحدة متوسطة مكان جميع المكثفات الالزمة هذا يجعل بناء الدائرة أسهل‪.‬‬
‫والقيمة المقترحة هي ‪ 1nF‬ويكتب عليه الكود ‪ 102‬كما يظهر في صورة المكثف أعاله‪.‬‬
‫‪91‬‬

‫فكرة تشغيل الشريحة بدون البورد ببساطة‪:‬‬


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

‫حتى تعرف أماكن األطراف (المنافذ)‬


‫شاهد الرسم يسار الصفحة‬

‫مالحظة‪ :‬ينصح بتوصيل الطرفين ‪ 1‬و ‪ 21‬إلى الـ ‪VCC‬‬


‫لتعمل الشريحة بشكل طبيعي‪.‬‬

‫تمرين‪ :‬اكتب كود بسيط يعمل على تشغيل ضوئين ‪ LED‬بحيث يومض أحدهما و اآلخر تتغير شدته‬
‫ببطء ‪ pwm‬ثم انزع الشريحة ‪ Atmega‬و شغل الدائرة على لوحة االختبار الـ ‪ testboard‬مع‬
‫العناصر الالزمة‪.‬‬
‫‪92‬‬

‫الملتيميتر الرقمي ‪Digital Multimeter‬‬


‫الملتيميتر الرقمي جهاز قياس متعدد الفوائد‪ .‬فهو يقيس الجهد الكهربائي (الفولت) التيار الكهربائي (األمبير)‬
‫المقاومة الكهربائية (األوم) و التردد (الهيرتز) و اختبار‬
‫التوصيلية (الزنان) و غيره من القياسات الكهربائية الهامة ‪.‬‬
‫ال تقلق إذا لم تفهم الفرق بين الجهد و التيار و المقاومة اآلن ‪.‬‬
‫سيشرح لك المدرس الفرق الحقا ً 😏‬

‫اآلن يهمنا بعض القياسات فقط ‪:‬‬


‫‪ -1‬اختبار التوصيلية ‪buzzer‬‬
‫‪ -2‬قياس المقاومة ‪OHM‬‬
‫‪ -3‬قياس الجهد المستمر ‪DC voltage‬‬
‫‪ -4‬قياس التيار ‪DC Current‬‬
‫‪-5‬قياس سعة المكثفات ‪Farad‬‬
‫التفصيل في شرح كل طريقة تتجاوز مجال هذا الكتاب ‪ .‬إذا‬
‫أحببت االستزادة أقترح عليك مشاهدة كورس أساسيات الكهرباء في موقع ‪✌ jeem2.com‬‬
‫‪93‬‬

‫تكبير اإلشارة الكهربائية ‪Power Amplification‬‬

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

‫سوف نبدأ بشرح الطريقة األسهل (استخدام دائرة مرحل) ثم سنذكر طرق متقدمة إلكترونيا ً استخدمها إذا‬
‫أحببت ‪ ،‬و تجاهلها إذا أحببت 😏‬

‫الطريقة األسهل هي شراء دائرة مرحالت مخصصة لألردوينو ‪Arduino Relay Module‬‬
‫ستجد مقاسات مختلفة تناسب التطبيقات المختلفة (مرحل واحد ‪) 8 ، 4 ، 2 ،‬‬
‫‪94‬‬

‫ومخرج‬ ‫‪GND‬‬ ‫الحظ في الصورة ‪ :‬األردوينو يتصل بدائرة المرحل بثالثة أسالك ( ‪+5v‬‬
‫رقمي)‬
‫اآلن بإمكانك بكل بساطة التحكم باألجهزة الكهربائية المنزلية بواسطة األردوينو‪.‬‬

‫تنبيه _ كل مرحل له طاقة تحمل (جهد و تيار) تأكد أن المرحل الذي تستخدمه يتحمل تشغيل الجهاز الذي‬
‫تريد تشغيله … مثال كثير من المرحالت تتحمل ‪ 5A‬بينما المكيف يستهلك ‪..!! 15A‬‬
‫‪95‬‬

‫التكبير باستخدام الترانزيستور‪Transistor :‬‬


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

‫الترانزيستور عنصر صغير و هام في الدوائر اإللكترونية و من الممكن أن تـــُـضيع الكثير من الوقت و‬
‫أنت تتفحص مئات بل آالف األنواع من الترانزيستورات‪ .‬طريقة عملها وخصائصها ‪.‬‬
‫الحقيقة؛ أنت لن تحتاج لدراسة كل شيء عن الترانزيستورات ‪.‬‬
‫الترانزيستور يمكنه ببساطة تكبير اإلشارة الخارجة من األردوينو ‪.‬‬
‫انظر الشكل‪--:‬‬

‫للترانزيستور ‪ 3‬أطراف ( ‪) E B C‬‬


‫وطريقة استخدامه بسيطة‪.‬‬
‫‪-1‬وصل مخرج األردوينو إلى طرف الـ ‪ B‬عبر مقاومة (نقترح‬
‫‪) 2.2K‬‬
‫‪-2‬استخدم بطارية خارجية كمصدر طاقة‪ .‬أو استخدم المنفذ ‪vcc‬‬
‫لتغذية الحمل (الشيء المراد تشغيله)_‬
‫‪ vcc‬لألردوينو يتمكن من إخراج ‪200mA‬‬

‫‪-3‬وصل الموجب للحمل (محرك مثال) والطرف الثاني للمحرك وصله بالطرف ‪ C‬في الترانزيستور‪.‬‬
‫‪-4‬وصل الطرف ‪ E‬باألرضي ‪ 0v‬للبطارية و لألردوينو‪( .‬انتهينا 😝)‬
‫‪96‬‬

‫الترانزيستورات أنواع كثيرة جدا ً … سوف ننصحك بنوعين شائعين‪.‬‬

‫ترانزيستور ‪2n2222‬‬
‫ويتمكن من توصيل تيار يصل إلى‬
‫‪C=600mA‬‬ ‫‪I‬‬
‫مقارنة بـ ‪ 40mA‬فقط يتمكن منفذ األردوينو من‬
‫إخراجها‪.‬‬
‫عادة نوصل مقاومة ‪ RB=1K‬لضبط قيمة التيار‬
‫من األردوينو‪ .‬شاهد الرسم‬

‫تمرين ‪ :‬شغل لمبة ‪ DC‬من كشاف (‪ )9v‬بواسطة األردوينو ‪ +‬ترانزيستور للتكبير‪.‬‬


97
‫‪98‬‬

‫ترانزيستور ‪TIP120‬‬
‫هذا الترانزيستور أكبر و يتحمل طاقة أعلى‬
‫يتحمل مرور تيار عالي ‪IC=5A‬‬

‫الحظ في بعض التطبيقات يجب تركيب مشتت حرارة على‬


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

‫التالي يوضح كيفية تشغيل محرك باألردوينو ‪ .‬مع استخدام‬ ‫الحظ الرسم‬
‫‪ TIP120‬كمكبر للتيار‪.‬‬

‫ينصح بوضع (دايود) بين طرفي المحرك كما يظهر بالصورة هذا يعمل على حماية الدائرة‬
‫‪99‬‬

‫المرحالت ‪Relay ::‬‬


‫يوجد عيبين في تكبير الطاقة باستخدام الترانزيستور ‪.‬‬
‫● السبب األول أن الترانزيستور يتيح تشغيل األجهزة التي تعمل على الطاقة المستمرة فقط ‪ DC‬بينما‬
‫معظم أجهزة المنزل تعمل على الطاقة المترددة ‪.AC‬‬
‫(الـ ‪ DC‬والـ ‪ ) AC‬هما نوعان من الكهرباء شرحنا الفرق بينهما في كتاب اساسيات الكهرباء‬
‫باختصار شديد كهرباء المنزل من نوع ‪ AC‬المتردد ‪ ،‬بينما كهرباء البطاريات والشواحن ‪ DC‬مستمرة‪.‬‬

‫نظرية عمل المرحل بسيطة ‪ ،‬ولن نشرحها في هذا الكتاب ‪ .‬لكن ببساطة المرحل عبارة عن مفتاح يتم‬
‫توصيله و غلقه بالكهرباء و ليس يدويا ً ‪ .‬شاهد الصورة‬

‫هذا يجعل المرحل (الريالي) يتمكن من تشغيل األجهزة سواء كانت تعمل بالكهرباء المستمرة ‪ DC‬أو‬
‫الكهرباء المترددة ‪AC‬‬
‫● السبب الثاني أن المرحل (‪ )relay‬يتحمل مرور تيار أعلى بكثير (مثال ‪ )10A‬من الترانزيستور‬
‫عادة‪.‬‬

‫المرحل العادي ‪ SPDT‬وتكون عادة ‪ 5‬أطراف‬


‫‪ 3‬أطراف للمفتاح ‪ :‬هي ‪ C‬و ‪ NC‬و ‪ NO‬في معظم التطبيقات سنستخدم ‪ C,NO‬فقط‬
‫وللتحكم بالمفتاح سندخل إشارة التحكم إلى طرف من أطراف الملف ‪ Coil‬والطرف اآلخر للملف يتصل‬
‫باألرضي‪.‬‬
‫‪100‬‬

‫المرحل المزدوج ‪ DPDT‬و يكون له عادة ‪ 8‬أطراف‬

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

‫يسحب المرحل الصغير عادة ‪ 50mA‬وهذه القيمة نسبيا عالية على مخرج األردوينو‪.‬‬
‫بإمكانك توصيل ملف المرحل إلى األردوينو مباشرة ولكنني لست مسؤول إذا تلف األردوينو بسبب سحب‬
‫التيار العالي‪.‬‬
‫الحل األسلم هو تشغيل المرحل بواسطة ترانزيستور‬
‫(مثال ‪)2n2222‬‬
‫نصيحة‪ :‬يستحسن إضافة دايود بين طرفي الملف ‪،‬‬
‫هذا يعمل على حماية الدائرة‪.‬‬
‫(انتبه على اتجاه الدايود يجب أن يكون اآلنود‬
‫متصل مع جهة األرضي)‬
‫‪101‬‬

‫مقاومة رفع الجهد و مقاومة خفض الجهد ‪pull-up , Pull down‬‬

‫بعض األشياء تعمل بطريقة أكثر تعقيدا مما يظهر عليها من الوهلة األولى ‪ .‬وقد تكون مقاومات الرفع و‬
‫مقاومات الخفض أحدها ‪.‬‬
‫عندما نريد إدخال إشارة رقمية إلى األردوينو‬
‫فإننا نستخدم مفتاح ضاغط ‪push button‬‬
‫كن المالحظ أنه في حالة عدم الضغط على‬ ‫ل‬
‫لزر فإن الجهد يكون غير واضح القراءة و قد‬ ‫ا‬
‫يعطي نتائج خاطئة‪.‬‬
‫ينصح باستخدام أحد هاتين الطريقتين بإضافة‬
‫مقاومة (تقريبا ً ‪)10K‬‬

‫مالحظة‪ :‬يمكن االستعاضة عن مقاومة رفع‬


‫لجهد باستخدام األمر‬ ‫ا‬
‫)‪pinMode(10,INPUT_PULLUP‬‬
‫بدالً من ‪:‬‬
‫;)‪pinMode(10,INPUT‬‬

‫ألمر ‪ PULLUP‬يعمل على توصيل مقاومة‬ ‫ا‬


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

‫مالحظة‪:‬‬
‫قد ال يعمل هذا األمر بشكل جيد مع الطرف ‪ 13‬بسبب وجود ‪ LED‬متصل بالمنفذ ‪ 13‬على البورد‪.‬‬
‫‪102‬‬

‫تـذبذب إشارة الدخل ‪Bouncing‬‬


‫عندما تضغط على زر رقمي فإنك تتوقع أن يتغير الجهد من ‪0‬‬
‫إلى ‪ 5v‬بشكل واضح ودقيق‪ .‬الحقيقة أن هذا قد ال يحدث كما‬
‫تتمنى بسبب ظاهرة بسيطة تسمى ‪ Debouncing‬انظر‬
‫الشكل‪.‬‬
‫لو أحببت تنفيذ مشروع يستخدم مفتاح واحد ضاغط لتشغيل و‬
‫إطفاء الجهاز (وليس مفتاحين) فإنك ستعاني بسبب هذه‬
‫الخاصية‪ .‬ألن الضغطة الواحدة ستظهر بشكل عدد عشوائي‬
‫غير محدد من الضغطات السريعة‪ .‬وقد تتغير حالة الجهاز كما‬
‫تحب و قد ال تتغير 😓 ‪ .‬شاهد هذا الكود الذي يحل المشكلة‬
‫بتأخير زمني‪.‬‬
‫هذا المتغير سيحمل حالة الضوء الحقا‪bool x=0; //‬‬
‫{)(‪void setup‬‬
‫;)‪pinMode(13,OUTPUT‬‬
‫};)‪pinMode(2,INPUT_PULLUP‬‬
‫{)(‪void loop‬‬
‫إيقاف البرنامج بانتظار ضغطة‪while(digitalRead(2)==1){}//‬‬
‫تبديل حالة إكس‪x= !x; //‬‬
‫اخراج إكس على المنفذ ‪digitalWrite(13,x); //13‬‬
‫هذا التأخير يعمل على حل المشكلة‪delay(500);} //‬‬
‫أيضا ً لو كنت تعمل على تنفيذ عداد إلكتروني فإنك تتوقع أنه كلما ضغطت على الزر فإن العد سيزيد ‪1‬‬
‫فقط … ولكن بسبب مشكلة الـ تذبذب ‪ bouncing‬الغير مرغوب بها ‪ .‬فقد تجد أن العداد يعد ‪ 3‬أو ‪5‬‬
‫عدات بدل واحدة عند كل ضغطة على الزر‪.‬‬

‫يمكنك أن تحل هذه المشكلة بأكثر من طريقة _ أسهلها هو التأخير الزمني بعد كل حافة صاعدة‪.‬‬
‫**إضافة حل مشكلة الديباونس بمقاومة و مكثف‪.‬‬
‫‪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‬‬

‫مسجالت اإلزاحة ‪shift‬‬


‫‪105‬‬

‫‪register‬نموذجا ً‪74HC595 :‬‬


‫مسجالت اإلزاحة هي شرائح إلكترونية تعمل بطريقة معينة (لن نشرح طريقة عملها بالتفصيل هنا) سوى‬
‫أنها مفيدة جدا في بعض تطبيقات األردوينو‪.‬‬
‫تخيل مثال إشارة مرور بها ‪ 4‬اتجاهات _ كل جهة فيها ‪ 5‬إضاءات ( ‪ 3‬للسيارات و ‪ 2‬للمشاة) المطلوب‬
‫هو ‪ 20‬مخرج رقمي ! بينما األردوينو أونو يحتوي ‪ 14‬منفذ رقمي فقط !‬
‫بالتأكيد يمكنك شراء نوع أكبر من األردوينو (أردوينو ميغا مثال) لكن هناك حل أسهل عادة و هو‬
‫مسجالت اإلزاحة‪.‬‬
‫أحد أشهر أنواع مسجالت اإلزاحة هي الشريحة ‪ 74HC595‬و فيما يلي توضيح أطرافها‪:‬‬

‫تحتوي الشريحة ‪ 74HC959‬على ‪ 3‬أطراف أساسية يجب توصيلها لمخارج األردوينو ‪ DS‬لنقل البيانات‬
‫‪ STCP ،‬يجب أن يكون ‪ 0‬أثناء نقل البيانات ثم ‪ 1‬لعرض البيانات ‪ ،‬و ‪ SHCP‬لضبط التوقيت ‪clk‬‬
‫انظر للدائرة التالية و الكود ‪ .‬و أعتقد أنك ستفهم ما تحتاج‪.‬‬
106

.‫) على مخرج المسجل‬11001010( ‫كود تجريبي يعرض القيمة‬


int latchPin = 12; //STCP
int clockPin = 11; //SHCP
int dataPin = 13; //DS
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST,0b11001010);
digitalWrite(latchPin, HIGH);}
void loop() {}

.‫ أعداد ثنائية بتتابع يغيرها المستخدم أعلى الكود‬3 ‫ ونود أن يعرض‬74HC595 ‫لدينا مسجل إزاحة‬ ‫تمرين‬
.‫ ونود عرض أرقام ثنائية عليها‬، ‫ مسجالت إزاحة‬3 ‫لدينا‬ ‫تمرين‬
‫‪107‬‬

‫محركات دي سي _ ‪DC motors‬‬

‫توجد أنواع عديدة من المحركات ؛ أشهرها وأبسطها هو محرك (التيار المستمر) ‪ . DC-motor‬يتميز‬
‫محرك دي سي بأن له سلكين فقط ‪ .‬و عند تطبيق الجهد المناسب عليهما فإن المحرك سيبدأ بالدوران ‪ ،‬و‬
‫عند عكس قطبية الجهد (الموجب و السالب) سوف ينعكس اتجاه الدوران‪.‬‬
‫ستجد محرك دي سي في العديد من األجهزة الكهربائية (مكيف ‪ ،‬مسجل ‪ ،‬داخل الكمبيوتر…) ‪ .‬وفي كثير‬
‫من التطبيقات ستجد المحرك متصل معه علبة تروس تجعل الحركة أبطأ و لكنها أقوى كثيرا ‪.‬‬
‫سنتحدث في أجزاء متقدمة من الكتاب عن أنواع أخرى ‪:‬‬
‫‪ servo motor‬له ثالثة أسالك‬ ‫محرك سيرفو‬

‫‪ stepper motor‬له خمسة أسالك عادة‬ ‫محرك خطوة‬

‫‪ solenoid‬له سلكين لكنه يتحرك بشكل خطي‬ ‫محرك خطي‬


‫وليس دوراني‬
‫‪108‬‬

‫أهم المالحظات عند تشغيل محرك دي سي هو سحبه لتيار (أمبير) عالي (أعلى من قدرة األردوينو) لذا‬
‫نستخدم طرق مختلفة لتكبير التيار (والجهد أحيانا) ‪ :‬ترانزيستور قدرة ‪ ،‬مرحل (ريالي) ‪ ،‬أو متحكم ‪H‬‬
‫في محرك دي سي عادي قسنا التيار فكان‬
‫في التشغيل الحـُـر(بدون حمل) ‪50mA :‬‬
‫في حالة الحمل األقصى‪700mA :‬‬
‫الطريقة األسهل هي استخدام دائرة متحكم بالمحرك دي سي ‪ :‬وتعرف عادة‬
‫بـ ‪ H-Bridge‬فقط تأكد من خصائص دائرة التحكم أنها تمد تيار كافي‬
‫لسحب التيار المتوقع‪.‬‬
‫الموديل في الصورة ‪ L298N‬يتمكن من تشغيل محركين دي سي ويتحمل تيار يصل إلى ‪3A‬‬

‫في الرسم ‪ IN1‬متصل مع ‪ 7‬و ‪ IN2‬متصل مع ‪6‬‬ ‫‪IN1‬‬ ‫‪IN2‬‬

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


‫سيدور المحرك األول مع عقارب الساعة‬ ‫‪0‬‬ ‫‪1‬‬
‫سيدور المحرك األول عكس عقارب الساعة‬ ‫‪1‬‬ ‫‪0‬‬
‫لن يدون المحرك األول‬ ‫‪1‬‬ ‫‪1‬‬
‫المنفذين ‪ IN3‬و ‪ IN4‬يتحكمان بالمحرك ‪B‬‬
‫المنافذ ‪ ENA‬و ‪( ENB‬متصلة مع ‪ 3‬و ‪ )8‬خاصة بالتحكم بالسرعة لكنها ال تستخدم عادة‬

‫بالتأكيد توجد موديالت مختلفة من متحكمات المحركات _ لذا ينبغي فهم خصائصها قبل استخدامها‪.‬‬
‫‪109‬‬

‫إذا أحببت تصنيع الدائرة اإللكترونية فإن من أشهر العناصر اإللكترونية (الشرائح) المخصصة للتحكم‬
‫بمحركات دي سي هي الشريحة ‪ L293D‬ولكن الكتاب لن يتسع لنشرحها هنا‪.‬‬

‫‪ARDUINO MOTOR SHIELD REV3‬‬


‫بورد (دائرة إلكترونية) تم تطويرها من أردوينو لتتمكن من‬
‫تشغيل عدة أنواع من المحركات ‪.‬‬

‫صندوق التروس ‪: Gearbox‬‬


‫تعمل التروس على إعطاء قوة أعلى بتقليل السرعة‪.‬‬
‫وتختلف التروس من ناحية النسبة بين دورات المحرك الداخلة و دورات الذراع الخارجة‬
‫من صندوق التروس‪ .‬تكون العالقة مثال ً ‪ 20:1‬أي ‪ 20‬دورة من المحرك = دورة‬
‫واحدة من مخرج التروس‬
‫أو ‪ 30:1‬يعطي سرعة أقل و قوة أعلى‪.‬‬

‫تمرين ‪ :‬شغل محرك دي سي بواسطة األردوينو ليدور في االتجاهين _ استخدم ‪H-bridge‬‬


‫‪110‬‬

‫‪Ping Sensor‬‬ ‫حساس المسافة _‬


‫‪ULTRASONIC Distance sensor‬‬

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

‫الطرف ‪ 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

‫ أطراف _ استخدم هذا الكود‬4 ‫و اذا كان حساساك المستخدم بـــ‬

unsigned long du; // du : is the duration of the echo


int trig = 3; //trig pin
int echo = 2; //echo pin
void setup(){
Serial.begin(9600);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);}
void loop(){
digitalWrite(trig,LOW);
delay(2);
digitalWrite(trig,HIGH);
delayMicroseconds(2);
digitalWrite(trig,LOW);
du=pulseIn(echo,HIGH);
Serial.println("\n");
Serial.println(du);
delay(1000); }

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

‫الباب الرابع‪ :‬المكتبات ‪ LIBRARIES‬و ‪C++‬‬


‫‪#include‬‬ ‫>…<‬ ‫‪#define‬‬ ‫‪Object‬‬

‫المكتبات ليست إال عدد من الدوال ( ‪ ) 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‬‬
‫صفحة اضافية‪...‬‬

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


‫‪EEPROM‬‬ ‫القراءة و الكتابة على الذاكرة الدائمة ‪ EEPROM‬داخل األردوينو‬

‫‪LiquidCrystal‬‬ ‫للتحكم بشاشات ‪LCDs‬‬

‫‪SD‬‬ ‫للقراءة و الكتابة من ذاكرات ‪SD‬‬

‫‪Servo‬‬ ‫للتحكم بالمحركات من نوع سيرفو ‪Servo motors‬‬

‫‪Stepper‬‬ ‫للتحكم بمحرك خطوة ‪stepper motor‬‬


‫** لالستزادة ‪ :‬اضغط على اسم أي مكتبة لالنتقال لصفحة خاصة بها‪.‬‬
‫‪115‬‬

‫مكتبات هامة (غير رسمية) وسوف نشرح كل مكتبة في الصفحات القادمة‬

‫‪IRremote‬‬ ‫لجعل األردوينو يستقبل إشارات الريموت كنترول‬


‫(تحت الحمراء)‬

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


‫(الرقمية)‬

‫‪Sevseg‬‬ ‫لتسهيل التحكم بشاشة السيفن سيقمنت لعرض األرقام‬

‫مالحظة‪ :‬معظم المكتبات تستخدم خصائص لغة ‪ ، 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‬‬


‫‪Class’s instance‬‬
‫‪118‬‬

‫الكائنات ( ‪ ) objects‬ليست إال طريقة لتنظيم األوامر وربطها مع مكونات النظام في لغة ‪C++‬‬

‫مثالً لديك شاشتين ‪ LCD‬أو ‪ 3‬لوحات مفاتيح ‪ .‬أو ‪ 4‬محركات‪ .‬كل مكون يمكن التحكم به بطريقة‪:‬‬
‫‪-1‬ادراج المكتبة الالزمة ‪include library‬‬
‫وقد شرحنا كيفية إدراج مكتبة في الصفحات السابقة‬
‫‪-2‬تعريف الكائن ‪Object , instance‬‬
‫وهذا السطر يسمى ‪ constructor‬وفيه يجمع المعلومات الالزمة لتكوين الكائن ‪Object‬‬
‫‪className‬‬ ‫;)‪objectName = className(arguments‬‬
‫‪className‬‬ ‫اختصار األمر السابق‪objectName(arguments);//‬‬

‫‪-3‬استخدام الدوال المطلوبة مرتبطة مع اسم الكائن‬


‫ويكون استخدام الدوال من المكتبة حسب البناء التالي‪:‬‬
‫;)‪object.function(arguments‬‬

‫>‪#include <Servo.h‬‬ ‫هنا نضيف مكتبة محركات السيرفو للكود‪.‬‬


‫>‪#include <LiquidCrystal.h‬‬
‫‪Servo‬‬ ‫;‪motor1‬‬ ‫نعمل على تعريف كائن واسمه ‪motor‬‬
‫‪Servo‬‬ ‫;‪motor2‬‬ ‫يمكننا تعريف كائن آخر من نفس المكتبة‬
‫;)‪LiquidCrystal lcd(8,9,4,5,6,7‬‬ ‫وهنا نعرف كائن ‪ ، lcd‬الحظ بعض الكائنات‬
‫تتطلب معطيات لتتعرف‪ .‬في هذه الحالة‪:‬‬
‫)‪( RS,E,D4,D5,D6,D7‬‬

‫;)‪motor1.attach(5‬‬ ‫االن أوامر المكتبات ترتبط بالمكونات‬


‫;)‪motor2.WriteMicroseconds(1300‬‬ ‫‪ motor1‬أو ‪ motor2‬أو الشاشة التي‬
‫;)‪lcd.begin(2,16‬‬ ‫أسميناها ‪lcd‬‬
‫;)“ ‪lcd.print(“my name is Sami‬‬

‫‪-:‬‬ ‫‪#define‬‬ ‫تعريف الماكرو __‬


‫‪119‬‬

‫الماكرو هو كود جانبي (قصير عادة) يعمل مثل الدوال أحيانا ً ‪.‬‬
‫في هذا الكتاب لن نتعمق في لغات البرمجة المتقدمة وال في تعريف الماكرو ‪.‬‬
‫لكن في األردوينو نستخدم ( ‪ ) #define‬في أعلى الكود لربط إسم بقيمة عادة ‪ .‬فالبرنامج قبل التنفيذ‬
‫‪) #define‬‬ ‫‪sam‬‬ ‫سوف يستبدل العبارة اليسرى بالقيمة اليمنى مثالً ( ‪10‬‬
‫في أي مكان من الكود عندما يوجد عبارة ( ‪ ) sam‬سوف يحذفها و يضع مكانها ( ‪) 10‬‬

‫السطرين التاليين يقومان بنفس العمل ‪ .‬سوى أن الطريقة ‪ #define‬أوفر في استخدام الذاكرة‪.‬‬
‫‪#define‬‬ ‫‪led‬‬ ‫‪1‬‬ ‫‪int‬‬ ‫;‪led = 1‬‬
‫‪#define‬‬ ‫‪led2‬‬ ‫‪5‬‬ ‫‪int‬‬ ‫;‪led2 = 5‬‬
‫فكلما كتبنا كلمة ( ‪ ) led‬في الكود فإن البرنامج سيحولها إلى القيمة ( ‪ ) 1‬قبل رفعها لألردوينو‬

‫مثال‪ :‬اعمل برنامج الوميض ‪ Blink‬و استخدم طريقة ‪ #define‬الختصار الكود‬


‫‪#define ON‬‬ ‫)‪digitalWrite(13,HIGH‬‬
‫‪#define OFF‬‬ ‫)‪digitalWrite(13,LOW‬‬
‫‪#define DD‬‬ ‫)‪delay(500‬‬

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


‫} ;‪void loop(){ON; DD; OFF; DD‬‬
‫‪120‬‬

‫لوحة األزرار ‪keypad‬‬

‫المفتاح (الزر) الرقمي طريقة ادخال شائعة و بسيطة‪ .‬لكن في الكثير من التطبيقات نحتاج إلدخال معلومات‬
‫أكثر (أرقام وحروف) للتحكم بتشغيل األردوينو‪ .‬ومن أشهر الحلول استخدام شبكة من األزرار الرقمية‬
‫‪ Keypad‬تحتوي ‪ 16‬زر لكنها تستخدم ‪ 8‬منافذ رقمية فقط‪.‬‬
‫لمشاهدة صفحة تشرح المكتبة و األوامر وتحتوي رابط التحميل اضغط هنا ‪:‬‬
‫‪https://playground.arduino.cc/Code/Keypad‬‬

‫مثال‪ :1‬يعرض الزر الذي ضغطته على شاشة السيلاير‪:‬‬


‫تذكر أن حجم اللوحة ‪#include <Keypad.h> //4*4‬‬
‫]‪char Keys[4][4] = { //[Rows] [Columns‬‬
‫‪{'D','#','0','*'},‬‬
‫‪{'C','9','8','7'},‬‬
‫‪{'B','6','5','4'},‬‬
‫;}}'‪{'A','3','2','1‬‬
‫;}‪byte RP[4] = {6, 7, 8, 9‬‬
‫;}‪byte CP[4] = {2, 3, 4, 5‬‬
‫تكوين الكائن ‪Keypad KP=Keypad(makeKeymap(Keys),RP,CP,4,4); //‬‬
‫};)‪void setup(){Serial.begin(9600‬‬
‫{)(‪void loop‬‬
‫;)(‪char x = KP.getKey‬‬
‫}};)‪if (x){Serial.println(x‬‬
‫مالحظات‪:‬‬
‫● أهم سطر يجب عليك فهمه هو الذي يبدأ بـ ‪ Keypad‬و يسمى سطر الـ ‪constructor‬‬
‫في هذا السطر يتم تعريف البرنامج بكل خصائص لوحة المفاتيح المستخدمة ‪ :‬عدد الصفوف ‪ ،‬األعمدة ‪،‬‬
‫المنافذ المستخدمة للصفوف و األعمدة و القيم (الرموز) التي توازي كل ضغطة زر ‪.‬‬
‫● القيم التي تريد استخدامها عند الضغط على كل زر موجودة في المصفوفة ( ‪ ) Keys‬و يجب‬
‫االنتباه أنك ستستخدم نوع واحد من البيانات ‪ char:‬في المثال السابق ‪.‬‬
‫‪121‬‬

‫يمكنك جعل عدد األعمدة ‪ 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‬‬

‫اإلشارات السبعة (‪ )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 ‫لنفهم تكوين وطريقة تشغيل الـ‬

! ‫ خانات (بدون مكتبة) الحظ مستوى التعقيد‬4 ‫هذا الكود يشغل‬


int x=1983; //‫غير القيمة التي تريد عرضها هنا‬
int A=7,B=8,C=2,D=3,E=4,F=6,G=5;
int D1=10,D2=11,D3=12,D4=13;
byte x4=x%10;
byte x3=x%100 /10;
byte x2=x%1000 /100;
byte x1=x%10000 /1000;
int X[]={x4,x3,x2,x1};
void setup(){for(int i=2;i<=13;i++){pinMode(i,OUTPUT);}}
void loop(){
for(int i=10;i<=13;i++){ digitalWrite(i,LOW);}
static int CS=0; //CS is chip select must loop 1-4
if (CS==4){CS=0;}
if (CS==0){digitalWrite(D4,HIGH);}
else if(CS==1){digitalWrite(D3,HIGH);}
else if(CS==2){digitalWrite(D2,HIGH);}
else if(CS==3){digitalWrite(D1,HIGH);}
for(int i=2;i<9;i++){digitalWrite(i,LOW);}
digitalWrite(E,HIGH);//because E is mostly off unlike the others
if(X[CS]==1||X[CS]==4){ digitalWrite(A,HIGH);}
if(X[CS]==5||X[CS]==6){ digitalWrite(B,HIGH);}
if(X[CS]==2){ digitalWrite(C,HIGH);}
if(X[CS]==1||X[CS]==4||X[CS]==7){ digitalWrite(D,HIGH);}
if(X[CS]==0||X[CS]==2||X[CS]==6||X[CS]==8){ digitalWrite(E,LOW);}
if(X[CS]==1||X[CS]==2||X[CS]==3||X[CS]==7){ digitalWrite(F,HIGH);}
if(X[CS]==0||X[CS]==1||X[CS]==7){ digitalWrite(G,HIGH);}
CS++;
delay(20);}

‫شاهد تشغيل الكود هـــــنـــــا‬


.‫ تحتوي األوامر الالزمة‬Library ‫لتسهيل العمل مع اإلشارات السبع يمكننا استخدام مكتبة‬
7seg‫المكتبة على طريقة توصيل الـ‬+ ‫شاهد األسطر التالية التي تشرح تعريف األردوينو‬
#include <SevSeg.h>
SevSeg ss;
void setup(){
‫‪125‬‬

‫;‪byte numDigits = 4‬‬


‫مقاومة عند كل ديجيت بين‪byte digitPins[] = {2, 3, 4, 5};//‬‬
‫;}‪byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13‬‬
‫;)‪ss.begin(COMMON_ANODE, numDigits, digitPins,segmentPins‬‬
‫هذا األمر غير ضروري لمعظم الشاشات‪ss.setBrightness(10);} //‬‬
‫مالحظة‪ :‬يجب أن تتأكد من نوع الـ ‪ SevSeg‬ضع ‪COMMON_CATHODE‬‬
‫بدل ‪ COMMON_ANODE‬حسب نوع السيفين سيقمينت‬
‫{)(‪void loop‬‬
‫;)‪ss.setNumber(1234,3‬‬ ‫‪//should show 1.234‬‬
‫};)(‪ss.refreshDisplay‬‬ ‫;‪// Must run repeatedly‬‬
‫مالحظات ‪ :‬هذا النوع من التشغيل ال يقبل وجود أمر يوقف دورة التنفيذ (مثل ‪ )delay‬إذا أردت العد كل‬
‫ثانية فاستخدم طريقة مثل (الوميض بال تأخير والذي شرحناه سابقا) (المزيد عن المكتبة اضغط هنا)‬

‫تمرين‪ :‬صمم شاشة (سيفن سيق) عـداد مع ثالثة أزرار ضاغطة ‪up, down , reset‬‬
‫تمرين‪ :‬صمم ساعة رقمية لتعد الثواني و الدقائق‬

‫استخدام اللوحة المتكاملة ‪max7219‬‬

‫اذا كنت تحتاج ‪ 8‬وحدات من السيفين سيقمينت أو ‪ 16‬أو ‪ 24‬و باستخدام ‪ 3‬منافذ من األردوينو فقط‬
‫(‪+‬طرفي التغذية) فاألسهل و األرخص استخدام هذه اللوحة المتكاملة ‪ .‬لن يتسع المجال في الكتاب لشرحها‬
‫‪https://www.youtube.com/watch?v=VgNIkGzxGAU‬‬ ‫يمكنك مشاهدة الرابط هنا ‪:‬‬
‫‪126‬‬

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

‫توجد عدة أنواع من المحركات _أشهرها‬


‫‪-1‬محرك دي سي ‪DC-motor‬‬
‫‪-2‬محرك خطوة ‪stepper motor‬‬
‫‪ -3‬محرك سيرفو ‪servo motor‬‬
‫الحظ أيضا أن محركات السيرفو تنقسم لقسمين‬
‫)‪ hobby (angle‬حسب الدخل(عادة عرض نبضات) تتحرك الذراع إلى‬ ‫سيرفـو الزاوية‬
‫‪ servo‬الزاوية المطلوبة و تقف عندها‪ .‬هذا النوع أكثر شيوعا‪.‬‬
‫‪ continuous‬يدور مثل محرك دي سي‪ .‬ويمكنك التحكم بسرعته واتجاهه‬ ‫سيرفـو الدورات‬
‫‪ rotation servo‬يحتوي داخليا على ‪ H-bridge‬للتكبير والتحكم‪.‬‬ ‫الكاملة‬
‫(هـذا النوع أصبح نادر الوجود)‬

‫انظر إلى رسم إشارة التحكم (بين كل بدايتي نبضة ‪)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‬‬

‫محرك الخطوة ‪stepper motor‬‬


‫‪128‬‬

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


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

‫يوجد ثالث طرق للتحكم بخطوات المحرك (خطوة بقطب ‪ ،‬خطوة بقطبين ‪ ،‬نصف خطوة) ال تحتاج للتعمق‬
‫في كل هذه الطرق شاهد الرابط التالي إذا أردت فهم الطرق المختلفة ( هــــــنا )‬
‫أيضا ً يمكنك التحكم بمحرك الخطوة بسلكين أو بأربعة (سنركز على األسهل هنا وهو ‪ 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‬‬

‫الذاكرة الدائمة ‪EEPROM‬‬

‫الذاكرات 💥💥💥… دعنا نتحدث قليال عن الذاكرات قبل أن ندخل في الكود 😀‬


‫الذاكرات ضرورية لعمل أي نظام كمبيوتري ‪ .‬ال بد من تخزين البرنامج (الكود‪ ،‬األوامر)‪ ،‬و ال بد من‬
‫متابعة قيم المتغيرات أثناء عمل البرنامج (ذاكرة ‪ . )RAM‬وفي كثير من األحيان تحتاج لتخزين القيم في‬
‫ذاكرة دائمة لتعود و تفتحها الحقا ً (مثل الهارديسك في الكمبيوتر)‬
‫كما قلنا سابقا ً يعتمد األردوينو على شريحة واحدة (مايكروكنترولر) هي ‪Atmega328p‬‬
‫هذه الشريحة تحتوي مكونات عديدة ومنها ‪ 3‬أنواع من الذاكرة‬
‫‪32KB‬‬ ‫و تستخدم لتخزين الكود (‪)sketch‬‬ ‫ذاكرة الفالش ‪Flash memory‬‬
‫‪2KB‬‬ ‫و تنشط أثناء تنفيذ البرنامج مثل قيم المتغيرات‬ ‫ذاكرة الـ رام ‪RAM‬‬
‫‪1KB‬‬ ‫وهي ذاكرة سنركز عليها في الصفحات التالية‬ ‫ذاكرة االيبروم ‪EEPROM‬‬

‫الحاجة لذاكرة الـ ايبروم ‪ :‬تخيل أنك صممت جهاز ليقرأ درجة الحرارة كل ‪ 10‬دقائق ويضع هذه‬
‫‪ int x , int y , int‬مثالً‪.‬‬ ‫القيم (درجات الحرارة) في متغيرات ‪z :‬‬
‫قمت بكتابة الكود ورفعته إلى األردوينو ‪ ،‬فتم تخزينها في ذاكرة ‪Flash memory‬‬
‫ثم وضعته في مكان التشغيل (مثال مصنع) و شغلته باستخدام بطارية‪ .‬ثم إنك أحببت أخذ هذه القيم إلى‬
‫الكمبيوتر‪.‬‬
‫المشكلة أنك بمجرد فصل الطاقة عن األردوينو فإن جميع هذه القيم ستختفي‪ .‬إلنها فعليا ً كانت مخزنة في الـ‬
‫رام فقط‪ .‬وذاكرة الـ ‪ RAM‬تفقد كل محتوياتها بمجرد فصل الطاقة عنها‪.‬‬
‫ذاكرة اإليبروم ‪ EEPROM‬مخصصة لالحتفاظ بالبيانات حتى بعد فصل الطاقة عنها‪ .‬وهي مفيدة كثيرا‬
‫في كثير من المشاريع المتقدمة‪.‬‬
‫‪131‬‬

‫الـ ‪ EEPROM‬هي ذاكرة مكونة من بايتات ‪ Bytes‬منفصلة‪ .‬لكل‬


‫بايت عنوان ويمكنه تخزين قيمة (‪ )255-0‬فقط وتعتبر قيمة صغيرة‪.‬‬
‫في األردوينو أونو (شريحة ‪ )Atmega328p‬تكون سعة االيبروم =‬
‫‪ 1KB‬و تكون البايتات مرقمة من ‪ 0‬إلى ‪1023‬‬

‫هناك مكتبة رسمية من األردوينو للتحكم بالـ ‪EEPROM‬‬


‫لذا يجب إضافة السطر التالي لتضمين المكتبة أعلى الكود ‪:‬‬
‫>‪#include <EEPROM.h‬‬

‫قبل أن نبدأ بكتابة الكود نود التنبيه على عدة أمور‪:‬‬


‫‪-‬توجد مكتبات عديدة غير رسمية للتحكم بالـ ‪ EEPROM‬ولديك الحرية‬
‫في استخدامها وفي بعض األحيان تكون أسهل من المكتبة الرسمية لكننا لن‬
‫نشرحها في هذا الكتاب‪.‬‬
‫‪-‬تعمل ذاكرة الـ ‪ EEPROM‬بشكل أبطأ من الـ ‪( RAM‬حوالي ‪)3ms‬‬
‫لتخزين البايت الواحد‪.‬‬
‫‪-‬اإليبروم لها عمر افتراضي من مرات الكتابة أو القراءة (حوالي ‪100‬‬
‫ألف مرة) الرقم كبير الشك‪ .‬لكن في بعض التطبيقات ينبغي االنتباه لهذا األمر حتى ال تتلف الـ ايبروم‬
‫األوامر األساسية‪-:‬‬
‫)‪EEPROM.write(0,235); //(address:0-1023 , value 0-255‬‬
‫)‪Byte x=EEPROM.read(10); //(address‬‬
‫األمرين السابقين سهلين و واضحين سوى أن باستخدامهما مشكلة و هي أنهما يعمالن على تخزين أو قراءة‬
‫بايت واحد فقط ‪ .‬بينما معظم المتغيرات (‪ int‬مثال) تكون أكثر من بايت‪.‬‬
‫‪String‬‬ ‫‪char‬‬ ‫‪long‬‬ ‫‪bool‬‬ ‫‪Byte‬‬ ‫‪float‬‬ ‫‪int‬‬ ‫نوع المتغير‬
‫‪any‬‬ ‫‪1‬‬ ‫‪4‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪4‬‬ ‫‪2‬‬ ‫عدد البايتات‬
‫شاهد المثال التالي لتخزين رقم ‪ int‬في ذاكرة االيبروم (‪ )x‬ثم إعادة قراءته و وضع القيمة في (‪)y‬‬
‫;‪int x=31287‬‬
‫;‪int y‬‬
‫)‪EEPROM.put(0, x); //(address,data‬‬
‫)‪EEPROM.get(0, y); //(address,destination variable‬‬
‫يجب أن يكون المتغيرين من نفس النوع وفي حال اختالف النوع قد تظهر قراءات خاطئة‪.‬‬
‫نفس هذه الطريقة يمكن استخدامها مع متغيرات من أنواع مختلفة مثل ‪float , char‬‬
‫ولكن انتبه لعدد البايت المستخدمة لكل نوع ‪ .‬مثال إذا خزنت ( [‪ ) char x ]10‬مكون من ‪10‬‬
‫حروف ‪ .‬ال تستخدم أول ‪ 10‬بايت ‪ .‬فهي مستخدمة بالفعل‪.‬‬
132

‫ وبدالً عن ذلك استخدم مصفوفة حروف محددة الحجم‬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

: ‫ مثل‬sizeof ‫لمعرفة عدد البايتات المستخدمة في أي متغير أو مصفوفة ؛ استخدم األمر‬


float x=1.2;
String y=”hello world”;
Serial.println(sizeof(x));
Serial.println(sizeof(y));
11 ‫ و‬4 : ‫ويفترض أن يظهر على الشاشة الرقمين‬

.‫ ثم استخرجها و اعرضها على الشاشة‬EEPROM ‫ في ذاكرة الـ‬sami grami :‫ خزن العبارة‬:‫مثال‬


#include <EEPROM.h>
char x[10] =”sami grami”;
char y[10];
void setup(){
EEPROM.put(100,x); //used address : 100
EEPROM.get(100,y);
Serial.begin(9600);
Serial.println(y);}
void loop(){}

: ‫ ثواني من قراءة مقاومة متغيرة‬3 ‫كود الكتابة كل‬


#include <EEPROM.h>
int x=0;
int add=0;
void setup(){
delay(10000); //so the Arduino doesn’t write right away
Serial.begin(9600);}
void loop(){
x=analogRead(A0);
Serial.println(x);
if(add<1022){ EEPROM.put(add,x); add=add+2;}
delay(3000);}
‫‪133‬‬

‫كود قراءة ‪ 40‬رقم من ذاكرة ايبروم و عرضها على الشاشة‪:‬‬


‫>‪#include <EEPROM.h‬‬
‫;‪int x=0‬‬
‫{)(‪void setup‬‬
‫;)‪Serial.begin(9600‬‬
‫{)‪for(int i=0 ; i<80 ; i=i+2‬‬
‫;)‪EEPROM.get(i,x‬‬
‫}};)‪Serial.println(x‬‬
‫}{)(‪void loop‬‬

‫تمرين‪-:‬‬
‫أ‪ -‬صمم كود يقيس شدة االستضاءة في غرفة ويخزن القراءة في االيبروم ويكرر العملية كل ‪ 10‬ثواني ‪.‬‬
‫وفي حال امتالء الذاكرة االيبروم‪ .‬يتوقف الكود عن التخزين‪.‬‬
‫أطفئ األردوينو ‪ .‬األفضل جعل العداد ‪ address‬مخزن في االيبروم بحيث في حال انقطاع الكهرباء‬
‫فإن التخزين يكمل من مكان التوقف و ال يعيد من جديد‪.‬‬
‫ب‪ -‬صمم كود آخر لقراءة محتويات الذاكرة ‪ EEPROM‬و عرضها على شاشة السيلاير‬
‫‪134‬‬

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

‫الشاشة من أهم المكونات التي تساعدك لعمل مشاريع رائعة فبدل أن تربط األردوينو بالكمبيوتر لعرض القيم‬
‫و العبارات ‪ .‬يمكنك أن تعرض العبارات و المعلومات على شاشة بسيطة في أي مكان و بتكلفة منخفضة‪.‬‬
‫السعر على أمازون حوالي (‪ 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‬‬

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


‫‪136‬‬

‫‪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.print(“hello world‬‬ ‫يكتب عبارة على سطر في الشاشة أو قيمة متغير‬


‫; ) ‪lcd.write( x‬‬ ‫يستخدم إلظهار الحروف بصيغة ‪char‬‬
‫;)(‪lcd.home‬‬ ‫أوامر إضافية (نادرة االستخدام)‬
‫;)(‪lcd.cursor‬‬
‫;)(‪lcd.noCursor‬‬
‫;)(‪lcd.blink‬‬
‫;)(‪lcd.noBlink‬‬
‫;)(‪lcd.noDisplay‬‬
‫;)(‪lcd.display‬‬
‫;)(‪lcd.scrollDisplayLeft‬‬
‫;)(‪lcd.scrollDisplayRight‬‬
‫;)(‪lcd.autoScroll‬‬
‫;)(‪lcd.noAutoScroll‬‬

‫للمزيد زر صفحة مكتبة الـ ‪ LCD‬مـن‪ -:‬هـــــنـــــا‬

‫تمرين ‪ :‬صمم ساعة رقمية تعرض الثواني و الدقائق و الساعات على شاشة ‪LCD‬‬
‫‪137‬‬

‫استخدام الريموت كنترول ( ‪ ) IR‬للتحكم بتشغيل األردوينو‬

‫وااااااااااااو … من أروع مميزات األردوينو (في رأيي) أنه يتيح لك التحكم‬ ‫واو … 😲‬
‫الالسلكي باستخدام ريموت كنترول بسيط‪ .‬يمكنك اآلن بسهولة التحكم بتشغيل األجهزة الكهربائية بريموت‬
‫التلفزيون أو الرسيفر (ياناس أحب األردوينو ذا) 😍‬
‫سنشرح قليال ً عمل الريموت قبل أن نبدأ بالبرمجة و االستخدام‪:‬‬
‫يعمل الريموت (المرسل) على إرسال إشارة (ذبذبات) بضوء غـير مرئي (تحت الحمراء) وحسب كل زر‬
‫تضغطه فإنه يرسل الذبذبات بطريقة معينة‪ .‬هذه الذبذبات يستحسن أن تترجم من شكل اإلشارة إلى رقم‬
‫(بالصيغة السداسية عشر)‬

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


‫مثال ً في ريموت تلفزيون سوني عندما تضغط الزر (‪ )1‬فإن الكود المرسل يكون ‪0xFF12C409 :‬‬
‫بينما في ريموت سامسونق عندما تضغط على الزر (‪ )1‬فإن الكود المرسل يكون ‪0x7070807F :‬‬

‫الخبر الجيد أنه أن األردوينو يمكنه التعرف على أي ريموت ‪ .‬فقط اتبع الخطوات التالية ‪-:‬‬
‫المرحلة األولى‪ :‬معرفة الكود الذي يتم ارساله عند الضغط على كل مفتاح‬
‫(مثالً ‪ 0xFA58H3‬عند الضغط على السهم األيمن)‬
‫‪138‬‬

‫المرحلة الثانية‪ :‬تغيير الكود بحيث نكتشف الزر الذي تم الضغط عليه (بقراءة الكود)‬
‫ثم تنفيذ العمل المطلوب (مثالً تشغيل أو إطفاء لمبة)‬
‫األوامر الرئيسية‪-:‬‬
‫‪IRrecv‬‬ ‫;)‪rec(10‬‬ ‫تعريف كائن مستقبل اسمه ‪ rec‬ومتصل بالمنفذ ‪10‬‬
‫‪decode_results‬‬ ‫;‪res‬‬ ‫كائن اسمه ‪ res‬وهو مساحة في الذاكرة لتخزين الشفرة‬
‫;)(‪rec.enableIRIn‬‬ ‫تشغيل المستقبل للـ ‪ IR‬وانتظار إشارة من الريموت‬
‫==)‪while(rec.decode(&res‬‬ ‫ايقاف البرنامج بانتظار إشارة من الريموت‬
‫}{)‪0‬‬

‫{))‪if(rec.decode(&res‬‬ ‫طريقة أخرى لكشف إشارة الريموت بدون ايقاف‬


‫;‪long x= res.value‬‬ ‫بهذه الطريقة نحصل على القيمة من الكائن ‪res‬‬
‫;)(‪rec.resume‬‬ ‫}‬ ‫انتظار إشارة جديدة من الريموت‬

‫شرح المرحلة األولى ‪ -:‬قراءة الكود القادم من الريموت‪.‬‬


‫>‪#include <IRremote.h‬‬
‫هنا ضع رقم المنفذ المستخدم‪IRrecv recv(3); //‬‬
‫;‪decode_results res‬‬
‫{ )(‪void setup‬‬
‫;)‪Serial.begin(9600‬‬
‫};)(‪recv.enableIRIn‬‬
‫{ )(‪void loop‬‬
‫{ ))‪if (recv.decode(&res‬‬
‫;)‪Serial.println(res.value, HEX‬‬
‫};)(‪recv.resume‬‬
‫} ;)‪delay(100‬‬
‫افتح صفحة الـ سيلاير و اضغط على أزرار الريموت (مع توجيه الريموت للحساس)‬
‫ستظهر الشفرات الخاصة بكل زر تضغطه‪.‬‬
‫في ريموتي أحتاج استخدام زرين فقط هما‪ 707005FA -:‬و ‪7070C53A‬‬

‫سنقوم اآلن بكتابة كود بسيط لتشغيل ‪ 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‬‬

‫التخزين على ذاكرة ‪SD‬‬

‫في بعض المشاريع تحتاج لتسجيل مقدار كبير من المعلومات (القراءات) بدون أن تبقى باتصال مع‬
‫الكمبيوتر‪ .‬مثال‪ :‬قياس درجة الحرارة طوال السنة‪ .‬هذا العمل يسمى ‪. logging‬‬
‫بإمكانك استخدام الذاكرة الدائمة داخل شريحة األردوينو ‪ EEPROM‬لكن حجمها صغير (‪ )1KB‬كما‬
‫أن استخراج المعلومات منها يعتبر نسبيا صعب لغير المتخصص‪.‬‬
‫الخيار األمثل في هذه الحالة هو استخدام ذاكرات الـ ‪ SD‬فهي رخيصة واستخدامها سهل‪.‬‬
‫الرائع في األمر أنه بإمكانك أخذ مئات أو آالف القراءات بسهولة من األردوينو إلى الذاكرة ‪ SD‬إلى‬
‫الكمبيوتر إلى برنامج أكسيل ؛ ثم رسم شكل بياني يبين لك خالصة كل تلك القراءات‪.‬‬

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

‫‪SPI‬‬ ‫بروتوكول التواصل ‪serial peripheral interface‬‬


‫بروتوكوالت التواصل موضوع كبير ولن يتسع الكتاب لشرحها بشكل متوسع سوى أننا سنشرح الفكرة‬
‫باختصار‪ .‬يوجد بروتوكوالت عديدة لربط األجهزة بالملحقات مثل ‪UART , I2C , SPI :‬‬
‫لعل من أسهلها ‪ SPI‬ويستخدم بكثرة لربط مكونات األنظمة اإللكترونية (أردوينو‪ ،‬حساسات‪ ،‬ذاكرات ‪،‬‬
‫شرائح إلكترونية متنوعة )‬
‫يستخدم بروتوكول الـ ‪ SPI‬أربعة أسالك‬
‫‪MOSI master out/ Slave in‬‬ ‫‪pin11‬‬ ‫نقل البيانات تسلسليا من األردوينو إلى الذاكرة‬

‫‪MISO master in / Slave out pin12‬‬ ‫نقل البيانات من الذاكرة إلى األردوينو‬

‫‪CLK‬‬ ‫‪Clock‬‬ ‫‪pin13‬‬ ‫نبضات التزامن‬

‫‪CS‬‬ ‫‪Chip select‬‬ ‫*‪any‬‬ ‫اختيار الملحق الفعال (في حال الربط بأكثر من ملحق)‬

‫توصيل مدخل الذاكرة باألردوينو ‪:‬‬

‫عند توصيل الدائرة اإلضافية (مدخل الذاكرة ‪ )SD‬وصل جميع األسالك التي تحدثنا عنها في أماكنها‬
‫المذكورة في الجدول‪MOSI , MISO , CLK :‬‬
‫‪ CS‬في أي منفذ آخر‬
‫‪ 5v‬و ‪ GND‬بشكل طبيعي ‪ .‬وال توصل ‪3.3v‬‬

‫الطريقة التي ينصح بها للكتابة على ذاكرة ‪ SD card‬تتكون من عدة خطوات ‪ :‬شاهدها في المثال‪.‬‬
‫‪142‬‬

‫>‪#include <SPI.h‬‬
‫>‪#include <SD.h‬‬

‫إنشاء كائن بأي إسم‪File sami; //‬‬


‫تحديد المنفذ المستخدم لـ سي إس‪int CS=10; //‬‬
‫;‪int x=20178‬‬

‫{ )(‪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‬‬

‫الباب الخامس‪ :‬المشاريع اإللكترونية ‪Electronic projects‬‬

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

‫بالنسبة لي ‪ :‬المشاريع تنقسم لقسمين عموما ً‬


‫‪ -1‬مشاريع هدفها حل مشكلة أو تطوير جهاز موجود‪.‬‬
‫‪ -2‬مشاريع هدفها شد االنتباه (في المعارض) بتطبيقات غـريبة وجذابة‬
‫للزوار‪.‬‬
‫شاهد مثالً كيف يستفيد هذا الفنان من األردوينو إلنتاج مشاهد الدمى‬
‫المتحركة (اضغط هنا)‬
‫‪145‬‬

‫في الحقيقة هناك مجاالت عديدة عامة قد تندرج تحتها عشرات و مئات األفكار و المشاريع مثل‪:‬‬
‫األتمتة ‪( ⌛automation‬الكلمة صعبة ‪ ،‬أعلم )‪:‬‬
‫جعل الكهرباء و اإللكترونيات تقوم بعمل بسيط‬
‫اعتاد اإلنسان القيام به مثل ري األشجار ‪ ،‬أو تشغيل‬
‫اإلضاءة ‪ .‬أو إطعام الحيوانات‪ .‬أو تنظيف البيت ‪.‬‬
‫الغسالة الفل اوتوماتيك مثال أيضا‪.‬‬
‫توفير الطاقة أو الماء💧 ‪ :‬مجال كبير و هام‬
‫فاستهالك الطاقة الكهربائية كبير جداً ‪ ،‬و كثير من‬
‫هذا االستهالك يضيع دون استفادة حقيقية ‪ .‬يمكن‬
‫ببعض الذكاء اإللكتروني التقليل من هذا الفقد‪.‬‬
‫السالمة ‪ :😓 Safety‬عادة لن نفكر بهذه المشكلة‬
‫إال بعد أن نرى اإلصابات و الخسائر‪ .‬توجد مخاطر‬
‫عديدة ‪ ،‬في المصنع في المنزل في الحديقة في‬
‫المسبح‪ .‬يمكن تصميم أنظمة آلية لحماية األشخاص‬
‫و الممتلكات من هذه المخاطر‪.‬‬
‫خدمة أصحاب‬
‫االحتياجات الخاصة🙆‪ :‬يوجد أشخاص لديهم إعاقات سمعية أو بصرية أو‬
‫حركية‪ .‬و اآللة قد تجعل حياتهم أسهل بكثير‪ .‬هذا مجال جميل و رائع‪.‬‬
‫تسهيل الوصول (مثل ريموت التحكم عن بعد) 🎮‪ :‬أن تفتح الباب بدون‬
‫استخدام المفتاح‪ .‬أو أن تغير درجة حرارة المكيف دون أن تقف (لمكيف‬
‫بدون ريموت) أو أن تستخدم االنترنت للتحكم بأجهزة كهربائية و أنت خارج‬
‫المنزل‪.‬‬
‫جمع المعلومات 📈 ‪ :‬في كثير من التطبيقات يحتاج اتخاذ القرار إلى كم كبير‬
‫من المعلومات ‪ .‬مثال ً نود بناء محطة طاقة شمسية أو محطة طاقة رياح ‪.‬‬
‫أين هو المكان األمثل بعد دراسة لمدة سنة كاملة لمعرفة المكان األمثل‪.‬‬
‫تقليل السعر 💸‪ :‬توجد منتجات كهربائية مرتفعة السعر‪ ،‬إذا استطعت إنتاج‬
‫منتج مشابه بتكلفة أقل ‪ .‬فأنت رائع‪.‬‬

‫بإمكانك هذه اللحظة التوجه إلى صفحة البحث قووقل أو يوتيوب‪ .‬و البحث عن ‪Arduino projects‬‬
‫ستجد مئات األفكار بعضها استعراضية و بعضها ذات تطبيقات مفيدة في الحياة شاهد هذا الفيديو على‬
‫سبيل المثال أيضا ً شاهد ‪ instructables :‬موقع خاص بتنفيذ األفكار و شرحها‬

‫مشاكل تصنيع المشاريع 🔨‪:‬‬


‫‪146‬‬

‫ال يتسع المجال هنا لشرح كيفية تصميم جهازك اإللكتروني و هل ستصنع دائرة إلكترونية؟ و كيف ستصنع‬
‫الصندوق الحاوي لمكونات الجهاز ‪ .‬كيف ستثبت كل قطعة في مكانها‪ .‬ستحتاج لمهارات فنية في تصميم‬
‫الجهاز وتشكيل المواد و تجميع القطع ولحام العناصر اإللكترونية و التوصيالت‪ .‬كل هذا يتجاوز مجال هذا‬
‫الكتاب‪ .‬وقد نناقشه في دورات و كتب قادمة‪.‬‬
‫الرابط التالي لفيديو لعملية وضع دائرة إلكترونية في صندوق مناسب وتشكيل الواجهة‪:‬‬
‫‪Circuit Skills: Electronics Enclosures‬‬

‫من النصائح العامة لتقديم مشروعك بشكل الئق‪-:‬‬


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

‫أفكار سريعة لمشاريع‪:‬‬


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

‫التحكم بالجوال باإلضاءة و المكيف‪.‬‬


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

‫مشروعي أنا (راح أشتغل عليه قريباً) ‪ :‬اضافة خاصية‬


‫(تعديل درجات الحرارة ) أثناء النوم (لمكيف ال يحتوي‬
‫على هذه الخاصية) و ربطها بالجوال‪ + .‬التحكم‬
‫باإلضاءة‪.‬‬
‫‪148‬‬

‫إضافات يمكن ربطها مع األردوينو‬


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

‫‪digital temp‬‬ ‫‪flame sensor‬‬ ‫‪mic - Sound‬‬ ‫‪joy stick‬‬


‫مقياس الحرارة الرقمي‬ ‫كاشف الحريق‬ ‫حساس للصوت‬ ‫عصا التحكم‬

‫‪metal touch‬‬ ‫‪linear hall‬‬ ‫‪Avoidance‬‬ ‫‪tracking sensor‬‬


‫كاشف المجال المغناطيسي‬ ‫حساس تالفي االصطدام‬ ‫حساس تتبع اللون‬

‫‪shook module‬‬ ‫‪heart beat‬‬ ‫‪reed switch‬‬ ‫‪magnetic spring‬‬


‫كاشف اهتزازات‬ ‫نبضات القلب‬ ‫مفتاح مستشعر للمغناطيس‬ ‫مفتاح يتأثر بالمغناطيس‬
‫‪149‬‬

‫‪Temperature‬‬ ‫‪tilt switch‬‬ ‫‪Hydrargyrum-sw‬‬ ‫‪rotary encoder‬‬


‫‪and humidity‬‬ ‫مفتاح ميالن‬ ‫‪mercury SW‬‬ ‫قياس سرعة واتجاه‬
‫مقياس حرارة و رطوبة‬ ‫الدوران‬

‫‪IR receiver‬‬ ‫‪IR Emission‬‬ ‫‪ analog hall sensor‬مقياس حرارة تماثلي‬


‫مستقبل إشارة تحت حمراء‬ ‫مرسل إشارة تحت حمراء‬ ‫قياس المجال‬
‫المغناطيسي‬

‫مستقبل ليزر‬ ‫مصدر ليزر‬ ‫‪ tap / knock‬حساس ضوئي‬


‫حساس االهتزاز‬
‫‪150‬‬

‫‪ gyroscope‬مصفوفة من الـ ‪LEDs‬‬ ‫‪PIR motion‬‬ ‫‪RTC Real Time Clock‬‬


‫حساس ميالن‬ ‫حساس حركة‬ ‫ساعة لحفظ الوقت‬

‫حساس قياس الرطوبة في التربة‬ ‫‪ RFDI‬حساس للغازات السامة‬


‫السلكي قصير المدى‬

‫مجرد التأمل في اإلضافات الكثيرة التي يمكن ربطها باألردوينو قد يجعلك تجد أفكار عديدة قابلة للتحسين‬
‫‪http://arduinomodules.info/‬‬ ‫موقع رائع لمشاهدة اإلضافات لألردوينو‬
‫‪151‬‬

‫مواضيع متقدمة قد نضع شرحها مستقبالً‬

‫استفدت أنا كثيرا و أنا أبحث في مواضيع هذا الكتاب‪ ،‬و أكتبه و أنسقه ‪ ،‬لكن مجاالت األردوينو أكثر بكثير‪.‬‬
‫إذا اتسع لي الوقت فسوف أنفـذ دورة أخرى و أكتب كتاب آخر أتمنى أن يحتوي على المواضيع التالية‬
‫والمزيد ‪.‬‬
‫القراءة من ذاكرة ‪ ، SD‬إرسال إشارات ‪ IR‬من األردوينو‬
‫توصيل األردوينو بالبلوتوث ‪Bluetooth‬‬
‫توصيل األردوينو بسلك الشبكة ‪Ethernet‬‬
‫توصيل األردوينو بالـ واي فاي‬
‫التحكم باألردوينو عبر اإلنترنت (جعل األردوينو يعمل كسيرفر)‬
‫التواصل المتقدم مع المكونات والشرائح اإللكترونية ‪ SPI‬نموذجا ً‬
‫استخدام الـ ‪GPS‬‬
‫استخدام الساعة الدائمة ‪RTC‬‬
‫استخدام شاشة الـ ‪OLED‬‬
‫االتصال مع شبكة الجوال ‪GSM‬‬
‫كيف تبني مكتبة ‪ Library‬خاصة بك‬
‫كيف تستخدم المداخل التماثلية كمنافذ رقمية‬
‫كيف تجعل األردوينو يعمل كـ كيبورد أو ماوس‬
‫‪152‬‬

‫خاتمة‪-:‬‬
‫األردوينو سهل اإلستخدام (نوعا ً ما) لكن ال حدود الستخداماته وإمكانياته إال الخيال …‬
‫يمكنك أن تحل عشرات المشاكل في الحياة العامة باستخدام شريحة األردوينو الجميلة واإلضافات التي‬
‫تعلمناها معا ً‪ .‬البرمجة هي لغة المستقبل ‪ ،‬هي اللغة التي نتحدث فيها مع اآلالت مباشرة‪.‬‬
‫المشاريع الصغيرة تبني الخبرة و الثقة و تمرنك على أهم المهارات العملية التي يحتاجها المهندس في‬
‫مسيرته المهنية‪ :‬البرمجة ‪ ،‬اإللكترونيات ‪ ،‬الكهرباء ‪ ،‬القياس ‪ ،‬االختبار‪ ،‬حـ ّل المشاكل والتحسين المستمر‪.‬‬
‫التواصل مع المهتمين بالمجال أهم مفاتيح التعلم و التطور ‪ :‬يوجد عدد كبير من المهتمين باألردوينو عبر‬
‫العالم‪ .‬ستحتاجهم و سيحتاجوك ‪ .‬اللغة االنجليزية أيضا ً مهمة جدا اليجاد الحلول بسرعة‪,‬‬

‫سوف أبقى معكم على تواصل بمشاريع ودروس و أخبار األردوينو …‬


‫لقد اخترت األردوينو ألبدأ رحلتي في األنظمة ذاتية التحكم الصغيرة‪ .‬وال أعلم إلى أين سأصل ‪...‬لكنني‬
‫متأكد من شيء واحد …‬
‫أنا استمتع بالرحلة كثيرا ً و أتمنى أن تستمتع بها معي ‪✌ .‬‬

‫كتبه‪ :‬م‪ .‬سامي قرامي‬


‫في ‪aug 2017-8-2‬‬

‫تعريف بالمؤلف‪:‬‬
‫‪153‬‬

‫م‪.‬سامي محمد قرامي‬


‫مدرب هندسة إلكترونية منذ ‪2006‬‬
‫المؤسسة العامة للتدريب التقني و المهني بالمملكة العربية السعودية‬
‫المعهد الثانوي الصناعي بجدة‬
‫‪sami@jeem2.com +966554513632‬‬

‫المؤهالت العلمية‪-:‬‬
‫ماجستير في الهندسة الكهربائية _ جامعة كولورادو دينفر_‪2014‬‬
‫بكالريوس الكلية التقنية بالرياض_إلكترونيات صناعية و تحكم_‪2006‬‬
‫دبلوم كلية االتصاالت بجدة_إلكترونيات صناعية و تحكم_‪2003‬‬
‫المعهد الثانوي الصناعي بجدة_إلكترونيات صناعية_‪1999‬‬

‫دورات واهتمامات‪-:‬‬
‫األنظمة الكمبيوترية الصغيرة (مثل األردوينو و الرازبري باي)‬
‫البرمجة (البايثون ‪ ،‬الماتالب‪ ،‬الـ ‪) C++‬‬
‫التعليم اإللكتروني ‪ -‬مؤسس موقع ‪ jeem2‬التعليمي للهندسة‬
‫تصميم مواقع االنترنت (ووردبريس)‬
‫تصوير الفيديو ‪ +‬المونتاج ‪ +‬الفوتوشوب‬
‫التحدث (الخطابة) باللغتين العربية و االنجليزية‬
‫عضو مؤسس في نادي التوستماسترز بجدة (عربي‪/‬انجليزي)‬
154

You might also like