Professional Documents
Culture Documents
مقدمة
آالف الطالب والهواه يتعلمون األردوينو سنويا وقد انتشر في العالم كله لدى جميع فئات المجتمع.
الهدف من الكتاب إيصال المعلومة بسرعة للمبتدئ في األردوينو بحيث يتمكن من الحصول على •
األساسيات بدون الحشو الزائد ليتمكن بعدها من االنطالق بنفسه.
يجب على المتعلم البحث والتعلم الذاتي باإلضافة إلى هذا الكتاب. •
تم تبسيط العديد من المعلومات ليسهل على المتعلم الدخول في مجال األردوينو.
iii أساسيات األردوينو
✓ ماهو األردوينو
حقوق الطبع
جميع الحقوق محفوظة ,الكتاب متاح للجميع لالستعمال الغير تجاري وال يسمح ببيعه وال طباعته ألغراض تجارية
إال بإذن خطي من الكاتب.
للتواصل مع الكاتب:
Electro.ahmed.a@gmail.com
v أساسيات األردوينو
Contents
79 المحركات
أساسيات في الكهرباء
الفولت – التيار – المقاومة
2 أساسيات األردوينو
الماء:
ينتقل من مناطق الضغط المرتفع إلى المنخفض ومن المناطق المرتفعة إلى المنخفضة. •
الكهرباء:
إذا لم يوجد فرق في الجهد بين نقطتين فإن الكهرباء ال تنتقل. •
البطارية في الصورة األولى 1.5فولت ،يعني أن طرفها الموجب جهده أعلى من السالب ب ،1.5والبطارية في
الصورة الثانية 9فولت ،يعني أن طرفها الموجب جهده أعلى من السالب ب9
عندما نضع هذه البطاريات في دائرة كهربائية سينتقل التيار الكهربائي بسبب وجود فرق في الجهد بين
الطرفين (فولت).
4 أساسيات األردوينو
نستطيع أن نتخيل أن الطرف الموجب طاقته أعلى من الطرف السالب بمقدار 1.5وهذا هو الفولت .الشحنات
الكهربائية تنتقل من الطاقة األعلى إلى األقل .إذا وصلنا لمبة ببطارية فإن اللمبة ستعمل ،لماذا؟
ألن الشحنات وجدت طريقا لها لتنتقل إلى الطاقة األقل مرورا باللمبة.
∞∞∞
5 أساسيات األردوينو
التيار الكهربائي.
سينتقل تيار كبير من الجهد األعلى إلى األقل ،وسترتفع درجة حرارة البطارية وقد تسيح أو تشتعل.
6 أساسيات األردوينو
نالحظ أيضا لو أننا قمنا بتوصيل لمبة LEDمباشرة مع بطارية 9فولت ستحترق بسبب ارتفاع شدة التيار.
المقاومة
المواد الموصلة مقاومتها قليلة جدا مثل النحاس والفضة واأللمنيوم. •
المواد العازلة مقاومتها عالية جدا مثل الخشب والبالستيك والمطاط. •
∞∞∞
8 أساسيات األردوينو
لمبة LEDتحتاج تيار قيمته 0.020أمبير لتعمل ،لو أردنا تشغيلها باستخدام بطارية 9فولت كم المقاومة التي
يمكن استخدامها؟
نستطيع استخدام مقاومة 450أوم أو أكبر (تم تجاهل فولت اللمبة للتبسيط).
∞∞∞
9 أساسيات األردوينو
ملخص الدرس:
اتصال نقطتين بينهما فرق جهد بدون مقاومة أو بمقاومة قليلة جدا يسمى .Short Circuit
∞∞∞
تمارين
.2لنسمح بمرور 2أمبير (التيار) في مقاومة قيمتها 10أوم ،كم فولت نحتاج؟
.3ما هو الفولت؟
المتحكمات واألردوينو
تحكم بال حدود
11 أساسيات األردوينو
مشكلة:
المتحكمات برمجتها تحتاج إلى قطعة برمجة خارجية ،وإال قطع إلكترونية أخرى عديدة وكان التعامل معها حكرا
على المختصين .فكر فريق من إيطاليا كيف يسهلوا تعلم واستخدام هذه المتحكمات ،فطوروا اآلتي:
ألواح الكترونية تحتوي على متحكم ) (Micro-Controllerوجميع ما يحتاجه من قطع الكترونية. •
مجموعة مكتبات برمجية يمكن استخدامها لتسهل علينا برمجة المتحكمات. •
كل برامجهم وألواحهم اإللكترونية مفتوحة المصدر ،بمعنى أنها متاحة للجميع ،فيمكن للجميع المشاركة •
في تطويرها!
وكانت النتيجة تسهيل التعامل مع المتحكمات بدرجة كبيرة جدا ،حتى انتشرت
برامجهم ولوحاتهم في العالم وأصبحت تستخدم من الصغير والكبير.
12 أساسيات األردوينو
ما هو الأردوينو؟
توجد ألواح كثيرة تدعم األردوينو أكثرها انتشارا هو األونو “ ”Unoوهي ما سندرسه ونطبق عليه في هذا الكتاب.
∞∞∞
13 أساسيات األردوينو
منافذ الديجيتال:
.2قراءة اإلشارة الواصلة للمنفذ ،هل هنالك إشارة واصلة أم ال؟ وال يمكننا معرفة قوتها.
∞∞∞
14 أساسيات األردوينو
منافذ الأنالوج
.2كمنافذ ديجيتال.
∞∞∞
15 أساسيات األردوينو
منفذ ( :)Vinلتشغيل األردوينو من مصدر طاقة خارجي كبطارية مثال (بين 7فولت إلى 12فولت).
16 أساسيات األردوينو
لوحة األونو تعمل على 5فولت ،يمكن تغذيتها ب 5فولت مباشرة باستخدام سلك ال USBعن طريق:
✓ الكمبيوتر.
ويمكن استخدام مصدر كهرباء خارجي مثل البطاريات أو أفياش الكهرباء من 7فولت إلى 12فولت (المنظم
∞∞∞
18 أساسيات األردوينو
تمارين
برنامج يمكن من خالله برمجة أي جهاز متوافق مع األردوينو بسهولة .يمكن تحميله من الرابط:
https://www.arduino.cc/en/Main/Software
نختار البرنامج الذي يوافق نظام التشغيل (في حالة ويندوز نختار .)Windows Installer
برنامج الأردوينو
دالة الإعدادات:
)(void setup
{
}
∞∞∞
الدالة الرئيسية:
كحلقة سباق السيارات ،سينفذ األردوينو مابين األقواس من أول سطر إلى آخر سطر ثم يرجع من •
جديد وهكذا.
)(void loop
{
}
23 أساسيات األردوينو
ال يدخل في البرنامج وهي مجرد مالحظات يكتبها المبرمج مالحظة :أي شيء مكتوب بعد الشرطتين المائلتين //
للشرح والتوضيح.
//
أساسيات في البرمجة:
)(void setup
{
}
;)pinMode(9, OUTPUT
;)digitalWrite(9, HIGH
24 أساسيات األردوينو
( )void setup
{
}
( )void loop
{
}
✓ عند توصيل األردوينو بالكمبيوتر عن طريق سلك ال USBيجب علينا أن نختار المنفذ المتصل باللوحة عن
طريق برنامج األردوينو من الكمبيوتر كالتالي:
(إذا لم يوجد المنفذ الخاص باألردوينو تأكد من توصيل األردوينو أو تثبيت البرنامج بشكل صحيح،
✓ نضغط .Upload
✓ سيظهر لك في األسفل معلومات التحميل ،وإن كان هناك خطأ سيكتب لك سببه غالبا.
الأمر pinMode
قبل استخدام أي منفذ من منافذ األردوينو الديجيتال يجب علينا تحديد حالة المنفذ .هناك حالتين للمنافذ:
مخرج :عندما نريد تشغيل وإطفاء جهاز أو إرسال إشارة ،نحدد المنفذ كمخرج كالتالي: •
مدخل :عندما نريد قراءة إشارة أو حساس ،نحدد المنفذ كمدخل. •
تحديد المنفذ عادة يكون مرة واحدة داخل دالة اإلعدادات ،setupيمكن أن نغير حالة المنفذ في أي وقت إن
احتجنا لذلك.
∞∞∞
28 أساسيات األردوينو
الأمر digitalWrite
نستطيع التحكم بمنافذ الديجيتال لترسل إشارة 5فولت أو 0فولت ( HIGHو :)LOW
ال يمكننا الحصول على 2.5فولت مثال أو 3فولت ،إما تعمل أو ال تعمل •
∞∞∞
29 أساسيات األردوينو
هناك إضاءة LEDداخل لوحة األردوينو موصولة بالمنفذ 13سنبرمجها لتعمل وتنطفئ كل ثانية.
)(void setup
{
;)Serial.begin(9600
}
)(int main
{
;)" Serial.println("I love Arduino
;)delay(1000
}
بعد كتابة البرنامج في برنامج األردوينو IDEسنرفعه إلى لوحة األردوينو كما وضحنا مسبقا.
.2يجعل المنفذ رقم ( HIGH 13بمعنى آخر )ONفيعمل ال LEDبسبب مرور التيار من المنفذ 13إلى المنفذ
األرضي مرورا بال.LED
.4يجعل المنفذ رقم ( LOW 13بمعنى آخر )offفينطفئ ال LEDألن المنفذ اآلن أصبح 0فولت واألرضي 0
فولت فال يوجد فرق في الجهد بينهما ،فال ينتقل التيار.
شرح األوامر
;)pinMode(9, OUTPUT
تحديد المنفذ رقم 9كمخرج.
;)digitalWrite(9, HIGH
التحكم بالمنفذ رقم 9ليصبح 5فولت(HIGH).
;)delay(1000
ايقاف البرنامج لمدة 1000ملي ثانية ( 1ثانية).
;)digitalWrite(9, LOW
التحكم بالمنفذ رقم 9ليصبح 0فولت(LOW).
األمر :delay
يوقف البرنامج حسب المدة المعطاة بين األقواس وهي بالملي ثانية. •
ال ينصح باستخدام هذا األمر وهناك طرق بديلة سندرسها الحقا. •
∞∞∞
31 أساسيات األردوينو
القطع المطلوبة:
إضاءة ليد.
سلكين ذكر-ذكر.
32 أساسيات األردوينو
خطوات التوصيل:
يجب أال نضع رجلي الليد أو المقاومة على نفس الخط األفقي.
البرنامج:
نستخدم نفس البرنامج في المثال السابق مع تغيير رقم المنفذ من 13إلى .9
33 أساسيات األردوينو
لوحة تجارب.
∞∞∞
34 أساسيات األردوينو
Serial
أحد بروتوكوالت اإلتصاالت ،نستطيع من خالله أن نرسل أي معلومة من األردوينو إلى الكمبيوتر والعكس .لنوصل
األردوينو أونو بالكمبيوتر عن طريق السيريال نحتاج أن نوصل سلك ال USBبين الطرفين فقط.
لنبدأ باستخدام السيريال يجب علينا فقط تحديد سرعة تبادل المعلومات باستخدام األمر:
;)Serial.begin(9600
;)(Serial.println
إلرسال جملة I Love Arduinoمن األردوينو إلى الكمبيوتر مرة واحدة كل ثانية نستطيع أن نستخدم البرنامج
التالي:
)(void setup
{
;)Serial.begin(9600
}
)(int main
{
;)"Serial.println("I love Arduino
;)delay(1000
}
35 أساسيات األردوينو
اآلن لنرى الرسالة نضغط على العدسة أعلى يمين برنامج األردوينو بعد تحميل البرنامج إلى اللوحة.
يجب أن تكون السرعة أسفل يمين الشاشة بعد الضغط على العدسة 9600مساوية للبرنامج الذي تم •
تحميله للوحة.
∞∞∞
36 أساسيات األردوينو
القطع المطلوبة:
✓ أردوينو.
✓ كيبل للبرمجة.
التوصيل (دياجرام):
38 أساسيات األردوينو
الكود
void loop()
{
digitalWrite(green, HIGH);
Serial.println("Green");
delay(3000);
digitalWrite(green, LOW);
digitalWrite(yellow, HIGH);
Serial.println("Yellow");
delay(1000);
digitalWrite(yellow, LOW);
digitalWrite(red, HIGH);
Serial.println("Red");
delay(3000);
digitalWrite(red, LOW);
}
39 أساسيات األردوينو
شرح الكود
;int red
ينشيء متغير اسمه ( redيمكننا تسميته أي اسم).
;red = 11
يمكن أن نحفظ فيه األعداد الصحيحة
;)pinMode(red, OUTPUT
اآلن كلما استخدمنا كلمة redسيراها األردوينو 11
;)digitalWrite(red, HIGH
هذا األمر يحدد لألردوينو كيف سنستخدم المنفذ إما
كمخرج أو مدخل.
;)delay(1000
الفراغ األول بين األقواس هو لرقم المنفذ.
;)Serial.begin(9600
الفراغ الثاني لنحدد استخدام المنفذ
كمخرج OUTPUTأو مدخلINPUT.
;)”Serial.println(“Green
يجب أن تكون بحروف كبيرة.
بعد توصيل الدائرة ورفع البرنامج ،سنضغط على العدسة أعلى اليمين لفتح السيريال في الكمبيوتر ورؤية ما
يجب أن تكون سرعة نقل البيانات مساوية لما برمجناها في األردوينو أسفل الصفحة على اليمين.
∞∞∞
40 أساسيات األردوينو
الأمر analogWrite
في األمثلة السابقة ،تحكمنا في ال LEDفإما يعمل أو ال يعمل ،ولكن كيف يمكننا التحكم في شدة إضاءته؟
للتحكم بشدة اإلضاءة علينا تغيير الفولت الخارج من المنافذ ،لكن ال يستطيع األردوينو اخراج أي فولت سوى 5
فلكي نتحكم بشدة اإلضاءة ،سنستخدم طريقة تسمى .Pulse Width Modulation
.3نقوم بالتحكم في طول بقاء اإلشارة .كلما طالت مدة بقاء اإلشارة ،زادت الطاقة الناتجة من
المنفذ (الصورة باألسفل).
.4باستخدام األمر analogWriteسنحدد رقم المنفذ ،ورقم (من 0إلى )255كلما زاد الرقم زادت شدة
اإلشارة.
0 .bأقل قيمة.
القطع المطلوبة:
✓ LED
✓ أسالك للتوصيل
:التوصيل
:الكود
void setup()
{
pinMode(9, OUTPUT);
}
void loop()
{
for (int i = 0; i < 255; i++) //for loop
{
analogWrite(9, i);
delay(25);
}
}
43 أساسيات األردوينو
شرح الكود:
)for(int i =0;i<255,i++
الكود سيقوم بانشاء عدد صحيح اسمه iقيمته 0
;)analogWrite(9, i
يحدد المنفذ رقم 9كمخرج
;)delay(25
من غير هذا األمر لن نستطيع تشغيل أي جهاز من
المنفذ
44 أساسيات األردوينو
ملخص الباب:
;)pinMode(4, OUTPUT
;)pinMode(5, INPUT
;)digitalWrite(9, HIGH
;)delay(25
;)Serial.begin(9600
45 أساسيات األردوينو
تمارين:
.3ما األمر الذي نحتاجه لنجعل المنفذ HIGHلنشغل مثال LEDمتصل به؟
.5كيف نرسل هذه الجملة إلى الكمبيوتر من األردوينو عن طريق السيريال " “ Hello World؟ اكتب البرنامج.
عندما يمر جسم أمام حساس الحركة ،يعطي الحساس إشارة ( 5-3فولت) ،وعندما ال يكتشف وجود تغير في
الحركة ستكون اإلشارة 0فولت .كيف يمكن أن نقرأ إشارة الحساس باستخدام األردوينو؟
;)pinMode(3, INPUT
;(digitalRead )3
إذا كانت هناك إشارة عند المنفذ سيعطينا قيمة ( ،.)1إذا لم يكن هناك إشارة عند المنفذ سيعطينا قيمة
(.)0
:الكود
void setup()
{
Serial.begin(9600);
pinMode(3, INPUT);
}
int main()
{
int x;
x = digitalRead(3);
if (x == 1)
{
Serial.println("Pin received HIGH Signal");
}
else if (x == 0)
{
Serial.println("Pin received LOW Signal");
}
}
49 أساسيات األردوينو
حساس الحركة
األجسام الحية تنبعث منها أشعة تحت حمراء نظرا لحرارتها .الحساس يقوم بقياس التغير في هذه األشعة
الواصلة له.
.1منفذ للفولت
.2منفذ لألرضي
.3في حال وجود إشارة سيقوم األردوينو بتشغيل إضاءة لعدة ثوان.
50 أساسيات األردوينو
القطع المطلوبة:
.2حساس الحركة.
.3إضاءة .LED
التوصيل:
52 أساسيات األردوينو
:الكود
void setup()
{
Serial.begin(9600);
pinMode(10, INPUT);
pinMode(9, OUTPUT);
}
void loop()
{
int active = digitalRead(10);
if (active == 1)
{
digitalWrite(9, HIGH);
Serial.println("Motion Detected");
delay(500);
}
else
{
digitalWrite(9 , LOW);
Serial.println("No Motion Detected");
}
}
53 أساسيات األردوينو
شرح الكود:
;)pinMode(10, INPUT
تحديد المنفذ رقم 10كمدخل
;)pinMode(9, OUTPUT
تحديد المنفذ رقم 9كمخرج
else
إن لم يتحقق الشرط في الجملة الشرطية...
;)delay(500
يوقف البرنامج لمدة نصف ثانية ( 1 = 1000ثانية).
54 أساسيات األردوينو
األمر active ==1معناه أننا نسأل األردوينو هل قيمة المتغير activeتساوي واحد أم ال؟
األردوينو قادر على أن يقرأ اإلشارات التي قوتها من 0إلى 5فولت لكن عندما نقرأها من منفذ ديجيتال فإن
األردوينو سيظهر لنا هل اإلشارة موجودة أم ال ،ولن نعرف مدى قوتها .لمعرفة قيمة اإلشارة سنستخدم منافذ
األنالوج.
∞∞∞
55 أساسيات األردوينو
❖ حساس درجة الحرارة يعطينا إشارة تزيد قوتها (الفولت) كلما زادت درجة الحرارة.
❖ القراءة من منافذ الديجيتال لن تفيدنا ألنها فقط تخبرنا هل هناك إشارة أم ال.
لن نحتاج لتحديد المنفذ كمدخل " ”Inputعند القراءة من منفذ أنالوج
;)analogRead(A0
عند حساب المقاومة من أي طرف مع الرجل الوسطى ،سنجدها تتغير مع تحريك المقاومة من 0إلى •
1000أوم.
بتغيير المقاومة يتغير فرق الجهد على الرجل الوسطى وهذا ما سنقيسه باستخدام منفذ األنالوج. •
57 أساسيات األردوينو
التوصيل:
58 أساسيات األردوينو
طريقة التوصيل:
الكود:
)(void setup
{
;)Serial.begin(9600
}
)(void loop
{
;float reading
;)reading = analogRead(0
;)Serial.println(reading
;)Serial.println(reading * 5 / 1023
;)delay(100
}
59 أساسيات األردوينو
شرح الكود:
;)Serial.print(9600
يحدد سرعة التخاطب عن طريق السيريال.
;float reading
انشاء متغير اسمه reading
;)analogRead(0
أمر لقراءة اإلشارة من المنفذ رقم ( A0أنالوج).
;)reading = analogRead(0
يأخذ قراءة من المنفذ رقم A0ويحفظها في
المتغير .reading
;)Serial.println(reading
ارسال قيمة readingعن طريق السيريال.
;)Serial.println(reading*5/1024
القراءة تأتينا رقم من 0إلى 1024
.1عندما تصل إشارة 5فولت إلى منفذ األنالوج ،سيعطينا قراءة .1024
∞∞∞
61 أساسيات األردوينو
تمارين:
.3هل يجب علينا تحديد المنفذ كمدخل عند قراءة إشارة أنالوج؟
هناك أوامر ال نستغني عنها في كل لغات البرمجة ،وهي مهمة لنا في األردوينو.
من أهم األوامر التي نحتاجها في البرمجة ،وهي بسيطة وسهلة ،مثال لها:
;int i = 5
)if (i == 3
{
;)"Serial.println("Hello
}
)else if (i == 4
{
;)"Serial.println("Good Morning
}
)else if (i == 5
{
;)"Serial.println ("Good Night
}
بما أن iتساوي 5سيتجاوز األردوينو الشرط األول والثاني ،وسينفذ ما بين األقواس في الشرط الثالث وسيطبع
مثال:
القطع المطلوبة:
✓ أردوينو أونو.
✓ كيبل للبرمجة.
التوصيل:
65 أساسيات األردوينو
:الكود
int reading;
float voltage;
void setup()
{
Serial.begin(9600);
}
void loop()
{
reading = analogRead(0);
voltage = reading * 5 / 1024;
if (voltage >= 4)
{
Serial.println("voltage is above than four");
}
else if (voltage >= 3 && voltage < 4)
{
Serial.println("voltage is between three and four");
}
else if (voltage >= 2 && voltage < 3)
{
Serial.println("voltage is between two and three");
}
else
{
Serial.println("Voltage is less than two");
}
delay(50);
Serial.println("The voltage is : " );
Serial.println(voltage);
}
66 أساسيات األردوينو
شرح الكود:
;int reading
تعريف متغير يقبل األعداد الصحيحة اسمه .reading
;float voltage
تعريف متغير يقبل االعداد الكسرية اسمه .voltage
;)Serial.begin(9600
بداية التحدث باستخدام السيريال بسرعة 9600بت في الثانية.
;)reading = analogRead(0
نقرأ من المنفذ رقم A0ونعطي المتغير readingقيمة القراءة.
&&
معناها (و) يجب أن يتحقق الشرطين معا كما في األمر
أسفل.
else
{ إذا لم يتحقق أي شرط من الشروط السابقة نفذ ما بين
Serial.println("Voltage is less األقواس.
;)"than two
}
;)delay(50
نوقف البرنامج 0.005ثانية لتقليل سرعة ارسال المعلومات
وتسهيل قراءتها.
67 أساسيات األردوينو
.2يعرف متغير اسمه ( voltageسميناه floatألنها تستطيع احواء األعداد الكسرية ألن الفولت قد يكون
3.45أو 4.21وليس دائما عدد صحيح.
∞∞∞
68 أساسيات األردوينو
مثال:
;int i = 5
)while (i == 5
{
;)"Serial.println("the code is inside the loop
}
;)"Serial.println("End loop
.3سيظل البرنامج يرسل لنا " ”the code is inside the loopلألبد
∞∞∞
69 أساسيات األردوينو
loop For
من أكثر األوامر استخداما .نستخدمها عندما نريد تكرار الشيء مرات معدودة 5مرات أو 100مرة مثال.
.4سيضيف في كل مرة ينفذ فيها البرنامج داخل الحلقة رقم 1إلى .i
i .5في البداية تساوي ،0سينفذ البرنامج ،ثم يقارنها هل هي أصغر من 5؟ نعم… إذا سيضيف لها
الرقم واحد وينفذ ما بين األقواس مرة أخرى وهكذا حتى تصبح قيمتها .5
70 أساسيات األردوينو
:تطبيق عملي
:القطع المطلوبة
. أردوينو أونو.1
. كيبل للبرمجة.2
:الكود
void setup()
{
Serial.begin(9600);
}
void loop()
{
for (int i = 0; i < 100 ; i ++)
{
Serial.println(i);
delay(50);
}
Serial.println(" Loop Ended " );
}
71 أساسيات األردوينو
شرح الكود:
;)Serial.begin(9600
بداية التحدث باستخدام السيريال بسرعة 9600بت في الثانية.
;int i = 0
ننشيء عدد صحيح اسمه iونعطيه القيمة 0
i++
تعني i = i + 1
;)Serial.println(i
ارسال قيمة iعن طريق السيريال إلى الكمبيوتر.
;)delay(50
لتقليل سرعة ارسال المعلومات حتى نستطيع قراءتها.
✓ طالما iأقل من ،100سننفذ األمر بين األقواس وسيضيف واحد إلى iحتى تصل إلى مئة.
∞∞∞
72 أساسيات األردوينو
التعريفات
;int x = 10
;x = x – 1 9قيمة المتغير اآلن
;x = 2 * x 18قيمة المتغير اآلن
أهم التعريفات:
int
نعرف متغير يقبل األعداد الصحيحة وال يقبل الكسور،
مثل . 4 ،3 ،2 ،1
float
متغير يقبل األعداد الكسرية ،يستطيع تخزين أرقام
كبيرة جدا.
double
أكثر دقة من ،floatيستطيع تخزين أرقام أقل من
.float
char
متغير يقبل الحروف (قد يكون رقم أيضا ،لكن لن
يعامل معاملة األرقام) يجب أن يكون بين هذه
العالمتين ‘ ‘
مثل:
‘’a
‘’b
‘’1
‘’4
string
نعرف متغير يخزن مجموعة من الحروف.
∞∞∞
75 أساسيات األردوينو
)(millis
لو أردنا تشغيل إضاءة لمدة 20ثانية واطفاءها عن طريق منفذ ديجيتال بدون ايقاف البرنامج طول هذه المدة
طريقة استخدامها:
نتفقد قيمة () millisالحالية باستمرار ونقارنها بالمتغير فإذا أصبحت أكبر من قيمة المتغير ب 20ثانية •
نطفيء الجهاز.
وبهذا استطعنا توقيت اإلضاءة بدون استخدام أمر ال delayالذي يمنعنا من تنفيذ أوامر أخرى أثناء •
عمله.
:القطع المطلوبة
✓ أردوينو أونو
✓ كيبل للبرمجة
✓ لمبة ليد
✓ مقاومة
:الكود
float timePassed;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
if (timePassed > millis() + 1000)
{
digitalWrite(13, !digitalRead(13));
timePassed = millis();
}
}
77 أساسيات األردوينو
.3دالة ifالشرطية ،إذا كان المتغير timePassedأكبر من ( millisالحالي )1000 +سينفذ ما بين األقواس
وإال سيتجاوز الدالة الشرطية.
.4إذا تحقق الشرط في الدالة سيشغل ال LEDإذا كان ال يعمل ،وسيطفئه إذا كان يعمل.
.5سيحفظ قيمة )(millisاآلن في المتغير timePassedليحفظ الوقت الذي تم فيه تغيير حالة ال.LED
شرح الكود
;float timePassed
انشاء متغير floatيقبل الكسور واألرقام اسميناه
timePassed
;)(millis
هذه الدالة تخبرنا كم مر على تشغيل األردوينو بالمللي
ثانية
;))digitalWrite(led,!digitalRead(led
إذا كان المنفذ ledيعمل سيقوم بإطفائه ،إذا كان ال يعمل
سيقوم بتشغيله.
)(timePassed = millis
نخزن قيمة millisفي المتغير timePassed
تمارين
.1عرف متغير يقبل األعداد الصحيحة اسمه .numberثم اجعل قيمته تساوي . 10
.6مالحظة.
المحركات
80 أساسيات األردوينو
محرك يتحرك 180درجة فقط (تقريبا) يمكننا التحكم به للذهاب إلى الزاوية التي نريد بدقة.
يستخدم في أيادي الروبوت وفي الطائرات الصغيرة وفي مشاريع األردوينو األخرى.
عادة يحتوي على ثالثة أسالك ،سلكين للكهرباء ( 5فولت ،أرضي ،GNDوسلك لإلشارة للتحكم).
القطع المطلوبة:
✓ أردوينو.
✓ كيبل للبرمجة.
✓ سيرفو موتور.
✓ أسالك للتوصيل.
✓ مقاومة متغيرة.
81 أساسيات األردوينو
التوصيل (دياجرام):
82 أساسيات األردوينو
:الكود
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup()
{
myservo.attach(9);
}
void loop()
{
int reading = analogRead(0);
pos = map(reading, 0, 1023, 0, 160);
myservo.write(pos);
delay(150);
}
83 أساسيات األردوينو
شرح الكود
>#include <Servo.h
اضافة مكتبة السيرفو للبرنامج لنستطيع التحكم به
باستخدام اوامر بسيطة فقط
;Servo myservo
تعريف سيرفو جديد اسمهmyservo
;)myservo.attach(9
تحديد المنفذ رقم 9للسيرفو الجديد
;)pos=map(reading,0,1023,0,160
تحويل قيمة readingمن ( 0حتى )1023لتصبح من (0
حتى )160وتخزين القيمة الجديدة في المتغير pos
وهكذا
;)myservo.write(pos
تحريك السيرفو إلى الزاوية pos
∞∞∞
84 أساسيات األردوينو
DC Motor
أعلى تيار تستطيع منافذ األردوينو وغيرها من المتحكمات توفيره هو 40ملي أمبير فقط( 0.04أمبير). •
سنستخدم درايفر ليقوم بتوفير التيار الالزم للمحرك بما أن األردوينو ال يستطيع ذلك. •
سيتم التحكم بالدرايفر عن طريق األردوينو بحيث نرسل فقط إشارات إلى الدرايفر ،وسيتم توفير •
وتشغيل الموتور عن طريقه.
القطع المطلوبة:
✓ درايفر .L293D
✓ أسالك ذكر-ذكر.
85 أساسيات األردوينو
قطعة الدرايفرL293D
كل قطعة إلكترونية توفر الشركة المصنعة لها ملف يحتوي كافة معلوماتها ويسمى الملف .Datasheet
لهذا الدرايفر 16منفذ ،نستطيع من خالل ال Datasheetمعرفه كل منفذ وطريقة توصيله.
المنفذ يسار نصف الدائرة الرمادية هو رقم ،1ويمين نصف الدائرة الرمادي هو منفذ رقم .16
طريقة التوصيل:
واتجاهه
واتجاهه
التوصيل:
88 أساسيات األردوينو
:الكود
void setup()
{
pinMode(11, OUTPUT);
pinMode(8, OUTPUT);
}
void loop()
{
digitalWrite(11, HIGH);
digitalWrite(8, LOW);
delay(3000);
digitalWrite(11, LOW);
digitalWrite(8, HIGH);
delay(3000);
}
:شرح الكود
pinMode(11, OUTPUT);
pinMode(8,OUTPUT); كمخرج8 و11 تحديد المنفذ رقم
digitalWrite(11, HIGH);
digitalWrite(8, LOW); سيتحرك المحرك
digitalWrite(11, LOW);
digitalWrite(8, HIGH); سيتحرك المحرك بعكس اإلتجاه
delay(3000);
يوقف البرنامج لمدة ثالثة ثواني
∞∞∞
89 أساسيات األردوينو
Stepper Motor
طريقة عمله:
يتم التحكم بها بترتيب معين ليتحرك الموتور خطوة وحدة. •
يتم التحكم باألقطاب باستخدام األردوينو ،لنحصل على دقة عالية في عدد الخطوات والسرعة. •
القطع المطلوبة:
✓ ستيبر موتور
التوصيل:
91 أساسيات األردوينو
:الكود
#include <Stepper.h>
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
}
void loop() {
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
شرح الكود:
>#include <Stepper.h
نضيف مكتبة لمحرك الستيبر لتسهيل برمجته
Stepper myStepper(stepsPerRevolution,
;)(8, 9, 10, 11 انشاء محرك جديد للمكتبة اسمه myStepper
;)myStepper.setSpeed(60
نستخدم هذا األمر من المكتبة لتحديد سرعة المحرك
في الدقيقة.
;)myStepper.step(stepsPerRevolution
أمر للمحرك ليتحرك خطوات تساوي العدد بين
األقواس
∞∞∞
93 أساسيات األردوينو
تمارين
هناك أكثر من طريقة وبروتوكول تشترك فيها كل المتحكمات وليس فقط األردوينو أونو.
منافذ الــSerial
من خاللها يستطيع األردوينو التحدث مع األجهزة األخرى مثل الكمبيوتر ،قطعة البلوتوث ،وغيرها من األجهزة
التي تدعم السيريال ،وتسمى هذه المنافذ أيضا ب .UARTاألجهزة التي تدعم السيريال تحتوي على منفذ
مرسل ( )TXومنفذ مستقبل ( )RXنالحظهم في المنفذ الديجيتال رقم 0و 1في األردوينو أونو.
RX → TX
TX → RX
VCC → VCC
GND → GND
تستخدم في:
∞∞∞
SoftwareSerial
عند عدم وجود منفذ سيريال متاح يمكن استخدام .Software Serial
أألردوينو أونو يدعم سيريال واحد فقط ،فال يمكن االتصال بجهازين عن طريق السيريال في نفس الوقت.
تطبيق عملي:
الخطوات:
.2نحمل برنامج مناسب للتحكم باألردوينو عن طريق البلوتوث عن طريق الGoogle app store
القطع المطلوبة:
✓ أردوينو.
✓ كيبل للبرمجة.
✓ لمبة .LED
التوصيل (دياجرام):
99 أساسيات األردوينو
:الكود
char reading;
SoftwareSerial SoftSerial1(6, 7);
void setup()
{
Serial.begin(9600);
SoftSerial1.begin(9600);
pinMode(10, OUTPUT);
}
void loop()
{
if (SoftSerial.available() > 0)
{
if (SoftSerial.read() ) == 'a')
digitalWrite(10, HIGH);
}
else if (SoftSerial.read() ) == 'b')
{
digitalWrite(10, LOW);
}
}
100 أساسيات األردوينو
شرح الكود:
;char reading
يعرف متغير يقبل الحروف ويسميه reading
SoftwareSerial SoftSerial1(6,
;)7 ينشيء سيريال اضافي على المنفذ رقم 6للمستقبل RX
ورقم 7للمرسل .TX
;)Serial.begin(9600
يحدد سرعة التخاطب عن طريق السيريال.
;)SoftSerial1.begin(9600
يحدد سرعة ارسال واستقبال البيانات عن طريق السيريال
اإلضافي.
;)pinMode(10, OUTPUT
يحدد المنفذ 10كمخرج
)if(SoftSerial.available()>0
{ } وجدت بيانات في السيريال نفذ ما بين األقواس
;)(SoftSerial1.read
القراءة من السيريال اإلضافي
∞∞∞
101 أساسيات األردوينو
I2C
يمكن ارسال واستقبال المعلومات من أكثر من 60حساس في نفس الوقت عن طريق سلكين فقط.
في األردوينو هناك مكتبة تستخدم لتسهيل التواصل عن طريق هذا البروتوكول اسمها .wire library
∞∞∞
SPI
يمكن ارسال واستقبال المعلومات من أجهزة كثيرة لكن تحتاج إلى أسالك متعددة أكثر من ال.I2C
درايفر سيركت
103 أساسيات األردوينو
فلكي نتحكم بأي دائرة تحتاج تيار أكبر أو فولت أعلى سنحتاج إلى .Driver circuit
ريالي. •
الموسفت هو أحد أفضل أنواع الترانسيستورز اآلن ومن أكثرها شيوعا ،له ثالثة أرجل .Drain, Gate, Source
عند وجود إشارة على رجل ال ,Gateسيقوم بتوصيل الطرفين األخرى ببعضهما وستعمل الدائرة.
األردوينو سيرسل إشارة بسيطة ليفتح الموسفت وبالتالي سيقوم الموسفت بإيصال التيار للجهاز المراد تشغيله.
القطع المطلوبة:
✓ أردوينو أونو.
✓ كيبل للبرمجة.
✓ لوجيك موسفت.
✓ لمبة .LED
105 أساسيات األردوينو
التوصيل:
106 أساسيات األردوينو
:الكود
void setup()
{
pinMode(9, OUTPUT);
}
void loop()
{
digitalWrite(9, HIGH);
delay(500);
digitalWrite(9, LOW);
delay(200);
}
∞∞∞
107 أساسيات األردوينو
القطع المطلوبة:
✓ لمبة .LED
✓ NPN Transistorمثل:
n22222 o
BC547 o
BC548 o
108 أساسيات األردوينو
التوصيل:
109 أساسيات األردوينو
الكود:
)(void setup
{
;)pinMode(9, OUTPUT
}
)(void loop
{
;)digitalWrite(9, HIGH
;)delay(500
;)digitalWrite(9, LOW
;)delay(200
}
∞∞∞
الريلاي
القطع المطلوبة:
✓ أردوينو.
✓ كيبل للبرمجة.
✓ موتور دي سي.
✓ 4-3بطاريات .AA
✓ ريالي 5فولت.
110 أساسيات األردوينو
التوصيل:
111 أساسيات األردوينو
:الكود
int relay = 9;
void setup()
{
pinMode(relay, OUTPUT);
Serial.begin(9600);
}
void loop()
{
digitalWrite(relay, HIGH);
Serial.println("Relay On");
delay(1000);
digitalWrite(relay, LOW);
Serial.println("Relay OFF");
delay(1000);
}
112 أساسيات األردوينو
شرح الكود:
;)pinMode(relay, OUTPUT
تحديد المنفذ رقم 9كمخرج لنتمكن من تشغيله
وايقافه
;)Serial.begin(9600
تحديد سرعة التحدث بالسيريال لنتمكن من ارسال
معلومات من األردوينو إلى الكمبيوتر( هذه الخطوة
تكون داخل ال)setup
;)digitalWrite(relay,HIGH
تشغيل المنفذ رقم 9ليعطينا 5فولت ليعمل الريالي
;)digitalWrite(relay,LOW
ايقاف المنفذ رقم 9لنوقف الريالي
;)(Serial.println
ارسال ما بداخل القوسين عن طريق السيريال لنقرأه
من الكمبيوتر (لنرسل جملة أو كلمة يجب وضعها
“) داخل هذه العالمتين “
113 أساسيات األردوينو
تمار ين:
.aالترانسيستور.
.bالموسفت.
.cالريالي.
114 أساسيات األردوينو
يظهر درجة الحرارة على الكمبيوتر عن طريق قراءة الحساس وتحويل القيمة إلى درجة مئوية.
يوجد طريقتين لتوصيل الحساس ،سنوصله بأسهل طريقة لكن أقل قراءة ممكنة ستكون من 2درجة مئوية إلى
القطع المطلوبة:
✓ أردوينو أونو.
✓ كيبل للبرمجة.
✓ حساس LM35
116 أساسيات األردوينو
التوصيل:
117 أساسيات األردوينو
الكود:
)(void setup
{
;)Serial.begin(9600
}
)(void loop
{
;)float reading = analogRead(A0
;float voltage = (reading / 1024) * 5
;)float temp = (voltage / 0.01
.1نقرأ اإلشارة من الحساس عن طريق منفذ أنالوج (سنحصل على رقم بين 0إلى .)1023
.3لكل 0.010فولت درجة مئوية واحدة ،لنحصل على درجة الحرارة نقسم الفولت على 0.010
118 أساسيات األردوينو
شرح الكود:
;)Serial.begin(9600
تحديد سرعة التخاطب عن طريق السيريال وبدأها
(القراءة ÷ 5 × )1024
;)Serial.println(temp
ارسال درجة الحرارة عن طريق السيريال.
∞∞∞
119 أساسيات األردوينو
حساس المطر
عند وجود ماء على اللوحة سيقوم الماء بتوصيل الخطوط ببعضها مما يجعل اإلشارة تنتقل من المجموعة األولى
إلى الثانية.
يقيس األردوينو الفولت على المجموعة األخرى ،وكلما زاد الفولت علمنا أن هناك ماء على الحساس.
القطع المطلوبة:
✓ مقاومة متغيرة.
✓ أسالك ذكر-ذكر.
✓ قليل من الماء.
120 أساسيات األردوينو
التوصيل:
121 أساسيات األردوينو
:الكود
float readSensor;
float voltage;
void setup()
{
Serial.begin(9600);
}
void loop()
{
readSensor = analogRead(0);
Serial.print(" Rain Sensor Reading is: ");
Serial.println(readSensor);
Serial.println();
delay(300);
}
:شرح الكود
float reading;
يقبل األعداد الكسرية والصحيحةfloat تعريف متغير
readSensor.ونسميه
Serial.begin(9600);
بدأ اإلرسال واإلستقبال عن طريق السيريال بسرعة
. بت في الثانية9600
readSensor = analogRead(0);
وحفظ القراءة في0 القراءة من منفذ األنالوج رقم
readSensor.المتغير
Serial.println(readSensor);
عن طريق السيريال نستطيعreadSensor ارسال قيمة
.قراءتها عن طريق الكمبيوتر أو غيره
122 أساسيات األردوينو
∞∞∞
عند وجود ماء في التربة سيوصل الماء التيار بين الطرفين كلما زاد الماء زادت قوة اإلشارة.
عند قلة الماء أو عدم وجوده سيكون الطرفين بينهما مقاومة عالية واإلشارة ضعيفة.
القطع المطلوبة:
.2حساس التربة.
.5أسالك ذكر-ذكر.
التوصيل:
124 أساسيات األردوينو
:الكود
float reading;
void setup()
{
Serial.begin(9600);
}
void loop()
{
readSensor(0);
delay(300);
}
شرح الكود:
;float reading
نعرف متغير floatيقبل األعداد الكسرية ونسميهreading.
;)Serial.begin(9600
بدأ اإلرسال واإلستقبال عن طريق السيريال بسرعة 9600بت في الثانية.
;)readSensor(0
هذا األمر سيقوم بنداء الدالة functionالتالية:
∞∞∞
126 أساسيات األردوينو
هي مقاومة قيمتها عالية جدا عند عدم وجود ضوء ،وفي حال وجود ضوء عليها تنخفض مقاومتها إلى بضع
القطع المطلوبة:
.2مقاومة ضوئية.
.3مقاومة 10،000أوم.
.5أسالك ذكر-ذكر.
127 أساسيات األردوينو
التوصيل:
128 أساسيات األردوينو
:الكود
void setup()
{
Serial.begin(9600);
}
void loop()
{
float reading;
reading = analogRead(A0);
Serial.println("Reading is : ");
Serial.println(reading);
شرح الكود:
else
وإال إذا لم تتحقق جميع الشروط السابقة نفذ األمر
التالي أو ما بين األقواس.
∞∞∞
130 أساسيات األردوينو
شاشة LCD
لنتحكم بالشاشة بسهولة سنستخدم مكتبة (المكاتب هي ملفات فيها برمجة مسبقة تسهل لنا برمجة األجهزة
فبدال من أن نكتب أوامر كثيرة ،سنكتب سطرين أو ثالثة فقط لوجود المكتبة).
القطع المطلوبة:
✓ شاشة .1602
✓ مقاومة 220أوم.
✓ أسالك ذكر-ذكر.
132 أساسيات األردوينو
http://playground.arduino.cc/uploads/Main/LiquidCrystal_1.zip
بعدها يجب أن نضيف المكتبة في بداية البرنامج الذي نريد استخدامها فيه عن طريق كتابة التالي:
<اسم المكتبة>#include
>#include <LiquidCrystal.h
133 أساسيات األردوينو
التوصيل:
134 أساسيات األردوينو
135 أساسيات األردوينو
طريقة التوصيل:
منفذ الشاشة
GND 1
GND 12
5volt 15
GND 16
بعد رفع البرنامج على األردوينو والتوصيل سنحرك المقاومة المتغيرة حتى تظهر لنا الحروف بشكل واضح.
136 أساسيات األردوينو
:الكود
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void loop()
{
}
137 أساسيات األردوينو
شرح الكود:
>#include <LiquidCrystal.h
نضيف المكتبة
;)lcd.begin(16, 2
نحدد عدد الصفوف واألعمدة في شاشتنا بما أن
شاشتنا x2 16فسنكتب 2 ,16
)"!lcd.print("hello, world
طباعة هذه الجملة على الشاشة.
∞∞∞
138 أساسيات األردوينو
المقاومة المتغيرة بالضوء تقل مقاومتها اذا تسلط عليها ضوء. •
نقوم بتوجيه الليزر إلى مقاومة متغيرة بالضوء " ”LDRعن بعد. •
عند مرور شخص من أمام الليزر ،سينقطع الليزر من المقاومة الضوئية وستزيد مقاومتها. •
التوصيل:
140 أساسيات األردوينو
القطع المطلوبة:
✓ ليزر.
✓ .LED
✓ أسالك للتوصيل.
:الكود
int sensorValue = 0;
int laser = 12;
int buzzer = 8;
int led = 9;
void setup()
{
pinMode(laser, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop()
{
sensorValue = analogRead(0);
Serial.println(sensorValue);
if (sensorValue < 700)
{
digitalWrite(led, HIGH);
digitalWrite(buzzer, HIGH);
}
else
{
digitalWrite(led, LOW);
digitalWrite(buzzer, LOW);
}
delay(500);
}
∞∞∞
142 أساسيات األردوينو
المكتبة عبارة عن برنامج يسهل لنا استخدام الحساسات وغيرها يحتوي على دوال " ”Functionsوتعريفات وأوامر،
باستخدامها نختصر كتابة البرنامج من عدة صفحات أحيانا إلى سطرين أو ثالث فقط!
143 أساسيات األردوينو
القطع المطلوبة:
أسالك ذكر-أنثى
اآلن عندما نريد استخدام المكتبة نكتب أعلى البرنامج األمر التالي:
>#include <dht.h
نحدد رقم المنفذ الديجيتال الذي سنقرأ منه ونوع الحساس الذي نستخدمه (اخترت D7يمكنك اختيار ما تريد)
;)DHT dht(7, DHT11
التوصيل:
التوصيل كالتالي:
:الكود
#include "DHT.h"
void setup()
{
Serial.begin(9600);
dht.begin();
}
void loop()
{
Serial.println();
delay(2000);
float h;
float t;
h = dht.readHumidity();
t = dht.readTemperature();
Serial.print("Humidity: ");
Serial.println(h);
Serial.print("Temperature: ");
Serial.println(t);
}
147 أساسيات األردوينو
شرح الكود:
"#include "DHT.h
إضافة مكتبة حساس الرطوبة لنستطيع استخدامها
في البرنامج.
;)(dht.begin
بدأ قراءة الحساس.
;float h
عرفنا متغير نوعه floatيقبل األعداد الكسرية
والصحيحة وسميناه hليمثل الرطوبة.
;float t
عرفنا متغير نوعه floatيقبل األعداد الكسرية
والصحيحة وسميناه tليمثل الحرارة.
;)(h = dht.readHumidity
قراءة الرطوبة من الحساس ،وحفظها في المتغير
h
;)(t = dht.readTemperature
قراءة درجة الحرارة من الحساس واعطاءها للمتغير t
;)Serial.println(h
ارسال قيمة hعن طريق السيريال.
;)Serial.println(t
ارسال قيمة tعن طريق السيريال.
148 أساسيات األردوينو
تمارين
.1اصنع دائرة باستخدام األردوينو تقيس درجة الحرارة والرطوبة وتظهرها على الشاشة.
.2اصنع دائرة باستخدام األردوينو تتحكم بريالي يغلق عندما تكون رطوبة التربة قليلة.
:مراجع
1. https://www.arduino.cc/en/Tutorial/PWM
2. https://stackoverflow.com/questions/2386772/what-is-the-difference-between-float-and-double
3. https://learn.adafruit.com/all-about-stepper-motors/what-is-a-stepper-motor
4. http://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-an-arduino/
5. http://www.circuitbasics.com/wp-content/uploads/2015/11/DHT11-Datasheet.pdf
6. https://www.arduino.cc/reference/en/language/functions/com
7. munication/serial/
8. http://bit.do/Avishkar
9. https://www.arduino.cc/en/Tutorial/SoftwareSerialExample
10. https://stackoverflow.com/questions/6160963/how-can-i-digitalread-a-pin-that-is-in-pinmode-output
11. http://donalmorrissey.blogspot.com/2010/04/sleeping-arduino-part-5-wake-up-via.html
12. http://fritzing.org/projects/soil-moisture-sensor-and-serial/
13. https://oscarliang.com/arduino-gps-tutorial/
14. http://omnigatherum.ca/wp/?p=338