اردوينو – الدرس الرابع عشر – محرك التيار المستمر DC motor

مقدمة

في هذا الدرس ستتعلم كيف تتحكم بدوران محرك التيار المستمر الصغير DC Motor بإستخدام الاردوينو.

ستقوم بإستخدام خاصية تغيير المخرج التناظري ‘Pulse Width Modulation – pwm’ بالاردوينو وذلك للتحكم في سرعة المحرك عبر ارسال رقم مابين 0 و 255 من شاشة الاتصال التسلسلي Serial Monitor.

محرك التيار المستمر الصغير

المواد والأدوات

محرك التيار المستمر الصغير

محرك التيار المستمر الصغير (6V DC Motor)

PN2222 Transistor

(PN2222 Transistor)

1N4001 diode

صمام ثنائي 1N4001 diode

arduino-lesson-10-sensing-light

(270 Ω Resistors)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو

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

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

محرك التيار المستمر الصغير

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

ارفع الكود التالي على متحكم الاردوينو:

int motorPin = 3;
 
void setup()
{
  pinMode(motorPin, OUTPUT);
  Serial.begin(9600);
  while (! Serial);
  Serial.println("Speed 0 to 255");
}
 
 
void loop()
{
  if (Serial.available())
  {
    int speed = Serial.parseInt();
    if (speed >= 0 && speed <= 255)
    {
      analogWrite(motorPin, speed);
    }
  }
}

 

يؤدي الترانزستور هنا وظيفة المحول ‘switch’ وذلك عبر التحكم بطاقة المحرك.  نقوم بإستخدام منفذ 3 للأردوينو لتشغيل وإطفاء الترانزستور تحت اسم ‘motorPin’.

عند بدء البرنامج  ستظهر شاشة الاتصال التسلسلي Serial Monitor تطلب منك ادخال قيمة طاقة المحرك ( مابين 0 و 255 ).

محرك التيار المستمر الصغير

في دالة loop الأمر ‘Serial.parseInt’ يستخدم لقراءة الرقم المدخل  عبر شاشة الاتصال التسلسلي Serial Monitor وتحويله لقيمة رقمية ‘int’.

بإمكنك ادخال أي رقم ، جملة if الشرطية في السطر الذي يليه تقوم بكتابة تناظرية ‘analogWrite’ عند وجود رقم بين 0 و 255 فقط..

الترانزستور Transistor

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

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

Transistor1

للترانزستور 3 رؤوس . معظم التيار الكهربائي يذهب من ‘collector’ إلى ‘Emitter’، ولكن هذا يحدث فقط إذا تم تمرير تيار قليل عبر ‘Base connection’. هذا التيار القليل يتم توفير ه من الاردوينو.

الرسم التالي يسمى  رسم تخطيطي ‘schematic diagram’. مثل تصميم لوح التجارب ، وظيفته اظهار كيفية ارتباط القطع الالكترونية ببعضها.

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

المنفذ 3 من الأردوينو مرتبط بالمقاومه . مما يقلل من التيار الموجه إلى الترانزستور.

يوجد صمام ثنائي ‘Diode’ موصول والذي يسمح بنقل التيار بإتجاه واحد فقط.

عند فصل الطاقة عن المحرك ، يحصل ارتداد جهد عكسي  مما قد يتلف الأردوينو ، وظيفة الصمام الثنائي ‘Diode’ هي الحماية من هذه الامور.

أنشطة أخرى

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




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