פרויקט לדוגמה 5 שליטה על מנוע צעד דרך תקשורת אינטרנט

כללי:

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

שלבי העבודה:

1.     בנה את המעגל האלקטרוני הבא:




2.     הורד את הקובץ inpout32.dll מהאתר והצמד אותו לתקייה שבה נימצא הפרויקט שלך

3.     פתח פקויקט חדש במקום שנימצא הקובץ inpout32.dll.

4.     גש לחלון הטופס והוסף לו את הפקדים הבאים:



הטופס כולל שמונה פקדים והם:

Command1 – לחצן עם הכיתוב "סע".

Text1 – עם המספר 360

Label1 – עם הכיתוב "זוית במעלות"

Label2 – עם הכיתוב "0"

Label3 – עם הכיתוב "כיוון המנוע עכשיו"

Timer1 – עם interval של 10

Shape1 – בצורה של עיגול

Line1 – קו

5.     גש לכתיבת הקוד של Form1 וכתוב בו את הקוד הבא:

Dim A, B, C

Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value_

 As Integer)

Private Sub Command1_Click()

Timer1.Enabled = True

End Sub

Private Sub Form_Load()

  Out &H378, &H0

  C = 7.5

  Timer1.Enabled = False

End Sub

Private Sub Timer1_Timer()

    A = Val(Text1.Text) / C

    If A > B Then B = B + 1

    If A < B Then B = B - 1

    Phase = B Mod 4

    If Phase = 0 Then Out &H378, 3

    If Phase = 1 Then Out &H378, 6

    If Phase = 2 Then Out &H378, 12

    If Phase = 3 Then Out &H378, 9

    Line1.Y2 = Line1.Y1 + Sin(B * C * 3.14 / 180) * 1200

    Line1.X2 = Line1.X1 + Cos(B * C * 3.14 / 180) * 1200

    Label2.Caption = B * C

    If Abs(A - B) < 1 Then Timer1.Enabled = False

End Sub


הסבר התוכנית:
המעגל עושה שימוש שקובץ DLL שונה מהדוגמאות של הפרויקטים הבאים כדי לאפשר תאימות ל- WindowsXP . כמו כן אני מדגים כאן כיצד ניתן להכריז כל הפונקציה Out שלא דרך כתיבת מודול. החיסרון בזה שלא מכריזים על הפונקציה במודול היא שניתן לקרוא לפונקציה רק מהטופס בה הוא הוכרז.

המשתנה C משמש לקביעת זוית הפסיעה של המנוע. להסבר מפורט על מנועי צעד כנס לכתובת: http://mop.ort.org.il/mechatronics/scripts/inner.asp?pc=852628868

התנועה של המנוע ניגרמת על ידי הפעלה של Timer1 תכונת ה- Interval  של ה- Timer1 קובע את מהירות התנועה של המנוע.

כל פעם שהאירוע של ה- Timer1  קורה המחשב בודק האם הזוית הרצויה, משתנה A, גדול או קטן מהזוית הנוכחית של המנוע, משתנה B , וכתוצאה מכך המחשב מוסיף או מוריד אחד מהמשתנה B

תזוזת המנוע מתבצעת על ידי בדיקת השארית של חלוקת המשתנה B ב- 4

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

    If Phase = 0 Then Out &H378, 3

    If Phase = 1 Then Out &H378, 6

    If Phase = 2 Then Out &H378, 12

    If Phase = 3 Then Out &H378, 9


השורות הבאות מחשבות את המיקום של הקו Line1 המורה על הזוית של המנוע, משתנה A, שים של שכל הזיות שהמחשב מחשב הם ברדיאנים ולא במעלות כל כן

יש להכפיל את הזיות בפאי ולחלק ב- 180 כדי להמיר אותה ממעלות לרדיאנים.

    Line1.Y2 = Line1.Y1 + Sin(B * C * 3.14 / 180) * 1200

    Line1.X2 = Line1.X1 + Cos(B * C * 3.14 / 180) * 1200


סוף התהליך כלומר הפסקת פעולת ה- Timer מתרחש כאשר זיות היעד, משתנה A, שווה לזיות הנוכחית של המנוע, משתנה B.

    If Abs(A - B) < 1 Then Timer1.Enabled = False


להורדת התוכנה המלאה לחץ כאן s_m.zip.



שילוב השליטה על המנוע דרך האינטרנט:

בתוכנה אני עושה שימוש באוביקט בתיקשורת של Microsoft בשם Winsock. פקד זה היינו פקד תעבורה של נתונים בפרוטוקול  TCP/IPאו בקיצור רשת האינטרנט. פקד זה יכול להעביר נתונים בין מחשבים המחוברים לרשת האינטרנט או בין שני מחשבים שלא מחוברים לאינטרנט אלא דרך כרטיסי רשת ובמחשב מוגדר הפרוטוקול TCP/IP.

להסבר מפורט על הפקד גלוש לאתר:
 
http://www.dr-vb.co.il/articles/article.php?id=19


הוספת הפקד לתוכנית:

פקד זה אינו פקד שמופיע דרך קבע באיזור הפקדים של ויזואל ביסק על כן יש להוסיפו באופן נקודתי כל פעם שרוצים לבנות תוכנית מחשב שעושה שימוש בפקד:
1. בחרו בתפריט
Project ולאחר מכן ב-Components .
2. בחלון שיפתח, תוסיפו את הפקד
Microsoft winsock control 6.0 (על ידי סימון V ליד שמו).
3. הוסיפו כעת, את הבקר לטופס שלכם על ידי גרירתו מאיזור הפקדים.

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


כתיבת תוכנת השרת:

1.     פתח פרויקט חדש ושמור אותו בתקייה שבו נימצא הקובץ inpout32.dll .

2.     הוסף לפרויקט את הפקד Microsoft winsock control.

3.     לחלון הטופס והוסף לו את הפקדים הבאים:

4.     גש לכתיבת הקוד של Form1 וכתוב בו את הקוד הבא:

Dim A, B, C As Integer

Dim data As String

Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" _

(ByVal PortAddress As Integer, ByVal Value As Integer)

Private Sub Form_Load()

  Winsock1.LocalPort = 3000

  Winsock1.Listen

  Out &H378, &H0

  C = 7.5

  Timer1.Enabled = False

End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

  Winsock1.Close

  Winsock1.Accept requestID

  Label4.Caption = "On Line"

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

  Winsock1.GetData data

  If data = "disconnect" Then

  Winsock1.Close

  Winsock1.Listen

  Else

  Text1.Text = data

  Timer1.Enabled = True

  End If

End Sub

Private Sub Timer1_Timer()

    A = Val(Text1.Text) / C

    If A > B Then B = B + 1

    If A < B Then B = B - 1

    Phase = B Mod 4

    If Phase = 0 Then Out &H378, 3

    If Phase = 1 Then Out &H378, 6

    If Phase = 2 Then Out &H378, 12

    If Phase = 3 Then Out &H378, 9

    Line1.Y2 = Line1.Y1 + Sin(B * C * 3.14 / 180) * 1200

    Line1.X2 = Line1.X1 + Cos(B * C * 3.14 / 180) * 1200

    Label2.Caption = B * C

    If Abs(A - B) < 1 Then Timer1.Enabled = False

End Sub


הסבר התוכנית:
בזמן הטעינה של הטופס, אירוע FormLoad, השרת מקבל אישור להאזין לתקשורת אינטרנט דרך פורט מספר 3000. כל תוכנת מחשב המשתמשת באינטרנט לתקשורת מקבלת ערוץ האזנה פרטי לדוגמה תוכנת הדפדפן מקבלת באופן מוסכם על ידי רשויות האינטרנט את פורט 80 כדי חשלוח ולקבל מיעד באינטרנט כל הפורטים מעל 100 הם לשימוש עתידי על כן אני עושה שימוש בפורט 3000 הפנוי.

  Winsock1.LocalPort = 3000

  Winsock1.Listen

כאשר מגיע מידע דרך פורט זה מופעל האירוע הבא:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

  Winsock1.GetData data

  If data = "disconnect" Then

  Winsock1.Close

  Winsock1.Listen

  Else

  Text1.Text = data

  Timer1.Enabled = True

  End If

End Sub

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

להורדת התוכנה המלאה לחץ כאן server.zip.


כתיבת תוכנת הלקוח:

1.     פתח פרויקט חדש ושמור אותו בתקייה שבו נימצא הקובץ inpout32.dll .

2.     הוסף לפרויקט את הפקד Microsoft winsock control.

3.     לחלון הטופס והוסף לו את הפקדים הבאים:

4.     גש לכתיבת הקוד של Form1 וכתוב בו את הקוד הבא:

Private Sub Command1_Click()

Winsock1.Close

Winsock1.RemoteHost = Text1.Text

Winsock1.RemotePort = 3000

Winsock1.Connect

End Sub

Private Sub Command2_Click()

If Winsock1.State = 7 Then

Dim data As String

data = "disconnect"

Winsock1.SendData data

Else

MsgBox "ãøåùä äúçáøåú"

End If

End Sub

Private Sub Command3_Click()

If Winsock1.State = 7 Then

Dim data As String

data = Text2.Text

Winsock1.SendData data

Else

MsgBox "ãøåùä äúçáøåú"

End If

End Sub

הסבר התוכנית:
לחצן מספר 1 יוצר את הקשר בין תוכנת הלקוח (תוכנה זו) לבין תוכנת השרת שבה מחובר המנוע. התוכנה מעבירה את תוכן תיבת הטקסט מבלקוח לשרת.

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

לחצן מספר 2 נבצע ניתוק על ידי בדיקת מצב החיבור (Winsock1.State = 7) מורה על חיבור תקין. אם אכן יש חיבור המחשב שולח את המילה (disconnect) כדי להודיע לשרת על הניתוק.

לחצן מספר 2 שלוח את תוכן תיבת הטקסט בה כתובה זוית לשרת לא ליפני שבדק שמצב החיבור תקין שוב על ידי הבדיקה (Winsock1.State = 7).

להורדת התוכנה המלאה לחץ כאן client.zip.



הרמן גדי , מורה לאלקטרוניקה ומחשבים - אורט מגדל העמק Herman Gadi © 2003