חיקוי ושפצור ה-2262/72: מבוא

לפני חודש ומשהו דיברתי על צמד הג'וקים PT2262 ו-PT2272, שיכולים להוות בסיס אמין וזול למערכת תקשורת אלחוטית חד-סטרית מינימלית. בפוסט זה נדבר על האפשרות לחקות את אופן הפעולה שלהם באמצעות מיקרו-בקרים – ונפתח בשאלה המתבקשת: בשביל מה?

בהתחשב בכך ש-PT2262/72 עובדים באופן עצמאי, עולים שקל ליחידה (ואפילו פחות מזה, אם קונים בכמויות גדולות) ואינם דורשים שום תכנות, העברה של הפונקציונליות שלהם לתוך מיקרו-בקר נראית כמו פספוס של הפואנטה. עם זאת, אפשר לחשוב בקלות על תסריטים שבהם דווקא כן נרצה להחליף את הג'וק הייעודי של המשדר או של המקלט במיקרו-בקר:

  • כשאותו חלק במערכת כולל ממילא מיקרו-בקר, ואנחנו יכולים להרשות לעצמנו להעמיס עליו גם את הפונקציה הזו
  • כשאנחנו רוצים, מסיבה כלשהי, לעבוד במתח של 3.3V או פחות (הג'וקים האלה פועלים כזכור ב-4 עד 15 וולט)
  • אם בנינו מספר משדרים מבוססי PT2262 ואנחנו רוצים לרכז את המידע מכולם באמצעות מאזין אחד ויחיד*
  • כדי לשפר בתנאים מסוימים את יעילות הפרוטוקול (ראו בהמשך)
  • כשהמטרה היא "לרחרח" שידורים זרים עם כתובת לא ידועה מראש
  • אם בא לנו להתמודד עם האתגר עצמו, כאתגר…

* את בעיית המאזין היחיד אפשר, אגב, לפתור גם עם דגמי PT2272 שמותאמים לכתובת קצרה מזו שמשדרים ה-PT2262. המחיר שנשלם על כך הוא כמות מידע קטנה יותר פר משדר ככל שיש יותר משדרים, ומגבלה משמעותית על מספר המשדרים הכולל.

כהערת שוליים, אציין שיש לזוג הג'וקים הזה כמה תואמים: SC2262/72, HT6010/34 ומן הסתם גם אחרים – באותם מארזים ועם אותו סידור פינים, אך עם תכונות חשמליות שונות מעט.

שידור

אופן שידור המידע מהמקודד, ה-PT2262, פשוט למדי, ומתואר במלואו ב-datasheet של הג'וק (בסעיף Functional Description). ראשית, יש לנו תדר שעון שתלוי בערך של הנגד ששמנו בין הפינים OSC1 ו-OSC2. לשם הקיצור, נקרא ל"תקתוק" אחד של השעון בשם a – זו תהיה יחידת הזמן הבסיסית שלנו.

כל שידור ("Frame") מורכב מארבעה עותקים זהים ורצופים של "Code Word", שמורכבת מ-12 אלמנטים של כתובת/נתונים ומאלמנט אחד נוסף לסינכרון. כל אלמנט כתובת/נתונים תואם לקלט בפין מסוים של כתובת/נתונים בג'וק, ולכן הוא יכול להיות באחד משלושה מצבים: "0", "1" או "F" (לא מחובר, Floating). אם נשתמש בסימן H למתח חיובי (High) וב-L לאפס, ככה נראים שלושת המצבים האלה בפלט של השידור:

"0" =  4aH, 12aL,  4aH, 12aL
"1" = 12aH,  4aL, 12aH,  4aL
"F" =  4aH, 12aL, 12aH,  4aL

שימו לב שסכום הזמנים של כל אלמנט כתובת/נתונים כזה הוא 32a. אלמנט הסינכרון, לעומת זאת, מגיע תמיד באותה צורה: 4aH ואחר כך 124aL (כמובן, אם זהו סוף ה-Frame, הקו ימשיך ל"הוציא" פלט L עד לתחילת השידור הבא). אם כן, משך הזמן של כל "Code Word" הוא 512a, ושל Frame שלם הוא 2048a.

הצגה גרפית מה-datasheet, של קידוד האלמנטים (נקראים כאן "ביטים"). לא כולל אלמנט הסינכרון
הצגה גרפית מה-datasheet, של קידוד האלמנטים (נקראים כאן "ביטים"). לא כולל אלמנט הסינכרון

בדקתי עם לוג'יק אנלייזר את הסיגנל שיוצא מ-PT2262 כאשר הנגד בין OSC1 ל-OSC2 הוא כ-2MOhm. מבחינה מבנית האות נראה בדיוק כמתואר למעלה, ותדר השעון שלו היה בסביבות 16.9KHz, כלומר ששידור של Frame שלם נמשך כ-0.12 שניות.

מעניין לציין שהעלייה הראשונה במתח הפלט הופיעה 4 אלפיות השניה אחרי הורדת המתח בפין TE (הפקודה להתחלת השידור). ייתכן שזה הזמן שנדרש לג'וק לקרוא ולקבוע את הערכים בפיני הקלט שלו.

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

קליטה

הפענוח של השידור הוא עסק מורכב, משתי סיבות: 1) אין לנו שום ערובה ששידור ייקלט מתחילתו ועד סופו ובאופן נאמן למקור, ו-2) אנחנו לא יודעים את תדר השעון המדויק של השולח.

כדי להתמודד עם הבעיה הראשונה, השידור כולל – כפי שבוודאי שמתם לב – כפילויות ומרווחי ביטחון גדולים. המפענח (PT2272) מאזין כל הזמן, מחפש שתי "Code Words" זהות ברציפות ומגיב רק אם הוא מוצא אותן. כל "Frame" כולל ארבע "Code Words" כדי להגדיל את הסיכויים שיגיעו לפחות שתיים זהות בסביבה של חוסר ודאות ורעש. המבנה של האלמנטים הספציפיים, לעומת זאת, מיועד להפחית את הסיכוי ל"False Positive", או אזעקת שווא – מצב שבו רעש ושגיאות אקראיות יירשמו כ"Code Word" לגיטימית.

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

שיפורים

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

1. כשהמיקרו-בקר בצד הקולט

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

המפענח המקורי שומר בזיכרון רק את ה-"Code Word" הלפני-אחרונה שהגיעה, כדי להשוות אותה לאחרונה. זה אומר שאפילו אם בתוך "Frame" מסוים הגיעו שתי "Code Words" תקינות מתוך ארבע, עדיין יכולים להיות מצבים שבהם המפענח לא יגיב, כי הן לא הגיעו ברציפות. אם ניתן למיקרו-בקר זיכרון טוב יותר, של שלושה צעדים אחורה במקום אחד, נוכל לזהות שידורים לגיטימיים שהיו נפסלים בגלל שיטת העבודה של הג'וק הייעודי.

2. כשהמיקרו-בקר בצד המשדר

אם נניח איכות סבירה של ערוץ התקשורת, או שנהיה מוכנים לספוג קצת יותר פספוסים, אנחנו יכולים לוותר על חלק מה-"Frame" ולשלוח רק שלוש או אפילו שתי "Code Words" ברציפות – מה שמוביל לחיסכון מיידי וברור בצריכת החשמל.

למקלטי RF פשוטים כמו ב-RF Link Kit הזולים יש חיסרון ידוע: כשאין שידור, הם עלולים להוציא כפלט רעש אקראי, והם זקוקים לרצף קצר של שידור אמתי כדי להתאפס על עצמם. לכן, בתיאוריה לפחות, קליטת האלמנטים הראשונים ב-"Code Word" הראשונה עלולה להיפגע, מה שיפסול מראש חצי מה-"Frame". במקרה כזה, אם המיקרו-בקר המשדר יתחיל את השידור לא ישירות במידע אלא באות אימון קצר (מעין "01010101" מהיר), הקליטה של המידע תהיה אמינה יותר, ונוכל לוותר על חלק מה-"Frame" בלב עוד יותר שקט.

האם אות אימון באמת חיוני במצבים כאלה? חיברתי ג'וק PT2262 למשדר RF זול (315MHz) ובדקתי בעזרת לוג'יק אנלייזר את הפלט ממקלט RF תואם. למען האמת, היה די מסובך להשיג את הרעש האקראי מהמקלט: הוא היה שקט מאד והגיב יפה מאד גם לאי-שידור וגם לשידור. בסופו של דבר דחקתי אותו בכוח לפינה – הנחתי אותו ישירות על המחשב, שם הוא קלט לשמחתי אות לא-רצוי וסדיר למדי. בתנאים אלה, אפשר לראות שאכן ההסתגלות לאות החזק והנכון לוקחת זמן, והאלמנטים הראשונים של ה-"Code Word" הראשונה השתבשו. בתמונה הבאה, החלק האופקי הראשון הוא האות המלא (מתחיל ברעש משמאל, השידור באמצע, ובסוף מימין שקט). החלק האופקי השני הוא תקריב של הראשון (של האזור שהוקף במסגרת אדומה), והחלק השלישי הוא תקריב של האזור שסומן במסגרת ירוקה. אגב, האזורים ה"לבנים יותר" באזור השידור שבחלק העליון הם רק תוצר לוואי של שמירת התמונה, לא שינויים באות האמתי.

שיבוש תחילת ה-Code Word במהלך ההסתגלות מרעש סביבתי לאות השידור
שיבוש תחילת ה-Code Word במהלך ההסתגלות מרעש סביבתי לאות השידור

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

תוספת: פיצוח OpenSesame

ממש בעודי עורך את הניסוי לעיל, עלה ליוטיוב הסרטון הזה של ההאקר סמי קמקר. בסרטון הוא מציג מערכת שפורצת שערים-עם-שלט-רחוק שעובדים בשיטת Fixed Code (קוד קבוע, בניגוד לקודים המוצפנים והמשתנים של שלטי מכוניות, למשל). המידע שהצגתי למעלה מספיק כדי לבצע התקפת "Brute Force" ולשפוך לאלחוט את כל הקודים האפשריים בזה אחר זה כדי לפצח שער מסוים – אלא שזה עלול לקחת שעות ארוכות. סמי הציג, בלי לתת יותר מדי פרטים, קיצור דרך מתוחכם שמקצר את הזמן הזה לשניות ספורות. הוא אפילו מציין את PT2262 בתור המקודד בשלטים של כמה מהשערים הפגיעים – אלא שקיצור הדרך שהוא מתאר לא תואם את אופן הפעולה של PT2272. ייתכן שזו הדרך של סמי להסתיר מידע חיוני מאנשים שירצו לנצל את השיטה שלו לרעה, או שיש איזו טעות ב-datasheet. שלחתי לו מייל, אמשיך בבדיקות בעצמי ואעדכן אתכם!

עדכון: קיבלתי מסמי תשובה עניינית ומהירה מאד, אך היא לא באמת קידמה אותי… אז אני ממשיך לבד 😉

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

יש מצב ש4 אלפיות השנייה לפני השידור זה לצורך Debouncing?