יום ראשון, 8 בפברואר 2009

מן המסד עד הטפחות: הפעלה ישירה של מנוע סרבו דרך המחשב

לאון מינץ

כולנו כותבים תוכניות במחשב. זה מתחיל בסמסטר הראשון בקורס שפת C ולא מסתיים כמעט אף פעם. במאמר זה נלמד איך לחבר בין שורות הקוד הצבעוניות לבין ה"ברזלים" אותם הן אמורות להפעיל...


במסגרת הקורס "בעיות נבחרות במכניקה הנדסית" של הפקולטה להוראת המדעים, הייתי צריך לגרום למנוע סרבו להסתובב על ידי פקודה מהמחשב. פונקציונליות שכזו היא די טריויאלית בעולם שלנו, ולראיה: הגאי הטיסנים מופעלים באמצעות שלט רחוק. אז כן, אפשר לקנות בקר שיעשה את זה, אבל המגבלה היחידה שהיתה לי היא, מן הסתם, העלות.

מהו מנוע סרבו?

מנוע סרבו הוא מנוע מיוחד אשר קובע את האוריינטציה שלו לפי אות הכניסה, בשיטת אפנון רוחב דופק (מוסבר בסעיף הבא). המנוע מורכב ממנוע DC, מפחת, חיישן מיקום ומעגל אלקטרוני המבקר את פעולת המנוע.
לדוגמה, אם אנו מעוניינים להטות את הגה הכיוון של הטיסן שלנו ב-°5, נשלח פקודה מתאימה למנוע. כעת התפקיד של המנוע לשמור על הטיה של 5 מעלות, על אף שמופעלת התנגדות של הרוח. לצורך זה המנוע מודד את הסטייה של ההגה מ-5 מעלות ומתקן בהתאם, על ידי משוב.
תחום התזוזה הטיפוסי הינו °120, ואכן, רוב השימושים של הסרבו הם של בקרת מיקום. לעומת זאת, במעבדה מדעית רוב הניסויים יצריכו שימוש במנועים עם תנועה רציפה. על מנת לאפשר תנועה רציפה, ניתן לבצע שינוי במנגנון הבקרה (קצר במערכת המשוב).

אפנון רוחב דופק (Pulse Width Modulation)

בשיטת אפנון רוחב דופק (PWM), אספקת הזרם לצרכן אינה רציפה אלא בצורה של דפקים קצרים. הערך הממוצע של ההספק תלוי ביחס הזמנים של הפעלה/הפסקה באספקת האנרגיה לצרכן[1]. פעולה זו מתוארת באיור הבא.

בשיטת PWM, לעצמת הזרם יש רק שני מצבים: I=Imax ו-I=0.
כפי שניתן לראות באיור, הגל הריבועי מתאפיין במשך זמן בו הוא מקבל את ערכו המקסימלי, ובמשך זמן שבו הוא מקבל את ערכו המינימלי, וסכומם הוא זמן המחזור של הגל.
טווח הזמנים של Imax עבור מנוע סטנדרטי הוא 920μs – 2120μs, כאשר 1250μs מציין את מצב האמצע, והזמן המומלץ עבור I=0 הוא‏ 14ms-20ms[2].

בקרה בשיטת PWM באמצעות מחשב מבוססת על לולאות השהייה לפרקי זמן קצובים, המתאימים לצורת הגל הרצויה.
אם כן, הקלט של מנוע הסרבו הוא גל ריבועי אשר צורתו מציינת את המיקום הזוויתי שבו ציר המנוע צריך להיות.

חיווט

למנוע הסרבו הטיפוסי שלושה מגעים – שניים למקור מתח (5-6V) ועוד אחד לבקרה, אשר "נסגר" בהדק השלילי של מקור המתח (או באדמה – ויחובר להארקה).
לכל סרבו יש אורכי גל אופיניים משלו, אשר משתנים מיצרן ליצרן.

אזהרה: אספקת מתח הגבוה ממתח העבודה של הסרבו או החלפה רגעית של הקוטביות עלולה לשרוף את המנוע מיידית.

חיבור LPT – מוטיבציה


מדובר ביישום שלא דורש השקעה כספית מעבר לרכישת המנועים.
היישום הוא פשוט ולא דורש שום אלקטורניקה נוספת.
האמיצים במיוחד יכולים לנסות להפעיל את הסרבו דרך כרטיס הקול של המחשב...

חסרונות

היציאה המקבילית הינה מיושנת ואינה מופיעה יותר במחשבים חדישים.
חיווט רשלני עלול לשרוף את לוח-האם של המחשב.
ביצועי המחשב משפיעים על פעולת המנוע.

כללית, עקרון הפעולה הוא[3]:
  1. שליחה של 1-לוגי ליציאה דיגילית.
  2. המתנה של מספר מילישניות.
  3. שליחה של 0-לוגי ליציאה דיגיטלית.
  4. המתנה של מספר מילישניות.
  5. חזרה על כך כמה עשרות פעמים בשניה.

מבוא לתכן לוגי...

כל אחד מ-8 הפינים של היציאה המקבילית יכולים להיות בשני מצבים לוגיים – 1,0 – ולכן 8 הפינים מסוגלים לייצג מספר בן 8 סיביות. כמות המספרים שניתן לייצג היא אפוא 28=256 ולכן טווח המספרים המתאים להפעלת 8 מנועי סרבו שונים במקביל הינו0-255.













































#ביטדצימליבינארי
2D0100000001
3D1200000010
4D2400000100
5D3800001000
6D41600010000
7D53200100000
8D66401000000
9D712810000000

דוגמה: נניח כי לכל פין של היציאה המקבילית מחוברת נורת LED. על מנת להאיר את ה-LEDs ה-3,5,9, עלינו לשלוח את המספר הבא ליציאה המקבילית:

‏ (2+8+128)d=(138)d=(10001010)b

היות שבערוץ הפלט של יציאת LPT יש 8 סיביות, מחשב אחד יכול לבקר בו-זמנית את פעולתם של 8 צרכנים, שכל אחד מהם פועל בבקרה דו-מצבית. בדוגמה זו נפעיל צרכן אחד בלבד, דרך המחבר הראשון (D0).

התממשקות אל היציאה המקבילית

במערכות הפעלה מיושנות (non-multitasking, 16bit) כגון MS-DOS, Win3x, ניתן להריץ קוד פשוט אשר ניגש ישירות אל היציאה המקבילית[4].
אולם רק מערכות הפעלה של 16 ביט מאפשרות גישה ישירה ליציאות המחשב. מערכות לינוקס וחלונות NT ומעלה לא יאפשרו גישה ישירה ליציאה המקבילית. לכן יש לאפשר גישה זו עם דרייבר מתאים (giveio בחלונות והרשאת root בלינוקס).

פייתון וחבילת pyParallel

פייתון הינה שפת תכנות עילית מודולרית המריצה פקודות בשיטת interpreter וזמינה עבור מערכות ההפעלה הנפוצות (חלונות, לינוקס, מק).
חבילת pyParallel[5] מאפשרת גישה נוחה מאוד ליציאה המקבילית והינה למעשה החבילה הבלעדית, ככל הידוע לי, עם פונקציונליות כזו.

התקנה

1. התקינו את פייתון[6].
2. התקינו את pyParallel.
3. התקינו את giveio[7].
4. רוב משתמשי לינוקס יצטרכו להקליד את הפקודה הבאה על מנת לאפשר גישה ליציאה: rmmod lp

הפעלה

הכנסו לפייתון על ידי הקלדת python בשורת הפקודה.
הפעולה הראשונה היא import, בדומה ל-include המוכר משפת C. לאחר מכן נתחיל לשלוח ביטים ליציאה:
>>> import parallel
>>> p = parallel.Parallel()
>>> p.setData(1)
הדוגמה הבאה מזיזה סיבית 1 ב-4 סיביות ימינה:
>>> p.setData(1 << 4)

קוד לדוגמה

בדוגמה הבאה נגדיר פונקציה המקבלת כפרמטרים שני זמנים: אחד עבור I=0 ואחד עבור I=Imax.
#!/bin/env python

import time
import parallel

p=parallel.Parallel()
p.setData(0)

def my_sleep(sec):
c = time.clock()
while time.clock() - c <>
pass

def startInfLoop(Time1,Time0):
time1=float(Time1)
time0=float(Time0)
while(1):
p.setData(0)
my_sleep(Time0)
p.setData(1)
my_sleep(Time0)

מקביליות

על מנת לשלוט על יותר מסרבו אחד, יהיה צורך בתכנות מקבילי ובקרת תהליכים עם סמפורים וכדומה. לפייתון יש את האפשרויות האלו, אך נושא זה מורכב למדי.

לקריאה נוספת

סימוכין

[1] וקס, שלמה, בקרת תהליכים באמצעות מחשב, מהדורה ניסויית, הטכניון, 1988.


אין תגובות: