מערכת בקרה: חיישן, בקר, מפעיל וחיווי
דוד המים שנכבה מעצמו, המזגן ששומר על הטמפרטורה בחדר, והתאורה שנדלקת עם השקיעה: כולן מערכות בקרה. בכל אחת מהן יש חיישן שמודד, בקר שמחליט, מפעיל שמבצע וחיווי שמודיע למשתמש. בפרק זה נכיר את המבנה של מערכת בקרה, נתאר תהליך מבוקר במילים ובתרשימים, נבחין בין חוג פתוח לחוג סגור, ונסיים בסקיצה הראשונה שלנו: תרמוסטט על לוח Arduino Uno.
- נשרטט דיאגרמת מלבנים של מערכת בקרה ונקרא בשם לכל מלבן בה.
- נתאר תהליך מבוקר במילים, בתרשים זרימה ובתרשים בועות.
- נבחין בין חוג פתוח לחוג סגור, ובין בקרה בדידה לבקרה רציפה, ונחשב את השגיאה e = r − y.
- נסביר מדוע מוסיפים היסטרזיס לבקרה דו-מצבית.
- נכתוב סקיצה בלולאת "קריאה – החלטה – ביצוע" ונחשב מה היא תדפיס בצג הטורי.
המבנה העקרוני של מערכת בקרה (Control System Structure)
בכל מערכת, פשוטה או מורכבת, נמצא תמיד אותם מלבנים. נשרטט אותם בדיאגרמת מלבנים: כל חלק במערכת מצויר כמלבן, וכל חץ מראה אות או אנרגיה שעוברים ממלבן אחד לאחר.
| המלבן | בערבית | תפקידו | דוגמאות |
|---|---|---|---|
| חיישן | الحسّاس | ממיר גודל פיזיקלי לאות חשמלי (מתח, זרם או רמה לוגית) שהבקר קורא | חיישן טמפרטורה, נגד תלוי-אור, מצוף |
| בקר | المتحكّم | קורא את החיישנים ואת פקודות המשתמש, משווה לערך הרצוי ומחליט מה לעשות | מיקרו-בקר על Arduino Uno או ESP32 |
| מפעיל | المشغّل | הופך את פקודת הבקר לפעולה: חום, תנועה או אור | מחמם, מנוע, שסתום חשמלי, מגען |
| חיווי | البيان | מודיע לאדם על מצב המערכת | נורית חיווי, זמזם, תצוגה |
| תהליך מבוקר | العملية المُتحكَّم بها | הדבר שאנו מבקרים | מים במכל, אוויר בחדר |
| משתמש | المستخدم | קובע את הערך הרצוי ועוקב אחר החיווי | מכוון את הטמפרטורה הרצויה |
בספר זה הבקר הוא מיקרו-בקר. החיישן מתחבר אליו דרך מבוא ספרתי או תקבילי, והמפעיל והחיווי — דרך מוצא. המוצא של הבקר חלש, ולכן המפעיל מופעל בדרך כלל באמצעות טרנזיסטור או ממסר.
ניהול הספק במערכת חשמל:
מערכות בקרה אינן מבקרות רק טמפרטורה. בלוח החשמל אפשר לבנות מערכת שמנהלת את ההספק: חיישן זרם מודד את הזרם הכולל של הבית; אם הזרם מתקרב לגבול המותר, הבקר מנתק עומס שאינו דחוף, כמו דוד המים, באמצעות מגען, ומדליק נורית חיווי "הדוד מנותק". כך אנו מונעים ניתוק של הבית כולו במפסק הראשי. החיישן כאן הוא חיישן הזרם, המפעיל — המגען, והחיווי — הנורית.
(א) נחשב את זרם הדוד.
(ב) האם הבקר מאפשר להפעיל אותו?
(ג) הבקר מחבר את הדוד מחדש רק כשנשאר מרווח של 2 A מתחת לגבול. עד איזה זרם צריכים שאר העומסים לרדת?
(א) הזרם של עומס התנגדותי שווה להספק שלו חלקי המתח:
(ב) הזרם הכולל אילו הפעלנו את הדוד:
ערך זה גדול מהגבול 32 A, ולכן הבקר משאיר את המגען פתוח ומדליק את נורית החיווי.
(ג) נחסר מהגבול את זרם הדוד ואת המרווח:
המרווח מונע חיבור וניתוק של הדוד שוב ושוב כשהזרם קרוב לגבול. אותו רעיון, היסטרזיס, יחזור בתרמוסטט.
תיאור תהליך מבוקר: מילולי, תרשים זרימה ותרשים בועות (Describing a Process)
לפני שנכתוב שורת קוד אחת, נתאר מה המערכת צריכה לעשות. נשתמש בשלוש דרכים שמשלימות זו את זו. הדוגמה שלנו בהמשך הפרק היא תרמוסטט: הוא מחמם חדר קטן ושומר על הטמפרטורה בו בין 23 °C ל-25 °C.
תיאור מילולי:
- בהפעלה המחמם כבוי.
- הבקר קורא את הטמפרטורה T פעם בשנייה.
- אם T יורדת מתחת ל-23 °C, הבקר מפעיל את המחמם.
- אם T עולה מעל 25 °C, הבקר מכבה את המחמם.
- בין שני הערכים הבקר אינו משנה דבר: המחמם נשאר במצבו הקודם.
- הבקר מציג בצג את T ואת מצב המחמם.
תיאור מילולי קל לכתוב, אבל הוא עלול להיות לא מדויק: מה בדיוק קורה ב-25 °C? לכן נשרטט אותו גם בתרשים.
תרשים זרימה:
נעקוב אחר החצים מלמעלה: אחרי האתחול מתחילה לולאה שאינה מסתיימת: קריאה, חישוב, שתי שאלות, הדפסה והמתנה, ואז חזרה לקריאה. אם התשובה לשתי השאלות היא "לא", נגיע להדפסה בלי לשנות את מצב המחמם; זה סעיף 5 בתיאור המילולי.
תרשים בועות (תרשים מצבים):
תרשים הבועות מראה בבירור את מה שהתיאור המילולי מסתיר: ב-T = 24 °C המחמם יכול להיות פועל או כבוי — התשובה תלויה במצב הקודם. מערכת כזאת "זוכרת", ולכן בסקיצה נזדקק למשתנה ששומר את המצב.
חוג פתוח וחוג סגור (Open and Closed Loop)
- ערך רצוי r: מה שהמשתמש קובע, למשל 24 °C.
- ערך מצוי y: מה שקיים בפועל בתהליך, כפי שהחיישן מודד אותו.
- שגיאה e: ההפרש בין הרצוי למצוי; יחידתה היא יחידת הגודל המבוקר. הבקר פועל כדי להקטין אותה:
- הפרעה: השפעה חיצונית שמשנה את התהליך: חלון פתוח, שמש, עומס נוסף. חוג פתוח אינו מתקן את השפעתה, וחוג סגור מתקן אותה מעצמו.
(א) החיישן מודד y = 21.5 °C.
(ב) אחרי שהשמש נכנסת לחדר הוא מודד y = 25.8 °C. נחשב את השגיאה בכל מקרה ונחליט מה התרמוסטט עושה.
נציב בנוסחת השגיאה: (א) בשורה הראשונה, (ב) בשורה השנייה.
(א) השגיאה חיובית: החדר קר מהרצוי, ולכן הבקר מפעיל את המחמם. (ב) השגיאה שלילית: החדר חם מהרצוי, ולכן הבקר מכבה את המחמם. השמש כאן היא הפרעה.
חוג פתוח פשוט וזול יותר, אבל אינו מתקן הפרעות. חוג סגור זקוק לחיישן ולתוכנית השוואה, אבל מתקן את עצמו.
בקרה בדידה ובקרה רציפה (Discrete and Continuous Control)
בקרה דו-מצבית עם היסטרזיס:
אילו התרמוסטט היה משתמש בערך סף אחד, למשל "הפעל מתחת ל-24 °C וכבה מעליו", מצב המחמם היה משתנה בכל פעם שהטמפרטורה חוצה את הסף כלפי מעלה או כלפי מטה — וליד הסף זה קורה כמעט בכל קריאה. הממסר או המגען נשחקים מהר, ונשמע "תקתוק" בלי הפסקה.
חישבנו במחשב את התנהגותו של חדר קטן במודל מפושט: טמפרטורת הסביבה 18 °C, המחמם מעלה את הטמפרטורה בקצב 0.8 °C/min, והחדר מאבד חום ככל שהוא חם יותר מהסביבה. הבקר קורא פעם בשנייה, ו-TON = 23 °C , TOFF = 25 °C. אלה מספרים לדוגמה של המודל, ולא ערכים של מכשיר מסוים.
- בהתחלה החדר קר, ולכן המחמם פועל עד שהטמפרטורה מגיעה ל-25 °C, אחרי כ-11.5 min.
- אחר כך הטמפרטורה מתנדנדת בין 23 °C ל-25 °C בקירוב. מחזור שלם נמשך כ-10.8 min: המחמם פועל כ-4 min וכבוי כ-6.7 min.
- במשך שעה שינה המחמם את מצבו 10 פעמים. באותו מודל, עם ערך סף אחד של 24 °C, המצב משתנה 2280 פעמים בשעה.
אם כן, המחיר של ההיסטרזיס הוא תנודת הטמפרטורה בתחום ΔT, והרווח הוא מספר קטן מאוד של מיתוגים. ככל שנרחיב את ΔT, יפחת מספר המיתוגים ותגדל התנודה.
לולאת הבקר: קריאה, החלטה וביצוע (Read – Decide – Act)
לסקיצה יש שתי פונקציות: setup() רצה פעם אחת בהפעלה, ו-loop() חוזרת בלי הפסקה. בכל סבב של loop() הבקר מבצע שלושה צעדים — והם בדיוק המלבנים של דיאגרמת המלבנים (ובסקיצה שבהמשך נמצא אותם בהערות // 1. read , // 2. decide , // 3. act):
- קריאה: הבקר קורא את החיישנים — analogRead() למבוא תקבילי או digitalRead() למבוא ספרתי.
- החלטה: הבקר ממיר את הערך הגולמי ליחידה פיזיקלית ומשווה אותו לערך הרצוי (משפט if).
- ביצוע: הבקר כותב למוצאים — digitalWrite() למפעיל ולחיווי, ו-Serial.print() לצג.
(א) נחשב את תדר הדגימה ואת מספר הקריאות בדקה.
(ב) בכמה משתנה הטמפרטורה בין שתי קריאות? האם הדגימה מהירה מספיק?
(א) Ts = 1 s (המשוואה הראשונה), ובדקה יש 60 קריאות. (ב) נחלק את השינוי בדקה במספר הקריאות (המשוואה השנייה):
השינוי בין שתי קריאות קטן בהרבה מרוחב אזור ההיסטרזיס 2 °C, ולכן הדגימה מהירה מאוד עבור התהליך האיטי הזה. לעומת זאת, לחצן שאדם לוחץ עליו דורש קריאה מהירה בהרבה, ולכן איננו משתמשים ב-delay() ארוך בתוך הלולאה: בזמן הזה הבקר אינו קורא דבר.
סקיצה ראשונה: תרמוסטט עם היסטרזיס (First Sketch: Thermostat)
נבנה את התרמוסטט על לוח Arduino Uno בלי חיישן טמפרטורה אמיתי: פוטנציומטר במבוא A0 מייצג את החיישן — נסובב את הידית שלו, ו"הטמפרטורה תשתנה". נורית LED במוצא D8 מייצגת את המחמם. בפרק 5 נחליף את הפוטנציומטר בחיישן טמפרטורה אמיתי, ובפרק 10 נחליף את הנורית בממסר.
חישוב הנגד הטורי של הנורית:
נבחר את הערך המסחרי הקרוב הגדול יותר מסדרת E12: R = 330 Ω. הזרם בפועל:
זה פחות מ-20 mA, הזרם המומלץ להדק של ATmega328P שב-Uno.
מהערך הגולמי לטמפרטורה:
פוטנציומטר של 10 kΩ מחובר בין 5 V ל-GND (זורם בו רק 0.5 mA), ולכן מתח הזחלן משתנה מ-0 עד 5 V. הממיר התקבילי-ספרתי של ה-Uno נותן ערך גולמי N מ-0 עד Nmax = 1023. נחליט שתחום "החיישן" הוא מ-0 עד Tmax = 50 °C, וכך הערך הגולמי הופך לטמפרטורה ביחס ישר פשוט:
הסקיצה:
const int SENSOR = A0; // potentiometer = temperature sensor (model)
const int HEATER = 8; // LED = heater (model)
const float T_MAX = 50.0; // N = 1023 -> 50 C
const float T_ON = 23.0; // below this: heater ON
const float T_OFF = 25.0; // above this: heater OFF
const unsigned long PERIOD = 1000; // sampling period [ms]
bool heaterOn = false;
unsigned long last = 0;
void setup() {
pinMode(HEATER, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (millis() - last < PERIOD) return;
last = millis();
int n = analogRead(SENSOR); // 1. read
float t = n * T_MAX / 1023.0;
if (t < T_ON) heaterOn = true; // 2. decide
else if (t > T_OFF) heaterOn = false;
digitalWrite(HEATER, heaterOn ? HIGH : LOW); // 3. act
Serial.print("N = "); Serial.print(n);
Serial.print(" T = "); Serial.print(t, 1);
Serial.println(heaterOn ? " C heater: ON" : " C heater: OFF");
}- הקבועים בראש הסקיצה: ההדקים, תחום החיישן, TON , TOFF וזמן הדגימה. כדי לשנות את הכיוונון נשנה שורה אחת.
- המשתנה heaterOn הוא "הזיכרון" של תרשים הבועות. אין else בסוף: אם T בין שני הערכים, איננו נוגעים בו.
- השורה if (millis() - last < PERIOD) return; גורמת לסבב לרוץ פעם בשנייה, בלי delay().
נסובב את הידית לאט למטה ואחר כך למעלה. זהו צג טיפוסי, שחושב באותה נוסחה של הסקיצה ובאותו עיגול לספרה אחת אחרי הנקודה העשרונית:
N = 532 T = 26.0 C heater: OFF N = 501 T = 24.5 C heater: OFF N = 486 T = 23.8 C heater: OFF N = 471 T = 23.0 C heater: OFF N = 460 T = 22.5 C heater: ON N = 452 T = 22.1 C heater: ON N = 466 T = 22.8 C heater: ON N = 481 T = 23.5 C heater: ON N = 497 T = 24.3 C heater: ON N = 512 T = 25.0 C heater: OFF N = 522 T = 25.5 C heater: OFF N = 530 T = 25.9 C heater: OFF
נשווה את השורות N = 486 (בדרך למטה) ו-N = 481 (בדרך למעלה): הטמפרטורה כמעט זהה, בתוך אזור ההיסטרזיס, אבל המחמם כבוי בראשונה ופועל בשנייה. זה ההיסטרזיס, כפי שראינו אותו בתרשים הבועות.
(א) ה-N הגדול ביותר שמפעיל את המחמם (T קטנה מ-23 °C).
(ב) ה-N הקטן ביותר שמכבה אותו (T גדולה מ-25 °C).
נבודד את N מהנוסחה: N = T·NmaxTmax.
(א) N הוא מספר שלם והתנאי הוא "קטן מ־", ולכן הערך הגדול ביותר שמפעיל את המחמם הוא N = 470. (ב) התנאי הוא "גדול מ־", ולכן הערך הקטן ביותר שמכבה אותו הוא N = 512. נשווה לצג: N = 471 לא הפעיל את המחמם, ו-N = 512 כיבה אותו.
מפת הספר: חיישנים, מפעילים וחיווי (Book Map)
בהמשך הספר ניקח כל מלבן בדיאגרמת המלבנים ונלמד אותו: כיצד הוא פועל, כיצד מחברים אותו לבקר, וכיצד הופכים את הקריאה שלו למספר בעל משמעות.
| פרק | נושא | דוגמאות |
|---|---|---|
| 2–4 | היסודות: מאפיינים ומבואות | דיוק, נגד משיכה למעלה, התאמת אותות |
| 5 | טמפרטורה ולחות | נגד תלוי-טמפרטורה, LM35, DS18B20, DHT22 |
| 6 | אור | נגד תלוי-אור, פוטודיודה |
| 7 | מרחק, נוכחות ותנועה | חיישן על-קולי, חיישן תנועה |
| 8 | חיישנים תעשייתיים | חיישני קרבה, מפסק גבול |
| 9 | זרם, מתח והספק | חיישן זרם, מחלק מתח |
| 10 | הפעלת עומסים | טרנזיסטור כמפסק, ממסר |
| 11 | מנועים | מנוע סרוו, מנוע צעד |
| 12 | מפעילים תעשייתיים | מגען, שסתום חשמלי |
| 13 | חיווי ותצוגה | זמזם, צג גביש נוזלי |
| 14 | פרויקט מסכם | מערכת בקרה שלמה |
סיכום נוסחאות הפרק:
| החוק | הנוסחה |
|---|---|
| הזרם של עומס התנגדותי | I = PV |
| השגיאה בחוג סגור | e = r − y |
| רוחב אזור ההיסטרזיס | ΔT = TOFF − TON |
| תדר הדגימה | fs = 1Ts |
| המתח מתוך הערך הגולמי | V = N·VrefNmax |
| מערך גולמי לטמפרטורה | T = N·TmaxNmax |
| הנגד הטורי של הנורית | R = VCC − VFIF |
מילון מונחים:
| עברית | English | العربية |
|---|---|---|
| מערכת בקרה | Control system | نظام التحكّم |
| בקרה ממוחשבת | Computer control | التحكّم المحوسب |
| חיישן | Sensor | الحسّاس (المستشعر) |
| בקר · מיקרו-בקר | Controller · Microcontroller | المتحكّم · المتحكّم الدقيق |
| מפעיל | Actuator | المشغّل |
| חיווי | Indication | البيان |
| תהליך מבוקר | Controlled process | العملية المُتحكَّم بها |
| דיאגרמת מלבנים | Block diagram | مخطّط الكتل |
| תרשים זרימה | Flowchart | مخطّط سير العمليات |
| תרשים בועות / מצבים | State diagram | مخطّط الحالات |
| חוג פתוח | Open loop | الحلقة المفتوحة |
| חוג סגור | Closed loop | الحلقة المغلقة |
| משוב | Feedback | التغذية الراجعة |
| ערך רצוי | Set point | القيمة المطلوبة |
| ערך מצוי | Actual value | القيمة الفعلية |
| שגיאה | Error | الخطأ |
| הפרעה | Disturbance | الاضطراب |
| בקרה בדידה | Discrete control | التحكّم المتقطّع |
| בקרה רציפה | Continuous control | التحكّم المستمر |
| בקרה דו-מצבית | On/off control | تحكّم تشغيل-إيقاف |
| היסטרזיס | Hysteresis | التخلّف (الهستيريسيس) |
| תרמוסטט | Thermostat | منظّم الحرارة (الثرموستات) |
| דגימה | Sampling | أخذ العيّنات |
| פוטנציומטר | Potentiometer | المقاومة المتغيّرة (البوتنشيومتر) |
| ערך גולמי | Raw value | القيمة الخام |
| מבוא · מוצא | Input · Output | المدخل · المخرج |
| ממיר תקבילי-ספרתי | Analog-to-digital converter | المحوّل التماثلي-الرقمي |
| חיישן זרם | Current sensor | حسّاس التيار |
| מגען | Contactor | الملامس (الكونتاكتور) |
| סקיצה | Sketch | البرنامج (sketch) |
שאלות לתרגול:
(א) רמזור שמתחלף כל 30 s.
(ב) מגהץ עם תרמוסטט.
(ג) השקיה לפי שעון.
(ד) משאבה עם שני מצופים.
(א) 35.5 °C.
(ב) 38.2 °C. מה פירוש הסימן של השגיאה בכל מקרה?
(א) מהו רוחב אזור ההיסטרזיס?
(ב) שרטטו תרשים בועות וכתבו את התנאי על כל חץ.
(א) חשבו את התנגדות הנגד הטורי.
(ב) בחרו ערך מסדרת E12 וחשבו את הזרם בפועל.
(א) חשבו את זרם המחמם.
(ב) האם הבקר מאפשר להפעיל אותו?