יש הרבה דרכים לשדר מידע באמצעות הפעלה וכיבוי מתוזמנים של מחולל אות כזה או אחר. אבל כשהמערכת מופעלת בסוללות ואורך החיים שלהן הוא שיקול קריטי, ייתכן שהדרך הטובה ביותר היא דווקא לשמור על השקט.
דמיינו מערכת שבה מממשים תקשורת סריאלית רציפה דומה לזו של הארדואינו (חד-סטרית), לא על גבי כבל מוליך חשמל אלא בעזרת פנס בצד אחד וחיישן אור בצד שני. הביטים 0 ו-1 מועברים באמצעות חושך ואור, בהתאמה, בתזמון נכון. זה יכול לעבוד. אבל מה קורה אם הפנס מופעל בסוללה, ואין לנו סוללות להחלפה? כמות המידע שאפשר להעביר מוגבלת, והפרוטוקול בזבזני למדי מכיוון שבממוצע, חצי מהביטים יצרכו חשמל. האם יש שיטה שתאפשר לנו להעביר יותר מידע עם אותה סוללה בדיוק?
טלגרף בן 2400 שנים
במאה הרביעית לפני הספירה, מלומד יווני בשם אניאס טקטיקוס תיאר את הטלגרף ההידראולי – מתקן להעברת תשדורות צבאיות למרחק. גם שולח המידע וגם המקבל צוידו בלפידים, ובכדי מים זהים בגודלם עם חור זהה בגודלו, סגור בפקק, קרוב לתחתית. בתוך המים שבכדים צפו מוטות עץ, שעליהם סומנו קווים בגבהים שונים. כל קו סימן הודעה אחרת, מהסוג שצפוי להופיע במהלך מלחמה: "רגלים מתקרבים", "פרשים מתקרבים", "ספינות מתקרבות", "תביאו אוכל" וכדומה.
כדי להתכונן לשידור, השולח הדליק את הלפיד שלו, החזיק אותו גבוה באוויר וחיכה שהמקבל – שנמצא על איזו גבעה רחוקה – ידליק בחזרה את הלפיד שלו כדי להראות שהוא מוכן. אז השולח הוריד את הלפיד ושניהם הוציאו בבת אחת את הפקקים מהכדים. השולח המתין עד שהקו הרלוונטי על המוט הצף יגיע לגובה שפת הכד, ואז הרים את הלפיד. כשהמקבל ראה את הלפיד עולה, הוא מיהר להביט על המוט בכד שלו – שהיה כמובן פחות או יותר באותו גובה – וכך פענח את המסר. הזמן שעבר בין הורדת הלפיד להעלתו מחדש היה, בעצמו, האמצעי להעברת המידע.
אותו רעיון יכול לשמש אותנו לפתרון הבעיה שהוצגה למעלה. במקום להשתמש בציר הזמן כדי "למסגר" ביטים, כפי שנעשה בפרוטוקולים המקובלים, נשתמש בביטים כדי למסגר את הזמן, ונהפוך את הזמן עצמו לנשא המידע.
עלות-תועלת
נניח שאנחנו צריכים לשדר בייטים, מספרים בני 8 ביט שערכיהם בין 0 ל-255. הזמן הנדרש לשידור כל בייט בשיטה הנאיבית, בקוד בינארי, הוא 8 יחידות זמן, ובממוצע כל בייט יעלה לנו 4 יחידות זמן במצב HIGH.
בשיטה מבוססת-הזמן, לעומת זאת, נשדר ביטים בודדים של HIGH בתור תוחמים, ומשך זמן ה-LOW ביניהם יהיה המספר הרצוי. למשל, כדי לשדר 59, נשלח ביט HIGH אחד, נחכה 59 יחידות זמן ואז נשלח עוד HIGH קצר (זהירות – כדאי לחשוב היטב איך שולחים את המספר 0). זמן השידור הממוצע לבייט יהיה אמנם 130 יחידות זמן, אך המחיר לבייט יהיה רק שתי יחידות – ואם נשלח בייטים ברצף, הוא יכול לרדת אפילו לאחת.
ומה שעוד יותר מעניין, לפחות ברמת התיאוריה, זה שאם המיקרו-בקר שלנו מסוגל להיכנס למצב שינה ולהעיר את עצמו ברזולוציית זמן מדויקת מספיק, את רוב זמן שידור המידע הוא יוכל להעביר בשינה ולחסוך כך עוד יותר חשמל.
זאת אומרת, השיטה מבוססת-הזמן מתאימה למצבים בהם צריכת החשמל היא שיקול קריטי לחלוטין, ולעומת זאת מהירות התקשורת היא עניין שולי. בתקשורת קווית, על גבי כבל, ההבדל בצריכת החשמל בין HIGH ל-LOW חסר משמעות. הוא בא לידי ביטוי רק בתקשורת אלחוטית – ואז גם סביר יותר שנצטרך לעבוד עם סוללה ולחסוך בחשמל.
אם מדובר על מודולי RF Link Kit הזולים, יש עוד סיבוכים שצריך לשים לב אליהם. כזכור, אם אין שידור למשך זמן-מה, המקלט מתחיל "לדמיין" אותות אקראיים וצריך לשלוח לו אות אימון לפני המידע, כדי לחזור ולסנכרן אותו. הבעיה הזו מגבילה אותנו גם מצד המשדר – יש הגבלה על משך הדממה הרצופה שאפשר "לשלוח" – וגם בצד הקולט, שיצטרך דרך סבירה להבדיל בין שידור לגיטימי לבין אות אימון לבין רעש סתם. בנוסף, משך ה-HIGH שיוצא מהמקלט אינו זהה בהכרח למשך ה-HIGH שנכנס למשדר – הוא יכול לסטות עד שלושים מיליוניות השניה, פלוס מינוס, מה שמשנה כמובן באותה מידה את משך ה-LOW שבין שני אותות.
עם כל הבעיות האלה נאלצתי להתמודד בפרויקט שאני עובד עליו כעת (עבור לקוח), וכמה מהן הובילו לטריקים ולתגליות מעניינים מאד בתחום האופטימיזציה – גם שלי וגם של הקומפיילר. אבל על כך – בפוסט הבא…
תחום מרתק!
ממתין לפוסט הבא…
תודה עידו.
ממש מעניין. זה נראה לי מרתק לעבוד בפרויקטים כל כך חסכניים.
אהבתי גם את הטריק העכבר…