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

}




التحكم في محرك التيار المستمر بإستخدام L298

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

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

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

arduino uno r3

Arduino Uno

L298 Motor driver

L298 Motor Driver

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

H-Bridge :

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

فكرة عمله :

الصورة التالية توضح كيف يتركب الـ H-Bridge:

hbridge-arduino

عند تشغيل كلا الترانزستور 1 و 4 يعمل المحرك نحو الإتجاه الأول وعند تشغيل الترانزستور 2 و 3 يعمل المحرك في الإتجاه المعاكس للإتجاه السابق.

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

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

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

L298 Motor Driver

هو عبارة عن H-Bridge تم تجميعها ووضعها معا في IC ، ليتم استخدامها بسهولة.  يمكن إستخدام واحد من IC للتحكم في محركين في نفس الوقت. لكل محرك مخرج خاص به وأطراف تحكم خاصة.

l298-motor-driver

الاطراف المستخدمة

Output A طرفى المحرك
VCC طرف البطارية الموجب
5v 5v فى الاردوينو
GND gnd فى الاردوينو
IN1 12 فى الاردوينو
IN2 13 فى الاردوينو

شرح الدارة

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

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

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

 

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

 

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

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

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

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

#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) بمنفذ 12 و 13 للأردوينو . لذلك قمنا بتسمية كلا المنفذين للأردونو تبعا لما تم توصيله بالدارة.

نقوم بتعرف المتغيرات IN1 و IN2 ( أطراف الـ H-bridge الموصله بالاردوينو) كمخرج.

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 . تقوم هذه الدالة بتشغيل المحرك مع اتجاه عقارب الساعة لمدة 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);
}