التحكم بمحرك 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

}




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

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

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


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

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);
}




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

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

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

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

 

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، سيتم توليد النغمات المختلفة باستخدام الأردوينو وسماعة البيزو .  كل مفتاح يصدر صوت بنغمة ذو تردد مختلف.

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

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

شرح الكود:

في البداية نقوم بتعريف متغيرات لإستخدامها في تسجيل حالة الـ 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);
	}

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




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

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

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

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

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

شرح الدارة

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

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

 

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

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

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

الكود

 شرح الكود :

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

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

#define TRIG  3

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

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

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

نقوم بتهيئة الشاشة 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
}

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

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

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

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

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




مشروع 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 .




التحكم بمحرك DC باستخدام المرحل (Relay)

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

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

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

arduino uno r3

Arduino Uno

Relay module 5v

Relay Module 5v

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

المرحل Relay

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

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

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

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

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

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

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

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

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

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

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

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

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

التوصيل :

 الأردوينو المرحل
طرفى المحرك  طرفى COM
طرف البطارية الموجب  طرفى NO
طرف البطارية السالب  طرفى NC
 Vcc  Vcc
Gnd   GND
منفذ 12  IN1
منفذ 13  IN2

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

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

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

يدور المحرك في الاتجاه الاول لمدة 3 ثوان ثم يتوقف مدة 3 ثوان و يدور فى الاتجاه المضاد لمده 3 ثوان ثم يتوقف مدة 3 ثوان اخرى وهكذا حتى يتم فصل التيار الكهربائي

#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);
}

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

هنا قمنا بضبط المخارج الموصولة على الدارة المتكاملة 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
}

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

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، تقوم بتحريك المحرك بإتجاه عقارب الساعة. تتم هذه العملية عن طريق جعل قيمة IN1  للمرحل 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 بشكل مشابه للدالة السابقة، إلا أنها تعكس اتجاه دوران المحرك. تتم هذه العملية عن طريق جعل قيمة IN2 للمرحل HIGH، وIN1 قيمة LOW .

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);
}



استخدام عصا التحكم joystick مع الاردوينو

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

استخدام-عصا-التحكم-joystick-مع-الاردوينو

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

arduino uno r3

لوحة الأردوينو (Arduino Uno)

عصا التحكم ( Joystick)

Full size breadboard 830

لوح التجارب (Breadboard)

Breadboard Jumper Wire 65 pcs

أسلاك توصيل (Wires)

عصا التحكم Joystick

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

استخدام-عصا-التحكم-joystick-مع-الاردوينو

تتكون عصا التحكم من مقاومتين متغيرتين للتحكم بمحاور الاتجاه X  و Y . يؤدي تحريك عصا التحكم  إلى تغيير في قيمة المقاومتان. ويتم تمثيل موضع عصا التحكم بنقطة يتم وصفها على محاور X,Y .

joystick-arduino

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

joystick-arduino

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

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

استخدام-عصا-التحكم-joystick-مع-الاردوينو

استخدام-عصا-التحكم-joystick-مع-الاردوينو

التوصيل :
Arduino Joystick
5v Vcc
Gnd Gnd
A0 VRx
A1 VRy

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

شرح الكود :

قمنا بتعريف متغيرين xVal، yVal إحداهما لتخزين قيمة X  والأخر لتخزين قيمة Y  ، حيث تمثل القيميتين موضع/موقع عصا التحكم.
في دالة التهيئة قمنا بتفعيل شاشة الاتصال التسلسلي، ثم ضبط الأطراف الموصله مع عصا التحكم كمدخل.

int xVal;                 //X values from joystick
int yVal;                 //Y values from joystick

void setup() {
  Serial.begin(9600);     //Starts serial at 9600 baud
  pinMode(A0, INPUT);     //Sets the analog ports used to an input
  pinMode(A1, INPUT);
}

نقوم بقراءة قيم X  و Y  ثم عرض النتائج على شاشة الاتصال التسلسلي باستخدام الدالة (Serial.print(value .

void loop() {
  xVal = analogRead(A0);  //read the X value
  yVal = analogRead(A1);  //read the Y value
  Serial.print(" Y = ");
  Serial.print(yVal);     //prints Y value
  Serial.print(" X = ");
  Serial.println(xVal);   //prints X value
  delay(1000);            // so that we dont get a spam on the serial monitor
}




التحكم بالاردوينو من خلال windows 10

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

windows-remote-arduino-experience

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

الأدوات التي تحتاجها لهذا المشروع :

(Bluetooth Module(HC-06

Diffused RGB 5mm LED

RGB 5mm LED

220 Ω resistor

مقاومة 220 اوم

potentiometer 10k

Potentiometer 10K Ω

Half-size Breadboard

 لوح تجارب حجم متوسط (Half size breadboard)

arduino uno r3

Arduino Uno R3

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

Jumper Wires Male/Male

سلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

ما هو Windows Remote Arduino وماذا يمكنك أن تفعل من خلاله؟

windows Remote Arduino  هي مكتبة ويندوز مفتوحة المصدر التي تسمح لأي جهاز ويندوز 10 -سواء كان هاتف ويندوز أو جهاز كمبيوتر أو حتى راسبيري باي 2 – التحكم بالاردوينو عن بعد.
تمكن المكتبة للمطورين من دمج أجهزة الاستشعار الخاصة بالاردوينو في مشاريع windows  الخاصة بهم . يمكنك العثور على المكتبة الخاصة لـ Windowd Remote Arduino  على الصفحة هنـا.

Windows Remote Arduino قادرة على التحكم بالوظائف التالية للأردوينو:
1- المداخل و المخارج الرقمية و التناظرية.
– الكتابة الرقمية.
– قراءة رقمية.
– الكتابة التناظرية (PWM).
– قراءة تناظرية.
– تعيين Pin Mode.
– تلقي الإشارات في حالة تم تغيير قيم الـ pins .
2- إرسال و إستقبال البيانات بين جهازين عبر I2C .

windows-remote-arduino-experience

للمستخدمين المتقدمين، تتيح Windows Remote Arduino  أوامر مخصصة عبر Firmata SysEx – يمكن الإطلاع على مزيد من المعلومات هنـا.

تصميم لوحة التجارب:

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

windows-remote-arduino-experience

يمكنك الاطلاع على الدرس الرابع لمعرفة طريقة توصيل الـ RGB LED.

لتبدأ التحكم بالأردوينو بإستخدام التطبيق Windows Arduino Experience ، قم بإتباع الخطوات الثلاثة :
1- تهيئة الاردوينو.
2- تهيئة جهاز Windows 10.
3- إجراء عملية الإتصال و التحكم .

تهيئة الأردوينو:

قم بتنزيل مكتبة “Arduino Firmata ” قم بإتباع الخطوات التالية :
إذهب إلى الشيفرة البرمجية (Sketch menu) / إدراج مكتبة (Include Library)  /  إدارة المكتبات (Manage Library)  ثم قم بالبحث عن “ “Firmataو قم بتنزيل أخر إصدار للمكتبة.
الآن قم بفتح   “StandardFirmata”من ملف (File) / أمثلة StandardFirmata / Firmata /  Examples   .

قم بالعديل baud rate على الكود

Firmata.begin(9600);

ثم قم برفع الكود على الأردوينو.

تهيئة جهاز الويندوز :

لتنزيل تطبيق Windows Remote Arduino Experience من هنـا.

قم بتفعيل البلوتوث على جهازك ثم قم بالاقتران الى البلوتوث عن طريق ادخال كلمة المرور الافتراضية  1234 او   0000.

windows-remote-arduino-experience

إجراء عملية الإ تصال و التحكم :

قم بفتح تطبيق windows ، بمجرد اختيار الاعدادات الصحيحة ، قم بإختيار البلوتوث HC-06 ثم انقر فوق  “Connect” للإتصال بالاردوينو عن بعد.

windows-remote-arduino-experience

قم بالتحكم بالـ RGB LED من خلال نافذة PWM :

windows-remote-arduino-experience

كما يمكنك قراءة القيم التناظرية للمقاومة المتغيرة عبر النافذة Analog :

windows-remote-arduino-experience



نظام انذار الحريق

أنظمة الكشف عن الحريق تلعب دورا هاما في الحماية و السلامة من الحرائق. في هذا المشروع، سنقوم ببناء نظام إنذار الحريق بإستخدام الأردوينو و مستشعر كاشف اللهب.

arduino-fire-alarm-system

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

الأدوات التي تحتاجها لهذا المشروع :

flame sensor

حساس كاشف اللهب (Flame Sensor)

Piezo sounder

Piezo sounder

small size breadboard 170 colors

  لوح تجارب صغير (small size breadboard)

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

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

arduino-fire-alarm-system

زاوية الرؤية:
زاوية الرؤية 60 درجة، و بالتالي فإنة توجية رؤية المستشعر أمر مهم للغاية في تصاميم المشاريع الخاصة بك.

arduino-fire-alarm-system

الطول الموجي لمستشعر اللهب:
وحدة مستشعر اللهب لها قدرة بالكشف عن الموجات من 760nm إلى 1100nm .

ملاحظة : يتم إستخدام مستشعر اللهب للكشف عن الحريق دون أي حماية للمستشعر من الحريق، يرجى ترك مسافة بينه وبين النار لتجنب أي ضرر.

تصميم لوحة التجارب:

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

arduino-fire-alarm-system

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

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

int Buzzer = 13; // Use the onboard Uno LED
int isFlamePin = 7; // This is our input pin
int isFlame = HIGH; // HIGH MEANS NO FLAME

void setup() {
 pinMode(Buzzer, OUTPUT);
 pinMode(isFlamePin, INPUT);
 Serial.begin(9600);
 
}

void loop() {
 isFlame = digitalRead(isFlamePin);
 if (isFlame== LOW)
 {
 Serial.println("FLAME, FLAME, FLAME");
 digitalWrite(Buzzer, HIGH);
 }
 else
 {
 Serial.println("no flame");
 digitalWrite(Buzzer, LOW);
 }
}

لمحة عن الكود:

في جزء الـ Loop يتم بإستمرار قراءة  قيمة مستشعر اللهب :

 isFlame = digitalRead(isFlamePin);

إذا كانت القيمة تساوي LOW سيتم تفعيل جهاز الإنذار و عكس ذلك يتم إلغاء التفعيل :

 if (isFlame== LOW)
 {
 Serial.println("FLAME, FLAME, FLAME");
 digitalWrite(Buzzer, HIGH);
 }
 else
 {
 Serial.println("no flame");
 digitalWrite(Buzzer, LOW);
 }

التحقق من عملية الكشف عن اللهب و ضبط الحساسية :

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

arduino-fire-alarm-system



التحكم بالروبوت عبر الهاتف الذكي

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

bluetooth-controlled-robot-car

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

الأدوات التي تحتاجها لهذا المشروع :

4WD Robot Chassis kit

L298 Motor driver

L298 H bridge Module

serial port bluetooth module hc-06

وحدة البلوتوث (HC-06)

battery holder

حامل البطارية

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر  (Jumper Wires Male Male)

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

 

ما هو الروبوت ؟

الروبوت هو جهاز كهروميكانيكي قادر على التفاعل بطرية أو بأخرى مع بيئته، و اتخاذ قرارات مستقلة أو إجراءات من أجل تحقيق مهنمة محددة.
يتكون الروبوت من العناصر التالية:
1- الهيكل.
2- المشغل الميكانيكي .
3- وحدة التحكم.
4-المدخلات/ الحساسات.
5- امدادات الطاقة.
في الخطوات التالية سنذكر كل عنصر من العناصر المذكورة اعلاه، بحث يمكن أن نفهمها بسهولة.

الهيكل (Structure / Chassis) :

smartphone-controlled-arduino-robot

يتألف الهيكل من المكونات الفزيائية. الروبوت يتكون من مكون او اكثر من المكونات الفزيائية التي تتحركة لتنفيذ مهام معينة. وفي حالتنا هيكل السيارة و العجلات تمثل هيكل الروبوت

المشغل الميكانيكي Actuator :

smartphone-controlled-arduino-robot

المحرك هو جهاز يقوم بتحويل الطاقة (في مجال الروبوت، تكون الطاقة الكهربائية) الى طاقة حركية. تنتج معظم المحركات إما الحركة الدورانية أو الخطية.
في حالتنا المحرك هو(DC Gear motor)  وهو بالاساس عبارة عن محرك  DC مركب مع علبة تروس (gear) تعمل على تقليل سرعة المحرك و زيادة عزم الدورات .

إعداد أطراف المحركات :

قطع اربع قطع من أسلاك (الحمراء و السوداء) مع طول حوالي 5-6 انش. قم بتجريد السلك من العازل في كل نهاية , ثم قم بلحم الأسلاك على المحركات.

smartphone-controlled-arduino-robot

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

تركيب المحرك :

smartphone-controlled-arduino-robot

لاحظ أن الأسلاك على كل محرك تشير الى إتجاه مركز الهيكل.

smartphone-controlled-arduino-robot

قم بضم اثنان من الأسلاك الحمراء و اثنان من الاسلاك السوداء معا على كل جانب من جوانب الهيكل. بعد الانضمام, سيكون لديك اثنان من النهايات على الجانب الايمن و اثنان على الجانب الأيسر.

تثبيت السقف العلوي:

بعد تركيب الاربع محركات في الطابق السفلي، قم بتركيب السقف العلوي. ثم قم بسحب نهايات الاسلاك نحو السطح العلوي.

smartphone-controlled-arduino-robot

هناك حاجة إلى المتحكم (العقل) لتحريك الروبوت من مكان إلى أخر. المتحكم له القدرة على تنفيذ برنامج و يكون مسؤولا عن جميع العمليات الحسابية، واتخاذ القرارات، و الاتصال . في هذا المشروع سيتم استخدام متحكمArduino  كـوحدة تحكم.

يمكنك استخدام وحدة التحكم لدوران المحركات في إتجاه واحد. ولكن اذا كنت تريد أن تكون  قادر على التحكم في المحرك بإتجاهات مختلفة (الأمام ،الخلف، يمين، ويسار) مع لوحة التحكم, فإنك بحاجة إلى مزيد من الدوائر . انت بحاجة إلى H-Bridge.

 L298  H Bridge Module

smartphone-controlled-arduino-robot

H-Bridge، يقوم بتحريك محرك الـ DC بإتجاه الامام و الخلف. وهو يتكون من اربع مفاتيح الكترونية S1,S2,S3,S4  (Transistors / MOSFETS / IGBT).

smartphone-controlled-arduino-robot

الية العمل: انظر للصورة اعلاه لفهم ألية العمل للـ H-Bridge . المفاتيح في نفس الجهة إما (S1,S2) أو  (S3,S4)لا يتم إغلاقهم بنفس الوقت , سيتم حدوث ماس كهربائي .
H-bridge توفر لك دائرة متكاملة، أو يمكنك أن تقوم ببناء الدائرة بنفسك عن طريق إستخدام اربع Transistor او MOSFETs. في هذا المشروع سيتم استخدام  L298 H-bridge Module الذي يمكن من خلاله التحكم في سرعة واتجاه المحركات.

وصف مداخل و مخراج الـ L298H-bridge Module : 

smartphone-controlled-arduino-robot

توصيل الأسلاك الكهربائية

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

smartphone-controlled-arduino-robot

MOTOR A هو المسؤول عن المحركات على الجانب الأيمن, وفي المقابل يتم ربط المحركات على الجانب الايسر للـ MOTOR B.

اتبع التعليمات التالية ليتم توصيل كل شي :

smartphone-controlled-arduino-robot
يمكنك العودة لمشروع نظام التحكم في الإضاءة عبر البلوتوث للإطلاع على الشرح المتعلق بوحدة البلوتوث .

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

في الكود البرمجي سنقوم بمراجعة البيانات الواردة وتنفيذ عملية المقارنة ، اذا كانت البيانات المستقبلة من الهاتف الذكي F يتم تحريك الروبوت للأمام و إذا كانت B يتم تحريكه للخلف و اذا كانت R  يتم تغير حركة لليمين و L  للتحرك لليسار. ويتم إيقافة إذا كانت البيانات المستقبلة 0 .

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

char data = 0;            //Variable for storing received data
#define right1 7 //IN1
#define right2 8
#define rightE 9
#define left1 6
#define left2 5
#define leftE 10

void Forward(); 
void Backward(); 
void Left(); 
void Right(); 
void Stop1(); 

void setup()
{
   Serial.begin(9600);   //Sets the baud for serial data transmission                               
   pinMode(left1, OUTPUT); 
   pinMode(left2, OUTPUT); 
   pinMode(leftE, OUTPUT); 
   pinMode(right1, OUTPUT);
   pinMode(right2, OUTPUT);
   pinMode(rightE, OUTPUT);
   delay(1000);
}
void loop()
{
   if(Serial.available() > 0)      
   {
     data = Serial.read();        //Read the incoming data & store into data    
      switch (data){
        case 'F':
            Forward();
            break; 
        case 'B':
            Backward();
            break; 
        case 'L':
           Left();           
           break; 
        case 'R':
           Right(); 
           break; 
        case '0':
           Stop1();
           break; 
      }
  } 
}
void Forward(){
  digitalWrite(right1,1); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 255);      
  digitalWrite(left1,1); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 255);                                                                                                                                                                                                                                                        
}
void Backward(){
  digitalWrite(right1,0); 
  digitalWrite(right2,1); 
  analogWrite(rightE, 255); 
  digitalWrite(left1,0); 
  digitalWrite(left2,1); 
  analogWrite(leftE, 255); 
}
void Left(){
  digitalWrite(right1,1); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 255); 
  digitalWrite(left1,0); 
  digitalWrite(left2,1); 
  analogWrite(leftE, 255); 
  
}
void Right(){
  digitalWrite(right1,0); 
  digitalWrite(right2,1); 
  analogWrite(rightE, 255); 
  digitalWrite(left1,1); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 255); 
}
void Stop1(){
  digitalWrite(left1,0); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 0); 
  digitalWrite(right1,0); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 0); 
}

 شرح الكود :

أولا لفعم الية العمل قم بالاطلاع على الجدول التالي. هو مفيد جدا أثناء كتابة التعليمات البرمجي :

smartphone-controlled-arduino-robot

في قسم الـ Loop يتم قراءة البيانات التي تم إرسالها من قبل الهاتف الذكي ثم يتم التحقق منها. فمثلا إذا كانت حرف “F” يتم إستدعاء الدالة Forward()ليتم تحريك الروبوت إلى الأمام ،وإذا كات حرف “B” يتم إستدعاء الدالة backward() ليتم تحريك الروبوت للخلف.

data = Serial.read();        //Read the incoming data & store into data    
      switch (data){
        case 'F':
            Forward();
            break; 
        case 'B':
            Backward();
            break; 
        case 'L':
           Left();           
           break; 
        case 'R':
           Right(); 
           break; 
        case '0':
           Stop1();
           break; 
      }

نقوم بإنشاء الدالة Forward() , Backward() , Right(),Left() لتحكم في إتجاهات الروبوت.
و الدالة Stop1() لإيقاف حركة الروبوت

void Stop1(){
  digitalWrite(left1,0); 
  digitalWrite(left2,0); 
  analogWrite(leftE, 0); 
  digitalWrite(right1,0); 
  digitalWrite(right2,0); 
  analogWrite(rightE, 0); 
}

تطبيق الاندرويد

في هذا المشروع لن يتم تغطية طريقة برمجة تطبيق الاندرويد , يمكنك تحميل البرنامج من هنا

كيف يمكن استخدام التطبيق؟
1- قم بتنزيل البرنامج من هنا
2- قم بإقتران جهازك مع البلوتوث   HC-06:
– تشغيل البلوتوث HC-06.
– تفحص الجهاز المتوفر .
-يتم الاقتران الى البلوتوث عن طريق ادخال كلمة المرور الافتراضية  1234 او   0000.
3- قم بفتح التطبيق , ثم قم بالضغط على زر الاجهزة المقترنة  ثم قم بإختيار وحدة البلوتوث الخاصة بك (HC-06) .

smartphone-controlled-arduino-robot

قم بالضغط على الأسهم لتغير حركة الروبوت و على زر Stop لإيقاف الحركة .

smartphone-controlled-arduino-robot



التحكم بالـ LED عن طريق التصفيق

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

arduino-sound-detection-sensor

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

الأدوات التي تحتاجها لهذا المشروع :

sound detection sensor

حساس الصوت Sound Detection Sensor

5mm Red LED

220 Ω resistor

مقاومة 220 اوم

small size breadboard 170 colors

small size breadboard  لوح تجارب صغير

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

سلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

حساس كاشف الصوت Sound Detection Sensor

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

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

 arduino-microphone

لتكون قادر على الكشف عن الإشارات يجب أن تكون كبيرة بما يكفي، فيجب  تضخيم الإشارة لتكون قابلة للإستخدام من قبل الاردوينو. لذا يجب علينا توصيل الميكروفون إلى مكبر للصوت (amplifier) ، فيتم تضخيم الاشارة ليتم الكشف عنها من قبل للأردوينو. اذا من أجل بناء هذة الدائرة نحن بحاجة إلى ميكروفون يتم توصيله إلى مكبر صوت (audio Amplifier)  للحصول على إشارات مضخمة.

في هذا المشروع سيتم استخدام  sounder detection module للكشف عن الصوت . في هذة اللوحة تم توصيل الميكروفون على مكبر  للصوت (LM939 op amp) ، و ويمكنك ضبط نقطة التحديد (threshold) لمستوى الصوت عن طريق المقاومة المتغيرة (Potentiometer) ، فعد تجاوز الصوت هذة النقطة يتم إضاءة الضوء LED .

الصوة  أدناه توضح التفاصيل للضوابط و المنافذ و المكونات الأساسية للوحة كاشف الصوت :

arduino-sound-detection-sensor

تصميم لوحة التجارب:

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

arduino-sound-detection-sensor

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

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

int digPin = 2;       
int greencar = 13;                                 
void setup(){
      Serial.begin(9600);
      pinMode(digPin, INPUT);
      pinMode(greencar, OUTPUT); 
 }
void loop(){
      if (digitalRead(digPin)){
        digitalWrite(greencar, HIGH);
        Serial.print("Sensore: ");
        Serial.println(digitalRead(digPin));
        delay(1000);
      }
      
      if (digitalRead(greencar)){
        if (digitalRead(digPin)){
          digitalWrite(greencar, LOW);

          delay(1000);
        }
      }
    }

لمحة عن الكود:

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

 if (digitalRead(digPin)){
        digitalWrite(greencar, HIGH);
        Serial.print("Sensore: ");
        Serial.println(digitalRead(digPin));
        delay(1000);
      }

واذا تم الكشف عن صوت للمرة الثانية يتم التحقق ما اذا كان الـ  LED في حالة التشغيل أو الإيقاف، فإذا كان في حالة التشغيل يتم إطفاءه :

 if (digitalRead(greencar)){
        if (digitalRead(digPin)){
          digitalWrite(greencar, LOW);

          delay(1000);
        }
      }



نظام حماية الخزنة

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

security-alarm-system-project

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

الأدوات التي تحتاجها لهذا المشروع :

matrix keypad 4x4

Matrix Keypad 4×4

 مستشعر الموجات فوق الصوتية (Ultrasonic Sensor HC-SR04)

Piezo sounder

Piezo sounder

HD44780

LCD 16×2 شاشة

potentiometer 10k

Potentiometer 10K Ω

220 Ω resistor

مقاومة 220 اوم

Full size breadboard 830

  لوح تجارب كبير (Full size breadboard)

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

نظرة عامة

لتفعيل نظام الحماية  في البداية يتم تفعيل أنظمة الانذار بعد 10 ثواني من الضغط على الزر A. وللكشف عن الأجسام يتم استخدام جهاز استشعار الموجات فوق الصوتية (Ultrasonic Sensor) ، في حال الكشف عن وجود جسم قريب يبدأ تفعيل صفارة الانذار (Buzzer) . ولإيقاف صفارة الانذار أنت بحاجة لادخال كلمة المرور المكونة من 4 أرقام ثم الضغط على زر النجمة للتحقق ما اذا كانت الكلمة المدخلة صحيحة او لا . تم وضع كلمة السر الحالية  1234 ولكن لديك ايضا امكانية تغيرها.

security-alarm-system-project

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

security-alarm-system-project

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

 

لوحة المفاتيح Keypad

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

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

security-alarm-system-project

لوحة المفاتيح 4×4  تتكون من 8-Pins  ، أربعة منهم للصفوف و أربعة منهم للأعمدة . كل زر بالواقع عبارة عن مفتاح (Push button)عند الضغط يتم التوصيل بين الصف و العامود.

security-alarm-system-project

على سبيل المثال : اذا وضع على الصف الأول  (Row 1قيمة LOW) ، وجميع الأعمدة قيمة HIGH ، عندما يتم الضغط على الزر الثالث ، سيتم التوصيل بين الصف الأول والعامود الثالث فسوف تصبح قيمة العامود الثالث LOW، وبالتالي يمكننا معرفة الزر الذي تم الضغط عليه.

تصميم لوح التجارب

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

security-alarm-system-project

توصيل لوحة المفاتيح :

الأردوينو لوحة المفاتيح
Pin A0  الصف الأول
Pin A1 الصف الثاني
Pin 6 الصف الثالث
Pin 7 الصف الرابع
Pin A5 العامود الأول
Pin A4 العامود الثاني
Pin A3 العامود الثالث
Pin A2 العامود الرابع

 قم بإضافة توصيل باقي القطع الإلكترونية كما هو موضح بالصورة التالية :

security-alarm-system-project

توصيل  شاشة الـ LCD :

Arduino LCD
Pin 12 RS pin
Pin 11 Enable pin
Pin 5 D4 pin
Pin 4 D5 pin
Pin 3 D6 pin
Pin 2 D7 pin
توصيل حساس الموجات فوق الصوتية (Ultrasonic Sensor) :
Ultrasonic Sensor Arduino
VCC +5V
Trig Pin 10
Echo Pin 9
Ground GND
توصيل Buzzer:
Buzzer Arduino
Shorter lead GND
Longer lead Pin 8

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

لفهم الكود بشكل أفضل ، سيتم شرح الكود على أقسام وفي النهاية سأقوم بوضع الكود الكامل.

قم بتنزيل المكتبة الخاصة بلوحة المفاتيح KeyPad من هنـا او من خلال الرابط المباشر هنـا .

أولا نحن بحاجة الى مكتبة الـ LCD   و مكتبة لوحة المفاتيح. ثم تحديد و تعريف المتغيرات لدبابيس جهاز الانذار  (Buzzer)و جهاز استشعار الموجات فوق الصوتية  (Ultrasonic)، و تعريف بعض المتغيرات اللازمة لهذا المشروع.

#include <LiquidCrystal.h> // includes the LiquidCrystal Library 
#include <Keypad.h>
#define buzzer 8
#define trigPin 10
#define echoPin 9
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg =0;
String password="1234";
String tempPassword;
boolean activated = false; // State of the alarm
boolean isActivated;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean enteredPassword; // State of the entered password to stop the alarm
boolean passChangeMode = false;
boolean passChanged = false;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keypressed;
//define the cymbols on the buttons of the keypads
char keyMap[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {A0,A1,6,7};
byte colPins[COLS] = {A5,A4,A3,A2};  //Column pinouts of the keypad
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 

في قسم الأعداد (setup)، نحن بحاجة لتهيئة الـ LCD وتحديد ما اذا كان الـ Pin الخاص بالمستشعر و جهاز الانذار مدخل او مخرج .

void setup() { 
  lcd.begin(16,2); 
  pinMode(buzzer, OUTPUT); // Set buzzer as an output
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}

في القسم Loop، نحن أولا بحاجة للتحقق ما اذا تم تفعيل أنظمة الانذار او لا. فإذا لم يتم التفعيل ، سيتم ظهور القائمة الرئيسية على شاشة الـ LCD التي تقدم خيارين ، خيار A لتفعيل الانذار وخيار B لتغير كلمة المرور.
ثم استخدام ()myKeypad.getKey لقراءة الزر الذي تم الضغط عليه من لوحة المفاتيح ، اذا تم الضغط على زر A ، يتم تفعيل جهاز الانذار لمدة200 milliseconds و تصبح قيمة المتغير activeAlarm =true.

if (!alarmActivated) {
if (screenOffMsg == 0 ){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A - Activate");
lcd.setCursor(0,1);
lcd.print("B - Change Pass");
screenOffMsg = 1;
}
keypressed = myKeypad.getKey();
if (keypressed =='A'){ //If A is pressed, activate the alarm
tone(buzzer, 1000, 200);
activateAlarm = true; 
}

في حالة تم الضغط على زر A يتم تفعيل الانذار و يتم طباعة الرسالة “Alarm will be activated in” على شاشة الـ LCD و عن طريق استخدام while loop يتم انشاء عداد تنازلي لمدة 9 ثواني قبل تفعيل الانذار .
ثم يتم ظهور الرسالة “Alarm Activated ” على الشاشة ويتم حساب المسافة الأولية بين نظام الامن (بإستخدام حساس الموجات فوق الصوتية ) و اي جسم امامه .

if (activateAlarm) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alarm will be");
lcd.setCursor(0,1);
lcd.print("activated in");
int countdown = 9; // 9 seconds count down before activating the alarm
while (countdown != 0) {
lcd.setCursor(13,1);
lcd.print(countdown);
countdown--;
tone(buzzer, 700, 100);
delay(1000);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alarm Activated!");
initialDistance = getDistance();
activateAlarm = false;
alarmActivated = true;

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

if (alarmActivated == true){
currentDistance = getDistance() + 10;
if ( currentDistance < initialDistance) {
tone(buzzer, 1000); // Send 1KHz sound signal 
lcd.clear();
enterPassword();
}
}

()enterPassword  هذة الدالة تقوم بطباعة رسالة على الشاشة توضح بها أن جهاز الانذار مفعل , وأننا بحاجة إلى إدخال كلمة السر من أجل إيقاف الانذار. وبإستخدام الـ while Loop سيتم التحقق باستمرار ما اذا تم ضغط زر على لوحة المفاتيح ، وكل زر يتم ضغطة يتم اضافته إلى متغير tempPassword. اذا تم ادخال اكثر من 4 ارقام او رمز # يتم مسح الادخال القديم و يمكنك اعادة ادخال كلمة المرور.

void enterPassword() {
  int k=5;
  tempPassword = "";
  activated = true;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" *** ALARM *** ");
  lcd.setCursor(0,1);
  lcd.print("Pass>");
      while(activated) {
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
          tempPassword += keypressed;
          lcd.setCursor(k,1);
          lcd.print("*");
          k++;
        }
      }
      if (k > 9 || keypressed == '#') {
        tempPassword = "";
        k=5;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(" *** ALARM *** ");
        lcd.setCursor(0,1);
        lcd.print("Pass>");
      }
      if ( keypressed == '*') {
        if ( tempPassword == password ) {
          activated = false;
          alarmActivated = false;
          noTone(buzzer);
          screenOffMsg = 0; 
        }
        else if (tempPassword != password) {
          lcd.setCursor(0,1);
          lcd.print("Wrong! Try Again");
          delay(2000);
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(" *** ALARM *** ");
          lcd.setCursor(0,1);
          lcd.print("Pass>");
        }
      }    
    }
}

و من ناحية أخرى إذا تم الضغط على زر النجمة سوف يتم التحقق ما اذا كانت الكلمة المدخلة صحيحة او لا. اذا كانت الكلمة صحيحة سيتم إيقاف الانزار و سيتم الرجوع الى الشاشة الرئيسية على شاشة الـ LCD. واذا تم ادخال كلمة مرور خاطئة يتم ظهور الرسالة (!Wrong! Try Again) و سيكون لدينا محاولة لإدخال كلمة المرور الصحيحة مرة أخرى .
لتغير كلمة المرور نستخدم طريقة مماثلة . أولا سنحتاج إلى ادخال كلمة المرور الحالية لتكون قادر على تعيين كلمة المرور الجديدة.

الكود التالي هو البرنامج الكامل قم برفعه على الاردوينو:

#include  // includes the LiquidCrystal Library 
#include 
#define buzzer 8
#define trigPin 10
#define echoPin 9
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg =0;
String password="1234";
String tempPassword;
boolean activated = false; // State of the alarm
boolean isActivated;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean enteredPassword; // State of the entered password to stop the alarm
boolean passChangeMode = false;
boolean passChanged = false;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keypressed;
//define the cymbols on the buttons of the keypads
char keyMap[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {A0,A1,6,7};
byte colPins[COLS] = {A5,A4,A3,A2};  //Column pinouts of the keypad
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 
void setup() { 
  lcd.begin(16,2); 
  pinMode(buzzer, OUTPUT); // Set buzzer as an output
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}
void loop() {
  if (activateAlarm) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Alarm will be");
    lcd.setCursor(0,1);
    lcd.print("activated in");
   
    int countdown = 9; // 9 seconds count down before activating the alarm
    while (countdown != 0) {
      lcd.setCursor(13,1);
      lcd.print(countdown);
      countdown--;
      tone(buzzer, 700, 100);
      delay(1000);
    }
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Alarm Activated!");
    initialDistance = getDistance();
    activateAlarm = false;
    alarmActivated = true;
  }
  if (alarmActivated == true){
      currentDistance = getDistance() + 10;
      if ( currentDistance < initialDistance) { tone(buzzer, 1000); // Send 1KHz sound signal lcd.clear(); enterPassword(); } } if (!alarmActivated) { if (screenOffMsg == 0 ){ lcd.clear(); lcd.setCursor(0,0); lcd.print("A - Activate"); lcd.setCursor(0,1); lcd.print("B - Change Pass"); screenOffMsg = 1; } keypressed = myKeypad.getKey(); if (keypressed =='A'){ //If A is pressed, activate the alarm tone(buzzer, 1000, 200); activateAlarm = true; } else if (keypressed =='B') { lcd.clear(); int i=1; tone(buzzer, 2000, 100); tempPassword = ""; lcd.setCursor(0,0); lcd.print("Current Password"); lcd.setCursor(0,1); lcd.print(">");
      passChangeMode = true;
      passChanged = true;   
      while(passChanged) {      
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
         tempPassword += keypressed;
         lcd.setCursor(i,1);
         lcd.print("*");
         i++;
         tone(buzzer, 2000, 100);
        }
      }
      if (i > 5 || keypressed == '#') {
        tempPassword = "";
        i=1;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Current Password");
        lcd.setCursor(0,1);
        lcd.print(">"); 
      }
      if ( keypressed == '*') {
        i=1;
        tone(buzzer, 2000, 100);
        if (password == tempPassword) {
          tempPassword="";
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Set New Password");
          lcd.setCursor(0,1);
          lcd.print(">");
          while(passChangeMode) {
            keypressed = myKeypad.getKey();
            if (keypressed != NO_KEY){
              if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
                  keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
                  keypressed == '8' || keypressed == '9' ) {
                tempPassword += keypressed;
                lcd.setCursor(i,1);
                lcd.print("*");
                i++;
                tone(buzzer, 2000, 100);
              }
            }
            if (i > 5 || keypressed == '#') {
              tempPassword = "";
              i=1;
              tone(buzzer, 2000, 100);
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("Set New Password");
              lcd.setCursor(0,1);
              lcd.print(">");
            }
            if ( keypressed == '*') {
              i=1;
              tone(buzzer, 2000, 100);
              password = tempPassword;
              passChangeMode = false;
              passChanged = false;
              screenOffMsg = 0;
            }            
          }
        }
      }
    }
   }
 }
}
void enterPassword() {
  int k=5;
  tempPassword = "";
  activated = true;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" *** ALARM *** ");
  lcd.setCursor(0,1);
  lcd.print("Pass>");
      while(activated) {
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
          tempPassword += keypressed;
          lcd.setCursor(k,1);
          lcd.print("*");
          k++;
        }
      }
      if (k > 9 || keypressed == '#') {
        tempPassword = "";
        k=5;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(" *** ALARM *** ");
        lcd.setCursor(0,1);
        lcd.print("Pass>");
      }
      if ( keypressed == '*') {
        if ( tempPassword == password ) {
          activated = false;
          alarmActivated = false;
          noTone(buzzer);
          screenOffMsg = 0; 
        }
        else if (tempPassword != password) {
          lcd.setCursor(0,1);
          lcd.print("Wrong! Try Again");
          delay(2000);
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(" *** ALARM *** ");
          lcd.setCursor(0,1);
          lcd.print("Pass>");
        }
      }    
    }
}
// Custom function for the Ultrasonic sensor
long getDistance(){
  //int i=10;
  
  //while( i<=10 ) {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance = duration*0.034/2;
  //sumDistance += distance;
  //}
  //int averageDistance= sumDistance/10;
  return distance;
}