ערכת לימוד:
לוחמת סייבר
)(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
© Copyright 2025