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

‫ערכת לימוד‪:‬‬
‫לוחמת סייבר‬
‫)‪(Cyberwarefare‬‬
‫מדריך לתלמיד‬
‫מאיר סלע‬
‫‪ 2‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫ערכת לימוד‪ :‬לוחמת סייבר )‪(Cyberwarfare‬‬
‫מדריך לתלמיד‬
‫מאיר סלע‬
‫מהדורה ראשונה ‪2012‬‬
‫הדפסה ‪1‬‬
‫כל הזכויות שמורות‬
‫עיטם רובוטיקה‬
‫אתר אינטרנט‪www.eytam.com :‬‬
‫פניות בדואר אלקטרוני‪http://www.eytam.com/contact :‬‬
‫אין להעתיק‪ ,‬לשכפל או לצלם ספר זה או קטעים ממנו‪ ,‬בשום צורה ובשום‬
‫אמצעי אלקטרוני‪ ,‬אופטי או מכני לכל מטרה שהיא‪ ,‬ללא אישור בכתב‬
‫מההוצאה לאור‪.‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :1‬מבוא ללוחמת סייבר‬
‫‪3‬‬
‫תוכן עניינים‬
‫‪ .1‬מבוא ללוחמת סייבר‬
‫‪5‬‬
‫‪ .2‬מושגי יסוד ברשתות‬
‫‪7‬‬
‫‪7‬‬
‫עקרונות האינטרנט‬
‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪10‬‬
‫‪11‬‬
‫‪13‬‬
‫מבנה טופולוגי של האינטרנט‬
‫ניתוב ומערכות אוטונומיות‬
‫מבנה הפרוטוקולים באינטרנט ‪ -‬מודל השכבות‬
‫תקשורת שרת‪-‬לקוח באמצעות ‪Ports‬‬
‫תקשורת טורית בין שני מחשבים‬
‫‪ .3‬ערכת הסייבר הלימודית‬
‫‪15‬‬
‫‪ .4‬תקשורת לבקר הסייבר‬
‫‪17‬‬
‫פרוטוקול התקשורת לבקר הסייבר‬
‫‪17‬‬
‫‪ .5‬תקשורת לבקר הסייבר מ‪Java -‬‬
‫‪19‬‬
‫‪19‬‬
‫תכנית דוגמא‪HelloCyber :‬‬
‫הרצה‬
‫הסבר‬
‫‪21‬‬
‫‪21‬‬
‫קריאת קלט מהערוץ הטורי‬
‫תכנית דוגמא כוללת‬
‫‪25‬‬
‫‪26‬‬
‫‪ .6‬תקשורת לבקר הסייבר מ‪#C -‬‬
‫תכנית דוגמא‪HelloCyber :‬‬
‫הרצה‬
‫הסבר‬
‫עיטם רובוטיקה‬
‫‪31‬‬
‫‪31‬‬
‫‪32‬‬
‫‪32‬‬
‫‪http://www.eytam.com‬‬
‫‪ 4‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫קריאת קלט מהערוץ הטורי‬
‫תכנית דוגמא כוללת‬
‫‪ .7‬נספח‪ :‬תכנות בקר הסייבר‬
‫‪35‬‬
‫‪38‬‬
‫‪43‬‬
‫סביבת הפיתוח ‪++Mambo‬‬
‫‪43‬‬
‫מבנה בקר ה‪Cyber -‬‬
‫‪45‬‬
‫‪47‬‬
‫דוגמא‪ :‬תכנות הבקר‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :1‬מבוא ללוחמת סייבר‬
‫‪5‬‬
‫‪ .1‬מבוא ללוחמת סייבר‬
‫יותר ויותר אנו נחשפים בתקופה האחרונה לידיעות בתחום פגיעה בתשתיות‬
‫מחשוב מעל גבי האינטרנט‪ ,‬כאשר זהות המפגע אינה לגמרי ברורה‪ .‬לעיתים‬
‫הידיעה היא על פגיעה בתשתית תקשוב של מדינה‪ ,‬כאשר החשד נופל על מדינה‬
‫אחרת או על ארגון עוין‪ .‬במקרים אחרים שומעים על חדירה של האקרים לאתרי‬
‫אינטרנט ולמאגרי מידע רגישים של מדינות או חברות‪ .‬כל המקרים מאופיינים‬
‫בחשאיות ובחוסר הנראות של הגורם הפוגע‪ ,‬הפגיעה עצמה והציוד או הנתונים‬
‫שנפגעו‪.‬‬
‫הטבלה הבאה מציגה אפשרויות ומאפיינים של לוחמה קיברנטית‪:‬‬
‫גורם פוגע‬
‫גורם נפגע‬
‫סוג הפגיעה‬
‫תחום‬
‫מדינה‬
‫מדינה‬
‫ריגול‬
‫צבאי‬
‫ארגון‪/‬חברה‬
‫ארגון‪/‬חברה‬
‫חבלה‬
‫אזרחי‬
‫האקר‪/‬פרט‬
‫פרט‬
‫של‬
‫מידע‬
‫לוחמת‬
‫היא‬
‫קיברנטית‬
‫הגדרה‪ :‬לוחמה‬
‫מדינות‪/‬ארגונים‪/‬פרטים במדינות‪/‬ארגונים‪/‬פרטים אחרים‪ ,‬המבוצעת‬
‫מעל גבי תשתיות תקשוב‪ ,‬תוך מטרה לרגל ו‪/‬או לחבל בתשתיות אלו‪.‬‬
‫התגברות אירועי הפגיעה בתשתיות התקשוב הובילו להגברת התודעה לסיכונים‬
‫הקיימים במרחב האינטרנט ולצורך בהבנת תחום אבטחת המידע‪ ,‬שיטות‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 6‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫תקיפה ושיטות הגנה‪ .‬השם הכולל שניתן לתחום זה הינו לוחמה קיברנטית‪,‬‬
‫כאשר קיברנטיקה )‪ (Cybernetics‬היא שם כולל למערכות ותהליכי תקשורת‬
‫בכלל ולאינטרנט בפרט‪.‬‬
‫מטרת ספר זה‪ ,‬יחד עם ערכת הסייבר המצורפת‪ ,‬היא להקנות לתלמידים כלים‬
‫וידע בסיסיים בתחום הלוחמה הקיברנטית‪ .‬באמצעות הערכה המצורפת יוכלו‬
‫התלמידים להרכיב מערכת הכוללת ציוד אלקטרוני ומערכת בקרה‪ ,‬וכן לדמות‬
‫גורם עוין המתחבר למערכת זו ומבצע תקיפה‪ .‬לימוד והתנסות מעשית בלוחמה‬
‫קיברנטית ימחיש לתלמידים את הצורך בהבנה מלאה של תהליכי התקשרות‪,‬‬
‫ויעלה בתודעתם את הצורך בשיטות הגנה וניטור ובמנגנוני אבטחה‪.‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :2‬מושגי יסוד ברשתות‬
‫‪7‬‬
‫‪ .2‬מושגי יסוד ברשתות‬
‫בפרק זה נסקור את המושגים היסודיים ברשתות מחשבים‪.‬‬
‫מהי רשת מחשבים? כשמה‪ ,‬רשת מחשבים בנויה ממספר מחשבים יחידים‪ ,‬והיא‬
‫יכולה בעצמה לכלול עוד רשתות‪ ,‬כלומר‪ ,‬תתי רשתות‪.‬‬
‫• מחשב אישי ‪ -‬מחשב יחיד‪ ,‬עצמאי שנועד לשימוש אישי של משתמש יחיד‪ ,‬או‬
‫מספר חשבונות עבור מספר משתמשים )שלא עובדים עליו בו זמנית(‪.‬‬
‫עקרונות האינטרנט‬
‫האינטרנט הוא אוסף מחשבים בכל העולם‪ ,‬המתקשרים ביניהם על ידי העברת‬
‫חבילות נתונים על אוסף קוי רשת‪ ,‬בפרוטוקול תקני הנקרא ‪TCP/IP‬‬
‫)‪ .(Transmission Control Protocol / Internet Protocol‬לכל מחשב כתובת‬
‫המזהה אותו ברשת‪ :‬כתובת זו נקראת כתובת ‪ (Internet Protocol) IP‬והיא‬
‫כוללת ‪ 32‬סיביות‪ .‬לכן ייתכנו ‪ 232=4G‬כתובות שונות באינטרנט‪ .‬כתובת זו‬
‫מייוצגת על ידי ‪ 4 Bytes‬מופרדים על ידי נקודה‪ ,‬לדוגמא‪.224.12.4.1 :‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 8‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫מכיוון שקשה לזכור את מספרי הכתובות‪ ,‬מוצמד להן בדרך כלל שם מתאים‬
‫הנקרא גם ‪ - domain‬לדוגמא‪ - www.company.com ,‬שמות אלו מסופקים על‬
‫ידי גופים ריכוזיים באינטרנט כגון ‪ .InterNic‬מנגנון תרגום השמות לכתובות‬
‫נקרא ‪ .(DNS) Domain Name System‬שרתי ‪ 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‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :2‬מושגי יסוד ברשתות‬
‫‪9‬‬
‫• ‪ - Wide Area Network‬רשת היכולה להיות פרושה על פני מספר יבשות‪.‬‬
‫כמו כן‪ ,‬ישנן רשתות המאופיינות על פי תפקידן‪:‬‬
‫• )‪ - Virtual Private Network (VPN‬רשת לוגית של מחשבים‪ ,‬המחוברים‬
‫באמצעות רשתות פיזיות הנ"ל‪ ,‬כגון ‪ ,WAN ,LAN‬אינטרנט וכו'‪ .‬לרוב רשת‬
‫זו כוללת מנגנוני אבטחה המאפשרים למשתמשי הקצה תקשורת פרטית‪ ,‬על‬
‫אף שהתשתית עליה "רוכבת" ה ‪ VPN‬היא ציבורית ‪ -‬וזאת באמצעות מנגנוני‬
‫הצפנה ופענוח‪.‬‬
‫• )‪ - Home Area Network (HAN‬רשת ביתית מעל ‪ LAN‬המאפשרת‬
‫תקשורת של מכשירים אלקטרוניים בבית‪ ,‬ומבוססת על שיתוף גישה ושיתוף‬
‫נתונים‪.‬‬
‫ניתוב ומערכות אוטונומיות‬
‫פרוטוקולי הניתוב בין מחשבים ברשתות השונות בתוך מערכת אוטונומית‬
‫נקראים ‪ .(Internal Gateway Protocol) IGP‬דוגמאות לפרוטוקולי ניתוב‬
‫תקניים‪ .OSPF ,RIP :‬פרוטוקולי ניתוב בין מערכות אוטונומיות נקראים‬
‫פרוטוקולי ‪.(Border Gateway Protocol) BGP‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 10‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫מבנה הפרוטוקולים באינטרנט ‪ -‬מודל השכבות‬
‫מודל השכבות ‪ (Open Systems Interconnection) OSI‬קובע שהמידע ברשת‬
‫עובר מספר שכבות לוגיות‪ ,‬כאשר לכל אחת תפקיד במשלוח המידע‪:‬‬
‫יישום‬
‫יישום‬
‫תצוגה‬
‫תצוגה‬
‫‪IP‬‬
‫שיחה‬
‫‪IP‬‬
‫שיחה‬
‫תעבורה‬
‫תעבורה‬
‫רשת‬
‫רשת‬
‫קו‬
‫קו‬
‫פיזית‬
‫פיזית‬
‫הערה ‪ :‬ישנו מודל שכבות אחר )מודל ‪ (TCP‬שבו רק‬
‫‪ 5‬שכבות ‪ -‬יישום‪ ,‬העברה‪ ,IP ,‬רשת ופיזית‪.‬‬
‫• שכבת היישום )‪ - (Application‬השכבה העליונה‪ :‬תכניות המעבירות ביניהן‬
‫נתונים‪ .‬דוגמאות‪:‬‬
‫‪ - (File Transfer Protocol) FTP‬פרוטוקול להעברת קבצים‬
‫‪ - Telnet‬פרוטוקול להתקשרות לקוח לשרת במוד טקסט‬
‫‪ - (Hyper Text Transfer Protocol) HTTP‬פרוטוקול ה‪WEB -‬‬
‫• שכבת התצוגה )‪ - (Presentation‬דחיסה‪/‬שחזור‪ ,‬הצפנה‪/‬פיענוח‪ ,‬המרה בין‬
‫ייצוגי מספרים שונים במחשבים שונים‪.‬‬
‫• שכבת השיחה )‪ - (Session‬ניהול השיחה בין יישומים‪ ,‬כלומר שמירת מידע‬
‫הקשר )‪ (context‬של שיחה‪.‬‬
‫• שכבת ההעברה )‪ - (Transport‬בקרה של זרימת המידע ואספקת העברת‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :2‬מושגי יסוד ברשתות‬
‫‪11‬‬
‫נתונים אמינה לשכבות שמעל‪ ,‬בקרת שגיאות‪.‬‬
‫• שכבת הרשת )‪ - (Network‬שכבת הרשת הכוללת את מודל הכתובות ואת‬
‫פרוטוקולי הניתוב‪.‬‬
‫• שכבת הקו )‪ (Data Link‬שכבה זו אחראית לקישור בין מחשבים ברשת‬
‫המקומית‪ :‬היא כוללת את בקרת הערוץ ‪(MAC - Medium Access‬‬
‫)‪ Control‬שדרכו עובר המידע‪ .‬דוגמאות‪:‬‬
‫‪ - Ethernet‬רשת בטופולוגיית אפיק קוי בעלת גישה אקראית‪ ,‬עם גילוי‬
‫התנגשויות‪.‬‬
‫‪ - Token Ring‬רשת מעגלית‪ :‬המידע עובר במעגל סביב כל התחנות‪.‬‬
‫• שכבה פיזית )‪ - (Physical‬כוללת את מאפייני שידור הנתונים הפיזי במדייה‬
‫של הרשת כגון‪ :‬מתחים וזרמים חשמליים של האותות‪ ,‬סוג הכבל או תדר‬
‫אות אלחוטי‪.‬‬
‫הערה ‪ :‬נהוג לכנות את שכבות הפרוטוקולים גם‬
‫מחסנית הפרוטוקולים )‪ (Protocol Sack‬עקב כוון‬
‫זרימת חבילות המידע ‪ -‬מטה בצד אחד‪ ,‬ומעלה בצד‬
‫השני‪.‬‬
‫תקשורת שרת‪-‬לקוח באמצעות ‪Ports‬‬
‫יישום שרת נרשם על ידי מערכת ההפעלה שעל השרת ומזוהה על ידה באמצעות‬
‫מספר ‪ . port‬הלקוח פונה לכתובת השרת )כתובת ‪ ( IP‬ומספר ה‪ port -‬ואם‬
‫הפעולה מצליחה נוצר קשר‪:‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 12‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫שרת‬
‫לקוח‬
‫מערכת ההפעלה‬
‫מערכת ההפעלה‬
‫‪socket‬‬
‫‪socket‬‬
‫‪port = 83‬‬
‫? = ‪port‬‬
‫‪IP=132.68.190.1‬‬
‫במחשב מארח )‪ (Host‬סטנדרטי רצות בדרך כלל מספר תכניות שרת המזוהות‬
‫על ידי מספרי ‪ port‬שונים‪ .‬קיימים מספרי ‪ port‬תקניים עבור תכניות שרת‬
‫שכיחות כגון‪.(23) Telnet ,(80) HTTP ,(21) FTP :‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :2‬מושגי יסוד ברשתות‬
‫‪13‬‬
‫מחשב מארח‬
‫‪ Sockets‬במערכת ההפעלה‬
‫‪Whois server‬‬
‫‪(TCP) port 43‬‬
‫‪HTTP server‬‬
‫‪(TCP) port 80‬‬
‫‪news server‬‬
‫‪(TCP) port 144‬‬
‫‪My server‬‬
‫‪(TCP) port 1300‬‬
‫‪FTP server‬‬
‫‪(TCP) port 21‬‬
‫‪telnet server‬‬
‫‪(TCP) port 23‬‬
‫‪domain name‬‬
‫‪server‬‬
‫‪(TCP) port 53‬‬
‫‪talk server‬‬
‫‪(UDP) port 517‬‬
‫‪HTTP Client‬‬
‫‪HTTP Client‬‬
‫‪My Client‬‬
‫‪FTP Client‬‬
‫‪My Client‬‬
‫‪My Client‬‬
‫בדוגמא רואים מחשב מארח יחיד המכיל תכניות שרת ומספר מחשבי‪/‬תכניות‬
‫לקוח מסוגים שונים‪ :‬קיימים שרתים ולקוחות תקניים כגון ‪ FTP, HTTP‬וכן‬
‫שרת ולקוח לא תקניים )‪.(My server, My client‬‬
‫גם מחשב הלקוח יכול להריץ תכניות לקוח מרובות הנבדלות על ידי מספר ה‪-‬‬
‫‪ port‬שפותחת עבורן מערכת ההפעלה‪ .‬מספר זה משמש לקבלת מידע המוחזר‬
‫מהשרת‪.‬‬
‫תקשורת טורית בין שני מחשבים‬
‫שני מחשבים יכולים לתקשר ביניהם באמצעות תקשורת טורית‪ .‬ישנם‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 14‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫פרוטוקולים תקניים לתקשורת טורית‪ ,‬להלן השכיחים שבהם‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ - RS-422 ,RS232‬פרוטוקולי תקשורת טורית הממומשים ע"י ‪-port‬ים‬
‫טוריים‪.‬‬
‫‪ - I2C‬מיועד לחיבור רכיבים פריפריאליים בעלי מהירות נמוכה ללוחות אם‬
‫או לכרטיסים אחרים‪.‬‬
‫‪ - SPI‬תקשורת ‪ master/slave‬טורית בין שני התקנים‬
‫‪ - USB‬פרוטוקול טורי מהיר הכולל גם אותו מתח ואדמה‪ ,‬שמטרתו להיות‬
‫תחליף אחיד ותקני לפרוטוקולי תקשורת טורית מסורתיים‬
‫‪ - FireWire‬תקן לממשק ‪ bus‬מהיר בין התקנים‬
‫‪ - Eheternet‬פרוטוקול תקני לרשתות מקומיות‬
‫בפרוטוקולים הטוריים נשלח המידע מצד אחד לשני בית אחד בכל פעם )בניגוד‬
‫לפרוטוקולי תקשורת מקבילית(‪.‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :3‬ערכת הסייבר הלימודית‬
‫‪15‬‬
‫‪ .3‬ערכת הסייבר‬
‫הלימודית‬
‫ערכת הסייבר הלימודית המצורפת כוללת את המרכיבים הבאים‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫מצלמת סייבר ‪ +‬מנוע סרוו ומתקן סיבוב‬
‫בקר מיתכנת רב ערוצי עם מסך משולב‬
‫חיישן טמפרטורה‬
‫חיישן מגע‬
‫חיישן נורית לד אדום‬
‫‪ 4‬כבלים לחיישנים‬
‫כבל חיבור למחשב ‪USB‬‬
‫סייבר ‪ -‬ספר הדרכה )ספר זה(‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 16‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :4‬תקשורת לבקר הסייבר‬
‫‪17‬‬
‫‪ .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‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 18‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫‪ - InA 4‬קריאת קלט אנלוגי מערוץ ‪.4‬‬
‫• >‪ - servo <degree‬סיבוב מנוע הסרוו שאליו מחוברת המצלמה לזווית‬
‫הנתונה‪ .‬הערכים האפשריים הם בין ‪ 0‬ל ‪ .180‬לדוגמא‪:‬‬
‫‪ - servo 180‬יסובב את המנוע לזווית ‪180‬‬
‫‪ - servo 0‬יסובב את המנוע לזווית ‪0‬‬
‫• >‪ - buzzer <freq‬הפעלת הזמזם שעל הבקר בתדר ‪freq‬‬
‫פקודות נוספות לרכיבים אופציונליים בערכת הסייבר‪:‬‬
‫• >‪ - ultrasonic <channel‬קריאת ערך מהחיישן האולטרסוני‪ .‬הערכים‬
‫האפשריים הם בין ‪ 0‬ל ‪.1023‬‬
‫• >‪ - motor <i> <value‬מתן ערך ‪) value‬ערכים בין ‪ -100‬ל ‪ (100‬למנוע ‪DC‬‬
‫מס‪) i .‬ערכים ‪ 1‬או ‪ .(2‬לדוגמא‪:‬‬
‫‪motor 1 100‬‬
‫‪motor 2 -50‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :5‬תקשורת לבקר הסייבר מ‪Java -‬‬
‫‪19‬‬
‫‪ .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‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬20
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!");
http://www.eytam.com
‫עיטם רובוטיקה‬
Java -‫ תקשורת לבקר הסייבר מ‬:5 ‫פרק‬
21
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 {
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬22
:‫ים‬-port ‫ רשימה של‬−
static Enumeration portList;
:‫ מזהה ערוץ טורי‬−
static CommPortIdentifier portId;
:‫ עצם ערוץ טורי‬−
static SerialPort serialPort;
:‫ הגדרת עצם זרם הפלט של הערוץ הטורי שישמש לכתיבה אליו‬−
static OutputStream outputStream;
:‫ המתודה הבאה מבצעת פתיחה ואתחול של הערוץ הטורי‬−
static boolean openSerial() {
‫ כאשר‬,COM<portNo> ‫ שמו יהיה תמיד מהצורה‬- ‫ הגדרת שם הערוץ‬−
:‫ של הערוץ הטורי במחשב‬port ‫ הוא מספר ה‬portNo
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();
‫ הוא‬portId -‫ ו‬,getPortIdentifiers() ‫ מתקבל ע"י קריאה ל‬portList
.‫ הנוכחי בחיפוש‬port ‫המזהה של ה‬
http://www.eytam.com
‫עיטם רובוטיקה‬
‫פרק ‪ :5‬תקשורת לבקר הסייבר מ‪Java -‬‬
‫‪23‬‬
‫‪ −‬אם נמצא ה ‪ port‬המתאים עפ"י השם‪,‬‬
‫{ ))‪if (portId.getName().equals(portName‬‬
‫{ ‪try‬‬
‫‪ −‬מבצעים פתיחה של ה ‪) port‬שני הפרמטרים אינם חשובים‪ ,‬נדרשת‬
‫מחרוזת כלשהי ומספר כלשהו לזיהוי חד ערכי( ע"י קריאה למתודה‬
‫‪ open‬של ‪:portId‬‬
‫‪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‬‬
‫ופרמטרים נוספים‪:‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬24
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();
}
}
}
}
http://www.eytam.com
‫עיטם רובוטיקה‬
‫פרק ‪ :5‬תקשורת לבקר הסייבר מ‪Java -‬‬
‫‪25‬‬
‫קריאת קלט מהערוץ הטורי‬
‫על מנת לקרוא קלט מהערוץ הטורי‪ ,‬נצטרך לעבוד עם זרם הקלט של הערוץ‬
‫הטורי‪ ,‬בדומה לעבודה עם זרם הפלט שלו‪.‬‬
‫ראשית נגדיר במחלקה משתנה מסוג זרם קלט‪:‬‬
‫;‪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‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 26‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫;))(‪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‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
27
Java -‫ תקשורת לבקר הסייבר מ‬:5 ‫פרק‬
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) {
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬28
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);
http://www.eytam.com
‫עיטם רובוטיקה‬
29
Java -‫ תקשורת לבקר הסייבר מ‬:5 ‫פרק‬
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
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬30
///////////////////////////////////////////////////////////////////////////////
// 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();
}
}
}
}
http://www.eytam.com
‫עיטם רובוטיקה‬
31
#C -‫ תקשורת לבקר הסייבר מ‬:6 ‫פרק‬
‫ תקשורת לבקר‬.6
C# -‫הסייבר מ‬
‫ שגירסה חופשית שלה‬,Microsoft Visual C# ‫ הינה‬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();
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬32
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!
‫הסבר‬
:‫הסבר התכנית‬
http://www.eytam.com
‫עיטם רובוטיקה‬
33
#C -‫ תקשורת לבקר הסייבר מ‬:6 ‫פרק‬
‫ בכדי‬IO.Ports ‫ וכן לספריה‬System ‫ מבצעים ייבוא לספריה‬,‫ ראשית‬−
:‫שנוכל לעשות שימוש בערוץ הטורי‬
using System;
using System.IO.Ports;
‫ שישמש לתקשורת בערוץ‬,SerialPort ‫ כעת מגדירים עצם מהמחלקה‬−
:‫הטורי לבקר‬
private static System.IO.Ports.SerialPort serialPort1;
:‫ הגדרת הפונקציה הראשית‬−
static void Main(string[] args)
{
‫ המקבל כפרמטר את רכיבי‬constructor ‫ ע"י‬SerialPort ‫ יצירת עצם ה‬−
:‫המערכת‬
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" ‫יש לחפש רכיב ששמו הוא‬
.‫המופיע לצדו הוא המבוקש‬
‫ כאשר‬,COM<portNum> -‫ כ‬port -‫ בשלב הבא בונים את שם ה‬−
:‫ שנמצא‬port -‫ הוא מספר ה‬portNum
serialPort1.PortName = "COM" + portNum;
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬34
:‫ ובדיקת הצלחה‬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!");
http://www.eytam.com
‫עיטם רובוטיקה‬
35
#C -‫ תקשורת לבקר הסייבר מ‬:6 ‫פרק‬
‫קריאת קלט מהערוץ הטורי‬
‫ של המחלקה‬ReadExisting() ‫קריאה מהערוץ הטורי מתבצעת ע"י המתודה‬
?‫ מתי נדע שיש קלט ממתין בערוץ הטורי‬,‫ השאלה הנשאלת היא‬.SerialPort
?‫ כיצד נסנכרן את פעולת הקריאה עם פעולת הכתיבה של הבקר‬,‫כלומר‬
‫ על מנת לקרוא‬:‫ ניתן לקרוא מהערוץ הטורי תוך שימוש במודל האירועים‬C# -‫ב‬
‫ אנו צריכים לטפל באירוע‬,‫קלט מהערוץ הטורי לאחר שהבקר כתב אליו‬
‫ התכנית הבאה קוראת את‬,‫ לדוגמא‬.SerialPort ‫ שבמחלקה‬DataRecieved
‫ של הבקר על ידי הגדרת מתודת תגובה לאירוע‬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.");
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬36
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;
http://www.eytam.com
‫עיטם רובוטיקה‬
‫פרק ‪ :6‬תקשורת לבקר הסייבר מ‪#C -‬‬
‫‪37‬‬
‫‪ −‬בתוך בלוק העבודה עם הערוץ הטורי אנו כותבים לבקר הוראה‬
‫לקריאת ערך דיגיטלי מערוץ ‪: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‬קריאת תו אחד‬
‫)‪ - Read(byte[] buffer, int offset, int count‬קריאה מהערוץ של ‪count‬‬
‫בתים לתוך החוצץ הנתון‪ ,‬בהזחה של ‪offset‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 38‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫תכנית דוגמא כוללת‬
‫תכנית הדוגמא הבאה מתייחסת למעגל הבא‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫חיישן לד מחובר לערוץ ‪ 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‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
39
#C -‫ תקשורת לבקר הסייבר מ‬:6 ‫פרק‬
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");
http://www.eytam.com
‫עיטם רובוטיקה‬
‫ מדריך לתלמיד‬:‫קיברנטית‬-‫ לוחמה‬40
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");
http://www.eytam.com
‫עיטם רובוטיקה‬
#C -‫ תקשורת לבקר הסייבר מ‬:6 ‫פרק‬
41
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) { }
}
}
}
http://www.eytam.com
‫עיטם רובוטיקה‬
‫‪ 42‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :7‬נספח‪ :‬תכנות בקר הסייבר‬
‫‪43‬‬
‫‪ .7‬נספח‪ :‬תכנות בקר‬
‫הסייבר‬
‫סביבת הפיתוח ‪Mambo++‬‬
‫סביבת הפיתוח ‪ Mambo++‬מאפשרת לתכנת את כרטיס הבקר בשפת ‪.C++‬‬
‫סביבת הפיתוח ‪ Mambo++‬בנויה מעל ‪ – Arduino‬סביבת קוד פתוח למערכות‬
‫חומרה ותוכנה‪ .‬הסביבה כוללת מפרט של שפת תכנות‪ ,‬הוראות חומרה ייעודיות‪,‬‬
‫טיפוסי נתונים‪ ,‬קבועים‪ ,‬ספריות וכלים נוספים לתכנות בקרים תואמי‬
‫‪.Arduino‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 44‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫חלון סביבת הפיתוח‪:‬‬
‫תכנית משתמש נקראת בסביבת הפיתוח ‪ .sketch‬כל ‪ sketch‬צריך לכלול את‬
‫שתי הפונקציות הבאות‪:‬‬
‫• )(‪ – void setup‬בפונקציה זו מאתחלים את נתוני היישום‬
‫• )(‪ – void loop‬בפונקציה זו מתבצע קטע התכנית באופן איטרטיבי‪.‬‬
‫הפונקציה נקראה על ידי המערכת באופן מחזורי‪.‬‬
‫לאחר כתיבת התכנית ניתן להעלותה לבקר באמצעות בחירה בתפריט‬
‫‪) File/Upload‬או ע"י הקלקה על הסימן ‪ V‬בסרגל הכלים(‪ .‬ההעלאה נמשכת‬
‫מספר שניות‪ ,‬ובסיום תוצג ההודעה בשורת הסטטוס "‪ ."Done Uploading‬אם‬
‫יש שגיאות בתכנית‪ ,‬הן תוצגנה בחלון הפלט שלמטה )עם רקע השחור(‪.‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :7‬נספח‪ :‬תכנות בקר הסייבר‬
‫‪45‬‬
‫מבנה בקר ה‪Cyber -‬‬
‫הבקר כולל‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ 4‬ערוצי קלט‪/‬פלט‬
‫‪ 3‬ערוצי מנועים )שניים למנועי ‪ ,DC‬אחד למנוע סרוו(‬
‫מסך ‪ 2 LCD‬שורות על ‪ 8‬עמודות‬
‫כפתור אתחול )אדום(‪ ,‬כפתור משתמש )שחור(‬
‫נורית )‪(led‬‬
‫זמזם )‪(buzzer‬‬
‫מחבר ‪USB‬‬
‫מחבר סוללה‬
‫כפתור בורר ‪ – USB‬סוללה‬
‫את הבקר מתכנתים באמצעות כבל ‪ USB‬המחובר למחשב בו מותקנת סביבת‬
‫התוכנה ‪.Mambo++‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 46‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫מפרט הפינים של הבקר‪:‬‬
‫פונקציות חומרה שימושיות‪:‬‬
‫• )>‪ - pinMode(<pin>,<mode‬קובעת האם הפין המצויין ישמש כקלט או‬
‫כפלט‪ .‬דוגמאות‪:‬‬
‫‪ - pinMode(2, INPUT) −‬פין ‪ 2‬הוא קלט‬
‫‪ - pinMode(10, OUTPUT) −‬פין ‪ 10‬הוא פלט‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫פרק ‪ :7‬נספח‪ :‬תכנות בקר הסייבר‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪47‬‬
‫)>‪ - digitalRead(<pin‬קריאת ערך ספרתי מהפין הנתון – ‪ 0‬או ‪1‬‬
‫)>‪ - digitalWrite(<pin>, <value‬כתיבת ערך ספרתי לפין הנתון‪.0/1 ,‬‬
‫)>‪ - analogRead(<pin‬קריאת ערך אנלוגי מפין נתון‪ .‬הערך הוא בן ‪10‬‬
‫סיביות‪ ,‬כלומר בין ‪ 0‬ל ‪.1023‬‬
‫)>‪ - analogWrite(<pin>, <value‬כתיבת ערך אנלוגי לפין)‪(PWM‬‬
‫דוגמא‪ :‬תכנות הבקר‬
‫תכנית הדוגמא הבאה גורמת להבהוב של הנורית שעל הבקר‪:‬‬
‫{ )(‪void setup‬‬
‫;)‪pinMode(1, OUTPUT‬‬
‫}‬
‫‪// set the LED on‬‬
‫‪// wait for a second‬‬
‫‪// set the LED off‬‬
‫‪// wait for a second‬‬
‫{ )(‪void loop‬‬
‫;)‪digitalWrite(1, HIGH‬‬
‫;)‪delay(1000‬‬
‫;)‪digitalWrite(1, LOW‬‬
‫;)‪delay(1000‬‬
‫}‬
‫התכנית כוללת שתי פונקציות ‪:C‬‬
‫• בפונקצית האתחול )(‪ setup‬קובעים את הפין עליו ממופה הלד )פין ‪ (1‬להיות‬
‫פלט‪.‬‬
‫• בפונקצית הלולאה )(‪ loop‬כותבים לפין פעם את הערך ‪ (LOW) 0‬ופעם את‬
‫הערך ‪(HIGH) 1‬‬
‫‪ −‬בין ההוראות מבוצעת המתנה של ‪ 1‬שניה ע"י הפונקציה ‪delay‬‬
‫)שהפרמטר שלה הוא במילישניות(‪ .‬ההמתנה הכרחית בכדי שקצב‬
‫השינוי של הנורית יהיה מספיק איטי כדי שנוכל להבחין בו‪.‬‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬
‫‪ 48‬לוחמה‪-‬קיברנטית‪ :‬מדריך לתלמיד‬
‫עיטם רובוטיקה‬
‫‪http://www.eytam.com‬‬