כשהארדואינו קלט את שידורי ה-BBC

בין שלל האפשרויות שמציע הפיתוח בשפת MicroPython על הלוח הלימודי BBC Micro:bit נמצא המודול המובנה Radio, שמאפשר העברה אלחוטית של מידע בין לוחות כאלה. האם אפשר לפרוץ את הגן הסגור של ה-BBC ולהוציא מידע גם אל פלטפורמות אחרות, למשל ארדואינו?

טבעת NeoPixel בשליטת ארדואינו מציגה מידע מה-Micro:bit
טבעת NeoPixel בשליטת ארדואינו מציגה מידע מה-Micro:bit

השילוב של ה-Micro:bit עם שפת התכנות MicroPython היה מהלך מעניין ומועיל לשני הצדדים, פרט לפאדיחה אחת בולטת: בגלל מגבלות הזיכרון שנוצרות בשילוב הזה, אי אפשר להפעיל דרך MicroPython את יכולות ה-Bluetooth של הלוח. האופציה האלחוטית היחידה היא המחלקה Radio הפרימיטיבית-יחסית, שדרכה אפשר לבחור פרמטרים ספורים לתקשורת ולשלוח או לקלוט בייטים ומחרוזות בין לוחות Micro:bit. לא מצאתי הסברים טכניים על המימוש המדויק של התקשורת הזו, וגם לא ראיתי שום פרויקט שבו Micro:bit דיבר עם לוח או מודול מסוג אחר.

עם זאת, המיקרו-בקר שבלב ה-Micro:bit הוא מדגם nRF51822 של חברת Nordic, שמפורסמת בקרב המייקרים בין השאר בזכות מודולי ה-RF הנפוצים והזולים שמבוססים על הדגם nRF240L01. האם ייתכן שה-Micro:bit והמודולים האלה קרובים מספיק, מבחינת צורת העבודה, כדי להחליף ביניהם מידע ישירות?

התשובה, ככל הנראה, שלילית. כתבתי תוכנית MicroPython שמשדרת מידע דרך המודול Radio שוב ושוב במגוון ערוצים, קצבי שידור וכתובות, ותוכנית מקבילה לארדואינו + מודול nRF240L01 שמנסה לקלוט שידורים כאלה. לא הצלחתי לקלוט שום מידע. מצד שני, באחת מספריות הקוד שניסיתי (RF24) הייתה תוכנית לדוגמה שחיפשה נוכחות של גל נושא, כלומר שידור כלשהו בכל הערוצים הזמינים, והיא דווקא הצליחה לזהות שמשהו קורה באזור של הערוצים שהגדרתי ל-Micro:bit.

למען האמת, היא זיהתה משהו גם בערוצים אחרים. כפי שאפשר לראות בתמונה הבאה, יש רצף של ערוצים "רועשים" בלי קשר למה שה-Micro:bit עושה או לא עושה. אני מניח שהרעש הזה נבע מהנתב שלי שפעל בקרבת מקום, אז פשוט נזהרתי לא להשתמש בטווח הזה בניסויים הבאים.

פלט התוכנית לדוגמה לסריקת ערוצים ב-nRF24L01
פלט התוכנית לדוגמה לסריקת ערוצים ב-nRF24L01 (שתי השורות הארוכות הראשונות הן למספור הערוצים; לחצו להגדלה)

בכל אופן, החומה נפרצה: יש לי דרך להבדיל מרחוק בין שני מצבים שונים של ה-Micro:bit, ובעצם זה כל מה שצריך כדי לממש תקשורת חד-סטרית פרימיטיבית ממנו אל הארדואינו… אם אצליח להתגבר על המוקשים שבדרך הזו. תוכנית סריקת הערוצים דגמה כל ערוץ מאה(!) פעמים, במשך 128 מיליוניות השנייה בכל פעם, רק כדי להעריך את מידת הפעילות בערוץ; וצורת הפעולה של המודול Radio ב-Micro:bit לא מאפשרת לי לשלוט במדויק בזמני השידור, שלא לדבר על המגבלות של עצם העבודה בשפת MicroPython, כפי שהזכרתי בפוסטים קודמים. אז מה כן אפשר לעשות?

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

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

כמובן, כל הפרויקט הזה לא נבנה אלא בשביל הפרנציפ שבדבר, כדי לעשות דווקא. אם רוצים לממש תקשורת מעשית בין ה-Micro:bit לבין פלטפורמות אחרות, הפתרון הנכון יהיה כמובן לחבר בשני הצדדים מודולי תקשורת RF או  IR נורמליים וזהו.

הנה קוד ה-MicroPython וקוד הארדואינו של הפרויקט, אבל ראו הוזהרתם – הם נכתבו רק כדי לעשות את העבודה, בלי יותר מדי הסברים וסדר. אני במקומכם לא הייתי מנסה ללמוד מהם 😉

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

אפשר ללמוד הרבה מקוד שאנשים כותבים. למשל, הוספת סוגרים מסביב לביטוי של תנאי if, מראה שהכותב רגיל לכתוב בC ולא בpython 🙂
לגבי הציפ תקשורת מצאתי את הרמז הבא: The nRF51822 is a powerful, highly flexible multiprotocol SoC … the embedded 2.4GHz transceiver supports both Bluetooth low energy and the Nordic Gazell 2.4 GHz protocol stack which is on air compatible with the nRF24L series products from Nordic Semiconductor.
לא מכיר את הגאזל, אבל בהחלט כיוון לבדיקה