לפני תקופת הקורונה, ברגע של חולשה, קניתי רכב רובוטי קטן עם לוח BBC Micro:bit שמשמש לו מוח. מה שלא ידעתי זה שהרובוט הוא קצת "גן סגור", ולא כל המידע עליו זמין בקלות. אז אחרי מחקר קצר, הנה הדרך להפעיל את כל הפונקציות שלו.
הרובוט הגיע ארוז היטב ומורכב ברובו: לקונה נשאר רק להרכיב את הצמיגים על הגלגלים ואת הגלגלים על צירי המנועים, להדביק את בית הסוללות במדבקה דו-צדדית על גב המנועים (אגב, המדבקה גדולה יותר ממה שנחוץ – אפשר לגזור ממנה רק את הגודל הדרוש ולשמור את השאר לשיפוצים בהמשך), ולהכניס את ה-Micro:bit ואת החיישן האולטרסוני למקום.
אחרי שעשיתי את כל זה, החלטתי שזה זמן טוב לשדרג את הקושחה של כרטיס המיקרו:ביט המצורף. אחרי כמה דקות טובות של אי-הצלחה הבנתי שכבל ה-USB הכתום שצורף לרובוט הוא דפוק ולא מסוגל להעביר נתונים, רק חשמל…
ביצעתי את המשימה עם כבל אחר, והתחלתי לבדוק איך מפעילים את הפונקציות השונות של הרובוט. חלק קטן מהן היה פשוט מאוד: למשל, ליד ה"פנס" הימני כתוב P12, אז כתיבת 0 או 1 לפין 12 במיקרו:ביט תכבה או תדליק את הפנס. פשוט וקל. אבל מה עם דברים מתקדמים יותר, כמו הלדים RGB שלמטה, או המנועים?
חיפשתי קצת בשרטוטים שונים ברשת ומצאתי אילו פינים מתחברים לאילו אלמנטים (פין 0 לבאזר, פין 15 לארבעת הלדים Addressable RGB המשורשרים וכן הלאה). המנועים, לעומת זאת, נשלטים דרך I2C. אבל איך? ליד כל מנוע יש ג'וק עם כיתוב שמתחיל ב-75V18 והלוגו YX; הסתבר שזהו דרייבר פשוט למנועי DC. הדרייברים האלה התחברו לג'וק נוסף, אותו זיהיתי כמיקרו-בקר הישן והטוב(?) STM8S003F3, איתו אפילו עבדתי קצת בעבר. זה אומר שפרוטוקול השליטה במנועים לא קבוע בחומרה אלא משהו שמישהו תכנת. אז איפה המפרט?
מה שלא ידעתי כשהזמנתי את הרובוט זה שמדובר במוצר "סגור" יחסית, שיועד לעבוד עם סביבת פיתוח גרפית מסוימת לילדים, ועם ספריות תוכנה מוכנות מראש שאת הקוד שלהן לא הצלחתי למצוא בשום מקום [עדכון: רק אחרי כתיבת רוב הפוסט הזה איתרתי אותו]. בתיאוריה אפשר לכתוב תוכנה בסביבת הפיתוח ההיא, לצותת לקווי ה-I2C ולהבין מה הם עושים – אך למזלי, מצאתי קוד לארדואינו שמישהו כתב ומשם אפשר להסיק יותר בקלות מהן הפקודות הרלוונטיות.
חיישן ה-IR הקדמי, זה שאמור לקלוט פקודות משלט רחוק למשל, לא הגיב לשידורים (כתבתי קוד שמדליק את הפנסים ברגע שמתגלה סיגנל כלשהו, והם לא דלקו בשום מצב). בדקתי את רגלי החיישן עם מולטימטר, וגיליתי שאף על פי שהוא מקבל מתח מספיק של כ-3.3V, ביציאה שלו (שאמורה להיות HIGH כשאין שידור) מתקבלים רק 1.2-1.3V – כנראה נמוך מדי לטעם המיקרו:ביט, וזאת למרות הימצאותו של נגד pull-up בערך 47K.
בחקירה יותר לעומק הסתבר שפין 16 של המיקרו:ביט, שמחובר ליציאת החיישן הזה – ובכלל פינים שמוגדרים כקלט דיגיטלי – מופעל כברירת מחדל עם נגד pull-down פנימי, וזה יצר מחלק מתח חזק מדי עם ה-pull-up של המקלט. לא היה פשוט לגלות איך משנים את זה, אבל בסוף נמצאה הפקודה המתאימה בפייתון (מהספרייה microbit כמובן):
pin16.set_pull(pin16.NO_PULL)
עכשיו היה לי מספיק מידע כדי לכתוב פונקציות פייתון לשליטה בסיסית כמעט בכל הפיצ'רים השונים של הרובוט – כולל יציאות הסרבו, אף על פי שהן פחות רלוונטיות לקיט כי אין לו מנועי סרבו או מקום בשבילם. אספתי את כל הפונקציות לקובץ קוד אחד, והוא יהווה בסיס למשחקים עם הרובוט בעתיד.
הדבר היחיד שחסר לי בינתיים הוא קריאה "חכמה" של מקלט ה-IR הקדמי, שתאפשר זיהוי לא רק של הימצאות סיגנל, אלא גם של פקודות שונות משלט רחוק. במיקרו-פייתון יהיה קשה לממש פענוח של אות משלטים רגילים, כי למיטב ידיעתי אין גישה לפסיקות וטיימרים של המיקרו:ביט. עם זאת, אולי אפשר להגדיר את כניסת המקלט כ-RX של מודול ה-UART המובנה, ואז לשלוח תווים ב-UART בקצב ביטים נמוך כפי שעשיתי בעבר בפרויקט המחסום. המשך יבוא…
אני חייב להיות המגיב המעצבן ולשאול למה אתה משקיע זמן בפלטפורמה הזו.
ניחא היית חסר כל רקע והפייתון היה מאפשר לך (לכאורה) כניסה חלקה לעולם הזה הרבה יותר מאשר ארדואינו למשל.
אבל לך כאדם בעל ניסיון עשיר למדי בתכנות ובאלקטרוניקה אני לא רואה סיבה להשקיע זמן וכסף בדבר הזה.
אני מפספס משהו?
שאלה לגיטימית לגמרי, יש לי לפחות שלוש תשובות… 1) הניסיון שלי בפייתון הוא די מזערי ולא יזיק לחזק אותו, גם אם דרך כלים כאלה, 2) מיקרו-פייתון מתבססת, לאט לאט, גם בעולם האמבדד ה"אמתי" (למשל במודולי מודמים מסוימים) וכדאי להכיר, 3) יש לי ילדים שאני רוצה לקרב לתחומים האלה, ואולי יום אחד ארצה/אצטרך לפנות גם לקהל רחב קצת יותר, אז כדאי להיות מוכן 🙂
הנקודה הראשונה והשלישית ענו לי על השאלות (אם כי בוודאי יש דרכים טובות יותר ללמוד פייתון 🙂 ).
הנקודה השניה הפתיע אותי – מוצר "אמיתי"? ועוד מודם? אשמח לדוגמא 😀
לי יצא להתעסק קצת עם מודם של Digi International, זו הדוגמה שקופצת לי לראש כרגע – היו עוד אבל אני לא זוכר ב"שלוף"…