הארדואינו אינו זקוק לחיבור למחשב כדי לעבוד, וברוב המקרים זה בדיוק מה שאנחנו רוצים: לתכנת אותו דרך המחשב, ואז לשחרר אותו לעולם הגדול והרחב ולתת לו לעשות את מה שהוא יודע, עם סוללה או בחיבור "לקיר" בלבד.
עם זאת, במקרים מסוימים אנחנו דווקא כן מעוניינים בחיבור קבוע למחשב: כאשר הארדואינו אמור לתקשר עם תוכנה כלשהי, כלומר להעביר או לקבל ממנה נתונים ופקודות, או בזמן שאנחנו מבצעים דיבוג ומנסים לפתור תקלות. סביבת הפיתוח של הארדואינו יודעת לאתר שגיאות בתחביר התוכנה, אבל אם טעינו בלוגיקה שלה, הלוח לא יתפקד כצפוי – ולכו תמצאו איפה הבעיה (בהנחה שהיא לא בחיבורי החומרה). התקשורת עם המחשב מאפשרת לנו, למשל, לצפות בערכי משתנים בזמן אמת, וכך להבין טוב יותר מה קורה בתוך השבב ולפתור את התקלות. אז איך עושים את זה?
אופן התקשורת הבסיסי והנוח ביותר עם המחשב הוא דרך כבל ה-USB שמשמש לתכנות הארדואינו, באמצעות מה שנקרא "פורט סריאלי" או "חיבור טורי" ("Serial Port"). במחשבים של פעם היו שני סוגי חיבורים פיזיים לתקשורת: חיבור מקבילי (Parallel Port), שהיה מסוגל להעביר מספר ביטים בו-זמנית, והחיבור הטורי שהעביר ביטים בזה אחר זה. תקן ה-USB משחזר בקלות את הפונקציונליות של החיבור הטורי הישן ולמעשה החליף אותו לגמרי. סביבת הפיתוח "מדברת" עם לוח הארדואינו דרך חיבור טורי, וגם אנחנו יכולים לנצל אותו לשימושינו.
כדי לעשות זאת, נשתמש באובייקט תוכנה מוגדר-מראש שנקרא Serial (הקלידו תמיד עם S גדולה בהתחלה, אחרת סביבת הפיתוח לא תזהה אותו). כדי להפעיל אותו, נכניס את הפקודה Serial.begin לתוך פונקציית ה-setup שלנו:
void setup() { Serial.begin(9600); }
פקודה זו מאתחלת את החיבור הטורי ומכינה אותו לקריאה וכתיבה. המספר 9600 מציין את ערך ה-Baud של החיבור, כלומר כמה ביטים יכולים לעבור בו מדי שניה. לא חייבים להשתמש בערך הזה דווקא (ראו אפשרויות נוספות בתיאור הפונקציה כאן), אבל הוא מספיק טוב לרוב השימושים והרבה דוגמאות מציינות אותו, אז מה זה משנה. אין גם חובה לאתחל את החיבור דווקא ב-setup.
כדי לכתוב לחיבור הטורי (להעביר מידע מהארדואינו למחשב), נוח להשתמש בפקודה Serial.println. נעביר לפקודה הזו, בתוך הסוגריים, מה שבא לנו: אותיות, מחרוזות, מספרים וכו', והיא כבר תכתוב אותם במחשב, בשורה חדשה כל פעם. לדוגמה,
void loop() { float v; v = (analogRead(A0) * 500.0) / 1023.0; Serial.println(v); delay(1500); }
איפה רואים את התוצאה? בסביבת הפיתוח, בתפריט Tools, בחרו ב-Serial Monitor (או לחצו Ctrl+Shift+M). שימו לב שזה יעבוד רק כשיש ארדואינו מחובר, אחרת תקבלו הודעת שגיאה. כמו כן, החלון ייסגר אוטומטית כשתטענו קוד חדש ללוח. בינתיים, אתם אמורים לקבל משהו כזה:
באמצעות אותו חלון אפשר לשלוח מידע בחזרה לארדואינו: כותבים מה שרוצים בתיבת הטקסט העליונה, ולוחצים על Send. לוח הארדואינו קולט את המידע הזה בשקט ומאחסן אותו במאגר פנימי קטן. כדי למשוך את המידע מהמאגר, נבדוק קודם כל אם יש בו משהו:
if (Serial.available() > 0) { // do something }
הפונקציה Serial.available מחזירה לנו את מספר הבתים (Bytes) של נתונים שממתינים, אם בכלל, במאגר. כדי לקרוא אותם בפועל, ניעזר בפקודה Serial.read. לדוגמה,
if (Serial.read() == '0') Serial.println("You wrote Zero!");
לאובייקט Serial יש עוד מספר פונקציות שמעניקות לנו שליטה טובה יותר בקריאה ובכתיבה, ואתם יכולים לקרוא עליהן בדף שלו. לצרכים הבסיסיים שלנו, בשלב זה, הארבע שהוזכרו יספיקו בהחלט.
בפוסט הבא נדגים את הקריאה והכתיבה לחיבור הטורי עם פרויקט למתחילים של מד טמפרטורה אינטראקטיבי.
הי
כאשר הארדואינו עובד standalone ללא חיבור למחשב, האם serial.print מבזבז משאבי ארדואינו?
תודה
אסף
בהשוואה לאותה תוכנה בדיוק שרצה כשהארדואינו כן מחובר? לא, אין הבדל.
איך מגדירם את הפורט במחשב
בסביבת הפיתוח של ארדואינו, זה בתפריט Tools->Port. בתוכנות אחרות, עיין במדריך למשתמש של כל תוכנה… 🙂
קאפצ'ה מגניבה XD
אני התחלתי לשחק עם הסיראל בשילוב עם תכנות ב PYTHON מה שפותח את האפשרויות למה שאפשר לעשות עם הארדווינו… בהרבה!
אומנם נתקלתי בלא מעט בעיות, אבל אני מניח שנתגבר
ממליץ לך גם להתעניין אם אתה בקטע של פייתון.
מגניבה אבל לא מושלמת, מסתבר…
למה דווקא פייתון?
מה זה FLOAT?
טיפוס משתנה שיכול להחזיק ערכים לא שלמים (עם ספרות אחרי הנקודה העשרונית, למשל 3.141592). אני ממליץ למצוא ספר או אתר בסיסיים על שפת C ולהתחיל משם. למישהו יש המלצה על איזה אתר חינמי קריא במיוחד?
יש באינטרלקט. הוא מקיף ויסודי מאוד, ולכן גם ארוך מאוד. הכל מלווה בסרטונים. זו דרך למידה איטית מאוד, אבל כל אחד יכול להיות ככה אשף (…) ב-C.
אני אישית למדתי דרך הספר בוויקיספר העברית (אחלה ספר! כולל גם תרגילים), והוא די מקיף, אך דורש יותר השקעה בקריאה ובהבנה. אני למדתי משם, ואני ממליץ!
מדריך מבורך, כן ירבו.
אגב, בנושא שברוך העלה, עוד משהו ששווה להזכיר (גם, רלוונטי אולי בשלב מתקדם יותר) הוא הנושא של ריבוי פורטים על ידי שימוש באמולציה (ועוד כמה צימוקים כמו שימוש בפסקים למשיכת מידע סריאלי), כמו כן, שווה לשים לב להבדלי גרסאות של הקלאס softSerial: הגרסה האחרונה היא NewSoftSerial ששולבה ב IDE של ארדואינו לא מזמן. זה עשה לי קצת בעיות עם קוד ישן עד שהבנתי מי נגד מי.
יש לי את הספר ואני אשמח לשלוח לך
שלום עידו!
אם אנו מדברים על תקשורת סריאלית, כדאי להזכיר ספריה SoftwareSereal שיצתה עם Arduino IDE 1.0 ועל תוכנה Processing שמקלה עד מאוד שליחה של מידע בערוץ הסריאלי ממחשב.
ספר Arduino Cookbook מלא בדוגמאות כאלה…
עוד לא נתקלתי בספריה הזו 🙂
זה נושא מתקדם יחסית למה שהצגתי; בשלב זה, אני מעדיף להתמקד בדברים בסיסיים יותר. אבל רשמתי לפניי להתייחסות עתידית. תודה!