روبوت الانقاذ

يصبح الروبوت في بعض الظروف مناسبًا لتأدية المهام أكثر من الانسان مثل حالات الحرائق والأماكن الغير آمنة وذلك لحماية الانسان من الخطر.
سنقوم في هذا المشروع ببرمجة الروبوت لإرساله في عملية إنقاذ والتحكم به بواسطة حركة الهاتف الذكي أو الجهاز اللوحي الذي يحتوي على مستشعر التسارع Accelerometer وباستخدام تطبيق Makeblock.

rescue-robot

 

الأدوات المطلوبة:

 

rescue-robot

Ultimate 2.0 Kit

مستشعر التسارع Accelerometer

 

مستشعر التسارع عبارة عن جهاز كهروميكانيكي صغير يقوم بقياس القوة الناتجة عن تسارع الجسم نتيجة الحركة أو الاهتزاز ويمكن لمقياس التسارع تحليل حركة الجهاز وتحديد الاتجاه الذي يميل فيه من خلال مقارنة تسارع الجهاز بالنسبة للأرض.

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

rescue-robot

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

البرمجة باستخدام التطبيق

سنقوم ببرمجة الروبوت باستخدام تطبيق MakeBlock
إذا كانت هذه المرة الأولى التي تستخدم فيها التطبيق قم بمراجعة درس تطبيق MakeBlock
قم بتنزيل التطبيق على هاتف ذكي أو جهاز لوحي وتأكد بأنه يحتوي على مستشعر التسارع من خلال مراجعة مواصفات الجهاز.

برمجة حركة الروبوت

للتحكم في حركة الروبوت سنقوم ببرمجته بحيث يتحرك في نفس الاتجاه الذي يميل فيه الهاتف المحمول
من خلال واجهة التطبيق سنقوم باختيار الروبوت Ultimate  واختيار إضافة مشروع جديد New Project

rescue-robot

 

سنقوم بإضافة مفتاح Switch ونسميه Tilt

rescue-robot

 

rescue-robot

تحت أمر تشغيل المفتاح سنضيف كود تحكم الحركة بإضافة أوامر شرطية
بحيث إذا تم توجيه الهاتف للأمام يتحرك الروبوت للأمام

rescue-robot

وكذلك بالنسبة للخلف واليمين واليسار

rescue-robot
rescue-robot
rescue-robot

تحت أمر إغلاق المفتاح نضع أمر توقف الحركة

rescue-robot

يتم وضع الأوامر البرمجية داخل أمر Repeat Forever

 

الكود البرمجي للحركة

rescue-robot

 

 


برمجة ذراع الروبوت

ينقسم التحكم بذراع الروبوت إلى قسمين : حركة الذراع للأعلى والأسفل وحركة المقبض للإمساك بالأشياء وإفلاتها
سنقوم بإضافة 4 أزرار تحكم
لتحرك الذراع للأعلى سوف نسمي الزر الأول Up بالنقر عليه واختيار علامة تعديل الاسم
عند  ضغط الزر سنضيف الأمر البرمجي المتعلق بتحريك محرك التشفير encoder motor  المسؤول عن تحريك الذراع واختيار رقم المنفذ الذي تم توصيله به
وعند ترك الزر نضع السرعة صفر للتوقف

rescue-robot

لتحريك الذراع للأسفل سوف نسمي الزر الآخر Down
ونضيف نفس الكود البرمجي لمحرك التشفير لكن بوضع قيمة السرعة سالبة ( – ) لعكس اتجاه الحركة

rescue-robot

 

برمجة القابض Gripper

لتحريك القابض للإمساك بالأشياء، سوف نسمي الزر الثالث Grip
عند ضغط الزر سنضيف الأمر المتعلق بحركة محرك DC المسؤول عن حركة القابض
وتحديد منفذ التوصيل

rescue-robot

الزر الرابع سوف نسميه Un-Grip،  لتحريك القابض لإفلات الأشياء
سنضيف نفس الكود البرمجي لكن بوضع السرعة بعلامة سالبة ( – ) لعكس اتجاه حركة المحرك وبالتالي عكس حركة القابض

rescue-robot

 

الواجهة النهائية للتطبيق

rescue-robot

لمزيد من المعلومات عن الأوامر البرمجية الأخرى يمكنك الرجوع لدرس جولة حول الأوامر البرمجية

نقوم بعد ذلك بحفظ المشروع Save وتحديث البرامج الثابتة من واجهة التطبيق Firmware  لتتمكن من تجربة المشروع.

بث  الفيديو على الحاسوب

عند إرسال الروبوت في مهام مختلفة قد نحتاج لمتابعة المحيط الذي يتحرك فيه الروبوت
ستقوم في هذه الخطوة بالاستفادة من كاميراة الهاتف الذكي لبث الفيديو على الحاسوب
باستخدام القطع الملحقة بروبوت Ultimate  يمكن بناء مسند لهاتف محمول بالمقياس المناسب لحجم الهاتف

rescue-robot

قم بتنزيل تطبيق Droidcam   من Google Play  على هاتف محمول أندرويد

سيظهر عند فتح التطبيق عنوان IP الخاص بهاتفك
ورقم المنفذ Port وعنوان المتصفح

rescue-robot

 

قم بفتح الكاميرا من خلال التطبيق

rescue-robot

على جهاز الحاسوب قم بفتح المتصفح وإدخال عنوان المتصفح Browser IP Cam Access بهذا الشكل

http://192.168.11.118 :4747/

يمكنك الآن متابعة البث لمباشر من كاميرا الهاتف المحمول على صفحة الويب

rescue-robot



التحكم بمحرك DC باستخدام الترانزستور

يهدف هذا المشروع إلى تعلم كيفية تشغيل وإيقاف محرك التيار المستمر عن طريق الأردوينو. فسوف نقوم بتعلم كيفية التحكم بمحرك التيار المستمر عن طريق الترانزستور.

التحكم-فى-تشغيل-محرك-تيار-مستمر-باستخد

المكونات المطلوبة

arduino uno r3

Arduino Uno

1k Ω Resistor

1K Resistor

NPN Transistor 2N2222

2n2222 NPN Transistor

9V DC Motor

DC Motor

9VDC 1000mA regulated switching power adapter

DC Power Supply

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

الترانستور Transistor

هو عبارة عن مفتاح الكتروني يمكن التحكم في فتحه وإغلاقه. يتركب الترانزستور من مواد شبة موصلة وله ثلاث أطراف. الأول يسمى المشع، والثاني يسمى القاعدة، والثالث يسمى المجمع.

فكرة عملة 

عند مرور تيار إلى طرف القاعدة، يصبح الترانزستور في حالة توصيل وهذا يسمح بمرور التيار بين المشع والمجمع. وعند قطع التيار عن طرف القاعدة يصبح في حالة قطع أي لا يمر أي تيار بين المشع والمجمع.

التحكم-فى-تشغيل-محرك-تيار-مستمر-باستخد

محرك التيار المستمر (DC Motor)

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

التحكم-فى-تشغيل-محرك-تيار-مستمر-باستخد

توصيل الدارة :

لا يجب توصيل محرك التيار المستمر مباشرة مع الاردوينو. لأن المحرك يحتاج إلى تيار عالي لا يستطيع الاردوينو اعطاءه له. لذلك نستخدم الترانزستور كدائرة بين الاردوينو الذي يعمل بتيار صغير وبين المحرك الذي يحتاج إلى تيارات عالية.

قم بتوصيل الدائرة كما هو موضح بالصورة التالية :

التحكم-فى-تشغيل-محرك-تيار-مستمر-باستخد

 

التحكم-فى-تشغيل-محرك-تيار-مستمر-باستخد

عند توصيل التيار إلى قاعدة الترانزستور بواسطة الأردوينو، يقوم المحرك بالدوران وعند فصل التيار عن القاعدة يتوقف.

التحكم-فى-تشغيل-محرك-تيار-مستمر-باستخد

الكود البرمجي :

قم بكتابة الكود التالي للتحكم بالمحرك عبر الترانزستور :

#define MOTOR 13

void setup() {

  pinMode(MOTOR, OUTPUT);    // set the motor pin as output

}

void loop() {

  digitalWrite(MOTOR, HIGH); // Turn the motor ON

  delay(7000);               // keep the motor ON for 7 Seconds

  digitalWrite(MOTOR, LOW);  // Turn the motor OFF

  delay(7000);               // keep the motor OFF for 7 Seconds

}

شرح الكود

يقوم هذا الكود بتشغيل المحرك و اطفاءة. فيعمل المحرك مدة 7 ثوان ثم يتوقف 7 ثوان اخرى ليعود للعمل بعدهم و هكذا حتى يتم فصل التيار الكهربائى عن الدارة.

في البداية، نقوم بتسمية الطرف 13 فى الاردوينو “MOTOR” بعد ذلك في الدالة  ()setup نقوم بتعريف هذا الطرف كمخرج

#define MOTOR 13

void setup() {

  pinMode(MOTOR, OUTPUT);    // set the motor pin as output

}

في الجزء التالي، نقوم بتشغيل أو وضع قيمة HIGH على الطرف MOTOR، فيعمل المحرك. ثم بإستخدام الدالة (delay(7000 نقوم بعمل تأخير زمني مدته 7 ثوان، فيضل المحرك سيعمل خلالها.

يتم إطفاء المحرك عن طريق وضع قيمة LOW على الطرف MOTOR ، فيتوقف المحرك عن الدوران لمدة 7 ثوان.

void loop() {

  digitalWrite(MOTOR, HIGH); // Turn the motor ON

  delay(7000);               // keep the motor ON for 7 Seconds

  digitalWrite(MOTOR, LOW);  // Turn the motor OFF

  delay(7000);               // keep the motor OFF for 7 Seconds

}




مشروع آلة التبريد

 

سنقوم في هذا المشروع بصنع آلة تبريد يمكن استخدامها لتبريد المشروبات باستخدام مستشعر الحرارة وقطع الكترونية أخرى.

makeblock-cooling-machine

 

الأدوات المطلوبة

makeblock-cooling-machine

Inventor Kit

القطع المطلوبة

makeblock-cooling-machine

 

طريقة التوصيل

 

نقوم بتوصيل مستشعر الحرارة إلى اللوحة الرئيسية عبر محول Rj25

makeblock-cooling-machine

 

المنفذ القطعة الالكترونية
منفذ4  وحدة 7-segment
منفذ6 محول RJ25
منفذ8 المقاومة المتغيرة
منفذ المحركات M1 المروحة Me 130 dc motor

 

 

برمجة المشروع

 

سنقوم ببرمجة المشروع بحيث يتيح لنا تعيين درجة الحرارة التي نرغب في تبريد العصير إليها عبر المقاومة المتغيرة ويتم عرضها على وحدة 7-segment

نقوم بوضع مستشعر الحرارة داخل الكوب فيقوم البرنامج بمقارنة درجة حرارة العصير بدرجة الحرارة التي قمنا باختيارها
إذا كانت أعلى (أي أسخن) يتم تشغيل المروحة للتبريد إلى أن تصل لدرجة الحرارة المطلوبة.
في البداية سنقوم بتحديد مدى قراءة المقاومة المتغيرة حيث سنستخدمها في تحديد درجة الحرارة

makeblock-cooling-machine

ننشئ متغيرًا باسم temperature ونقوم بتعيينه لقراءة قيمة المقاومة المتغيرة

makeblock-cooling-machine

نقوم بتعيين وحدة 7-segment لعرض درجة الحرارة temperature

makeblock-cooling-machine

نستخدم الأمر التالي لقراءة مستشعر درجة الحرارة

makeblock-cooling-machine

باستخدام حلقة Repeat until
نضع أمر المحرك M1  المتعلق بالمروحة ليتحرك بسرعة 100 إلى أن تصبح درجة الحرارة التي اخترناها أكبر من الحرارة التي يقرأها المستشعر

makeblock-cooling-machine

عند تبريد الكوب إلى درجة الحرارة المطلوبة تتوقف المروحة

makeblock-cooling-machine

الكود البرمجي

 

makeblock-cooling-machine

للمزيد من المعلومات حول الكود يمكنك مراجعة درس جولة حول الأوامر البرمجية.

 




التحكم بالمروحة باستخدام الاردوينو

في هذا المشروع سنتعلم فكرة عمل المرحل وكيفية استعماله للتحكم في تشغيل مروحة تعمل على محرك تيار مستمر و ايضا عكس اتجاه حركتها.

التحكم-فى-تشغيل-و-اتجاه-دوران-مروحة-باس


المكونات المطلوبة

arduino uno r3

Arduino Uno

Relay module 5v

Relay Module 5v

Raspberry pi fans

DC Fan

9VDC 1000mA regulated switching power adapter

DC Power Supply

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

المرحل Relay

المرحل هو عبارة عن مفتاح كهروميكانيكي. وهذا يعني أنه يتكون من نقاط تلامس ولكنه يحتوي على ملف كهربائي. فائدة هذا الملف هو التحكم في توصيل وفصل نقاط التلامس للتحكم في الفصل والتشغيل في المرحل.

التحكم-فى-تشغيل-و-اتجاه-دوران-مروحة-باس

مكونات المرحل

  1. ملف كهربائي
  2.   نقاط توصيل مغلقة ومفتوحة

لماذا يتم استخدام المرحل؟

لا يمكن توصيل مروحة التيار المستمر بشكل مباشر مع الاردوينو. وذلك بسبب احتياج المروحة إلى تيار عالي لا يستطيع الاردوينو اعطاءه لها. لذلك، نستخدم المرحل (Relay) كدائرة بين الاردوينو الذي يعمل بتيار صغير وبين المروحة التي تختاج إلى تيارات عالية.

التحكم-فى-تشغيل-و-اتجاه-دوران-مروحة-باس

مروحة التيار المستمر (DC Fan) :

هي عبارة عن محرك تيار مستمر مثبت عليه ريش ليعمل كمروحة. يتم التحكم بها بشكل مشابه للتحكم بمحرك التيار المستمر. يتم تشغيلها عن طريق امدادها بتيار مستمر، ولعكس حركتها سنقوم بعكس توصيل اطرافها أي عكس الاقطاب لتدور في الاتجاه المعاكس.

التحكم-فى-تشغيل-و-اتجاه-دوران-مروحة-باس

توصيل الدارة :

يتم توصيل الدارة كما هو موضح بالصورة التالية :

التحكم-فى-تشغيل-و-اتجاه-دوران-مروحة-باس

التوصيلات :

التحكم-فى-تشغيل-و-اتجاه-دوران-مروحة-باس

 

طرفى المحرك  طرفى COM للRelay Module
طرف البطارية الموجب  طرفى NO للRelay Module
طرف البطارية السالب  طرفى NC للRelay Module
طرف Vcc للArduino  طرف Vcc لل Relay Module
طرف Gnd للArduino  طرف GND للRelay Module
طرف 12 للArduino  طرف IN1 للRelay Module
طرف 13 للArduino  طرف IN2 للRelay Module

كيفية عمل الدارة

  سيتم وصل طرفى المرحل (Relay) على منافذ من النوع الرقمي. لجعل المروحة تدور مع اتجاه عقارب الساعة، نقوم بجعل قيمة المخرج الأول HIGH والثاني LOW . ولدورانها عكس عقارب الساعة نقوم بعكس العملية السابقة. اما لجعلها تتوقف نقوم بجعل كلا الطرفان LOW .

الكود البرمجي :

قم بكتابة الكود البرمجي كما يلي :

#define MOTOR_IN1 12
#define MOTOR_IN2 13  

void motor_forward(void);  // a function that will be called to rotate it clockwise
void motor_reverse(void);  // a function that will be called to totate it counter-clockwise
void motor_stop(void);     // a function that will be called to stop the rotation

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

شرح الكود البرمجي :

تدور المروحة في الإتجاه الأول لمدة 3 ثوان، ثم تتوقف لمدة 3 ثوان. وبعد ذلك، تدور في الاتجاه المعاكس لمدة 3 ثوان ثم تتوقف لمدة 3 ثوان اخرى، وهكذا حتى يتم فصل التيار.

الشرح مفصلا :

يتم ضبط المنافذ الموصله مع المرحل IN1، IN2 كمخرج :

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

في دالة الـ ()loop ، نقوم باستدعاء الدالة ()motor_forward لتشغيل المروحة مع اتجاه عقارب الساعة. ثم نقوم باستخدام الدالة (delay(3000 لإضافة تأخير زمني مدته 3 ثوان تظل المروحة خلاله تدور في نفس الاتجاه. ثم يتم استخدام الدالة ()motor_stop لإيقاف المروحة عن العمل لمدة 3 ثوان. ثم بإستدعاء الدالة ()motor_reverse نقوم بعكس اتجاه الحركة للمروحة. يتم تكرار هذه العملية حتى يتم فصل التيار.

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

دالة ()motor_forward تقوم بتشغيل المروحة مع اتجاه عقارب الساعة. فهي تقوم بجعل أحد الأطراف HIGH والطرف الأخر LOW فتدور المروحة في هذا الإتجاه.

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

تعمل الدالة ()motor_reverse  بشكل مشابه للدالة السابقة motor_forward ، ولكن تعكس المخرجات على الأطراف فالطرف الذي تم إخراج قيمة HIGH عليه يتم جعله LOW والطرف الأخر HIGH . فينتج دوران باتجاه معاكس لإتجاه عقارب الساعة.

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

تقوم الدالة motor_stop() بإيقاف المروحة تماما عن الحركة، عن طريق جعل كلا الطرفان LOW فلا يصل تيار إلى المروحة فتتوقف.

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}




مشروع المروحة الذكية

سنقوم في هذا المشروع بعمل مروحة ذكية تعمل عند عند الاقتراب منها لمسافة محددة وتزداد سرعتها كلما اقتربت منها أكثر

makeblock-smart-fan

 

الأدوات المطلوبة

makeblock-smart-fan

Inventor Kit

القطع المطلوبة

makeblock-smart-fan

 

طريقة التوصيل

 

 

makeblock-smart-fan

قم بتوصيل مستشعر الموجات فوق الصوتية بالمنفذ رقم 3
وقم بتوصيل المروحة (Me 130 dc motor) بأحد المنفذين المخصصة للمحركات كما هو موضح بالصورة

لاحظ أنك إذا قمت بتوصيل في المنفذ M1  على اللوحة الرئيسية فستعتمد M1 عند كتابة الكود البرمجي.

برمجة المشروع

نقوم بدايةً بإنشاء متغير Distance وتعيينه لتخزين قراءة مستشعر الموجات فوق الصوتية

makeblock-smart-fan

نقوم بإضافة جملة شرطية if.. else
لتحديد المسافة التي تبدأ عندها المروحة بالدوران وهنا اخترنا أن تكون أقل من 70 سم

makeblock-smart-fan

ننشئ متغيرًا باسم speed ونقوم بتعيينه ليتغير قيمته وفق المسافة
أضفنا عبارة رياضية وهي أن تكون السرعة حاصل طرح المسافة من 150
وبذلك ستتغير السرعة وفق المسافة
كلما كانت المسافة صغيرة تزداد السرعة

makeblock-smart-fan

بعد else نضع سرعة المحرك M1 تساوي صفر ليتوقف إذا كانت المسافة أكبر من 70

makeblock-smart-fan

 

الكود البرمجي

 

makeblock-smart-fan

 

للمزيد من المعلومات حول الكود يمكنك الرجوع إلى درس جولة حول الأوامر البرمجية.

 




مشروع محاكاة إشارة المرور

سنقوم في هذا المشروع بدمج عدة عناصر إلكترونية لمحاكاة إشارة المرور مثل إضاءة RGB ومحرك سيرفو ووحدة عرض 7-segment

 

makeblock-traffic-light

 

الأدوات المطلوبة

 

makeblock-traffic-light

حقيبة المخترع (Inventor Kit)

تركيب الدائرة

 

سنستخدم في هذا المشروع القطع الالكترونية التالية:

 

makeblock-traffic-light

نلاحظ أن منافذ محرك السيرفو تختلف عن منافذ لوحة (Orion (RJ25 لذلك نستخدم محول RJ25 الذي يقوم بتحويل المنافذ القياسية Rj25 إلى 6 دبابيس لتتوافق مع العناصر الالكترونية الأخرى مثل محرك السيرفو في هذا المشروع.

طريقة التوصيل

 

makeblock-traffic-light

 

المنفذ القطعة الالكترونية
منفذ 4 وحدة عرض 7-segment
منفذ 8 RGB LED
منفذ 6 محول RJ25

 

ويتم توصيل محرك السيرفو بمحول RJ25

 

برمجة المشروع

 

سنقوم ببرمجة المشروع بحيث تكون الإضاءة حمراء لمدة 10 ثوان ويكون ذراع محرك السيرفو على زاوية 180 درجة
ليمنع السيارات من العبور
يبدأ العد التنازلي يظهر على وحدة عرض 7-segment من 10 إلى 0
ثم تتحول الإضاءة إلى الأخضر ويتحرك ذراع محرك السيرفو إلى 90 درجة ليسمح للسيارات بالعبور
في البداية سننشيء متغير second  ليمثل عدد الثواني في العداد

makeblock-traffic-light

قم بتعيين قيمة المتغير second على عدد الثواني التي سيبدأ بها العد التنازلي
10هنا اخترنا أن يبدأ العداد من

makeblock-traffic-light

لنجعل العدد يتناقص سنستخدم الأمر التالي

makeblock-traffic-light

وليكون مقدار التناقص كل ثانية سنستخدم الأمر wait

makeblock-traffic-light

خلال العد التنازلي نريد أن يظهر العداد على وحدة 7-segment
وكذلك تكون الإضاءة حمراء

makeblock-traffic-light

وأن يكون الحاجز مغلقا لمنع مرور السيارات أي يكون ذراع محرك السيرفو على زاوية 180 درجة

makeblock-traffic-light

سنضع هذه الأوامر داخل حلقة Repeat until

makeblock-traffic-light

ستتكرر الأوامر داخل الحلقة إلى أن يصل العداد إلى الصفر أي يتحقق الشرط الذي تم وضعه في الأمر البرمجي Repeat until
عند وصول العداد إلى الصفر سنعيد تعيينه ليبدأ العد من 10 أي عند فتح الإشارة والحاجز
سنستخدم الأمر if then
ونضع الشرط إذا كانت الثواني = 0

makeblock-traffic-light

 

 وعند تحقق هذا الشرط نريد أن  تكون الإضاءة خضراء (green=60)
ويتم فتح المزلاق أيتحرك ذراع السيرفو إلى 90 درجة
كذلك نضيف الأمر الذي يظهر العد التنازلي في وحدة عرض 7-segment

makeblock-traffic-light

بعد مرور هذه العشر ثوان سنستخدم أمر تعيين العداد مرة أخرى ليستمر في تكرار فتح إشارة المرور وغلقها

makeblock-traffic-light

الكود البرمجي

 

makeblock-traffic-light

 

لمزيد من المعلومات حول الأوامر البرمجية الأخرى يمكنك الرجوع إلى درس جولة حول الأوامر البرمجية

 




عمل بيانو بسيط باستخدام اردوينو

الهدف من المشروع هو عمل بيانو بسيط باستخدام الاردوينو يقوم باصدار الاصوات و النغمات بالضغط على المفاتيح

عمل-بيانو-بسيط-باستخدام-اردوينو

المكونات المطلوبة

 

arduino uno r3

Arduino Uno

10k Ω Resistors 1/2 w 1%

K Ohm Resistor 10

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

Piezo sounder

Piezo Sounder

Tactile Push Button Switch

Push Buttons

السماعه Piezo

 هي عبارة عن كريستال تسمى بيزوكريستال عند تعريضها لجهد كهربائي تقوم باصدار صوت، سنستخدمها في هذا المشروع لاصدر نغمات مختلفة كالبيانو

عمل-بيانو-بسيط-باستخدام-اردوينو

شرح الدارة

قم بتوصيل الدائرة كما هو موضح بالصورة :

عمل-بيانو-بسيط-باستخدام-اردوينو

سنقوم بعمل بيانو بسيط بإستخدام 8 مفاتيح من النوع PushButton، سيتم توليد النغمات المختلفة باستخدام الأردوينو وسماعة البيزو .  كل مفتاح يصدر صوت بنغمة ذو تردد مختلف.

عمل-بيانو-بسيط-باستخدام-اردوينو

الكود البرمجى

// butt_c --> pin 2
#define BUTT_C  2
// butt_d --> pin 3
#define BUTT_D  3
// butt_e --> pin 4
#define BUTT_E  4
// butt_f --> pin 5
#define BUTT_F  5
// butt_g --> pin 6
#define BUTT_G  6
// butt_a --> pin 7
#define BUTT_A  7
// butt_b --> pin 8
#define BUTT_B  8
// butt_h --> pin 9
#define BUTT_H  9
// speaker --> pin 13
#define SPEAKER  13

// variables to store the state of the buttons
int C = 0, D = 0, E = 0, F = 0, G = 0, A = 0, B = 0, H = 0;

//NOTES         'c'  , 'd',  'e',  'f',  'g', 'a',  'b',  'h'
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; //freq

int Cur_tone = 0;

void setup()
{
  pinMode(BUTT_C, INPUT);
  pinMode(BUTT_D, INPUT);
  pinMode(BUTT_E, INPUT);
  pinMode(BUTT_F, INPUT);
  pinMode(BUTT_G, INPUT);
  pinMode(BUTT_A, INPUT);
  pinMode(BUTT_B, INPUT);
  pinMode(BUTT_H, INPUT);
  pinMode(SPEAKER, OUTPUT);
}

void loop()
{
	C = digitalRead(BUTT_C);
	D = digitalRead(BUTT_D);
	E = digitalRead(BUTT_E);
	F = digitalRead(BUTT_F);
	G = digitalRead(BUTT_G);
	A = digitalRead(BUTT_A);
	B = digitalRead(BUTT_B);
	H = digitalRead(BUTT_H);

       // check if any button is being pressed
	if((C == HIGH) || (E == HIGH) || (G == HIGH) || (D == HIGH) || 
	   (F == HIGH) || (A == HIGH) || (B == HIGH) || (H == HIGH) )
	{ 
        // if a button is being pressed, check which one
		if (C == HIGH){
			Cur_tone = tones[0];
		} 

		if (E == HIGH){
			Cur_tone = tones[1];
		}

		if (G == HIGH){
			Cur_tone = tones[2];
		}

		if (D == HIGH){
			Cur_tone = tones[3];
		}

		if (F == HIGH){
			Cur_tone = tones[4];
		}

		if (A == HIGH){
			Cur_tone = tones[5];
		}

		if (B == HIGH){
			Cur_tone = tones[6];
		}

		if (H == HIGH){
			Cur_tone = tones[7];
		}

		digitalWrite(SPEAKER, HIGH);
		delayMicroseconds(Cur_tone);
		digitalWrite(SPEAKER, LOW);
		delayMicroseconds(Cur_tone);
	}
	else{                //switch off the speaker if no button is being pressed
	  digitalWrite(SPEAKER, LOW);
	}
}

شرح الكود:

في البداية نقوم بتعريف متغيرات لإستخدامها في تسجيل حالة الـ Push Buttons . ونقوم بالاعلان عن مصفوفة tones[] ، والتي سيتم تسجيل قيم الترددات عليها  لإستخدامها في توليد النغمات المختلفة عن طريق الـ Buzzer .

في الدالة setup() قمنا بتفعيل المنافذ الموصله مع المفاتيح كمدخل، والمنفذ الموصل مع الـ Buzzer كمخرج.

// variables to store the state of the buttons
int C = 0, D = 0, E = 0, F = 0, G = 0, A = 0, B = 0, H = 0;

//NOTES         'c'  , 'd',  'e',  'f',  'g', 'a',  'b',  'h'
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; //freq

int Cur_tone = 0;

void setup()
{
  pinMode(BUTT_C, INPUT);
  pinMode(BUTT_D, INPUT);
  pinMode(BUTT_E, INPUT);
  pinMode(BUTT_F, INPUT);
  pinMode(BUTT_G, INPUT);
  pinMode(BUTT_A, INPUT);
  pinMode(BUTT_B, INPUT);
  pinMode(BUTT_H, INPUT);
  pinMode(SPEAKER, OUTPUT);
}

ثم نقوم بقراءة حالة الـ Push Buttons وتخزينها، وتخزينها في المتغيرات التي تم الاعلان عنها سابقا :

void loop()
{
	C = digitalRead(BUTT_C);
	D = digitalRead(BUTT_D);
	E = digitalRead(BUTT_E);
	F = digitalRead(BUTT_F);
	G = digitalRead(BUTT_G);
	A = digitalRead(BUTT_A);
	B = digitalRead(BUTT_B);
	H = digitalRead(BUTT_H);

 نقوم بعملية التحقق من المفتاح الذي تم الضغط عليه. بعد ذلك يتم تسجيل قيمة معينة في متغير Cur_tone حسب المفتاح المضغوط عليه. ثم نقوم بتشغيل الـ Buzzer بتأخير زمني يعتمد على قيمة المتغير Cur_tone :

// check if any button is being pressed
	if((C == HIGH) || (E == HIGH) || (G == HIGH) || (D == HIGH) || 
	   (F == HIGH) || (A == HIGH) || (B == HIGH) || (H == HIGH) )
	{ 
        // if a button is being pressed, check which one
		if (C == HIGH){
			Cur_tone = tones[0];
		} 

		if (E == HIGH){
			Cur_tone = tones[1];
		}

		if (G == HIGH){
			Cur_tone = tones[2];
		}

		if (D == HIGH){
			Cur_tone = tones[3];
		}

		if (F == HIGH){
			Cur_tone = tones[4];
		}

		if (A == HIGH){
			Cur_tone = tones[5];
		}

		if (B == HIGH){
			Cur_tone = tones[6];
		}

		if (H == HIGH){
			Cur_tone = tones[7];
		}

		digitalWrite(SPEAKER, HIGH);
		delayMicroseconds(Cur_tone);
		digitalWrite(SPEAKER, LOW);
		delayMicroseconds(Cur_tone);
	}
	else{                //switch off the speaker if no button is being pressed
	  digitalWrite(SPEAKER, LOW);
	}

استخدم مفاتيح أخرى لإصدار نغمات مختلفة .




التحكم بالروبوت عبر الأوامر الصوتية

سنقوم في هذا المشروع باستخدام مستشعر الصوت الموجود في اللوحة الرئيسية Auriga لروبوت Ranger
لبرمجة روبوت يستجيب للأوامر الصوتية

 

voice-control-robot

 

الأدوات المطلوبة

voice-control-robot

mBot Ranger Kit

 Sound Sensor مستشعر الصوت

 

يمكن أن نقول بأن مستشعر الصوت  هو عبارة عن مايكروفون صغير يقوم بتحويل الصوت إلى إشارة كهربائية،  ويعطي قيمة  تتراوح بين 0-1023.  تختلف القيمة باختلاف المحيط الذي نقوم بتشغيل الروبوت فيه
لا يستطيع مستشعر الصوت التمييز بين الكلمات لكن يستطيع التمييز بين الأصوات المرتفعة والمنخفضة التي تقع في المدى الخاص به. كلما كانت شدة الصوت أعلى كانت الإشارة الكهربائية أكثر

voice-control-robot

 

تحديد مدى قراءة المستشعر

قبل أن نقوم بكتابة البرنامج نحتاج أولا إلى عمل اختبار صغير لمعرفة المدى الذي يقرأ فيه المستشعر، والقراءات التي يعطيها عند التصفيق أو الكلام أو أي أصوات  أخرى.
نقوم أولا بتوصيل الروبوت إلى الحاسوب عن طريق الكيبل.

قم بانشاء متغير Sound
اختيار الأمر say وتعيينه على مستشعر الضوء
ووضع الأمر داخل حلقة forever

voice-control-robot

 

ستظهر قراءة المستشعر على الشاشة

voice-control-robot

نلاحظ أن القيمة تتغير بسرعة كبيرة جدا وبهذا يصعب تحديد أعلى قيمة وأقل قيمة،  لذا سنضيف متغيرين آخرين
Max ليمثل أعلى قيمة،  و Min ليمثل أقل قيمة

voice-control-robot

سنقوم بتعيين المتغيرين على قراءة مستشعر الصوت

voice-control-robot

ونقوم كذلك بتعيين المتغير Sound لقراءة مستشعر الصوت

voice-control-robot

في البداية ستكون Max = Min
داخل حلقة forever  ستتغير قيمة المتغير Sound
ولتحديد أعلى وأقل قيمة نستخدم if ..then
بحيث إذا كانت قيمة sound أكبر من قيمة max
يتم إعادة تعيين قيمة max إلى هذه القيمة كأعلى قيمة
ويتم إعادة تعيين قيمة min إلى أقل قيمة تمت قراءتها في المتغير Sound

 

voice-control-robot

 

 

الكود البرمجي

سنقوم ببرمجة الروبوت بحيث يتراجع للوراء عند التصفيق أو إعطاءه أي أمر صوتي

سنأخذ بالاعتبار القيم  التي حصلنا عليها من الكود السابق،  لاستخدامها في كتابة كود الروبوت الجديد

نقوم بفتح صفحة جديدة في برنامج mBlock
وانشاء متغير Sound  وتعيينه لقراءة مستشعر الصوت في اللوحة الرئيسية

voice-control-robot

 

نقوم بإضافة شرط if then
بحيث إذا كانت قراءة مستشعر الصوت أعلى من قيمة معينة يتحرك الروبوت للخلف
لتحديد هذه القيمة نعود إلى القيم التي حصلنا عليها من الكود السابق

voice-control-robot

نلاحظ في الصورة أن قيمة max = 184 وهذه القيمة تم تسجيلها قبل إصدار أي صوت
مما يعني أنه عند التصفيق مثلا ستكون قيمة المستشعر أكبر من هذه القيمة

 

voice-control-robot

 

إذا كانت قيمة القراءة أقل،  يتم تنفيذ الأوامر بعد else وهو التحرك للأمام

 

الكود البرمجي:

 

voice-control-robot

 

قم  بتجربة إضافة أوامر برمجية تقوم بإضاءة LED عند التصفيق

لمزيد من المعلومات حول الأوامر البرمجية الأخرى قم بالرجوع لدرس جولة حول الأوامر البرمجية

 

 




حساب المسافة بإستخدام حساس الموجات فوق صوتية

في هذا المشروع سنتعلم فكرة عمل حساس الموجات فوق الصوتية و كيفية استعماله لحساب المسافة بين الاردوينو و كائن ما. قد يستخدم في انظامة الإنذار او في روبوت تخطي العقبات ثم سنقوم بعرض هذة القراءات على شاشة LCD

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

المكونات المطلوبة

arduino uno r3

Arduino Uno

Ultrasonic Sensor HC-SR04

HC-SR04 Ultrasonic Sensor

 

HD44780

LCD 16×2

220 Ω resistor

مقاومة 220 اوم

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

حساس الموجات فوق الصوتية

يقوم مستشعر الموجات فوق الصوتية بقياس المسافة. حيث يقوم باطلاق موجات صوتية عالية التردد لا يمكن للأذن البشرية سماعها وعند اصطدام هذه الموجات بجسم ما ترتد على شكل صدى Echo ،عند ارتداد هذه الموجات يتم حساب الزمن الذي استغرقته للعودة إلى المستشعر وحساب المسافة.

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

قم بتوصيل حساس الموجات الفوق صوتية مع الأردوينو كما هو موضح بالصورة :

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

الشاشة LCD

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال
تعمل الشاشة في احد الحالات التالية:

1- أن تستقبل امر من الارودوينو و تقوم بتنفيذه مثلا: أمر مسح الشاشة و أمر التهيئة 

lcd.begin(16,2);
lcd.clear();

2- أن تستقبل معلومات من الاردوينو و تقوم بعرضها مثلا : كتابة جملة معينة  

lcd.print("Hello");

 

قم بتوصيل شاشة LCD مع الأردوينو كما هو موضح بالصورة :

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

شرح الدارة

يقوم الحساس بارسال موجات فوق صوتية واعادة استقبالها عندما تصطدم بكائن ما. ثم يقوم الاردوينو بقياس المسافة بين الحساس وبين الكائن بناءا على الوقت بين الارسال والاستقبال للموجات من خلال عمل بعض الحسابات لتحويل القيمة المحسوبة من وقت الى مسافة بالإعتماد على معرفة قيمة سرعة الصوت في الهواء. بعد ذلك يقوم الاردوينو بعرض المسافة على الشاشة LCD .

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

 

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

توصيل حساس الموجات فوق الصوتية

Ultrasonic Sensor Arduino
GND GND
Echo Pin 2
Trigger Pin 3
Vcc 5v

الكود

#include <LiquidCrystal.h>         // the LCD Library
#include <NewPing.h>               // the Ultrasonic Library

#define TRIG  3                    // Pin-3 of Arduino Connected to Trig Pin of Ultrasonic
#define ECHO  2                    // Pin-4 of Arduino Connected to Echo Pin of Ultrasonic
#define MAX_DISTANCE 100           // Max. Distance the Sensor Can Measure, Required for the Library


NewPing sonar(TRIG, ECHO, MAX_DISTANCE); // Ultrasonic Variable
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);  // LCD Variable


unsigned int duration;             // Variable Used To Store The Measured Distance

void setup()
{
 pinMode(TRIG,OUTPUT);             // Set Trig Pin of Arduino As Output
 pinMode(ECHO, INPUT);             // Set Echo Pin of Arduino As Input
 lcd.begin(16,2);                  // To Setup and Start the LCD
 lcd.clear();                      // To Clear the LCD
}

void loop()
{
 duration = sonar.ping();          // Send ping, get ping time in microseconds (uS).
 duration = duration / 2 / 29.4;   // Explained Below
 lcd.print("Ping: ");              // to Print " Ping:  " on the LCD
 lcd.print(duration);              // next to it print the Calculated Value
 lcd.print(" cm");

 // on lcd we will see "  Ping: 30 cm  "

 delay(1000);                      // min. delay between pings is 29 msec
 lcd.clear();                      // to clear the LCD for the Next Round
}

 شرح الكود :

في البداية قم بإدراج المكتبات المستخدمة في البرنامج, هنا سيتم استخدام مكتبة الشاشة LCD و مكتبة حساس الموجات فوق الصوتية Ultrasonic.

نقوم بتعريف أسماء منافذ الاردوينو التي تم توصيلها مع الحساس :

#define TRIG  3

ننشىء المتغيرات اللازمة للمكتبات المستخدمة :

 أولا، نقوم بتعريف المتغير الخاص بمكتبة الشاشة LCD، وإعداده إعتمادا على كيفية توصيله مع الأردوينو :

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

ثم نقوم بتعريف المتغير الخاص بمكتبة Ultrasonic، وتحديد منافذ الأردوينو المتصل معها :

NewPing sonar(TRIG, ECHO, MAX_DISTANCE);

نقوم بتهيئة الشاشة LCD للعمل عن طريق الامر :

lcd.begin(16,2);

يقوم الكود بتشغيل الحساس و حساب المسافة ثم يتم عرضها على الشاشة :

void loop()
{
 duration = sonar.ping();          // Send ping, get ping time in microseconds (uS).
 duration = duration / 2 / 29.4;   // Explained Below
 lcd.print("Ping: ");              // to Print " Ping:  " on the LCD
 lcd.print(duration);              // next to it print the Calculated Value
 lcd.print(" cm");

 // on lcd we will see "  Ping: 30 cm  "

 delay(1000);                      // min. delay between pings is 29 msec
 lcd.clear();                      // to clear the LCD for the Next Round
}

في البداية، نقوم بإستخدام الدالة ()sonar.ping لنحصل على قيمة الوقت الذي استغرقته موجات الـUltrasonic لتصدم بكائن و تعود الى الحساس مرة اخرى. ثم نقوم بعمل حسابات بسيطة على هذة القيمة سيتم شرحها لاحقا بعد ذلك قمنا بعرض هذة الحسابات على شاشة LCD.

  • الحسابات الخاصة بعمل حساس الموجات فوق الصوتية:

يقوم الحساس بارسال موجات فوق صوتية و عند اصطدامها بحائل ترتد مرة اخرى فيمكن للاردوينو حساب الوقت الذى استغرقته الموجات للذهاب و العودة لذلك لابد من القسمة على 2 لاننا نريد حساب المسافة و هذا يعتمد على وقت الذهاب فقط.

 سرعه الصوت في الهواء في الحالة العادية تقريبا 340 متر لكل ثانية فيكون الوقت المستهلك لعبور 1 سم هو :

100 للتحويل من متر الى سم , و 10^6 للتحويل من ثانية الى مايكروثانية .




روبوت السومو

 

مصارعة السومو من الفنون القتالية اليابانية القديمة، سنقوم في هذا المشروع ببرمجة الروبوت ليكون جاهزًا للمشاركة بحيث يقوم الروبوت بالبحث عن الخصم في مساحة محددة بواسطة مستشعر الموجات فوق الصوتية وعندما يجده يقوم بالهجوم على الروبوت الخصم.

sumo-mbot

الأدوات المطلوبة:

 

sumo-mbot

mBot Kit (عدد 2)

 

فكرة المشروع

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

 

sumo-mbot

 

يعطي المستشعر قراءة تساوي 3 إذا كان على سطح أبيض وقراءة تساوي 0 إذا كان على سطح أسود، وقيم تساوي 1 أو 2 إذا كانت إحدى جهتي المستشعر على اللون الأسود والأخرى على الأبيض.  لفهم كيفية عمل مستشعر وحدة المسار راجع مشروع روبوت تفادي السقوط

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

رصد حافة الطاولة رصد الخصم الفعل
نعم نعم الانعطاف يمينًا أو يسارًا
نعم لا الانعطاف يمينًا أو يسارًا
لا نعم زيادة السرعة (هجوم)
لا لا التحرك للأمام

 

 

الكود البرمجي

 

سنحتاج عند برمجة روبوت السومو إلى وضع الأوامر باعتبار قراءة مستشعر تتبع المسار ومستشعر الموجات فوق الصوتية.

سنقوم بدايةً بوضع مجموعة من الأوامر داخل حلقة تكرار Repeat until ، يقوم هذا الأمر بتنفيذ الأوامر التي بداخل الحلقة إلى أن يتحقق الشرط الذي يتم وضعه
وهنا قمنا باختيار الشرط أن تساوي قراءة مستشعر تتبع المسار 3
(عندما تكون القيمة 3 فذلك يعني أن كلا المستشعرين في وحدة تتبع المسار على سطح أبيض أي أن الروبوت لم يصل لحافة ساحة القتال)

sumo-mbot

 

الأوامر التي بداخل حلقة repeat until ستعتمد على المسافة على قراءة مستشعر الموجات فوق الصوتية ، أي إذا كان الروبوت يسير على السطح الأبيض سننتقل لاختبار شرط المسافة
وهو إذا كانت المسافة بين الروبوت والخصم أقل من 12 سم سيقوم بالهجوم عليه عن طريق زيادة السرعة إلى 255،  وإن لم تكن المسافة كذلك يستمر الروبوت في الحركة للأمام بسرعة متوسطة

 

sumo-mbot

نعود إلى شرط مستشعر تتبع المسار
إذا تحقق الشرط أن القراءة أصغر من 3، فذلك يعني أن الروبوت لم يعد على السطح الأبيض أي وصل إلى حافة ساحة القتال
فهنا يتم تنفيذ الأوامر بعد else،  وهي الحركة للخلف لمدة ثانيتين وفائدة الأمر wait  أن يسمح له بالرجوع مسافة كافية تمكنه من الانعطاف

sumo-mbot

 

بعد أن يعود الروبوت للخلف هل ينعطف يمينا أو يسارًا؟
ليتمكن الروبوت من اتخاذ القرار
سنستخدم الأمر pick random من 1 إلى 10

sumo-mbot

 

وهذا الأمر يقوم في كل مرة بأخذ رقم عشوائي بين العددين اللذان تم اختيارهما
وتبعا لهذا الرقم قمنا بوضع شرط إذا كان الرقم أقل من 5 ينعطف الروبوت لليمين
وإلا فينعطف لليسار

sumo-mbot

قمنا بوضع أمر التأخير الزمني.wait ليكون لدى الروبوت زمن كافي للانعطاف

الكود البرمجي

 

sumo-mbot

بذلك سيكون الروبوت جاهزًا للمشاركة في مسابقة السومو قم بتنزيل الكود على روبوت آخر لتبدأ المنافسة.
لمزيد من المعلومات حول الأوامر البرمجية الأخرى يمكنك مراجعة درس جولة حول الأوامر البرمجية.

 




مصباح الطاولة الذكي

سنقوم في هذا المشروع بعمل مصباح طاولة ذكي باستخدام مستشعر الحركة  بحيث يضيء المصباح عند استشعار الحركة ويُطفأ عند عدم وجود حركة

 

makeblock-smart-lamp

 

الأدوات المطلوبة

makeblock-smart-lamp

Inventor Kit

 

تركيب الدائرة

سنستخدم في هذا المشروع القطع التالية

 

makeblock-smart-lamp

 

طريقة التوصيل

 

 

makeblock-smart-lamp
المنفذ القطعة الالكترونية
منفذ3 RGB LED
منفذ4 مستشعر الحركة PIR
منفذ6 المقاومة المتغيرة Potentiometer

برمجة المشروع

 

سنقوم ببرمجة المشروع بحيث يمكن التحكم بإضاءة RGB بطريقتين، إما التحكم بشدة الإضاءة عن طريق المقاومة المتغيرة وإما باستخدام مستشعر الحركة بحيث يضيء المصباح عند استشعار الحركة ويُطفأ عند عدم وجود حركة.

سنقوم بدايةً بإنشاء متغيرين
الأول ولنسميه LEDcount للتحكم بالإضاءة التدريجية حيث تحتوي وحدة RGB على 4 LED
وسنسمي المتغير الآخر Brightness للتحكم في شدة الإضاءة

 

makeblock-smart-lamp

 

يعطي مستشعر الحركة قيمتين إما 0 عند عدم وجود حركة أو 1 عند رصد الحركة

 

makeblock-smart-lamp

 

نضع جملة شرطية if  then بحيث عند رصد الحركة (قراءة المستشعر = 1) تتم إضاءة RGB بشكل تدريجي
يتم تعيين المتغير LEDcount على القيمة 0

 

makeblock-smart-lamp

 

نختار أن يتم تغير القيمة بقيمة 1 تدريجيا لتتم الإضاءة تدريجيا

 

makeblock-smart-lamp

 

للتحكم في شدة الإضاءة عبر المقاومة المتغيرة potentiometer
نستخدم الأمر البرمجي if…the.. else
ونقوم بوضع شرط بحيث يحدد أقل وأعلى قيمة للمقاومة
أقل قيمة = 0   ،  أعلى قيمة = 975

 

makeblock-smart-lamp

 

نقوم بتعيين قيمة المتغير Brightness لقراءة قيمة المقاومة المتغيرة potentiometer
أعلى شدة لإضاءة RGB تساوي 255
لذلك سنقوم بقسمة قيمة المقاومة على 4 لنحصل على قيم بين 0 – 255

 

makeblock-smart-lamp

ومن ثم تعيين قيمة شدة LED وفق قيمة المتغير Brightness

makeblock-smart-lamp

 

بعد الأمر else  نعين الإضاءة على 0 أي مطفأة

makeblock-smart-lamp

 

الكود البرمجي

 

makeblock-smart-lamp

 

للمزيد من المعلومات حول الكود يمكنك الرجوع لدرس جولة حول الأوامر البرمجية

 

 




مشروع Mood lamp

في هذا الدرس سوف نقوم بعمل مشروع جمالي قليلا وهو مشروع الـ Mood lamp او مصباح المزاج، وهو عبارة عن أنبوبة من الورق المقوى الخفيف وبداخله مجموعه من الـ LEDs ذات الألوان (حمراء، خضراء، زرقاء). يقوم هذا المصباح بتغيير الألوان بشكل جميل وسلس لإضافة الهدوء والراحة في المكان.

مشروع-mood-lamp-لإضافة-ديكور-مميز-لبيتك

المكونات المطلوبة

arduino uno r3

Arduino Uno

220 Ω resistor

220 Ohm – 330 Ohm Resistors

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

blue led 5mm

Blue LED

green led 5mm

Green LED

led 5mm red

Red LED

white-paper

ورق مقوى خفيف (أي شكل ترغب به، هذه لمستك الجمالية)

توصيل الدارة على لوحة التجارب

mood-lamp

 

mood-lamp

شرح المشروع

نقوم بتوصيل الـثلاثة LEDs على مخارج PWM من الأردوينو وعن طريق التحكم في نسبة الفولت الخارجة للـLED  نستطيع التحكم في شدة الإضاءة.

سبب اختيار ألوان الـ LED (الأحمر، الأخضر، الأزرق)، لأنها الألوان الرئيسية التي يمكن تكوين أي لون آخر منها عن طريق خلط النسب بين الثلاثة والعمل على تداخل الضوء بوضعهم بجانب بعضهم (وهذا ما يحدث حقيقة في RGB LED).

للتحكم في شدة الإضاءة يمكنك أن تكتب كود الأردينو (analogWrite(x  حيث x  تمتد من 0 الى 255 (و هذا نظير 0 الى 100% تقريبًا).

نقوم بفتح نافذة اختيار اللون color picker – والتي توجد غالبًا في برامج الجرافيك مثل الفوتوشوب- لإختيار قيم RGB حتى نقوم بعرض جميع ألوان الطيف فكانت النتيجة كالآتي:

مشروع-mood-lamp-لإضافة-ديكور-مميز-لبيتك

وبالتالي سوف نقوم بعمل دالتين decrease color ودالة أخرى increase color. كلتا الدالتين تأخذ معامل وهو اسم اللون الذي نريد أن نقوم بزيادته من 0 الى 255 او بنقصانه من 255 الى 0.

برمجة الأردوينو

#define LED_RED   11
#define LED_GREEN 10
#define LED_BLUE  9

void setup() {
  // Define the output LEDs
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
}

void loop() {
  increaseColor(LED_BLUE);
  decreaseColor(LED_RED);
  increaseColor(LED_GREEN);
  decreaseColor(LED_BLUE);
  increaseColor(LED_RED);
  decreaseColor(LED_GREEN);
}

void increaseColor(unsigned char colorPin) {
  for(int i=0; i<=255; i++) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

void decreaseColor(unsigned char colorPin) {
  for(int i=255; i>=0; i--) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

شرح الكود :

في البداية نقوم بتسمية مداخل الاردوينو حسب الـ LEDs  الموصلة معها، فالمدخل  9 موصل مع LED  الأزرق، والمدخل 10 موصل مع LED  الأخضر، ومدخل 11 موصل مع الأحمر.
ثم نقوم بتعريف هذه الأطراف كمخرج في دالة ()setup .

#define LED_RED   11
#define LED_GREEN 10
#define LED_BLUE  9

void setup() {
  // Define the output LEDs
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
}

في دالة ()loop نقوم بالتحكم في شدة اضاءة كل LEDs ودمج الألوان الثلاثة معا، وبهذه الطريقة نحصل على مزيج من الألوان تعتمد على شدة تركيز كل لون LED على حدة .
يتم التحكم في شدة إضاء كل LED عن طريق استدعاء الدالة increaseColor والدالة decreaseColor .

void loop() {
  increaseColor(LED_BLUE);
  decreaseColor(LED_RED);
  increaseColor(LED_GREEN);
  decreaseColor(LED_BLUE);
  increaseColor(LED_RED);
  decreaseColor(LED_GREEN);
}

الدالة increaseColor  تعمل على زيادة شدة اضاءة اللون تدريجيا. تقوم هذه الدالة باستخدام الدالة analogWrite(Pin_name,Vlaue) للتحكم في شدة الإضاءة، وبإستخدام for loop تبدأ شدة الاضاءة بالإزدياد تدريجيا من 0 إلى قيمة 255 .

/* هذه الدالة تقوم بعمل تأثير ناعم بزيادة قيمة اللون المطلوب منها من 0 الى 255 */
void increaseColor(unsigned char colorPin) {
  for(int i=0; i<=255; i++) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

تقوم الدالة decreaseColor  بتقليل شدة اضاءة الـ LED  تدريجيا. تعمل هذه الدالة بنفس طريقة الدالة السابقة increaseColor ، ولكن تستخدم الـ for loop لتقليل شدة الإضاءة من 255 إلى 0 .

/*
و هذه الدالة تفعل العكس
*/
void decreaseColor(unsigned char colorPin) {
  for(int i=255; i>=0; i--) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

باستخدام نفس التقنية مع باقي الـ LEDs يمكننا دمج الألوان بصورة رائعة لنحصل على Mood Lamp .