אחת הבשורות המעניינות בגרסה 1.6.6 של סביבת הפיתוח של ארדואינו היא Serial Plotter – כלי להצגה גרפית בסיסית של מידע. בפוסט זה אתאר בקצרה מה ה-Serial Plotter עושה ואיך משתמשים בו.
כמו ה-Serial Monitor הוותיק והמוכר, גם ה-Serial Plotter מספק רק פונקציונליות מינימלית, והוא מאד לא גמיש. כמובן, פשטות כזו היא חלק מסוד ההצלחה של ארדואינו באופן כללי, ומי שזקוק לכלים מורכבים יותר ימצא אותם במקומות אחרים.
כדי להגיע לפלוטר הסריאלי, נבחר בתפריט Tools->Serial Plotter (או מקשי הקיצור Ctrl+Shift+L במערכת ההפעלה Windows). כמו המוניטור, גם הפלוטר ייפתח רק אם יש ארדואינו (או מקור סריאלי אחר) שמחובר למחשב.
בתחתית החלון של הפלוטר, מצד שמאל, יש תפריט נפתח בו אפשר לבחור את קצב השידור. מעבר לזה, הכל שם נבחר ומבוצע בשבילנו, ואין דרך מובנית "להקפיא" את הגרף, לשמור אותו כתמונה או לבצע פעולות מתקדמות אחרות.
הגרף מופק ממספרים ש-(1) מגיעים כטקסט*, (2) אין לפניהם או אחריהם טקסט או סימנים גרפיים אחרים, ו-(3) שמסתיימים בתווי השורה החדשה המקובלים (אלה שנשלחים אוטומטית בסיום הפקודה Serial.println). כלומר, אם ורק אם הפלוטר "רואה" שורה של טקסט, שמכילה אך ורק מספר חוקי (כולל מספרים עם נקודה עשרונית), הוא יוסיף את המספר לגרף. אחרת הוא מתעלם מהקלט. אפשר, אם כי כמובן לא מומלץ, להוסיף לפני ואחרי המספר תווים שאינם גרפיים – קודי ASCII מספר 0 עד 32 כולל. הגרף עצמו הוא בצבע כחול, והנקודות מחוברות ביניהן.
* כאשר מעבירים משתנה מספרי כפרמטר לפונקציה Serial.print או Serial.println, הוא נשלח אוטומטית לפלט הסריאלי בפורמט טקסט מתאים.
ציר X של הגרף אינו מצויר ואינו מתחשב בשום צורה בזמן שעובר בין מספר למספר. הוא מציין אך ורק את סדר המספרים שהגיעו, משמאל לימין, ורוחבו 500 יחידות. כשמותחים את חלון הפלוטר, הגרף נמתח ויזואלית בהתאם אך כמות היחידות בציר לא משתנה. אם מגיעים יותר מ-500 מספרים, הגרף "זז" ומציג רק את ה-500 האחרונים. לא ניתן לגלול לאחור.
ציר Y נקבע ומתעדכן אוטומטית בהתאם לערכי המספרים שמגיעים, כדי להציג את מלוא הטווח ועוד "מרווח ביטחון" גדול. הוא יכול לכלול מספרים שליליים.
הנה הקוד – לא יעיל במיוחד – שמצייר גל סינוס "קלאסי" (לא כמו בתמונה למעלה, שם הכפלתי את j כדי לקבל גרף צפוף יותר):
void setup() { Serial.begin(9600); } void loop() { for (int j = 0; j < 360; j++) { Serial.println(sin(j * (PI / 180))); } }
כל האמור לעיל הוא על סמך ניסויים שערכתי, בלי לקרוא (בינתיים) את קוד המקור של הפלוטר. אם יש לכם הערות/תיקונים, אשמח לשמוע בתגובות.
נ.ב. מספר משתמשים כבר דיווחו על תקלות מסוימות בגרסה 1.6.6 של סביבת הפיתוח (עבודה עם namespace ונושאים מתקדמים-יחסית אחרים). ראו הוזהרתם…
נראה כמו פיצ'ר נחמד, אך כמו שציינת הוא חסר גמישות..
בשלב זה של הפלוטר עדיין עדיף לרכז את הנתונים ולהכניס אותם לאקסל לאחר מכן. החסרון היחיד של עבודה בצורה הזאת היא שאתה לא רואה את הנתונים בזמן אמת, צריך לאגור כמות של נתונים ורק אז להעביר אותם הלאה לאקסל..
אבל לדעתי כאמור, גם כך- עדיין עדיף על הפלוטר בשלב זה..
תודה על הפוסט..
מה שהכי משמח אותי בפלוטר הוא שסוף כל סוף שברו קצת את המסגרת הרגילה של ה-IDE, והשקיעו טיפה במשתמש הטיפוסי ולא רק בלוחות חדשים ובתמיכה בהם. גם אם הפלוטר עצמו נותן מעט מאד בסופו של דבר (ובטח שלא עונה על צרכים מורכבים), הכיוון בהחלט חיובי.
…אלא אם יתקבלו "הצעות השיפור" לפלוטר שאנשים התחילו לזרוק ב-Github. בקושי נולד, וכבר מנסים להפוך אותו לדינוזאור מגושם 🙂
אני מסכים איתך לגבי "שבירת המסגרת" הכיוון בהחלט חיובי..
ולגבי "הצעות השיפור",
המפתחים מושכים לכיוון פונקציונליות פשוטה, המגיבים מושכים לכיוון תוספות רבות שיסרבלו..
אולי זה יתאזן בסופו של דבר איפשהו באמצע עם תוספות שימושיות- אך פשוטות..
ימים יגידו ☺