ארדואינו זה עבודה

כשהתחלתי להתעסק עם הארדואינו, לא תיארתי לעצמי בכלל שיהיה לזה צד כלכלי (חוץ מהמחיר של הרכיבים, כמובן) – אך דבר הוביל לדבר, ולא מזמן השלמתי את פרויקט הארדואינו ה"עסקי" הראשון שלי, עבור לקוח משלם. כבר רמזתי על הפרויקט הזה בעבר, וכעת הגיע הזמן לספר עליו ביתר פירוט.

Project Hardware
חלק הארדואינו של חומרת הפרויקט

הגדרות

הפרויקט המלא הוא פיתוח שהלקוח ביקש לשמור בסוד, ולכן לא אדבר על מה שהפרויקט בכללותו מיועד לעשות ואיך הוא בנוי. לצורך העניין, פשוט דמיינו קופסה שחורה שממנה יוצאים שני חוטים. כל חוט נותן מתח של 0-5 וולט (אינדיקציה לפרמטר כלשהו במערכת שמשתנה עם הזמן). המשימה העיקרית שלי היתה לבנות Data Logger – מערכת מבוססת ארדואינו שדוגמת את המידע שמגיע מהחוטים הללו לאורך זמן, ושומרת אותו כך שניתן יהיה, מאוחר יותר, להעביר את המידע למחשב לצורך עיבודים נוספים. ביחד עם לוח הארדואינו (שלא התאים למשימה והוחלף על ידי, כפי שתואר בקישור למעלה) קיבלתי גם את ה-Shield האדום שבתמונה (מודול לכרטיס Micro-SD) וכרטיס זיכרון תואם.

הדרישות מה-Data Logger היו ברורות: עליו להיות מסוגל לעבוד ללא השגחה ימים רבים ברצף; הוא צריך להמיר את המתחים הגולמיים שמתקבלים בשני החוטים לסולמות ערכים שמתאימים לפרמטרים הנמדדים; הדגימה צריכה להתבצע לעתים קרובות יחסית (בסביבות פעם בשניה), הקבצים שהוא שומר צריכים להיות בפורמט CSV (טקסט פשוט מופרד בפסיקים, כזה שאפשר לטעון בקלות לאקסל), וצריכה להיות דרך כלשהי לדעת מתי קובץ מסוים והנתונים שבו נאספו.

מחיר הגמישות

דבר ראשון, בדקתי את נושא גודל הקבצים. קובץ CSV הוא בפורמט שאדם יכול לקרוא. לכן, מספר כמו 123.456 תופס שבעה בייטים שלמים (שישה לספרות ואחד לנקודה). נוסיף לזה פסיק מפריד ומספר דומה עבור הפרמטר מהחוט השני וקיבלנו 15 בתים לכל דגימה, ולזה צריך להוסיף עוד שניים למעבר השורה (תווי ASCII מס' 10 ו-13). דגימה אחת בשניה זה 86,400 דגימות ביממה, או 604,800 בשבוע. כפול 17 בייטים נותן בערך 10 מגהבייט – בהחלט משהו שכרטיס הזיכרון והארדואינו יכולים להתמודד איתו.

השיקול הבא היה עניין הגמישות. הדרישות של הלקוח, בעיקר מבחינת אופן החישוב להמרת הנתונים, לא היו מוגדרות מראש במאת האחוזים: ייתכן שהמתח מחוט אחד יומר במדידה לסקאלה של 1-100, וייתכן שהטווח הרצוי יהיה דווקא 5- עד 5. מבחינת הארדואינו עצמו אין כאן קושי גדול: במקום לקבע את הערכים ישירות בקוד, אני יכול לשמור אותם ב-EEPROM של השבב והקוד יטען אותם משם או יצרוב ערכים חדשים במקומם כשאגיד לו. הבעיה האמיתית היא השאלה עם איזה מין ממשק אעשה זאת. את הרעיון המקורי של הלקוח, להיעזר במסך LCD וכמה לחצנים, פסלתי מיד: זה גם לא יהיה נוח, גם ירוקן במהירות את הסוללה וגם ינפח משמעותית את הקוד ואת כמות העבודה. מכיוון שזמן קצר לפני כן למדתי כיצר לקשר בין הארדואינו למחשב, החלטתי לנצל את אותה טכניקה ולכתוב תוכנת דסקטופ שתשמש כממשק לשליטה ועדכון ערכים בארדואינו. ואם כבר יש ממשק ישיר למחשב, למה לא להעביר את קובצי הנתונים דרכו ולחסוך את השליפה וההחזרה של הכרטיס העדין והפגיע?

זה היה רעיון טוב, אלא שהוא החזיר אותי לנושא של גודל הקבצים. התקשורת הסריאלית בין הארדואינו למחשב היא בקצב מרבי של 115,200 קילוביט לשניה, כלומר 14.4 קילובייט לשניה. לקובץ של עשרה מגה יידרשו אחת-עשרה דקות בערך לעבור. ומה אם הלקוח יחליט לדגום כל עשירית שניה במקום כל שניה? מאה ועשר דקות זה כבר זמן בלתי סביר בעליל.

במקום לוותר על תוכנת הממשק, חזרתי לחשוב על פורמט הקובץ. למה, בעצם, אני צריך לשמור אותו בפורמט קריא לאדם אם הוא ממילא עובר דרך המחשב? הארדואינו שומר מספרים עשרוניים במשתני float בני 4 בייט כל אחד, ואני לא זקוק לפסיקים או למעברי שורה (תוכנת הדסקטופ תוכל להוסיף אותם לבד) – כבר חסכתי 53% מגודל הקובץ!

אבל רגע… בעצם, אם תוכנת הדסקטופ יכולה לדעת לאיזו סקאלות המתחים מומרים, אפשר לכתוב בקובץ אך ורק את המידע הגולמי שמגיע מהפינים האנלוגיים – 2 בייט למדידה – ותוכנת הדסקטופ תבצע גם את חישובי ההמרה בעצמה! למעשה, הארדואינו לא צריך לעשות שום עיבוד של הנתונים, רק לשפוך אותם כמו שהם לקובץ! מ-17 בייט לרשומה ירדתי ל-4, חסכון של 76.4%,  וקובץ המקרה הקיצוני ההוא של השעתיים ייקח עכשיו פחות מחצי שעה.

הפרטים הקטנים

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

אני! עובד! בארדואינו!

כידוע, תכנות זה לא דבר חדש בשבילי. כמו כן, יצא לי לראות, לשמוע על ולהשתתף במספיק פרויקטים של העולם האמיתי – לאו דווקא בתחום האלקטרוניקה – כדי לדעת למה צריך לשים לב, אילו בעיות עלולות לצוץ ואיך לעבוד בצורה גמישה שהולמת את הדרישות המשתנות. והן תמיד משתנות, באמת.

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

אני מקווה שזו היתה הסנונית הראשונה ושיהיה לי עוד הרבה מה לספר לכם. ובינתיים, אם אתם שומעים על מישהו שמחפש מומחה לפיתוח ארדואינו, עם שילוב תוכנות דסקטופ או משהו בסגנון, אתם יודעים לאן להפנות אותו… 🙂

נ.ב. ברוח הקהילה ובהתאם להיכרותי איתכם, כמובן שאשמח להפנות אליכם במקרה הצורך לקוחות שזקוקים לידע וליכולות הספציפיות שלכם, לייעץ לכם בתחומי הידע שלי ולשתף פעולה בכל דרך אחרת גם בפרויקטים מסחריים. דברו איתי! (info שטרודל idogendel.com)

להרשמה
הודע לי על
1 תגובה
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

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