الحسّاسات والمشغّلات للمتحكّمات · الفصل 11 — المحرّكات: التيار المستمر، المحرّك المؤازر ومحرّك الخطوةמנועים: מנוע זרם ישר, סרוו ומנוע צעד · 33.102⌂📚🏠
الفصل 11

المحرّكات: التيار المستمر، المحرّك المؤازر ومحرّك الخطوة

מנועים: מנוע זרם ישר, סרוו ומנוע צעד
الصفّان الحادي عشر والثاني عشر · 6 ساعات تعليمية

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

في نهاية هذا الفصل سنعرف أن:
  • نشرح لماذا يحتاج المحرّك إلى دائرة قيادة ومصدر منفصل مع أرضي مشترك، ونحسب تيار البدء.
  • نتحكّم في سرعة محرّك التيار المستمر بتعديل عرض النبضة، ونحسب نسبة التشغيل والجهد المتوسّط.
  • نعكس اتجاه الدوران بجسر H، ونعرف الحالة الممنوعة وجدول الحقيقة لدائرة قيادة جاهزة.
  • نتحكّم في زاوية المحرّك المؤازر بعرض النبضة، ونشرح الحلقة المغلقة التي بداخله.
  • نشغّل محرّك الخطوة بتسلسل الملفات، ونحسب زاوية الخطوة وعدد الخطوات لحركة معيّنة.
  • نختار نوع المحرّك المناسب لكل تطبيق.

מנוע זרם ישר והצורך במעגל הנעה – محرّك التيار المستمر ولماذا يحتاج إلى دائرة قيادة (DC Motor)

محرّك التيار المستمر (מנוע זרם ישר): محرّك يدور عندما نوصل بين طرفيه جهدا مستمرا. سرعته تزداد كلما زاد الجهد على طرفيه، واتجاه دورانه ينعكس عندما نعكس قطبية الجهد. هو أبسط المحرّكات وأرخصها، ونجده في المراوح الصغيرة، الألعاب، المضخّات الصغيرة وعجلات الروبوت.

ملف المحرّك له مقاومة صغيرة. عندما يدور المحرّك يتولّد فيه جهد يعاكس جهد المصدر، فيبقى التيار معتدلا. لكن في لحظة البدء، أو عندما نمسك المحور فيتوقّف، لا يتولّد هذا الجهد المعاكس، ويحدّ التيارَ مقاومةُ الملف وحدها. يسمى هذا التيار تيار البدء (זרם התנעה)، وهو أكبر تيار يسحبه المحرّك.

تيار البدء (المحور متوقّف) · זרם התנעה
Ist = VMRM
الرمزالمعنىوحدة القياس
Istتيار البدء: التيار عندما يكون المحور متوقّفا[A]
VMجهد مصدر المحرّك[V]
RMمقاومة ملف المحرّك، نقيسها بالأوميتر بين طرفيه[Ω]
مثال 11.1
قسنا بالأوميتر مقاومة ملف محرّك صغير فوجدناها RM = 3 Ω. يعمل المحرّك من مصدر VM = 6 V.
(أ) نحسب تيار البدء.
(ب) كم مرّة هو أكبر من التيار الموصى به لطرف Arduino Uno (20 mA)؟
الحل:

(أ) في لحظة البدء لا يتولّد جهد معاكس، فيحدّ التيار مقاومة الملف وحدها:

Ist = VMRM = 63 = 2 A

(ب) نقسم على التيار الموصى به للطرف:

IstIpin = 20.02 = 100

التيار أكبر بمئة مرّة، ولذلك لا نوصل المحرّك بطرف المتحكّم أبدا: نحتاج إلى مفتاح إلكتروني ومصدر منفصل.

Ist = 2 A

من هنا ثلاث قواعد ترافقنا في الفصل كله:

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

בקרת מהירות באפנון רוחב פולס – التحكّم في السرعة بتعديل عرض النبضة (PWM Speed Control)

تعديل عرض النبضة (אפנון רוחב פולס (PWM)): طريقة نُشغّل فيها المفتاح ونُطفئه بسرعة وبتردّد ثابت، ونغيّر فقط الجزء من الدور الذي يكون فيه المفتاح مغلقا. يسمى هذا الجزء نسبة التشغيل (מחזור עבודה) D. المحرّك بطيء الاستجابة لا يلحق بالنبضات، فيتصرّف كأنه موصول بالجهد المتوسّط.
نسبة التشغيل والجهد المتوسّط · מחזור עבודה ומתח ממוצע
D = tonT
Vavg = D·VM
D = x255
الرمزالمعنىوحدة القياس
Dنسبة التشغيل (تُكتب أيضا بالنسبة المئوية)—
tonزمن النبضة في كل دور (المفتاح مغلق)[ms]
Tالدور: T = 1f[ms]
Vavgالجهد المتوسّط على المحرّك[V]
xالقيمة التي نكتبها في الدالة analogWrite() من 0 حتى 255—
Vavg = 1.5 VD = 25%tonT = 2.04 msVavg = 3 VD = 50%Vavg = 4.5 VD = 75%6V0T2T
ثلاث نسب تشغيل بنفس التردّد. الخط المتقطّع هو الجهد المتوسّط على محرّك مصدره 6 V

في Arduino Uno تُنتج الدالة analogWrite(pin, x) إشارة PWM على الأطراف 3، 5، 6، 9، 10، 11 فقط (المُعلَّمة بالعلامة ~). التردّد حسب توثيق Arduino: 490 Hz (T = 2.04 ms) على الأطراف 3، 9، 10، 11، و 980 Hz (T = 1.02 ms) على الطرفين 5 و 6.

دائرة القيادة: ترانزستور MOSFET وديود الحماية – מעגל ההנעה: MOSFET ודיודת חופש:

نستخدم ترانزستور MOSFET من نوع المستوى المنطقي (Logic-level)، أي ترانزستورا يُفتح تماما بجهد 5 V على البوابة، مثل IRLZ44N. الترانزستور يعمل كمفتاح بين المحرّك والأرضي؛ ديود الحماية موصول على التوازي مع المحرّك ومهبطه نحو +VM؛ المقاومة 220 Ω تحدّ تيار شحن البوابة، والمقاومة 10 kΩ تُبقي الترانزستور مقطوعا عندما يكون الطرف عائما أثناء بدء تشغيل المتحكّم. المقاومة المتغيرة على الطرف A0 تحدّد السرعة.

Arduino Uno5VA0GNDD9GND 10kΩ220Ω10kΩM1N5819IRLZ44N+−VM6Vأرضي مشترك
محرّك تيار مستمر يُقاد بترانزستور MOSFET من الطرف D9. للمحرّك مصدر 6 V منفصل، والأرضي مشترك
سرعة محرّك تيار مستمر من مقاومة متغيرة Arduino Uno · dc_pwm_pot.ino
const int POT = A0;
const int MOTOR = 9;        // PWM pin, 490 Hz
const float VM = 6.0;       // motor supply [V]
unsigned long last = 0;

void setup() {
  pinMode(MOTOR, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int raw = analogRead(POT);
  int x = raw / 4;                  // 0..1023 -> 0..255
  analogWrite(MOTOR, x);
  if (millis() - last >= 500) {     // print twice a second
    last = millis();
    float duty = x * 100.0 / 255;
    float vavg = VM * x / 255;
    Serial.print("raw = "); Serial.print(raw);
    Serial.print("  x = "); Serial.print(x);
    Serial.print("  D = "); Serial.print(duty, 1);
    Serial.print(" %  Vavg = "); Serial.print(vavg, 2);
    Serial.println(" V");
  }
}
Serial Monitor · قراءة نموذجية
raw = 0  x = 0  D = 0.0 %  Vavg = 0.00 V
raw = 205  x = 51  D = 20.0 %  Vavg = 1.20 V
raw = 512  x = 128  D = 50.2 %  Vavg = 3.01 V
raw = 818  x = 204  D = 80.0 %  Vavg = 4.80 V
raw = 1023  x = 255  D = 100.0 %  Vavg = 6.00 V

نلاحظ أن البرنامج يقرأ المقاومة المتغيرة ويحدّث السرعة في كل دورة، ويطبع مرّتين في الثانية فقط بواسطة millis()، لكي لا يبطئ الطباعة تحكّمَنا. عند نسبة تشغيل صغيرة قد لا يبدأ المحرّك بالدوران إطلاقا، لأن الجهد المتوسّط لا يكفي للتغلّب على الاحتكاك.

سؤال 11.1: نكتب في البرنامج analogWrite(9, 102)، وجهد مصدر المحرّك VM = 12 V.
(أ) ما هي نسبة التشغيل؟
(ب) ما هو الجهد المتوسّط على المحرّك؟
(ج) ما هو زمن النبضة ton في الطرف 9؟
خطأ شائع: ننسى ديود الحماية لأن «المحرّك يعمل بدونه». يعمل فعلا، لكن الجهد العالي الذي يظهر في كل مرّة يُقطع فيها التيار — مئات المرّات في الثانية في PWM — يُتلف الترانزستور مع الوقت. ونخطئ أيضا عندما نختار MOSFET عاديا لا يُفتح تماما بجهد 5 V، فيسخن.
▶تجربة حية — مختبر برمجة Arduinoنكتب برنامج PWM، ونجرّبه في المحاكاة قبل أن نوصل المحرّك الحقيقي.
⚠
المختبر غير متاح الآن. المادة في هذا الفصل كاملة من دونه — نواصل القراءة، ونعود إلى التجربة لاحقا أو نفتحها مباشرة من الرابط الذي تحت الإطار.
https://fahed-lab.com/micro/arduino_code_lab
نفتح المختبر في صفحة مستقلة ↗ fahed-lab.com/micro/arduino_code_lab

היפוך כיוון בגשר H – عكس اتجاه الدوران بجسر H (H-Bridge)

جسر H (גשר H): دائرة من أربعة مفاتيح إلكترونية، مرتّبة على شكل الحرف H، والمحرّك في الخط الأفقي بينها. عندما نغلق زوجين متقابلين من المفاتيح يمر التيار في المحرّك في اتجاه معيّن، وعندما نغلق الزوج الآخر ينعكس الاتجاه، فينعكس اتجاه الدوران — بدون أن نبدّل الأسلاك ومن مصدر واحد.
+VMGNDS1S2S3S4M
إلى الأمام: S1 و S4 مغلقان
+VMGNDS1S2S3S4M
إلى الخلف: S3 و S2 مغلقان
+VMGNDS1S2S3S4M!
ممنوع: S1 و S2 معا (قِصَر)

إذا فتحنا المفاتيح الأربعة يتباطأ المحرّك وحده حتى يتوقّف — توقّف حر (עצירה חופשית). وإذا أغلقنا S2 و S4 معا يُقصَر طرفا المحرّك فيتوقّف بسرعة — كبح (בלימה).

تحذير: الحالة الممنوعة (מצב אסור، بالإنجليزية shoot-through): إغلاق المفتاحين في نفس الفرع معا (S1 مع S2 أو S3 مع S4) يصل +VM بالأرضي مباشرة. التيار عندها لا تحدّه إلا مقاومة المفاتيح، فتحترق خلال لحظة. لذلك لا نبني جسر H من أربعة ترانزستورات منفصلة في المختبر، بل نستخدم دائرة قيادة جاهزة يمنع منطقها الداخلي هذه الحالة.

دائرة قيادة جاهزة: L298N و L9110 – דרייבר מוכן: L298N ו-L9110:

الشريحة L298N فيها جسران H. لكل محرّك ثلاثة أطراف تحكّم: IN1 و IN2 تحدّدان الاتجاه، و ENA تُشغّل الجسر؛ إذا أدخلنا إلى ENA إشارة PWM تحكّمنا في السرعة أيضا. جدول الحقيقة حسب ورقة البيانات:

ENAIN1IN2حالة المحرّك
110يدور إلى الأمام
101يدور إلى الخلف
100توقّف سريع (كبح)
111توقّف سريع (كبح)
0××توقّف حر (المحرّك يتباطأ وحده)

المنطق الداخلي يحوّل حالة IN1 = IN2 إلى كبح، ولا يسمح بالحالة الممنوعة. ترانزستورات L298N من النوع ثنائي القطبية، ولذلك يهبط عليها جهد ملحوظ: يصل إلى المحرّك جهد أقل من جهد المصدر، والفرق يتحوّل إلى حرارة في الشريحة؛ لذلك نختار مصدرا أعلى قليلا من جهد المحرّك. الشريحة نفسها لا تحتوي ديودات حماية، وفي كثير من الوحدات الجاهزة تكون الديودات مركّبة على اللوحة — نتحقّق من ذلك في مخطط الوحدة. الشريحة L9110 أصغر وتناسب المحرّكات الصغيرة جدا؛ لها طرفا تحكّم فقط لكل محرّك، ونعطي PWM لأحدهما.

Arduino UnoD5D7D8GNDL298NENAIN1IN2OUT1OUT2+12VGNDM6V DC+−VS9Vأرضي مشتركنزيل جسر ENA
محرّك تيار مستمر مع وحدة L298N: الاتجاه من D7 و D8، والسرعة (PWM بتردّد 980 Hz) من D5

نكتب برنامجا يدير المحرّك إلى الأمام، يكبحه، ثم يديره إلى الخلف. لا نقفز من سرعة صفر إلى السرعة القصوى: نرفع قيمة PWM تدريجيا — تسارع تدريجي (האצה רכה) — فيكون تيار البدء أصغر، والآلية الميكانيكية لا تتلقّى صدمة.

إلى الأمام، كبح، إلى الخلف — مع تسارع تدريجي Arduino Uno · hbridge_ramp.ino
const int ENA = 5, IN1 = 7, IN2 = 8;    // ENA: PWM 980 Hz
const int STEP = 5, STEP_MS = 20;       // ramp: +5 every 20 ms
void setup() {
  pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  Serial.begin(9600);
}

void ramp(int from, int to) {
  int s = (to > from) ? STEP : -STEP;
  for (int x = from; x != to; x += s) { analogWrite(ENA, x); delay(STEP_MS); }
  analogWrite(ENA, to);
}

void run(int a, int b, const char *name) {
  digitalWrite(IN1, a); digitalWrite(IN2, b);
  Serial.println(name);
  ramp(0, 255); delay(2000); ramp(255, 0);
}

void loop() {
  run(HIGH, LOW, "FWD");
  digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);          // IN1 = IN2
  analogWrite(ENA, 255); Serial.println("BRAKE"); delay(1000);
  run(LOW, HIGH, "REV");
  analogWrite(ENA, 0); Serial.println("FREE"); delay(1000); // EN = 0
}
Serial Monitor · قراءة نموذجية
FWD
BRAKE
REV
FREE
FWD
مثال 11.2
نحسب من البرنامج:
(أ) زمن التسارع من 0 حتى 255.
(ب) زمن دورة كاملة للدالة loop() (بدون زمن الطباعة).
الحل:

(أ) القيمة تتغيّر بخطوات من 5، وكل خطوة تستمر 20 ms:

tramp = 2555 · 20 = 51 · 20 = 1020 ms

(ب) في كل اتجاه: تسارع، 2000 ms بالسرعة القصوى، وتباطؤ؛ وبعد كل اتجاه توقّف 1000 ms:

t = 2·(2·1020 + 2000) + 2·1000 = 10080 ms
t = 10.08 s
سؤال 11.2: نريد أن يستمر التسارع في البرنامج السابق 2 s تقريبا مع بقاء STEP = 5. ما هي قيمة STEP_MS المناسبة؟ وماذا يحدث للمحرّك إذا كتبنا IN1 = HIGH و IN2 = HIGH مع ENA = 255؟
خطأ شائع: نعكس الاتجاه والمحرّك يدور بالسرعة القصوى. عندها يكون الجهد المعاكس في المحرّك في نفس اتجاه جهد المصدر، فيمر تيار أكبر حتى من تيار البدء. لذلك نُبطئ أولا، نتوقّف لحظة، ثم نعكس — كما في البرنامج.
▶تجربة حية — عكس اتجاه محرّك بالملامساتللمقارنة: في اللوحات الصناعية نعكس اتجاه محرّك ثلاثي الطور بملامسين، وبينهما قفل متبادل يمنع إغلاقهما معا — نفس فكرة الحالة الممنوعة في جسر H.
⚠
المختبر غير متاح الآن. المادة في هذا الفصل كاملة من دونه — نواصل القراءة، ونعود إلى التجربة لاحقا أو نفتحها مباشرة من الرابط الذي تحت الإطار.
https://fahed-lab.com/control/reversing_motor
نفتح المختبر في صفحة مستقلة ↗ fahed-lab.com/control/reversing_motor

מנוע סרוו – المحرّك المؤازر (Servo Motor)

المحرّك المؤازر (מנוע סרוו): محرّك يدور إلى زاوية نحدّدها له ويثبت عندها، بدل أن يدور باستمرار (ويسمى أيضا السيرفو). في داخله محرّك تيار مستمر صغير، مسنّنات تُبطئ الحركة وتزيد العزم، مقاومة متغيرة على محور المخرج، ودائرة إلكترونية. له ثلاثة أسلاك: الإشارة، +5 V والأرضي. المحرّك المؤازر الصغير الشائع يدور عادة من 0° حتى 180°.

نحدّد الزاوية بإشارة نبضات: نبضة كل 20 ms (تردّد 50 Hz)، وعرض النبضة (רוחב הפולס) هو الذي يحدّد الزاوية. القيم النموذجية: 1 ms لزاوية 0°، 1.5 ms للمنتصف و 2 ms لزاوية 180°؛ لكن محرّكات كثيرة تحتاج إلى مجال أوسع، من 0.5 ms حتى 2.5 ms تقريبا. نتحقّق في ورقة البيانات لكل محرّك.

1 msθ = 0°1.5 msθ = 90°2 msθ = 180°T = 20 ms (50 Hz)
إشارة المحرّك المؤازر: دور ثابت 20 ms، وعرض النبضة يحدّد الزاوية
عرض النبضة حسب الزاوية · רוחב פולס וזווית
tp = tmin + θ180°·(tmax − tmin)
الرمزالمعنىوحدة القياس
tpعرض النبضة[µs]
θالزاوية المطلوبة[°]
tminعرض النبضة عند 0°[µs]
tmaxعرض النبضة عند 180°[µs]

في Arduino نستخدم المكتبة Servo: الدالة attach(pin, min, max) تربط المحرّك بطرف وتحدّد عرض النبضة عند 0° وعند 180° بالميكروثانية، والدالة write(angle) تحوّل الزاوية إلى عرض نبضة بالدالة map(). بدون القيمتين تستخدم المكتبة 544 µs و 2400 µs. نأخذ هنا المجال الآمن 1000–2000 µs، ونوسّعه بحذر حسب المحرّك.

Arduino Uno5VA0GNDD9GND 10kΩServoSIGGND+5V+−5Vمصدر منفصل
محرّك مؤازر على الطرف D9، ومقاومة متغيرة على A0. للمحرّك مصدر 5 V منفصل، والأرضي مشترك
زاوية المحرّك المؤازر من مقاومة متغيرة Arduino Uno · servo_pot.ino
#include <Servo.h>

const int POT = A0;
const int SERVO_PIN = 9;
Servo servo;
unsigned long last = 0;

void setup() {
  servo.attach(SERVO_PIN, 1000, 2000);   // pulse at 0 and 180 deg [us]
  Serial.begin(9600);
}

void loop() {
  int raw = analogRead(POT);
  int angle = map(raw, 0, 1023, 0, 180);
  servo.write(angle);
  if (millis() - last >= 500) {
    last = millis();
    Serial.print("raw = "); Serial.print(raw);
    Serial.print("  angle = "); Serial.print(angle);
    Serial.print("  pulse = "); Serial.print(servo.readMicroseconds());
    Serial.println(" us");
  }
}
Serial Monitor · قراءة نموذجية
raw = 0  angle = 0  pulse = 1000 us
raw = 256  angle = 45  pulse = 1250 us
raw = 512  angle = 90  pulse = 1500 us
raw = 700  angle = 123  pulse = 1683 us
raw = 1023  angle = 180  pulse = 2000 us
مثال 11.3
القيمة الخام على A0 هي 700. نحسب كما يحسب البرنامج:
(أ) الزاوية.
(ب) عرض النبضة.
الحل:

(أ) الدالة map() تحسب بأعداد صحيحة وتحذف الكسر:

θ = 700·1801023 = 123.17 → 123°

(ب) نعوّض في قانون عرض النبضة (و map() تحذف الكسر مرّة أخرى):

tp = 1000 + 123180·(2000 − 1000) = 1683.3 → 1683 µs

نفس السطر الذي يطبعه البرنامج على الشاشة التسلسلية.

tp = 1683 µs
سؤال 11.3: محرّك مؤازر مربوط بالأمر servo.attach(9, 1000, 2000).
(أ) ما عرض النبضة عند servo.write(45)؟
(ب) ما الزاوية التي تقابل نبضة 1700 µs؟
خطأ شائع: نغذّي المحرّك المؤازر من طرف 5 V في اللوحة. عند البدء والتوقّف يسحب المحرّك تيارا لحظيا كبيرا، فيهبط الجهد ويُعاد تشغيل المتحكّم أو تظهر قراءات غريبة. نستخدم مصدر 5 V منفصلا ونوصل الأرضي مشتركا. وتذكير: في Uno تستخدم المكتبة Servo المؤقّت 1، ولذلك تتوقّف analogWrite() عن العمل على الطرفين 9 و 10.

حلقة مغلقة داخل المحرّك – חוג סגור בתוך הסרוו:

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

داخل المحرّك المؤازرالمتحكّم1–2 msالمطلوبة+−الخطأمضخّم ودائرةقيادةمحرّك DCمسنّناتθمقاومة متغيرة على المحورالفعلية
مخطّط الكتل للمحرّك المؤازر: المتحكّم يعطي القيمة المطلوبة فقط، والحلقة المغلقة كلها داخل المحرّك

מנוע צעד – محرّك الخطوة (Stepper Motor)

محرّك الخطوة (מנוע צעד): محرّك يدور بخطوات ثابتة: في كل مرّة نغيّر فيها الملفات التي يمر فيها التيار يدور المحور زاوية ثابتة واحدة — خطوة. إذا عددنا الخطوات عرفنا موقع المحور بدون حسّاس؛ ولذلك نجده في الطابعات ثلاثية الأبعاد وآلات CNC والكاميرات.

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

12341100
الخطوة 1
12340110
الخطوة 2
12340011
الخطوة 3
12341001
الخطوة 4

هذا هو تسلسل الخطوة الكاملة (צעד מלא): ملفان يعملان في كل خطوة، فيكون العزم كبيرا. في نصف الخطوة (חצי צעד) نُدخل بين كل خطوتين حالة فيها ملف واحد فقط، فيتضاعف عدد الخطوات في الدورة وتصبح الحركة أنعم. لعكس الاتجاه نمرّ على الجدول من اليسار إلى اليمين.

خطوة كاملة1234
IN11001
IN21100
IN30110
IN40011
نصف خطوة12345678
IN111000001
IN201110000
IN300011100
IN400000111
زاوية الخطوة · זווית צעד
θs = 360°Nrev
الرمزالمعنىوحدة القياس
θsزاوية الخطوة[°]
Nrevعدد الخطوات في دورة واحدة—

المحرّك 28BYJ-48 مع دائرة القيادة ULN2003 – 28BYJ-48 עם ULN2003:

المحرّك الصغير الشائع في المختبر هو 28BYJ-48 (لجهد 5 V)، وفيه مسنّنات داخلية. في الخطوة الكاملة يحتاج محور المخرج إلى 2048 خطوة لدورة كاملة، وفي نصف الخطوة إلى 4096 (قيمة نموذجية حسب ورقة البيانات). مقاومة كل ملف نحو 50 Ω (قيمة نموذجية حسب ورقة البيانات)، فيمر في الملف 100 mA — أكثر بكثير مما يعطيه الطرف. لذلك نقود الملفات بالشريحة ULN2003: سبعة مفاتيح ترانزستورية، كل منها يحتمل حتى 500 mA، وديودات الحماية في داخلها.

Arduino UnoD8D9D10D11GNDULN2003IN1IN2IN3IN4+−M28BYJ-485V+−5Vمصدر منفصل للمحرّك
محرّك الخطوة 28BYJ-48 مع وحدة ULN2003: الأطراف D8–D11 إلى IN1–IN4، ومصدر 5 V منفصل للمحرّك
دورة إلى الأمام وربع دورة إلى الخلف بكتابة تسلسل الملفات مباشرة Arduino Uno · stepper_uln2003.ino
const int IN_PIN[4] = {8, 9, 10, 11};       // ULN2003 IN1..IN4
const byte SEQ[4] = {0b1100, 0b0110, 0b0011, 0b1001};
const long STEPS_REV = 2048, STEP_MS = 3;   // full step, output shaft
int phase = 0;
void coils(byte p) {
  for (int i = 0; i < 4; i++) digitalWrite(IN_PIN[i], bitRead(p, 3 - i));
}
void turn(long steps, int dir) {            // dir = +1 or -1
  Serial.print(dir > 0 ? "CW  steps = " : "CCW steps = "); Serial.println(steps);
  for (long n = 0; n < steps; n++) {
    phase = (phase + dir + 4) % 4;          // next row of SEQ
    coils(SEQ[phase]); delay(STEP_MS);
  }
  coils(0);                                 // coils off: no heating
}

void setup() {
  for (int i = 0; i < 4; i++) pinMode(IN_PIN[i], OUTPUT);
  Serial.begin(9600);
  Serial.print("t_rev = "); Serial.print(STEPS_REV * STEP_MS / 1000.0, 2);
  Serial.println(" s");                     // time of one revolution
}

void loop() {
  turn(STEPS_REV, +1);     delay(1000);     // one revolution
  turn(STEPS_REV / 4, -1); delay(1000);     // quarter back
}
Serial Monitor · قراءة نموذجية
t_rev = 6.14 s
CW  steps = 2048
CCW steps = 512
CW  steps = 2048

لا نستخدم هنا مكتبة: الدالة coils() تكتب أربع خانات من التسلسل في الأطراف الأربعة، والمتغيّر phase يتقدّم أو يتراجع حسب الاتجاه. بعد الحركة نطفئ الملفات لكي لا تسخن؛ الثمن أن المحور لا يقاوم إذا دفعناه — يزول عزم التثبيت (מומנט החזקה).

مثال 11.4
للمحرّك 28BYJ-48 في الخطوة الكاملة Nrev = 2048، وزمن الخطوة في البرنامج 3 ms. نحسب:
(أ) زاوية الخطوة.
(ب) عدد الخطوات لربع دورة وزمنها.
الحل:
θs = 360°2048 = 0.176°

(ب) ربع الخطوات، وكل خطوة تستمر 3 ms:

20484 = 512 ; t = 512 · 0.003 = 1.536 s

وبنفس الطريقة يطبع البرنامج زمن دورة كاملة: 2048 · 3 ms ≈ 6.14 s.

t = 1.536 s
سؤال 11.4: المحرّك 28BYJ-48 في نصف الخطوة (Nrev = 4096). كم خطوة نحتاج لزاوية 90°؟ وكم ملفا يعمل في الحالة 4 من جدول نصف الخطوة؟
خطأ شائع: نقصّر زمن الخطوة كثيرا لكي «يدور أسرع». المحرّك لا يلحق، فيهتز في مكانه أو يفقد خطوات، والمتحكّم لا يعرف ذلك. محرّك الخطوة يعمل في حلقة مفتوحة: لا تغذية راجعة تخبرنا بالموقع الحقيقي. نجد أقصر زمن خطوة بالتجربة أو في ورقة البيانات، ونبقى فوقه.

محرّك الخطوة ثنائي القطب ودائرة القيادة STEP/DIR – מנוע צעד דו-קוטבי ודרייבר STEP/DIR:

المحرّكات الأقوى، مثل محرّكات الطابعة ثلاثية الأبعاد، هي محرّكات ثنائية القطب (מנוע צעד דו-קוטבי): ملفان فقط، والتيار في كل ملف يجب أن ينعكس — أي يحتاج كل ملف إلى جسر H. زاوية الخطوة في كثير منها 1.8°، أي 200 خطوة في الدورة (قيمة نموذجية). وحدات القيادة A4988 و DRV8825 تحتوي جسرين H ومنطقا كاملا، ويكفي المتحكّم طرفان: نبضة على STEP = خطوة واحدة، والمستوى على DIR = الاتجاه. وهي تقسم كل خطوة إلى خطوات دقيقة (מיקרו-צעדים): حتى 1/16 في A4988 وحتى 1/32 في DRV8825، حسب أطراف MS. وتحدّ التيار في الملفات بنفسها؛ نضبط الحدّ بالمقاومة المتغيرة الصغيرة على اللوحة حسب تعليمات صانعها.

التقسيم في A4988كاملة1/21/41/81/16
MS101011
MS200111
MS300001
Arduino Uno5VGNDD3D4A4988ENMS1MS2MS3RSTSLPSTEPDIRVMOTGND2B2A1A1BVDDGND 5V5V5V+−+47µF12VBAمحرّك ثنائي القطب5V
محرّك خطوة ثنائي القطب مع وحدة A4988. الطرف D3 إلى STEP والطرف D4 إلى DIR، والطرفان MS1 و MS2 إلى 5 V للتقسيم 1/8. للمحرّك مصدر 12 V ومكثف قرب الوحدة
دورة في كل اتجاه بإشارتي STEP و DIR Arduino Uno · stepper_a4988.ino
const int STEP_PIN = 3, DIR_PIN = 4;
const long STEPS_REV = 200L * 8;        // 1.8 deg motor, 1/8 microstep
const float RPM = 60.0;
unsigned long periodUs;
int dir = HIGH;

void setup() {
  pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT);
  Serial.begin(9600);
  periodUs = 60000000.0 / (STEPS_REV * RPM);
  Serial.print("steps/rev = "); Serial.println(STEPS_REV);
  Serial.print("period = "); Serial.print(periodUs); Serial.println(" us");
}

void loop() {
  digitalWrite(DIR_PIN, dir);
  Serial.print("DIR = "); Serial.println(dir);
  for (long n = 0; n < STEPS_REV; n++) {     // one revolution
    digitalWrite(STEP_PIN, HIGH); delayMicroseconds(10);
    digitalWrite(STEP_PIN, LOW);  delayMicroseconds(periodUs - 10);
  }
  dir = !dir;                                // reverse next time
  delay(500);
}
Serial Monitor · قراءة نموذجية
steps/rev = 1600
period = 625 us
DIR = 1
DIR = 0
DIR = 1

في التقسيم 1/8 تصبح الدورة 200 · 8 = 1600 خطوة. البرنامج يحسب بنفسه الزمن بين نبضتين من السرعة المطلوبة RPM، فلكي نغيّر السرعة نغيّر هذا الثابت فقط.

تحذير: لا نفصل المحرّك عن وحدة A4988 أو DRV8825 ولا نوصله بها والمصدر موصول: الجهد الذي يتولّد في الملفات قد يُتلف الوحدة. ونضبط حدّ التيار قبل التشغيل الطويل، وإلا سخنت الوحدة والمحرّك. يوصي صانع لوحة A4988 الشائعة بمكثف 47 µF على الأقل بين VMOT و GND.

השוואה ובחירת מנוע – مقارنة واختيار المحرّك (Choosing a Motor)

محرّك التيار المستمرالمحرّك المؤازرمحرّك الخطوة
ماذا نحدّد؟السرعة والاتجاهالزاويةعدد الخطوات وسرعتها
طريقة التحكّمPWM + جسر Hنبضة 1–2 ms كل 20 msتسلسل الملفات أو STEP/DIR
التغذية الراجعةلا (إلا إذا أضفنا مرمِّزا دوّارا)نعم — حلقة مغلقة داخليةلا — حلقة مفتوحة، نعدّ الخطوات
دائرة القيادةMOSFET أو L298N / L9110داخل المحرّكULN2003 أو A4988 / DRV8825
تطبيق نموذجيمروحة، مضخّة، عجلات روبوتذراع روبوت، صمّام صغير، حاجزطابعة ثلاثية الأبعاد، CNC، طاولة دوّارة

القاعدة البسيطة: إذا كان المطلوب دورانا مستمرا بسرعة متغيرة — محرّك تيار مستمر. إذا كان المطلوب زاوية في مجال محدود — محرّك مؤازر. إذا كان المطلوب موقعا دقيقا على مسافة أو دورات كثيرة، وبدون حسّاس — محرّك الخطوة.

ملخّص قوانين الفصل:

القانونالصيغة
تيار البدءIst = VMRM
نسبة التشغيلD = tonT = x255
الجهد المتوسّطVavg = D·VM
عرض نبضة المحرّك المؤازرtp = tmin + θ180°·(tmax − tmin)
زاوية الخطوةθs = 360°Nrev

قاموس المصطلحات – מילון מונחים:

بالعربيةبالعبرية (كما تظهر في الامتحان)English
محرّك التيار المستمرמנוע זרם ישרDC motor
تيار البدءזרם התנעהStall / starting current
دائرة القيادةמעגל הנעה (דרייבר)Driver
أرضي مشتركאדמה משותפתCommon ground
تعديل عرض النبضةאפנון רוחב פולסPWM
نسبة التشغيلמחזור עבודהDuty cycle
الجهد المتوسّطמתח ממוצעAverage voltage
ترانزستور MOSFET بالمستوى المنطقيMOSFET ברמה לוגיתLogic-level MOSFET
ديود الحماية (ديود العجلة الحرّة)דיודת חופשFlyback diode
جسر Hגשר HH-bridge
الحالة الممنوعةמצב אסורShoot-through
الكبح · التوقّف الحرבלימה · עצירה חופשיתBrake · coast
تسارع تدريجيהאצה רכהSoft ramp
المحرّك المؤازر (السيرفو)מנוע סרווServo motor
عرض النبضةרוחב הפולסPulse width
محرّك الخطوةמנוע צעדStepper motor
خطوة كاملة · نصف خطوةצעד מלא · חצי צעדFull step · half step
خطوات دقيقةמיקרו-צעדיםMicrostepping
محرّك ثنائي القطبמנוע צעד דו-קוטביBipolar stepper
عزم التثبيتמומנט החזקהHolding torque

أسئلة للتمرين:

1.
نكتب analogWrite(3, 64) وجهد مصدر المحرّك 12 V.
(أ) نحسب نسبة التشغيل بالنسبة المئوية.
(ب) نحسب الجهد المتوسّط.
(ج) نحسب الدور وزمن النبضة.
الإجابات: (أ) D = 25.1 % (ب) Vavg = 3.01 V (ج) T = 2.04 ms ، ton = 0.512 ms
2.
مصدر المحرّك 9 V ونريد جهدا متوسّطا 4.5 V. ما القيمة التي نكتبها في analogWrite()؟
الإجابات: x = 127.5 ≈ 128
3.
ما الفرق في الدور بين إشارة PWM على الطرف 6 وإشارة على الطرف 10 في Uno؟ وهل يتغيّر الجهد المتوسّط على المحرّك إذا كتبنا نفس القيمة؟
الإجابات: T = 1.02 ms على الطرف 6 و 2.04 ms على الطرف 10؛ الجهد المتوسّط نفسه لأن نسبة التشغيل نفسها
4.
مقاومة ملف محرّك 4 Ω ومصدره 12 V.
(أ) نحسب تيار البدء.
(ب) كم مرّة هو أكبر من الحدّ الأقصى المطلق لطرف Uno (40 mA)؟
الإجابات: (أ) Ist = 3 A (ب) 75 مرّة
5.
لماذا نختار لمحرّك التيار المستمر ترانزستور MOSFET بالمستوى المنطقي مثل IRLZ44N؟ ولماذا نضع مقاومة 10 kΩ بين البوابة والأرضي؟
الإجابات: لأنه يُفتح تماما بجهد 5 V من طرف المتحكّم فلا يسخن؛ والمقاومة تُبقي الترانزستور مقطوعا عندما يكون الطرف عائما
6.
في البرنامج dc_pwm_pot كانت القيمة الخام 300. ماذا يطبع البرنامج في السطر؟
الإجابات: raw = 300 x = 75 D = 29.4 % Vavg = 1.76 V
7.
نرسم جسر H بأربعة مفاتيح ونشير:
(أ) أي مفتاحين نغلق للدوران إلى الخلف؟
(ب) أي زوج ممنوع إغلاقه معا ولماذا؟
(ج) ما حالة المحرّك في L298N عندما ENA = 0؟
الإجابات: (أ) S3 و S2 (ب) مفتاحا الفرع نفسه (S1 مع S2 ، S3 مع S4): قِصَر في المصدر (ج) توقّف حر
8.
محرّك مؤازر مربوط بالأمر attach(9, 1000, 2000).
(أ) نحسب عرض النبضة عند 30°.
(ب) ما الزاوية عند نبضة 1300 µs؟
(ج) ما نسبة التشغيل عند 90°؟
الإجابات: (أ) 1166 µs (ب) 54° (ج) D = 7.5 %
9.
نشرح بمخطّط الكتل لماذا يعود ذراع المحرّك المؤازر إلى زاويته إذا أزحناه بأيدينا. ما القيمة المطلوبة وما القيمة الفعلية؟
الإجابات: القيمة المطلوبة عرض النبضة، والفعلية زاوية المحور التي تقيسها المقاومة المتغيرة؛ الخطأ يدير المحرّك حتى يصبح صفرا
10.
المحرّك 28BYJ-48 في الخطوة الكاملة (Nrev = 2048) وزمن الخطوة 4 ms.
(أ) نحسب زاوية الخطوة.
(ب) نحسب زمن ربع دورة.
(ج) كم خطوة لزاوية 45°؟
الإجابات: (أ) θs = 0.176° (ب) t = 2.048 s (ج) 256 خطوة
11.
محرّك 1.8° مع A4988 في التقسيم 1/16.
(أ) كم خطوة في الدورة؟
(ب) كيف نوصل الأطراف MS1 و MS2 و MS3؟
الإجابات: (أ) 3200 خطوة (ب) الثلاثة إلى 5 V
12.
نكتب جدول نصف الخطوة لأربعة ملفات، ونشرح كيف نعكس الاتجاه في البرنامج stepper_uln2003.
الإجابات: نمرّ على التسلسل بالترتيب المعاكس: نستدعي الدالة turn() بالقيمة -1 فيتراجع المتغيّر phase
13.
نختار نوع المحرّك ودائرة القيادة:
(أ) مروحة تبريد تتغيّر سرعتها حسب الحرارة.
(ب) مؤشّر يُظهر الحرارة على تدريج من 0° حتى 180°.
(ج) طاولة تدور 15° بالضبط في كل مرّة.
الإجابات: (أ) محرّك تيار مستمر مع MOSFET و PWM (ب) محرّك مؤازر (ج) محرّك الخطوة مع ULN2003 أو A4988
الإجابات النهائية لأسئلة الفصل
11.1 (أ) D = 40 % (ب) Vavg = 4.8 V (ج) ton = 0.82 ms
11.2 STEP_MS ≈ 39.2 ms؛ يُكبح المحرّك (توقّف سريع)، ولا يحدث قِصَر لأن الدائرة تمنعه
11.3 (أ) 1250 µs (ب) 126°
11.4 1024 خطوة؛ ملفان (IN2 و IN3)
لوحة القوانين: كل قوانين هذا الفصل مجموعة مع رسومها وجداول رموزها في الفصل 15 — لوحة القوانين الشاملة. (נוסחאון הספר)