قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-01-2020, 11:20 PM المشاركة 9   
افتراضي



التحكم بالمحرك الخطوي ثنائي القطبية وسرعته من خلال لوحة الأردوينو :

لا بد من استخدام دائرة عزل ما بين لوحة الأردوينو والمحرك ثنائي القطبية لتأمين التيار المطلوب. لا يمكن استخدام الدائرة المتكاملة ULN2003 مع المحرك ثنائي القطبية لأنها تعمل كمصب للتيار فقط (أي تسمح بمرور التيار باتجاه واحد)، في حين الدائرة المتكاملة L293 والدائرة المتكاملة L298N ستفي بالغرض المطلوب منها .
يبين الشكل أدناه الدائرة الكهربية للوحة الأردوينو مع الدائرة المتكاملة L293 والمحرك الخطوي ثنائي القطبية. تم ربط المنافذ 0,1,2,3 مع مداخل بوابات الدائرة L293، والمخارج مع أربعة أسلاك للمحرك.



البرنامج :
يتم اختيار إحدى طرق تنشيط الملفات المذكورة سابقا (ملف واحد، خطوة كاملة، نصف خطوة) وبرمجة لوحة الأردوينو تبعا لذلك . يتم التحكم بجهة دوران المحرك (مع أو عكس عقارب الساعة) من خالل ترتيب تنشيط الملفات الواحد تلو الآخر، ويتم التحكم بسرعة المحرك من خلال تغيير التأخير الزمني ما بين كل مرحلة من مراحل الدورة. تم كتابة الكود البرمجي الخاص بطريقة التحريك بخطوة كاملة، مع إمكانية اختيار جهة الدوران وسرعة المحرك. يصلح هذا الكود مع كل من الدائرة المتكاملة L293، واللوحة L298N .

كود:
void setup() {
 byte i;
 for (i = 0; i <= 7; i++)
 {
 pinMode(i, OUTPUT);
 }
}

void loop() {
 move_motor('L', 250); // move left, speed
 move_motor('R', 250); // move right, speed
move_motor('L', 500); // move left, speed
move_motor('R', 500); // move right, speed
}

void move_motor(char Direction, int Speed)
{
 if (Direction == 'L')
 { PORTA(B00000101);
 delay(Speed);

PORTA(B00000110);
delay(Speed);
 
PORTA(B00001010);  delay(Speed);
 
PORTA(B00001001);
 delay(Speed);
 
}
 
if (Direction == 'R')
 { PORTA(B00000101);
 delay(Speed);
 
PORTA(B00001001);
 delay(Speed);
 PORTA(B00001010);
 delay(Speed);
 
PORTA(B00000110);
 delay(Speed);
 
}
} 

void PORTA(byte value)
{
 byte i;
 for (i = 0; i <= 7; i++)
 {
 digitalWrite(i, bitRead(value, i));
 }
}

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-01-2020, 11:28 PM المشاركة 10   
افتراضي


مكتبة محرك الخطوة Stepper Library :

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

كود:
#include <Stepper.h>

دوال المكتبة Functions :

كود:
Stepper(steps, pin1, pin2)
Stepper(steps, pin1, pin2, pin3, pin4)
setSpeed(rpm)
step(steps)

1- الدالة

كود:
Stepper(steps, pin1, pin2)
Stepper(steps, pin1, pin2, pin3, pin4)

الوصف : Description
تخلق (تنشىء) هذه الدالة مثيلًا جديدًا لفئة Stepper التي تمثل محرك خطوة معينًا متصل بلوحة Arduino. تستخدم هذه الدالة في الجزء العلوي من البرنامج ، أعلى setup() , loop() . يعتمد عدد البارامترات على كيفية توصيل محرك الخطوة - إما باستخدام طرفين أو أربعة أطراف من لوحة Arduino.

البارامترات : Parameters
• البارامتر steps : عدد الخطوات steps فى الدورة الواحدة للمحرك . إذا أعطى عدد الدرجات لكل خطوة ، اقسم 360 على هذا العدد للحصول على عدد الخطوات فى الدورة الواحدة steps (مثال : 360/3.6 = 100 steps ) . هذا البارامتر متغير من نوع int .
• البارامترات pin1, pin2 : طرفان متصلان بالمحرك ، نوع int .
• البارامترات pin3, pin4 : اختيارى ، الطرفان الأخران المتصلان بالمحرك ، إذا كان متصل إلى أربعة أطراف ، نوع int .

العائد : Returns
مثيل جديد من فئة محرك الخطوة Stepper .
مثال :

كود:
Stepper myStepper = Stepper(100, 5, 6);

2- الدالة

كود:
Stepper: setSpeed(rpms)

الوصف : Description
تحديد سرعة المحرك بالدورات لكل دقيقة (RPMs) . هذه الدالة لا تجعل المحرك يدور ، فقط تحديد السرعة التى سوف يكون عليها عندما تستدعى الدالة step() .

البارامترات : Parameters
البارامتر rpms : السرعة التى يجب أن يدور بها المحرك بالدورات فى الدقيقة – عدد موجب ، نوع long .

العائد :
لا شىء .

3- الدالة

كود:
Stepper: step(steps)

الوصف : Description
تدير المحرك عددًا معينًا من الخطوات ، بسرعة يحددها أحدث إستدعاء للدالة setSpeed() . هذه الدالة تحجب blocking . أي أنها ستنتظر حتى ينتهي المحرك من التحرك لتمرير التحكم إلى السطر التالي في البرنامج . على سبيل المثال ، إذا قمت بتعيين السرعة ، على سبيل المثال ، 1 RPM واستدعيت الدالة step(100) على محرك 100 خطوة ، فإن هذه الدالة تستغرق دقيقة كاملة للتشغيل. للتحكم بشكل أفضل ، حافظ على السرعة عالية وخذ فقط بضع خطوات مع كل استدعاء للدالة step() .

البارامترات : Parameters
البارامتر steps : عدد الخطوات التى يدورها المحرك ، موجبة للدوران فى اتجاه معين ، وسالبة للدوران فى الاتجاه الآخر ، نوع int .
العائد :
لا شىء .

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-01-2020, 12:58 PM المشاركة 11   
افتراضي


مثال : تطبيق على المكتبة : التأرجح 60 – ثانية





سنقوم بإنشاء جهاز وهمى لبيان الوقت يكون محصورًا إلى الأبد في حلقة مدتها 60 ثانية. سوف يتحرك محرك الخطوة في قوس كامل 360 درجة في حوالي دقيقة. في نهاية قوسه ، سيغير الاتجاه ويدور في الاتجاه الآخر. نظرًا لأن محرك الخطوة يتحرك بخطوات 1.8 درجة ، فليس من الممكن تمامًا الحصول على الزمن بدقة هنا ، لكنه قريب بدرجة كافية. لهذا السبب ، يجب أن يتحرك محرك الخطوة في كل ثانية 3.33 خطوة (360 /1.8=200 step/rev , 200/60=3.33step/sec) ، وهو ما لا يستطيع القيام به. لذا ، فإننا نجعل التأخير بين الخطوات 909 ميلي ثانية بدلاً من واحد ثانية . نظرًا لكيفية تصميم الدائرتين المختلفتين الموضحتين في الأشكال ، يتحكم البرنامج في أي من نوعى المحركات.

كود:
#include <Stepper.h>
const int steps = 200;
Stepper stepper(steps, 8, 9, 10, 11);
int stepDirection = 3;
int counter = 0;
void setup() {
stepper.setSpeed(30);
}
void loop() {
stepper.step(stepDirection);
delay(909);
counter+=3;
if (counter > steps) {
counter = 0;
if (stepDirection == 3) stepDirection = -3;
else stepDirection = 3;
}
}

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

• الفئة Stepper :
لإنشاء مثيل جديد لمكتبة Stepper ، نستخدم واحدًا من بناء الجملة التالية :

كود:
Stepper name(steps, pin 1, pin 2)
Stepper name(steps, pin1, pin 2, pin 3, pin4)



يعتمد بناء الجملة الذي نستخدمه على ما إذا كنا نستخدم 2 طرف أو أربعة أطراف للتحكم في برامج تشغيل محرك الخطوة . لجعل التوصيلات الخاصة بنا أسهل قليلاً ويعمل الكود على كلا المشغلين drivers ، اخترنا استخدام أربعة أطراف - أسهل في التوصيل على حساب (بتكلفة) زوج من الأطراف الرقمية. في هذا المثال ، أنشأنا مثيل Stepper التالي:

كود:
Stepper stepper(steps, 8, 9, 10, 11);

المثيل يسمى stepper على الرغم من أننا يمكن أن نستخدم أي شيء تقريبا للاسم. البارامتر الأول هو عدد الخطوات التي يمكن للمحرك القيام بها في دورة واحدة كاملة. بالنسبة لمحركنا ، فإن خطوته بقيمة 1.8 درجة ، مما يعني أنه سيستغرق 200 خطوة لإكمال دورة واحدة (360/1.8=200) . في الكود السابق ، أعلنا أن عدد خطوات محركنا كمتغير ثابت steps والذى سنستخدمه لاحقًا في الكود. البارامترات الأربعة التالية ، pins1-4 ، هي أرقام الأطراف المتصلة بالمشغل . راجع الدائرة الكهربية لمعرفة التوصيل .

• الدالة setSpeed() :
بعد إنشاء المثيل ، نحتاج إلى ضبط set سرعة دوران المحرك ا. يحتوي بناء جملة هذه الدالة على بارامتر واحد فقط ، كما يلي:

كود:
name.setSpeed(rpm)


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

• الدالة step() :

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

كود:
 name.step(steps)

البارامتر الوحيد الذى يجب تمريره إلى هذه الدالة هو عدد الخطوات التي نريد تحريك محرك الخطوة بها. على سبيل المثال ، مع محرك بخطوة 1.8 درجة ، حركة الخطوة الواحدة تساوي 1.8 درجة . سيؤدي تعيين عدد الخطوات إلى 50 إلى دوران المحرك 90 درجة في اتجاه عقارب الساعة على محرك 200 خطوة (50*1.8=90) ، أو ربع دورة ، فى حين أن (-50) سوف يدير المحرك 9- درجة عكس اتجاه عقارب الساعة. كما ترى ، فإن العدد الصحيح الموجب سيخلق حركة في اتجاه معين بينما القيمة السالبة ترسله في الاتجاه المعاكس.
على عكس شيء مشابه للدالة analogWrite() ، التي تقوم بتعيينها ونسيانها ، فإن الدالة step() ستمنع Arduino من فعل أي شيء آخر حتى تكمل حركتها بالكامل. هذا ليس كبيرًا في القيمة إذا قمنا بتدوير المحرك بزيادات صغيرة في كل مرة نستدعى الدالة step() ، لكنها تتزايد بسرعة. كمثال عملي ، إذا قمنا بتعيين السرعة RPM على 10 RPM ، فإن محركنا ذو 200 خطوة سيستغرق 6 ثوان لإكمال 200 خطوة. بمعنى آخر ، إذا استخدمنا العبارة stepper.step(200) فسيكون هناك 6 ثوانٍ لن نتمكن من قراءة المدخلات أو التواصل مع الأجهزة الأخرى أو أي شيء آخر.
بدلاً من ذلك ، قد يكون من الأفضل إكمال التدوير الكبير بعبارة حلقة مثل جزء الكود التالي:

كود:
for (int i=0; i<200; i++) {
stepper.step(1);
if (digitalRead(2) == HIGH) break;
}

في هذا المثال ، نقوم بزيادة محرك الخطوة 200 مرة بزيادات خطوة واحدة لإكمال دورة واحدة. بدلاً من استدعاء بحركة واحدة من 200 خطوة نستخدم حلقة for ، ستأخذ كل خطوة فردية 30 مللي ثانية فقط وفيما بين كل خطوة ، يمكننا ، على سبيل المثال ، التحقق من حالة طرف دخل رقمي والخروج من الحلقة باستخدام عبارة break إذا تم استيفاء شرط.

مثال لبرنامج آخر :
يوضح هذا البرنامج طريقة تعيين (تحويل) map القيم من جهاز استشعار تناظري إلى حركة محرك خطوة . تعد المقاومة المتغيرة potentiometer ذو المقبض الكبير خيارًا جيدًا ، أو ربما الأفضل من ذلك ، هو مقياس التسارع accelerometer الذي يتحكم في حركة المحرك من خلال إمالة محاوره ، على الرغم من أن أي مدخلات تناظرية ستعمل أيضًا. باستخدام الدالة map() ، يمكننا أخذ قراءة تماثلية وتعيينها map على إجمالي عدد الخطوات للإشارة إلى مستوى المدخلات التناظرية - قراءة كاملة بالقيمة 1024 سوف تدير المحرك دورة كاملة.


كود:
#include <Stepper.h>
const int steps = 200;
Stepper stepper(steps, 8, 9, 10, 11);
int previous, val;
void setup() {
stepper.setSpeed(30);
}
void loop() {
val = map(analogRead(0), 0, 1024, 0, steps);
stepper.step(val - previous);
previous = val;
delay(20);
}



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-01-2020, 02:03 PM المشاركة 12   
افتراضي


الأمثلة الموجودة ضمن بيئة تطوير الاردوينو :

مثال رقم 1 : محرك الخطوة يتتبع دوران مقاومة متغيرة (أو حساس آخر) على الدخل التناظرى “0” :

البرنامج :

كود:
/*
 * MotorKnob
 *
 * A stepper motor follows the turns of a potentiometer
 * (or other sensor) on analog input 0.
 *
 * http://www.arduino.cc/en/Reference/Stepper
 * This example code is in the public domain.
 */

#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 100

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

// the previous reading from the analog input
int previous = 0;

void setup() {
  // set the speed of the motor to 30 RPMs
  stepper.setSpeed(30);
}

void loop() {
  // get the sensor value
  int val = analogRead(0);

  // move a number of steps equal to the change in the
  // sensor reading
  stepper.step(val - previous);

  // remember the previous value of the sensor
  previous = val;
}

شرح البرنامج :

1- فى البداية يجب تضمين ملف الرأس للمكتبة Stepper بالصيغة :

كود:
 #include <Stepper.h>

2- ثم تحديد (تعريف) عدد الخطوات STEPS فى كل دورة للمحرك الخاص بك (من خصائص المحرك) :

كود:
// change this to the number of steps on your motor
#define STEPS 100

3- بعد ذلك يتم إنشاء مثيل للفئة Stepper وليكن بالمسمى stepper مع تعيين البارامترات الخاصة به ( عدد الخطوات فى الدورة STEPS ، والأطراف المتصلة بدائرة تشغيل محرك الخطوة 8,9,10,11 ) للدالة :

كود:
// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

4- تعريف متغير القيمة السابقة لعدد الخطوات steps المطلوبة (من الدخل التناظرى) ، نوع int ، مع تعيينه بصفر:

كود:
 // the previous reading from the analog input
int previous = 0;

5- فى الدالة setup يتم تحديد سرعة دوران المحرك بالقيم 30 لفة كل دقيقة (التى سوف يدور بها عند إعطائه أمر الخطوات ) ، باستخدام الدالة :

كود:
// set the speed of the motor to 30 RPMs
stepper.setSpeed(30);

6- فى الدالة loop يتم :
أ‌- الحصول على قراءة جهد الدخل التناظرى (قيمة الحساس) :

كود:
// get the sensor value
int val = analogRead(0);
ب‌- ثم إعطاء الأمر بالحركة ( الخطوة step) بقيمة التغير فى قيمة الحساس :

كود:
 // move a number of steps equal to the change in the sensor reading
  stepper.step(val - previous);

ت‌- تذكر القيمة السابقة للحساس

كود:
// remember the previous value of the sensor
  previous = val;


مثال رقم 2 : التحكم فى محرح الخطوة – دورة واحدة :
• هذا البرنامج يقوم بتشغيل محرح خطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف الرقمية 8-11 للاردوينو .
• المحرك يجب أن يدور دورة واحدة فى اتجاه معين ، ثم يدور دورة واحدة فى الاتجاه الآخر .

كود:
/*
 Stepper Motor Control - one revolution
 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.
 The motor should revolve one revolution in one direction, then
 one revolution in the other direction.
 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(60);
}

void loop() {
  // step one revolution  in one direction:
  myStepper.step(stepsPerRevolution);
  delay(500);

  // step one revolution in the other direction:
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

مثال رقم 3 : التحكم فى محرك الخطوة – خطوة واحدة فى كل مرة .
• هذا البرنامج يقوم بتشغيل محرح خطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف الرقمية 8-11 للاردوينو .
• المحرك سوف يخطو "خطوة" واحدة فى كل مرة ، ببطىء شديد . يمكنك استخدام ذلك لاختبار التوصيل الصحيح لأسلاك المحرك بالأطراف المناسبة . إذا كان التوصيل صحيح فإن جميع الخطوات يجب أن تكون فى نفس الاتجاه .
• يستخدم هذا البرنامج أيضا لعد عدد الخطوات لكل دورة للمحرك ، إذا لم تكن تعرفه . ثم بعد ذلك أدخل هذا العدد فى مثال الدورة الواحدة السابق للتحقق من حصولك على العدد الصحيح .

كود:
/*
 Stepper Motor Control - one step at a time
 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.
 The motor will step one step at a time, very slowly.  You can use this to
 test that you've got the four wires of your stepper wired to the correct
 pins. If wired correctly, all steps should be in the same direction.
 Use this also to count the number of steps per revolution of your motor,
 if you don't know it.  Then plug that number into the oneRevolution
 example to see if you got it right.
  */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // number of steps the motor has taken

void setup() {
}

void loop() {
  // step one step:
  myStepper.step(1);
  stepCount++;
  delay(500);
}



مثال رقم 4 : التحكم فى محرك الخطوة : التحكم فى السرعة :
• هذا البرنامج يقوم بتشغيل محرك الخطوة أحادى القطبية أو ثنائى القطبية .
• المحرك متصل بالأطراف 8-11 للاردوينو .
• توجد مقاومة متغيرة متصلة بالدخل التناظرى رقم “0” .
• المحرك سوف يدور فى اتجاه عقارب الساعة . كلما ارتفع قيمة المقاومة المتغيرة ، كلما أسرعت سرعة المحرك . لأن الدالة setSpeed() تحدد التأخير بين الخطوات ، قد تلاحظ أن المحرك أقل إستجابة للتغيرات فى قيمة الحساس عند السرعات المنخفضة .

كود:
 /*
 Stepper Motor Control - speed control
 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.
 A potentiometer is connected to analog input 0.
 The motor will rotate in a clockwise direction. The higher the potentiometer value,
 the faster the motor speed. Because setSpeed() sets the delay between steps,
 you may notice the motor is less responsive to changes in the sensor value at
 low speeds.
 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor


// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;  // number of steps the motor has taken

void setup() {
  // nothing to do inside the setup
}

void loop() {
  // read the sensor value:
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    myStepper.step(stepsPerRevolution / 100);
  }
}

مثال عملى : محرك الخطوة 28BYJ-48 مع الدائرة المتكاملة ULN2003
المحرك 28BYJ-48 هو محرك خطوى ذو 5 أسلاك أحادي القطبية والذى يتحرك 32 خطوة لكل دورة داخليًا ولكن لديه نظام تروس يحرك العمود بمعامل 64. والنتيجة هي محرك يدور بسرعة 2048 خطوة لكل دورة (32 * 64) . تجدر الإشارة إلى أن بعض هذه المحركات قد يكون لديها نظام تروس مختلف ، لذلك قد لا يكون عدد الخطوات لكل دوران للمحرك هو نفسه. هذا المحرك يعمل على 5 فولت.
يتم تغليف المحرك عادةً بلوحة تشغيل (قيادة) صغيرة تعتمد على الدائرة المتكاملة المكونة من مصفوفة ترانزستور دارلينجتون ULN2003. تحتوي اللوحة على موصل يتناسب بشكل مثالي مع أسلاك المحرك بحيث يكون سهل الاستخدام للغاية. هناك أيضا وصلات لأربعة مداخل رقمية بجهد 5 فولت ، وكذلك وصلة للتغذية .
فيما يتعلق بمصدر الإمداد بالقدرة ، هناك شيء مهم للغاية تجدر الإشارة إليه وهو أنه يجب ألا تستخدم أبدًا 5 فولت من لوحة Arduino لتشغيل هذا المحرك (أو أي محرك آخر) بصرف النظر عن مدى إغرائه. على الرغم من أن 28BYJ-48 لا يسحب الكثير من التيار ، إلا أنه سيحدث "ضوضاء" “noise” كهربائية على خطوط الإمداد بالقدرة وقد يؤدي ذلك إلى تلف Arduino. دائما استخدام مصادر قدرة منفصلة لتشغيل محركات الخطوة لخاص بك .
سنقوم بتوصيل المحرك والمشغل والاردوينو على النحو التالي:




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

كود:
/*
    Demonstrates 28BYJ-48 Unipolar Stepper with ULN2003 Driver
  Uses Arduino Stepper Library
*/

//Include the Arduino Stepper Library
#include <Stepper.h>

// Define Constants

// Number of steps per internal motor revolution 
const float STEPS_PER_REV = 32; 

//  Amount of Gear Reduction
const float GEAR_RED = 64;

// Number of steps per geared output rotation
const float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;

// Define Variables

// Number of Steps Required
int StepsRequired;

// Create Instance of Stepper Class
// Specify Pins used for motor coils
// The pins used are 8,9,10,11 
// Connected to ULN2003 Motor Driver In1, In2, In3, In4 
// Pins entered in sequence 1-3-2-4 for proper step sequencing

Stepper steppermotor(STEPS_PER_REV, 8, 10, 9, 11);

void setup()
{
// Nothing  (Stepper Library sets pins as outputs)
}

void loop()
{
  // Slow - 4-step CW sequence to observe lights on driver board
  steppermotor.setSpeed(1);    
  StepsRequired  =  4;
  steppermotor.step(StepsRequired);
  delay(2000);

   // Rotate CW 1/2 turn slowly
  StepsRequired  =  STEPS_PER_OUT_REV / 2; 
  steppermotor.setSpeed(100);   
  steppermotor.step(StepsRequired);
  delay(1000);
  
  // Rotate CCW 1/2 turn quickly
  StepsRequired  =  - STEPS_PER_OUT_REV / 2;   
  steppermotor.setSpeed(700);  
  steppermotor.step(StepsRequired);
  delay(2000);

}

في هذا البرنامج ، نستخدم المكتبة Stepper التي تأتي ضمن بيئة تطوير الاردوينو . تهتم هذه المكتبة بتسلسل النبضات التي سنرسلها إلى محرك الخطوة ويمكن استخدامها مع مجموعة واسعة من المحركات ، أحادية القطب وثنائية القطب.
تتميز محركات الخطوة 28BYJ-48 بأن لها تروس داخلية مما يقلل من سرعة دوران عمود الخرج بمعامل 64 (البعض يختلف ). لذلك نحدد (نعرف) ثلاثة ثوابت للتعامل مع دوران المحرك:
• STEPS_PER_REV وهو عدد الخطوات التي يتخذها المحرك الفعلي لكل دورة. تم تعيينا بالقيمة 32.
• GEAR_RED وهو مقدار تقليل (تخفيض) التروس. تم وضعها بالقيمة 64 ولكن قد تحتاج إلى ضبطها إذا كان المحرك مختلفًا .
• STEPS_PER_OUT_REV وهو الخرج النهائي لعمود المحرك بعد تخفيض التروس. وهو حاصل ضرب الرقمين أعلاه.
في حال كنت تتساءل عن سبب استخدام النوع float بدلاً من integer للثوابت أعلاه ، فذلك لأن تخفيض التروس في بعض الأحيان يصل عدد مثل 63.5. إذا كنت تستخدم 64 ، يمكنك استخدام الأعداد الصحيحة integers .
سيتم استخدام المتغير "StepsRequired" لتحديد (لتعريف) عدد الخطوات التي نريد أن يدور بها محركنا.
محرك الخطوة أحادى القطبية 28BYJ-48 له تسلسل خطوة كما يلي: 1-3-2-4 سيتم استخدام هذه المعلومات لقيادة المحرك عن طريق إنشاء مثيل للفئة Stepper يسمى "steppermotor" مع تسلسل الأطراف 8,10, 9, 11 . تأكد تحقيق ذلك أو أن المحرك لن يعمل بشكل صحيح.
لا يوجد شيء لتعيينه في الدالة setup لأن فئة المكتبة Stepper تقوم بالفعل بتعيين أطراف الدخل / الخرج الأربعة كمخارج .
في الدالة loop لدينا ثلاثة عروض توضيحية ، لك الحرية لإضافة أكبر عدد تريده أو لتغيير الموجود .
التشغيل الأول يخطو المحرك أربع خطوات ببطء شديد. من المثير للاهتمام ملاحظة الليدات في UNL2003 أثناء تشغيلها.
التشغيل الثانى يدور المحرك في اتجاه عقارب الساعة نصف دوره ببطء شديد. والتشغيل النهائى يعود المحرك نصف دورة بسرعة أكبر بكثير. يمكنك تجربة البارامتر "setSpeed" لتحديد السرعة القصوى لمحركك.


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 10-01-2020, 09:42 PM المشاركة 13   
افتراضي محرك التيار المستمر بدون الفرش Brushless DC Motor(BLDC) والوحدة الإلكترونية للتحكم فى


محرك التيار المستمر بدون الفرش Brushless DC Motor(BLDC) والوحدة الإلكترونية للتحكم فى السرعة ESC والاردوينو .

https://howtomechatronics.com/how-it...-and-esc-work/




يتكون محرك BLDC من جزأين رئيسيين ، الجزء (العضو) الثابت stator والجزء (العضو) الدوار rotor . في الرسم التوضيحي أدناه ، العضو الدوار مكون من مغناطيسًا دائمًا permanent magnet به أقطاب ، بينما يتكون العضو الثابت من ملفات coils مرتبة كما هو موضح في الصورة أدناه.



نعلم جميعًا أنه إذا مررنا تيار كهربى خلال ملف ، فسيولد حقل مغناطيسي magnetic field وستعتمد خطوط المجال المغناطيسي أو القطبين على اتجاه التيار .



لذلك إذا طبقنا (مررنا) التيار المناسب ، فإن الملف سيولد مجال مغناطيسي يجذب المغناطيس الدائم للعضو الدوار . الآن إذا قمنا بتنشيط كل ملف واحد تلو الآخر ، فإن العضوالدوار سيظل يدور بسبب تفاعل القوة بين المغناطيس الدائم والمغناطيس الكهربائي.



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



باستخدام هذا التكوين ، يمكننا إنشاء ستة أقطاب على العضو الثابت فقط بثلاثة ملفات أو طور phase . يمكننا زيادة الكفاءة أكثر عن طريق تنشيط اثنين من الملفات في نفس الوقت. وبهذه الطريقة ، ملف سوف يجذب attract والملف الآخر ينفر repel العضو الدوار .



من أجل أن يصنع العضو الدوار دورة كاملة 360 درجة ، فإنه يحتاج إلى ست خطوات أو فترات intervals.



إذا ألقينا نظرة على الشكل الموجي للتيار ، يمكننا أن نلاحظ أنه في فترة interval يوجد طور (مرحلة) phase ذات تيار موجب ، وطور ذات تيار سالب ، ويتم إيقاف off الطور (المرحلة) الثالث. هذا يعطي فكرة أنه يمكننا ربط نقاط النهاية الحرة لكل مرحلة من المراحل الثلاث معًا وبالتالي يمكننا مشاركة التيار بينهما أو استخدام تيار واحد لتنشيط المرحلتين في نفس الوقت.
إليكم مثال. إذا قمنا بسحب pull up المرحلة A عاليا High ، أو وصلناها بجهد DC موجب ، مع نوع من المبدلات switch ، على سبيل المثال MOSFET ، وعلى الجانب الآخر ، قم بتوصيل المرحلة B بالأرضى ، عندئذ سوف يتدفق التيار من الجهد VCC ، عبر المرحلة A ، إلى النقطة المحايدة ثم المرحلة B ، إلى الأرضى. لذلك ، بمرور تيار واحد فقط ، أنشأنا الأقطاب الأربعة المختلفة التي تسبب تحريك العضو الدوار.



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



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

كيف تعمل ESC (وحدة متحكم السرعة إلكترونيا)

تتحكم (ESC) أو وحدة التحكم في السرعة إلكترونيا في حركة أو سرعة المحرك بدون فرش عن طريق تنشيط الموسفتات MOSFETs المناسبة لإنشاء المجال المغناطيسي الدوار بحيث يدور المحرك. كلما زاد التردد frequency أو كلما أسرع ESC من خلال الفواصل الزمنية الست ، كلما زادت سرعة المحرك.



ومع ذلك ، هنا يأتي سؤال مهم ، وهو كيف نعرف متى يتم تنشيط هذه المرحلة phase . الجواب هو أننا بحاجة إلى معرفة موضع العضو الدوار ، وهناك طريقتان شائعتان تستخدمان لتحديد موضع العضوالدوار.
الطريقة الأولى الشائعة هي استخدام حساسات "تأثير هول" Hall-effect المدمجة في العضو الثابت ، ومرتبة على قدم المساواة بين 120 أو 60 درجة عن بعضها البعض.



عندما تدور المغناطيسات الدائمة للعضو الدور ، تستشعر مستشعرات تأثير هول المجال المغناطيسي وتولد منطقًا "مرتفعًا" “high” لقطب مغنطيسي معين أو منطق "منخفض" “low” للقطب المقابل (العكسى) . وفقًا لهذه المعلومات ، يعرف ESC متى يتم تنشيط تتابع التبديل commutation التالى أو الفترة الزمنية interval.
الطريقة الثانية الشائعة المستخدمة لتحديد موضع العضو الدوار هي من خلال استشعار القوة الدافعة الكهربائية الخلفية (العكسية) back EMF . تحدث EMF الخلفية نتيجة للعملية المعاكسة تماما لتوليد مجال مغناطيسي أو عندما يمر مجال مغناطيسي متحرك أو متغير عبر ملف ، فإنه يُحدث induces تيارًا في الملف.



لذلك ، عندما يمر الحقل المغناطيسي المتحرك للعضو الدوار عبر الملف الحر ، أو الملف غير النشط ، فإنه سيؤدي إلى تدفق تيار في الملف ونتيجة لذلك سيحدث انخفاض في الجهد في هذا الملف. يلتقط ESC انخفاض الجهد هذا عند حدوثه وبناءً عليه ، فإنه يتوقع أو يحسب متى يجب أن يحدث الفاصل الزمني interval التالي.
هذا هو مبدأ العمل الأساسي لمحركات التيار المستمر بدون فرش و(ESCs) وهو نفس الشيء حتى لو قمنا بزيادة عدد أقطاب كل من العضو الدوار والعضو الثابت. سيظل لدينا محرك ثلاثي المراحل (الأطوار) phase ، فقط عدد الفواصل الزمنية سيزيد من أجل إكمال دورة كاملة.



هنا يمكننا أن نذكر أيضًا أن محركات BLDC يمكن أن تكون من النوع inrunners أو النوع outrunners . يمتلك المحرك inrunner مغناطيسًا دائمًا داخل المغناطيسات الكهربائية ، والعكس بالعكس ، يمتلك المحرك outrunner المغناطيس الدائم خارج المغناطيس الكهربائي. مرة أخرى ، وهم يستخدمون نفس مبدأ العمل ولكل منهم نقاط القوة أو الضعف الخاصة به.



المحرك بدون فرش من نوع outrunner brushless motor مزود بالمغناطيس الدائم خارج المغناطيس الكهربائي.المحور الخارجي الذي يحمل المغناطيس الدائم يحتوي على عمود الخرج (الدوران) المتصل في المنتصف.



outrunner brushless motor


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 10-01-2020, 10:00 PM المشاركة 14   
افتراضي


كيفية التحكم فى محرك التيار المستمر بدون الفرش باستخدام الاردوينو :

سوف نتعلم كيفية التحكم في محرك بدون فرش باستخدام Arduino و ESC .
محرك BLDC المستخدم بالمواصفات التالية: له معدل KV rating بالقيمة “1000” ، ويمكن تشغيله باستخدام بطارية 2S أو 3S أو 4S نوع LiPo(lithium polymer battery) ويتطلب 30A ESC . يحدد (يعرف) معدل KV لمحرك بدون فرش السرعة RPM للمحرك لكل فولت بدون تحميل.



في هذه الحالة ، يعني 1000KV ، على سبيل المثال ، أنه إذا قمنا لتغذية المحرك ببطارية 2S LiPo التي يبلغ جهدها 7.4 فولت ، يمكن للمحرك أن يحقق أقصى سرعة RPM تبلغ 7.4 أضعاف 1000 ، أو 7400 دورة في الدقيقة.
تتميز المحركات التي لا تستخدم فرشًا بأنها متعطشة للقدرة ، والطريقة الأكثر شيوعًا لتشغيلها هي استخدام بطاريات LiPo. يشير الرقم "S" لبطارية LiPo إلى عدد الخلايا الموجودة في البطارية ، ولكل خلية جهد كهربي قدره 3.7 فولت.



في هذا المثال ، نستخدم بطارية 3S LiPo التي تحتوي على 3 خلايا أى 11.1 فولت. لذلك ، نتوقع أن يصل المحرك إلى الحد الأقصى لعدد الدورات في الدقيقة بقيمة 11100.
أخيرًا ، الوحدة 30A ESC التي سنستخدمها في هذا المثال وتطابق متطلبات المحرك. على جانب ، يوجد لدى ESC ثلاثة أسلاك تتحكم في المراحل الثلاثة للمحرك وعلى الجانب الآخر يوجد سلكان ، VCC و GND ، لتوفير القدرة .




هناك أيضًا مجموعة أخرى من ثلاثة أسلاك تخرج من ESC وهي خط الإشارة ، +5V ، والأرضى. تسمى هذه الميزة لوحدة ESC "دائرة حزف أو تعويض البطارية " Battery Eliminator Circuit وكما يوحي الاسم ، فهي تلغي الحاجة إلى بطارية منفصلة للميكروكونترولر . ومن ثم ، توفر ESC +5V منظم يمكن استخدامه لتشغيل Arduino .
يمكننا أن نلاحظ هنا أن هذا الاتصال هو في الواقع نفس الاتصال الذي نراه مع محركات السيرفو.



إن التحكم في محرك بدون فرش باستخدام ESC و Arduino بسيط مثل التحكم في محرك السيرفو باستخدام Arduino. تستخدم ESCs نفس نوع إشارة التحكم مثل السيرفو وهى إشارة 50Hz PWM القياسية.



لذلك ، باستخدام Arduino ، علينا فقط توليد إشارة 50Hz PWM واعتمادًا على عرض النبضات أو مدة الحالة المرتفعة التي يجب أن تتراوح من واحد ميلي إلى 2 ميلي ثانية ، فإن ESC سوف يقود المحرك من الحد الأدنى إلى أقصى سرعة RPM .



الدائرة الكهربية :
بالإضافة إلى ESC ، سنستخدم مقاومة متغيرة potentiometer بسيط للتحكم في سرعة المحرك.



البرنامج :

البرنامج حقيقة بسيط ، فقط بضع سطور من الكود :

كود:
/*
Arduino Brushless Motor Control
by Dejan, https://howtomechatronics.com
*/
	
#include <Servo.h>
	
Servo ESC; // create servo object to control the ESC
	
int potValue; // value from the analog pin
	
void setup() {
// Attach the ESC on pin 9
ESC.attach(9,1000,2000); // (pin, min pulse width, max pulse width in microseconds) 
}
	
void loop() {
potValue = analogRead(A0); // reads the value of the potentiometer (value between 0 and 1023)
potValue = map(potValue, 0, 1023, 0, 180); // scale it to use it with the servo library (value between 0 and 180)
ESC.write(potValue); // Send the signal to the ESC
}


الوصف:
نحن بحاجة إلى تعريف مكتبة Servo ، لأنه مع مكتبة servo يمكننا بسهولة توليد إشارة 50Hz PWM ، وإلا فإن إشارات PWM التي يولدها Arduino تكون عند ترددات مختلفة. ثم نحتاج إلى إنشاء كائن servo وليكن ESC وتعريف متغير لتخزين الدخل التناظرى من المقاومة المتغيرة . في قسم الإعداد setup ، نستخدم الدالة attach() ، لنعرّف أي طرف Arduino هو الطرف الموصل لإشارة التحكم الخاصة بالوحدة ESC ، كما نحدد (نعرف) الحد الأدنى والحد الأقصى لعرض نبضات إشارة PWM بالميكروثانية.
في قسم الحلقة loop ، فى البداية نقرأ البوتونشميتر ، ونقوم بتعيين map قيمته من 0 إلى 1023 إلى القيمة من 0 إلى 180. ثم باستخدام الدالة write() نرسل الإشارة إلى ESC ، أو نولد إشارة 50Hz PWM . تتوافق القيم من 0 إلى 180 مع القيم من 1000 إلى 2000 ميكروثانية المحددة في قسم الإعداد.
لذلك ، إذا قمنا بتحميل هذا الكود إلى Arduino ، ثم قمنا بتشغيل كل شيء باستخدام البطارية ، فيمكننا التحكم في سرعة المحرك بدون فرش من الصفر إلى الحد الأقصى باستخدام البوتنشميتر .









الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 01:51 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)