:דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - firewire • תוימוקמ...

48
ערכת לימוד: לוחמת סייבר(Cyberwarefare) מדריך לתלמיד מאיר סלע

Upload: others

Post on 20-Jan-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

ערכת לימוד:

לוחמת סייבר

(Cyberwarefare)

מדריך לתלמיד

מאיר סלע

Page 2: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

2 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

(Cyberwarfare) ערכת לימוד: לוחמת סייבר

מדריך לתלמיד

מאיר סלע

מהדורה ראשונה 2012

הדפסה 1

כל הזכויות שמורות

עיטם רובוטיקהעיטם רובוטיקהעיטם רובוטיקהעיטם רובוטיקה

www.eytam.com :אתר אינטרנט

http://www.eytam.com/contact :פניות בדואר אלקטרוני

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

אמצעי אלקטרוני, אופטי או מכני לכל מטרה שהיא, ללא אישור בכתב

מההוצאה לאור.

Page 3: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 1 : מבוא ללוחמת סייבר 3

http://www.eytam.com עיטם רובוטיקה

תוכן עניינים

5 1 . מבוא ללוחמת סייבר

7 2 . מושגי יסוד ברשתות 7 עקרונות האינטרנט 8 מבנה טופולוגי של האינטרנט 9 ניתוב ומערכות אוטונומיות 10 מבנה הפרוטוקולים באינטרנט - מודל השכבות 10

11 Ports תקשורת שרת-לקוח באמצעות 13 תקשורת טורית בין שני מחשבים

15 3 . ערכת הסייבר הלימודית

17 4 . תקשורת לבקר הסייבר 17 פרוטוקול התקשורת לבקר הסייבר

19 Java -5 . תקשורת לבקר הסייבר מ 19 HelloCyber :תכנית דוגמא 21 הרצה 21 הסבר

25 קריאת קלט מהערוץ הטורי

26 תכנית דוגמא כוללת

31 #C -6 . תקשורת לבקר הסייבר מ 31 HelloCyber :תכנית דוגמא 32 הרצה 32 הסבר

Page 4: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

4 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

35 קריאת קלט מהערוץ הטורי

38 תכנית דוגמא כוללת

43 7 . נספח: תכנות בקר הסייבר 43 ++Mambo סביבת הפיתוח

45 Cyber -מבנה בקר ה

47 דוגמא: תכנות הבקר

Page 5: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 1 : מבוא ללוחמת סייבר 5

http://www.eytam.com עיטם רובוטיקה

1 . מבוא ללוחמת סייבר

יותר ויותר אנו נחשפים בתקופה האחרונה לידיעות בתחום פגיעה בתשתיות

מחשוב מעל גבי האינטרנט, כאשר זהות המפגע אינה לגמרי ברורה. לעיתים

הידיעה היא על פגיעה בתשתית תקשוב של מדינה, כאשר החשד נופל על מדינה

אחרת או על ארגון עוין. במקרים אחרים שומעים על חדירה של האקרים לאתרי

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

בחשאיות ובחוסר הנראות של הגורם הפוגע, הפגיעה עצמה והציוד או הנתונים

שנפגעו.

הטבלה הבאה מציגה אפשרויות ומאפיינים של לוחמה קיברנטית:

תחום סוג הפגיעה גורם נפגע גורם פוגע

צבאי ריגול מדינה מדינה

אזרחי חבלה ארגון/חברה ארגון/חברה

פרט האקר/פרט

הגדרה: לוחמה קיברנטית היא לוחמת מידע של

מדינות/ארגונים/פרטים במדינות/ארגונים/פרטים אחרים, המבוצעת

מעל גבי תשתיות תקשוב, תוך מטרה לרגל ו/או לחבל בתשתיות אלו.

התגברות אירועי הפגיעה בתשתיות התקשוב הובילו להגברת התודעה לסיכונים

הקיימים במרחב האינטרנט ולצורך בהבנת תחום אבטחת המידע, שיטות

Page 6: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

6 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

תקיפה ושיטות הגנה. השם הכולל שניתן לתחום זה הינו לוחמה קיברנטית,

כאשר קיברנטיקה (Cybernetics) היא שם כולל למערכות ותהליכי תקשורת

בכלל ולאינטרנט בפרט.

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

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

התלמידים להרכיב מערכת הכוללת ציוד אלקטרוני ומערכת בקרה, וכן לדמות

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

קיברנטית ימחיש לתלמידים את הצורך בהבנה מלאה של תהליכי התקשרות,

ויעלה בתודעתם את הצורך בשיטות הגנה וניטור ובמנגנוני אבטחה.

Page 7: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 2 : מושגי יסוד ברשתות 7

http://www.eytam.com עיטם רובוטיקה

2 . מושגי יסוד ברשתות

בפרק זה נסקור את המושגים היסודיים ברשתות מחשבים.

מהי רשת מחשבים? כשמה, רשת מחשבים בנויה ממספר מחשבים יחידים, והיא

יכולה בעצמה לכלול עוד רשתות, כלומר, תתי רשתות.

• מחשב אישי - מחשב יחיד, עצמאי שנועד לשימוש אישי של משתמש יחיד, או

מספר חשבונות עבור מספר משתמשים (שלא עובדים עליו בו זמנית).

עקרונות האינטרנט האינטרנט הוא אוסף מחשבים בכל העולם, המתקשרים ביניהם על ידי העברת

TCP/IP חבילות נתונים על אוסף קוי רשת, בפרוטוקול תקני הנקרא

(Transmission Control Protocol / Internet Protocol). לכל מחשב כתובת

המזהה אותו ברשת: כתובת זו נקראת כתובת IP (Internet Protocol) והיא

2 כתובות שונות באינטרנט. כתובת זו 32

=4G כוללת 32 סיביות. לכן ייתכנו

מייוצגת על ידי Bytes 4 מופרדים על ידי נקודה, לדוגמא: 224.12.4.1.

Page 8: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

8 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

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

הנקרא גם domain - לדוגמא, www.company.com - שמות אלו מסופקים על

ידי גופים ריכוזיים באינטרנט כגון InterNic. מנגנון תרגום השמות לכתובות

נקרא Domain Name System (DNS). שרתי DNS מחזיקים טבלאות תרגום

.IP של שמות לכתובות ואחראים לתרגום השמות לכתובות

מחשבים שונים מתקשרים ביניהם ישירות או דרך מחשבים מתווכים. בכדי

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

(Routing) תקניים.

מבנה טופולוגי של האינטרנט מבחינה טופולוגית, רשת האינטרנט בנויה מקבוצות של רשתות מחשבים, כך

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

IBM Compatible

IBM Compatible

IBM Compatible IBM Compatible

IBM Compatible

IBM Compatible

IBM Compatible

IBM Compatible

IBM Compatible IBM Compatible

אפיון של רשתות בגדלים שונים:

• Local Are Network (LAN) - רשת מקומית שבה מחשבים הנמצאים בתוך

מתחם בעל שטח מוגבל - בבית, במשרד, בבי"ס וכו'.

• Metropolitan Area Network (MAN) - רשת הפרושה על פני מרחב גדול

.LANs כגון עיר או קמפוס, ועשויה להכיל מספר

Page 9: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 2 : מושגי יסוד ברשתות 9

http://www.eytam.com עיטם רובוטיקה

• Wide Area Network - רשת היכולה להיות פרושה על פני מספר יבשות.

כמו כן, ישנן רשתות המאופיינות על פי תפקידן:

• Virtual Private Network (VPN) - רשת לוגית של מחשבים, המחוברים

באמצעות רשתות פיזיות הנ"ל, כגון WAN ,LAN, אינטרנט וכו'. לרוב רשת

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

אף שהתשתית עליה "רוכבת" ה VPN היא ציבורית - וזאת באמצעות מנגנוני

הצפנה ופענוח.

• Home Area Network (HAN) - רשת ביתית מעל LAN המאפשרת

תקשורת של מכשירים אלקטרוניים בבית, ומבוססת על שיתוף גישה ושיתוף

נתונים.

ניתוב ומערכות אוטונומיות פרוטוקולי הניתוב בין מחשבים ברשתות השונות בתוך מערכת אוטונומית

נקראים IGP (Internal Gateway Protocol). דוגמאות לפרוטוקולי ניתוב

תקניים: OSPF ,RIP. פרוטוקולי ניתוב בין מערכות אוטונומיות נקראים

.(Border Gateway Protocol) BGP פרוטוקולי

Page 10: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

10 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

מבנה הפרוטוקולים באינטרנט - מודל השכבות

מודל השכבות OSI (Open Systems Interconnection) קובע שהמידע ברשת

עובר מספר שכבות לוגיות, כאשר לכל אחת תפקיד במשלוח המידע:

יישום

IP

תצוגה

שיחה

תעבורה

רשת

קו

פיזית

יישום

IP

תצוגה

שיחה

תעבורה

רשת

קו

פיזית

הערה : ישנו מודל שכבות אחר (מודל TCP) שבו רק

5 שכבות - יישום, העברה, IP, רשת ופיזית.

• שכבת היישום (Application) - השכבה העליונה: תכניות המעבירות ביניהן

נתונים. דוגמאות:

FTP (File Transfer Protocol) - פרוטוקול להעברת קבצים

Telnet - פרוטוקול להתקשרות לקוח לשרת במוד טקסט

WEB -פרוטוקול ה - (Hyper Text Transfer Protocol) HTTP

• שכבת התצוגה (Presentation) - דחיסה/שחזור, הצפנה/פיענוח, המרה בין

ייצוגי מספרים שונים במחשבים שונים.

• שכבת השיחה (Session) - ניהול השיחה בין יישומים, כלומר שמירת מידע

הקשר (context) של שיחה.

• שכבת ההעברה (Transport) - בקרה של זרימת המידע ואספקת העברת

Page 11: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 2 : מושגי יסוד ברשתות 11

http://www.eytam.com עיטם רובוטיקה

נתונים אמינה לשכבות שמעל, בקרת שגיאות.

• שכבת הרשת (Network) - שכבת הרשת הכוללת את מודל הכתובות ואת

פרוטוקולי הניתוב.

• שכבת הקו (Data Link) שכבה זו אחראית לקישור בין מחשבים ברשת

(MAC - Medium Access המקומית: היא כוללת את בקרת הערוץ

(Control שדרכו עובר המידע. דוגמאות:

Ethernet - רשת בטופולוגיית אפיק קוי בעלת גישה אקראית, עם גילוי התנגשויות.

Token Ring - רשת מעגלית: המידע עובר במעגל סביב כל התחנות.

• שכבה פיזית (Physical) - כוללת את מאפייני שידור הנתונים הפיזי במדייה

של הרשת כגון: מתחים וזרמים חשמליים של האותות, סוג הכבל או תדר

אות אלחוטי.

הערה : נהוג לכנות את שכבות הפרוטוקולים גם

מחסנית הפרוטוקולים (Protocol Sack) עקב כוון

זרימת חבילות המידע - מטה בצד אחד, ומעלה בצד

השני.

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

מספר port . הלקוח פונה לכתובת השרת (כתובת IP ) ומספר ה- port ואם

הפעולה מצליחה נוצר קשר:

Page 12: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

12 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

לקוחשרת

port = 83

IP=132.68.190.1

port = ?

מערכת ההפעלהמערכת ההפעלה

socket socket

במחשב מארח (Host) סטנדרטי רצות בדרך כלל מספר תכניות שרת המזוהות

על ידי מספרי port שונים. קיימים מספרי port תקניים עבור תכניות שרת

.(23) Telnet ,(80) HTTP ,(21) FTP :שכיחות כגון

Page 13: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 2 : מושגי יסוד ברשתות 13

http://www.eytam.com עיטם רובוטיקה

מחשב מארח

telnet server (TCP) port 23

FTP server(TCP) port 21

Whois server

(TCP) port 43

domain name

server

(TCP) port 53

HTTP server

(TCP) port 80

talk server

(UDP) port 517

news server

(TCP) port 144

My server (TCP) port 1300

My Client

Sockets במערכת ההפעלה

My Client

My Client

FTP Client

HTTP Client

HTTP Client

בדוגמא רואים מחשב מארח יחיד המכיל תכניות שרת ומספר מחשבי/תכניות

לקוח מסוגים שונים: קיימים שרתים ולקוחות תקניים כגון FTP, HTTP וכן

.(My server, My client) שרת ולקוח לא תקניים

גם מחשב הלקוח יכול להריץ תכניות לקוח מרובות הנבדלות על ידי מספר ה-

port שפותחת עבורן מערכת ההפעלה. מספר זה משמש לקבלת מידע המוחזר

מהשרת.

תקשורת טורית בין שני מחשבים שני מחשבים יכולים לתקשר ביניהם באמצעות תקשורת טורית. ישנם

Page 14: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

14 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

פרוטוקולים תקניים לתקשורת טורית, להלן השכיחים שבהם:

• RS-422 ,RS232 - פרוטוקולי תקשורת טורית הממומשים ע"י port-ים

טוריים.

I2 - מיועד לחיבור רכיבים פריפריאליים בעלי מהירות נמוכה ללוחות אם C •

או לכרטיסים אחרים.

• SPI - תקשורת master/slave טורית בין שני התקנים

• USB - פרוטוקול טורי מהיר הכולל גם אותו מתח ואדמה, שמטרתו להיות

תחליף אחיד ותקני לפרוטוקולי תקשורת טורית מסורתיים

• FireWire - תקן לממשק bus מהיר בין התקנים

• Eheternet - פרוטוקול תקני לרשתות מקומיות

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

לפרוטוקולי תקשורת מקבילית).

Page 15: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 3 : ערכת הסייבר הלימודית 15

http://www.eytam.com עיטם רובוטיקה

3 . ערכת הסייבר הלימודית

ערכת הסייבר הלימודית המצורפת כוללת את המרכיבים הבאים:

• מצלמת סייבר + מנוע סרוו ומתקן סיבוב

• בקר מיתכנת רב ערוצי עם מסך משולב

• חיישן טמפרטורה

• חיישן מגע

• חיישן נורית לד אדום

• 4 כבלים לחיישנים

USB כבל חיבור למחשב •

• סייבר - ספר הדרכה (ספר זה)

Page 16: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

16 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

Page 17: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 4 : תקשורת לבקר הסייבר 17

http://www.eytam.com עיטם רובוטיקה

4 . תקשורת לבקר הסייבר

פרוטוקול התקשורת לבקר הסייבר

התקשורת לבקר מהמחשב האישי מתבצעת באמצעות כבל USB המחבר בין

השניים, תוך שימוש בערוץ טורי - SerialPort. באמצעות ערוץ זה, אנו מעבירים

לבקר פקודות לביצוע. הפקודות הזמינות הן:

• <lcd <lineNum> <string - הדפסת המחרוזת string למסך הבקר בשורה

LineNum. הערכים האפשריים ל- lineNum הם 0 (שורה ראשונה) או 1

(שורה שנייה). למחיקת תוכן שורה יש להדפיס שורת רווחים. הערה: המסך

הנו בן שתי שורות ו 8 עמודות, לכן בהדפסת מחרוזת ארוכה מ 8 תווים יוצגו

רק 8 התווים הראשונים.

• <out <channel> <value - כתיבת הערך value לערוץ channel של הבקר.

הערכים האפשריים הם 0 או 1. לדוגמא:

out 3 1 - יכתוב את הערך 1 לערוץ 3.

• <inD <channel - קריאת קלט דיגיטלי (0 או 1) מערוץ channel. הערכים

האפשריים הם 0 או 1.לדוגמא:

inD 2 - קריאת קלט דיגיטלי מערוץ 2.

• <inA <channel - קריאת ערך אנלוגי מהערוץ הנתון. הערכים האפשריים

הם בין 0 ל 1023.

Page 18: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

18 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

InA 4 - קריאת קלט אנלוגי מערוץ 4.

• <servo <degree - סיבוב מנוע הסרוו שאליו מחוברת המצלמה לזווית

הנתונה. הערכים האפשריים הם בין 0 ל 180. לדוגמא:

servo 180 - יסובב את המנוע לזווית 180

servo 0 - יסובב את המנוע לזווית 0

freq הפעלת הזמזם שעל הבקר בתדר - buzzer <freq> •

פקודות נוספות לרכיבים אופציונליים בערכת הסייבר:

• <ultrasonic <channel - קריאת ערך מהחיישן האולטרסוני. הערכים

האפשריים הם בין 0 ל 1023.

DC (ערכים בין 100- ל 100) למנוע value מתן ערך - motor <i> <value> •

מס. i (ערכים 1 או 2). לדוגמא:

motor 1 100

motor 2 -50

Page 19: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

19 Java -פרק 5 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

5 . תקשורת לבקר

Java -הסייבר מ

סביבת העבודה המומלצת ב- Java הינה Eclipse - זוהי תוכנה בקוד פתוח

הניתנת להורדה חופשית מאתר האינטרנט www.eclipse.org. לאחר התקנת

התוכנה, יש ליצור פרוייקט חדש.

לצורך עבודה עם הערוץ הטורי, יש לעשות שימוש בספריה RxTx (ניתן להורידה

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

לפרוייקט את הקובץ RXTXcomm.jar, וכן יש לוודא שבספריה בה מורצת

.rxtxSerial.dll התכנית נמצא קובץ זמן הריצה

HelloCyber :תכנית דוגמא

.“hello!” נתחיל עם תכנית דוגמא בסיסית המדפיסה למסך הבקר את המחרוזת

import java.io.*;

import java.util.*;

import gnu.io.*;

public class HelloCyber {

static Enumeration portList;

static CommPortIdentifier portId;

Page 20: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

20 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

static SerialPort serialPort;

static OutputStream outputStream;

static boolean openSerial() {

String portName = "COM";

System.out.print("Enter Cyber Controller port number:");

Scanner scanner = new Scanner(System.in);

int portNum = scanner.nextInt();

portName += portNum;

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {

portId = (CommPortIdentifier) portList.nextElement();

if (portId.getName().equals(portName)) {

try {

serialPort = (SerialPort) portId.open("HelloCyber",

2000);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

}

return false;

}

public static void main(String[] args) {

if (openSerial()) {

try {

outputStream = serialPort.getOutputStream();

serialPort.setSerialPortParams(9600,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

serialPort.setDTR(true);

System.out.println("Initializing..");

Thread.sleep(2000);

System.out.println("Writing to serial port!");

Page 21: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

21 Java -פרק 5 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

outputStream.write(new String("lcd 0 hello!

\n").getBytes());

// done

System.out.println("Done!");

System.out.flush();

outputStream.close();

System.exit(0);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

הרצה בהרצת התכנית מודפס למסך הבקר:

hello!

הסבר הסבר התכנית:

− ייבוא ספריות - *.gnu.io כוללת את ספרית הערוץ הטורי:

import java.io.*;

import java.util.*;

import gnu.io.*;

הגדרות משתנים במחלקה:

− מחלקת התכנית:

public class HelloCyber {

Page 22: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

22 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

− רשימה של port-ים:

static Enumeration portList;

− מזהה ערוץ טורי:

static CommPortIdentifier portId;

− עצם ערוץ טורי:

static SerialPort serialPort;

− הגדרת עצם זרם הפלט של הערוץ הטורי שישמש לכתיבה אליו:

static OutputStream outputStream;

− המתודה הבאה מבצעת פתיחה ואתחול של הערוץ הטורי:

static boolean openSerial() {

− הגדרת שם הערוץ - שמו יהיה תמיד מהצורה <COM<portNo, כאשר

portNo הוא מספר ה port של הערוץ הטורי במחשב:

String portName = "COM";

System.out.print("Enter Cyber Controller port number:");

Scanner scanner = new Scanner(System.in);

int portNum = scanner.nextInt();

portName += portNum;

<= My Computer ע"י הסתכלות ב port ניתן למצוא את מספר ה

Ports <= Device Manager <= Hardware <= Properties, ושם

port -מספר ה - “USB Serial Port" יש לחפש רכיב ששמו הואהמופיע לצדו הוא המבוקש.

− כעת עוברים בלולאה על רשימת ה- ports שבמחשב ומחפשים את זה

בעל השם שמצאנו לעיל:

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {

portId = (CommPortIdentifier) portList.nextElement();

portList מתקבל ע"י קריאה ל ()getPortIdentifiers, ו- portId הוא

המזהה של ה port הנוכחי בחיפוש.

Page 23: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

23 Java -פרק 5 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

− אם נמצא ה port המתאים עפ"י השם,

if (portId.getName().equals(portName)) {

try {

− מבצעים פתיחה של ה port (שני הפרמטרים אינם חשובים, נדרשת

מחרוזת כלשהי ומספר כלשהו לזיהוי חד ערכי) ע"י קריאה למתודה

:portId של open

serialPort = (SerialPort) portId.open("HelloCyber",

2000);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

}

return false;

}

המתודה מחזירה true אם הפתיחה הצליחה ו false אחרת.

− המתודה הראשית:

public static void main(String[] args) {

− פתיחת הערוץ הטורי:

if (openSerial()) {

try {

− כעת יש לקבל את זרם הפלט של הערוץ הטורי ע"י קריאה למתודה

()getOutputStream שלו:

outputStream = serialPort.getOutputStream();

− אתחול עצם הערוץ הטורי לקצב המתאים לזה שבבקר (9600)

ופרמטרים נוספים:

Page 24: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

24 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

serialPort.setSerialPortParams(9600,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

− אפשור הערוץ הטורי:

serialPort.setDTR(true);

− המתנה כ 2 שניות לסיום האתחול:

System.out.println("Initializing..");

Thread.sleep(2000);

− כעת מבוצעת הכתיבה לערוץ, תוך שימוש במתודה ()write של זרם

הפלט שהוגדר על הערוץ:

outputStream.write(new String("lcd 0 hello!

\n").getBytes());

הוספת תו סוף השורה הכרחי מכיוון שבבקר מבוצעת קריאה עד לסוף השורה.

− לאחר שסיימנו, מדפיסים הודעת סיום וסוגרים את זרם הפלט:

// done

System.out.println("Done!");

System.out.flush();

outputStream.close();

System.exit(0);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

Page 25: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

25 Java -פרק 5 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

קריאת קלט מהערוץ הטורי על מנת לקרוא קלט מהערוץ הטורי, נצטרך לעבוד עם זרם הקלט של הערוץ

הטורי, בדומה לעבודה עם זרם הפלט שלו.

ראשית נגדיר במחלקה משתנה מסוג זרם קלט:

static InputStream inputStream;

משתנה זה יקבל את זרם הקלט של הערוץ הטורי (לאחר פתיחתו):

inputStream = serialPort.getInputStream();

וכעת, באפשרותנו לקרוא מהערוץ מה שכתב הבקר - נבצע קריאת קלט במתודה

נפרדת:

static void readInput() throws InterruptedException, IOException {

Thread.sleep(1000);

byte[] buf = new byte[100];

int len;

if((len = inputStream.read(buf))>-1) {

String s = new String(buf, 0, len);

s = s.trim();

System.out.println(s);

}

}

כפי שניתן לראות, המתודה ()read של זרם הקלט קוראת את הבתים הזמינים

בערוץ הטורי, ואלו מומרים למחרוזת (תוך שימוש ב constructor מתאים של

String). רווחים מיותרים מוסרים מהמחרוזת והיא מודפסת לפלט התקני.

וכעת, ניתן לקרוא למתודה הזו לקריאה של מידע שכתב הבקר, לדוגמא:

System.out.println("Read button - input digital channel 2");

Page 26: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

26 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

outputStream.write(new String("inD 2").getBytes()); outputStream.flush();

Thread.sleep(1000);

readInput();

Thread.sleep(3000);

בדוגמא זו ניתנת הוראה לבקר הסייבר לקרוא את הערך הדיגיטלי מערוץ 2,

ולאחר המתנה קצרה (על מנת לוודא שהבקר סיים לכתוב) הערך נקרא ע"י

קריאה למתודה ()readInput שכתבנו לעיל.

תכנית דוגמא כוללת תכנית הדוגמא הבאה מתייחסת למעגל הבא:

• חיישן לד מחובר לערוץ 1 של הבקר

• חיישן מגע מחבור לערוץ 2 של הבקר

• חיישן טמפרטורה מחובר לערוץ 3 של הבקר

• מנוע הסרוו של המצלמה מחובר לערוץ "נוסף" של הבקר

התכנית מבצעת את ההוראות הבאות (תוך ביצוע המתנה של מספר שניות בין

הוראה להוראה):

• ביצוע הוראות הדפסה למסך

• הדלקת הלד שבערוץ 1

• כיבוי הלד שבערוץ 1

• קריאת ערך חיישן המגע שבערוץ 2 - קריאה דיגיטלית

• קריאת ערך חיישן הטמפרטורה שבערוץ 3 - קריאה אנלוגית

• סיבוב מנוע הסרוו לזווית 180 מעלות

• סיבוב מנוע הסרוו לזווית 0 מעלות

:JavaCyber קוד התכנית

Page 27: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

27 Java -פרק 5 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Enumeration;

import java.util.Scanner;

public class JavaCyber {

static Enumeration portList;

static CommPortIdentifier portId;

static SerialPort serialPort;

static OutputStream outputStream;

static InputStream inputStream;

static boolean openSerial() {

String portName = "COM";

System.out.print("Enter Cyber Controller port number:");

Scanner scanner = new Scanner(System.in);

int portNum = scanner.nextInt();

portName += portNum;

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {

portId = (CommPortIdentifier) portList.nextElement();

if (portId.getName().equals(portName)) {

try {

serialPort = (SerialPort) portId.open("JavaCyber",

2000);

serialPort.setSerialPortParams(9600,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

serialPort.setDTR(true);

System.out.println("Initializing..");

Thread.sleep(2000);

return true;

} catch (Exception e) {

Page 28: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

28 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

e.printStackTrace(); return false;

}

}

}

return false;

}

static void readInput() throws InterruptedException, IOException

{

Thread.sleep(1000);

byte[] buf = new byte[100];

int len;

if((len = inputStream.read(buf))>-1) {

String s = new String(buf, 0, len);

s = s.trim();

System.out.println(s);

}

}

public static void main(String[] args) {

if (openSerial()) {

try {

outputStream = serialPort.getOutputStream();

inputStream = serialPort.getInputStream();

System.out.println("LCD screen commands");

outputStream.write(new String("lcd 0 \n").getBytes());

outputStream.write(new String("lcd 1 \n").getBytes());

Thread.sleep(1000);

outputStream.write(new String("lcd 0 LCD\n").getBytes());

outputStream.write(new String("lcd 1 Test\n").getBytes());

Thread.sleep(3000);

System.out.println("Sending led ON command - led is on

channel 1");

outputStream.write(new String("out 1 1").getBytes());

Thread.sleep(3000);

Page 29: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

29 Java -פרק 5 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

System.out.println("Sending led OFF command - led is on

channel 1"); outputStream.write(new String("out 1 0").getBytes());

Thread.sleep(3000);

System.out.println("Read button - input digital channel

2");

outputStream.write(new String("inD 2").getBytes());

outputStream.flush();

Thread.sleep(1000);

readInput();

Thread.sleep(3000);

System.out.println("Read temperature - input analog

channel 3");

outputStream.write(new String("inA 3").getBytes());

Thread.sleep(1000);

readInput();

Thread.sleep(3000);

System.out.println("Buzzer test");

outputStream.write(new String("buzzer 1200 ").getBytes());

Thread.sleep(3000);

outputStream.write(new String("buzzer 0 ").getBytes());

Thread.sleep(3000);

System.out.println("Sending Servo open 180 deg

command (pwm)");

outputStream.write(new String("servo 180 ").getBytes());

Thread.sleep(5000);

System.out.println("Sending Servo close (0 deg) command

(pwm)");

outputStream.write(new String("servo 0 ").getBytes());

Thread.sleep(5000);

//////////////////////////////////////////////////////////////////////////////

// Optional components

Page 30: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

30 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

/////////////////////////////////////////////////////////////////////////////// // Ultrasonic Sensor on channel 4

System.out.println("Read ultrasonic - channel 4");

outputStream.write(new String("ultrasonic 4").getBytes());

Thread.sleep(1000);

readInput();

Thread.sleep(3000);

// DC motors

System.out.println("Set Motor values");

outputStream.write(new String("motor 1 100").getBytes());

outputStream.write(new String("motor 2 100").getBytes());

Thread.sleep(3000);

outputStream.write(new String("motor 1 -100").getBytes());

outputStream.write(new String("motor 2 -100").getBytes());

Thread.sleep(3000);

outputStream.write(new String("motor 1 0").getBytes());

outputStream.write(new String("motor 2 0").getBytes());

// done

System.out.println("Done!");

System.out.flush();

outputStream.close();

System.exit(0);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

Page 31: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

31 #C -פרק 6 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

6 . תקשורת לבקר

C# -הסייבר מ

סביבת העבודה ב #C הינה #Microsoft Visual C, שגירסה חופשית שלה

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

והרצתה, יש ליצור Solution (מרחב עבודה). כעת יש ליצור פרוייקט מסוג

.Console Application

HelloCyber :תכנית דוגמא

.“hello!” נתחיל עם תכנית דוגמא בסיסית המדפיסה למסך הבקר את המחרוזת

using System;

using System.IO.Ports;

namespace HelloCyber

{

class Program

{

private static System.IO.Ports.SerialPort serialPort1;

static void Main(string[] args)

{

System.ComponentModel.IContainer components = new

System.ComponentModel.Container();

Page 32: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

32 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

serialPort1 = new System.IO.Ports.SerialPort(components);

serialPort1.BaudRate = 9600;

Console.WriteLine("Enter Cyber Controller port number:");

String portNum = Console.ReadLine();

serialPort1.PortName = "COM" + portNum;

serialPort1.Open();

if (!serialPort1.IsOpen) {

Console.WriteLine("Error - couldn't open port, please check

port number and run again.");

return;

}

// this turns on serial!

serialPort1.DtrEnable = true;

Console.WriteLine("Initializing ..");

System.Threading.Thread.Sleep(2000);

using (serialPort1)

{

serialPort1.WriteLine("lcd 0 hello! ");

}

}

}

}

הרצה בהרצת התכנית מודפס למסך הבקר:

hello!

הסבר הסבר התכנית:

Page 33: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

33 #C -פרק 6 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

− ראשית, מבצעים ייבוא לספריה System וכן לספריה IO.Ports בכדי

שנוכל לעשות שימוש בערוץ הטורי:

using System;

using System.IO.Ports;

− כעת מגדירים עצם מהמחלקה SerialPort, שישמש לתקשורת בערוץ

הטורי לבקר:

private static System.IO.Ports.SerialPort serialPort1;

− הגדרת הפונקציה הראשית:

static void Main(string[] args)

{

− יצירת עצם ה SerialPort ע"י constructor המקבל כפרמטר את רכיבי

המערכת:

System.ComponentModel.IContainer components = new

System.ComponentModel.Container();

serialPort1 = new System.IO.Ports.SerialPort(components);

− קביעת קצב הערוץ הטורי ל 9600 - בהתאמה לקצב המוגדר בבקר:

serialPort1.BaudRate = 9600;

− כעת התכנית מבקשת להכניס את מספר ה- port במחשב אליו מחובר

הבקר:

Console.WriteLine("Enter Cyber Controller port number:");

String portNum = Console.ReadLine();

<= My Computer ע"י הסתכלות ב port ניתן למצוא את מספר ה

Ports <= Device Manager <= Hardware <= Properties, ושם

port -מספר ה - “USB Serial Port" יש לחפש רכיב ששמו הואהמופיע לצדו הוא המבוקש.

− בשלב הבא בונים את שם ה- port כ- <COM<portNum, כאשר

portNum הוא מספר ה- port שנמצא:

serialPort1.PortName = "COM" + portNum;

Page 34: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

34 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

− פתיחת ה- port ובדיקת הצלחה:

serialPort1.Open();

if (!serialPort1.IsOpen) {

Console.WriteLine("Error - couldn't open port, please check

port number and run again.");

return;

}

true צריך להיות בעל ערך SerialPort שבמחלקה DtrEnable השדה −

בכדי שה- port יהיה פעיל:

// this turns on serial!

serialPort1.DtrEnable = true;

− הדפסת הודעת אתחול:

Console.WriteLine("Initializing ..");

:port המתנה של כ 2 שניות לאתחול ה −

System.Threading.Thread.Sleep(2000);

serialPort1 אפשר לעשות שימוש בעצם using כעת, בתוך בלוק −

using (serialPort1)

{

serialPort1.WriteLine("lcd 0 hello! ");

}

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

את השורה ואז להדפיס את ההודעה כך:

serialPort1.WriteLine("lcd 0 ");

serialPort1.WriteLine("lcd 0 hello!");

Page 35: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

35 #C -פרק 6 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

קריאת קלט מהערוץ הטורי

קריאה מהערוץ הטורי מתבצעת ע"י המתודה ()ReadExisting של המחלקה

SerialPort. השאלה הנשאלת היא, מתי נדע שיש קלט ממתין בערוץ הטורי?

כלומר, כיצד נסנכרן את פעולת הקריאה עם פעולת הכתיבה של הבקר?

ב- #C ניתן לקרוא מהערוץ הטורי תוך שימוש במודל האירועים: על מנת לקרוא

קלט מהערוץ הטורי לאחר שהבקר כתב אליו, אנו צריכים לטפל באירוע

DataRecieved שבמחלקה SerialPort. לדוגמא, התכנית הבאה קוראת את

הערך הדיגיטלי שבערוץ 2 של הבקר על ידי הגדרת מתודת תגובה לאירוע

:DataRecieved

using System;

using System.IO.Ports;

namespace SerialEventHandling

{

class Program

{

private static System.IO.Ports.SerialPort serialPort1;

static void Main(string[] args)

{

System.ComponentModel.IContainer components = new

System.ComponentModel.Container();

serialPort1 = new System.IO.Ports.SerialPort(components);

serialPort1.BaudRate = 9600;

Console.WriteLine("Enter Cyber Controller port number:");

String portNum = Console.ReadLine();

serialPort1.PortName = "COM" + portNum;

serialPort1.Open();

if (!serialPort1.IsOpen)

{

Console.WriteLine("Error - couldn't open port, please check

port number and run again.");

Page 36: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

36 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

return;

}

// this turns on serial!

serialPort1.DtrEnable = true;

// callback for text coming back from the arduino

serialPort1.DataReceived += OnReceived;

Console.WriteLine("Initializing ..");

System.Threading.Thread.Sleep(2000);

using (serialPort1)

{

Console.WriteLine("Input digital channel 2");

serialPort1.WriteLine("inD 2");

System.Threading.Thread.Sleep(3000);

}

}

private static void OnReceived(object sender,

SerialDataReceivedEventArgs c)

{

int ch;

try

{

// write out text coming back from the controller

Console.Write(serialPort1.ReadExisting());

}

catch (Exception exc) { }

}

}

}

− כפי שניתן לראות התכנית דומה לקודמתה, רק שהפעם הוגדרה

מתודת תגובה לאירוע קבלת נתונים בערוץ הטורי:

serialPort1.DataReceived += OnReceived;

Page 37: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

37 #C -פרק 6 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

− בתוך בלוק העבודה עם הערוץ הטורי אנו כותבים לבקר הוראה

לקריאת ערך דיגיטלי מערוץ 2:

using (serialPort1)

{

Console.WriteLine("Input digital channel 2");

serialPort1.WriteLine("inD 2");

System.Threading.Thread.Sleep(3000);

}

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

− כעת, בתוך מתודת התגובה לאירוע אנחנו מבצעים קריאה של הנתונים

שכתב הבקר:

private static void OnReceived(object sender,

SerialDataReceivedEventArgs c)

{

try

{

// write out text coming back from the controller

Console.Write(serialPort1.ReadExisting());

}

catch (Exception exc) { }

}

}

SerialPort -הפרמטרים למתודה הם עצם המייצג את השולח (עצם העצמו) ועצם פרמטרים.

פונקציות נוספות שימושיות לקריאה מהערוץ הטורי:

• ()ReadLine - קוראת שורה שלמה מהערוץ, עד לתו שורה חדשה

• ()ReadByte - קריאת בייט אחד

• ()ReadChar- קריאת תו אחד

count קריאה מהערוץ של - Read(byte[] buffer, int offset, int count) •

offset בתים לתוך החוצץ הנתון, בהזחה של

Page 38: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

38 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

תכנית דוגמא כוללת תכנית הדוגמא הבאה מתייחסת למעגל הבא:

• חיישן לד מחובר לערוץ 1 של הבקר

• חיישן מגע מחבור לערוץ 2 של הבקר

• חיישן טמפרטורה מחובר לערוץ 3 של הבקר

• מנוע הסרוו של המצלמה מחובר לערוץ "נוסף" של הבקר

התכנית מבצעת את ההוראות הבאות (תוך ביצוע המתנה של מספר שניות בין

הוראה להוראה):

• ביצוע הוראות הדפסה למסך

• הדלקת הלד שבערוץ 1

• כיבוי הלד שבערוץ 1

• קריאת ערך חיישן המגע שבערוץ 2 - קריאה דיגיטלית

• קריאת ערך חיישן הטמפרטורה שבערוץ 3 - קריאה אנלוגית

• סיבוב מנוע הסרוו לזווית 180 מעלות

• סיבוב מנוע הסרוו לזווית 0 מעלות

קוד התכנית:

using System;

using System.IO.Ports;

namespace CSharpCyber

{

class Program

{

private static System.IO.Ports.SerialPort serialPort1;

static void Main(string[] args) {

System.ComponentModel.IContainer components = new

System.ComponentModel.Container();

serialPort1 = new System.IO.Ports.SerialPort(components);

serialPort1.BaudRate = 9600;

Page 39: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

39 #C -פרק 6 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

Console.WriteLine("Enter Cyber Controller port number:");

String portNum = Console.ReadLine();

serialPort1.PortName = "COM" + portNum;

serialPort1.Open();

if (!serialPort1.IsOpen)

{

Console.WriteLine("Error - couldn't open port, please check

port number and run again.");

return;

}

// this turns on serial!

serialPort1.DtrEnable = true;

// callback for text coming back from the controller

serialPort1.DataReceived += OnReceived;

Console.WriteLine("Initializing ..");

System.Threading.Thread.Sleep(2000);

using (serialPort1)

{

Console.WriteLine("LCD screen commands");

serialPort1.WriteLine("lcd 0 "); // clear line 0

serialPort1.WriteLine("lcd 1 "); // clear line 1

System.Threading.Thread.Sleep(1000);

serialPort1.WriteLine("lcd 0 LCD");

serialPort1.WriteLine("lcd 1 Test");

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Sending led ON command - led is on

channel 1");

serialPort1.WriteLine("out 1 1");

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Sending led OFF command - led is

on channel 1");

serialPort1.WriteLine("out 1 0");

Page 40: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

40 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Read button - input digital channel

2");

serialPort1.WriteLine("inD 2");

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Read temperature - input analog

channel 3");

serialPort1.WriteLine("inA 2");

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Buzzer test");

serialPort1.WriteLine("buzzer 1200");

System.Threading.Thread.Sleep(3000);

serialPort1.WriteLine("buzzer 0");

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Sending Servo open 180 deg

command (pwm)");

serialPort1.WriteLine("servo 180");

System.Threading.Thread.Sleep(5000);

Console.WriteLine("Sending Servo close (0 deg)

command (pwm)");

serialPort1.WriteLine("servo 0");

System.Threading.Thread.Sleep(5000);

//////////////////////////////////////////////////////////////////////////

// Optional components

///////////////////////////////////////////////////////////////////////////

// Ultrasonic Sensor on channel 4

Console.WriteLine("Read ultrasonic - channel 4");

serialPort1.WriteLine("ultrasonic 4");

System.Threading.Thread.Sleep(3000);

// DC motors

Console.WriteLine("Set Motor values");

Page 41: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

41 #C -פרק 6 : תקשורת לבקר הסייבר מ

http://www.eytam.com עיטם רובוטיקה

serialPort1.WriteLine("motor 1 100");

serialPort1.WriteLine("motor 2 100");

System.Threading.Thread.Sleep(3000);

serialPort1.WriteLine("motor 1 -100");

serialPort1.WriteLine("motor 2 -100");

System.Threading.Thread.Sleep(3000);

serialPort1.WriteLine("motor 1 0");

serialPort1.WriteLine("motor 2 0");

Console.WriteLine("Done");

}

}

private static void OnReceived(object sender,

SerialDataReceivedEventArgs c)

{

try

{

// write out text coming back from the controller

Console.Write(serialPort1.ReadExisting());

} catch (Exception exc) { }

}

}

}

Page 42: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

42 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

Page 43: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 7 : נספח: תכנות בקר הסייבר 43

http://www.eytam.com עיטם רובוטיקה

7 . נספח: תכנות בקר הסייבר

Mambo++ סביבת הפיתוח

.C++ מאפשרת לתכנת את כרטיס הבקר בשפת Mambo++ סביבת הפיתוח

סביבת הפיתוח ++Mambo בנויה מעל Arduino – סביבת קוד פתוח למערכות

חומרה ותוכנה. הסביבה כוללת מפרט של שפת תכנות, הוראות חומרה ייעודיות,

טיפוסי נתונים, קבועים, ספריות וכלים נוספים לתכנות בקרים תואמי

.Arduino

Page 44: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

44 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

חלון סביבת הפיתוח:

תכנית משתמש נקראת בסביבת הפיתוח sketch. כל sketch צריך לכלול את

שתי הפונקציות הבאות:

• ()void setup – בפונקציה זו מאתחלים את נתוני היישום

• ()void loop – בפונקציה זו מתבצע קטע התכנית באופן איטרטיבי.

הפונקציה נקראה על ידי המערכת באופן מחזורי.

לאחר כתיבת התכנית ניתן להעלותה לבקר באמצעות בחירה בתפריט

File/Upload (או ע"י הקלקה על הסימן V בסרגל הכלים). ההעלאה נמשכת

מספר שניות, ובסיום תוצג ההודעה בשורת הסטטוס "Done Uploading". אם

יש שגיאות בתכנית, הן תוצגנה בחלון הפלט שלמטה (עם רקע השחור).

Page 45: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 7 : נספח: תכנות בקר הסייבר 45

http://www.eytam.com עיטם רובוטיקה

Cyber -מבנה בקר ה הבקר כולל:

• 4 ערוצי קלט/פלט

• 3 ערוצי מנועים (שניים למנועי DC, אחד למנוע סרוו)

• מסך LCD 2 שורות על 8 עמודות

• כפתור אתחול (אדום), כפתור משתמש (שחור)

(led) נורית •

(buzzer) זמזם •

USB מחבר •

• מחבר סוללה

• כפתור בורר USB – סוללה

את הבקר מתכנתים באמצעות כבל USB המחובר למחשב בו מותקנת סביבת

.Mambo++ התוכנה

Page 46: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

46 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה

מפרט הפינים של הבקר:

פונקציות חומרה שימושיות:

• pinMode(<pin>,<mode>) - קובעת האם הפין המצויין ישמש כקלט או

כפלט. דוגמאות:

− pinMode(2, INPUT) - פין 2 הוא קלט

− pinMode(10, OUTPUT) - פין 10 הוא פלט

Page 47: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

פרק 7 : נספח: תכנות בקר הסייבר 47

http://www.eytam.com עיטם רובוטיקה

• digitalRead(<pin>) - קריאת ערך ספרתי מהפין הנתון – 0 או 1

• digitalWrite(<pin>, <value>) - כתיבת ערך ספרתי לפין הנתון, 0/1.

• analogRead(<pin>) - קריאת ערך אנלוגי מפין נתון. הערך הוא בן 10

סיביות, כלומר בין 0 ל 1023.

(PWM)כתיבת ערך אנלוגי לפין - analogWrite(<pin>, <value>) •

דוגמא: תכנות הבקר תכנית הדוגמא הבאה גורמת להבהוב של הנורית שעל הבקר:

void setup() {

pinMode(1, OUTPUT);

}

void loop() {

digitalWrite(1, HIGH); // set the LED on

delay(1000); // wait for a second

digitalWrite(1, LOW); // set the LED off

delay(1000); // wait for a second

}

:C התכנית כוללת שתי פונקציות

• בפונקצית האתחול ()setup קובעים את הפין עליו ממופה הלד (פין 1) להיות

פלט.

• בפונקצית הלולאה ()loop כותבים לפין פעם את הערך 0 (LOW) ופעם את

(HIGH) 1 הערך

delay בין ההוראות מבוצעת המתנה של 1 שניה ע"י הפונקציה −

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

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

Page 48: :דומיל תכרעםינקתה ןיב ריהמ bus קשממל ןקת - FireWire • תוימוקמ תותשרל ינקת לוקוטורפ - Eheternet • דוגינב) םעפ לכב

48 לוחמה-קיברנטית: מדריך לתלמיד

http://www.eytam.com עיטם רובוטיקה