חיישנים ומפעילים למיקרו-בקרים · פרק 11 — מנועים: מנוע זרם ישר, סרוו ומנוע צעדסמלי מקצוע 33.102 ו-33.002⌂📚🏠
פרק 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 ברמה לוגית, כלומר טרנזיסטור שמוליך במלואו כבר במתח 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-Bridge)

גשר H: מעגל של ארבעה מפסקים אלקטרוניים המסודרים בצורת האות H, והמנוע בקו האופקי שביניהם. כאשר סוגרים זוג מפסקים נגדיים, הזרם עובר במנוע בכיוון מסוים; כאשר סוגרים את הזוג האחר, כיוון הזרם מתהפך, ואיתו כיוון הסיבוב — בלי להחליף חוטים ומאותו מקור.
+VMGNDS1S2S3S4M
קדימה: S1 ו-S4 סגורים
+VMGNDS1S2S3S4M
אחורה: S3 ו-S2 סגורים
+VMGNDS1S2S3S4M!
אסור: S1 ו-S2 יחד (קצר)

אם נפתח את ארבעת המפסקים, המנוע יאט מעצמו עד שייעצר — עצירה חופשית. ואם נסגור את S2 ו-S4 יחד, הדקי המנוע יקוצרו והוא ייעצר מהר — בלימה.

אזהרה: המצב האסור (shoot-through): סגירה של שני המפסקים באותה זרוע יחד (S1 עם S2 או S3 עם S4) מחברת את +VM ישירות לאדמה. הזרם מוגבל אז רק בהתנגדות המפסקים, והם נשרפים תוך רגע. לכן במעבדה לא נבנה גשר H מארבעה טרנזיסטורים נפרדים, אלא נשתמש בדרייבר מוכן שהלוגיקה הפנימית שלו מונעת את המצב הזה.

דרייבר מוכן: 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? ומה יקרה למנוע עם ENA = 255, אם נכתוב IN1 = HIGH ו-IN2 = HIGH?
טעות נפוצה: הופכים את הכיוון כשהמנוע מסתובב במהירות המרבית. אז המתח ההפוך שבמנוע הוא באותו כיוון כמו מתח המקור, ועובר זרם גדול אפילו מזרם ההתנעה. לכן קודם נאט, נעצור לרגע, ורק אז נהפוך את הכיוון — כמו בסקיצה.
▶ניסוי חי — היפוך כיוון מנוע במגעניםלהשוואה: בלוחות חשמל תעשייתיים הופכים את כיוון הסיבוב של מנוע תלת-מופעי בשני מגענים, וביניהם נעילה הדדית שמונעת את סגירתם יחד — אותו רעיון כמו המצב האסור בגשר 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 (למתח 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:

המנועים החזקים יותר, כמו המנועים של מדפסת תלת-ממד, הם מנועי צעד דו-קוטביים: יש בהם רק שני סלילים, והזרם בכל סליל צריך להתהפך — כלומר כל סליל צריך גשר 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 ברמה לוגיתLogic-level MOSFETترانزستور MOSFET بالمستوى المنطقي
דיודת חופשFlyback diodeديود الحماية (ديود العجلة الحرّة)
גשר HH-bridgeجسر H
מצב אסור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 — נוסחאון הספר.