המקרה המוזר של הקבל באמצע החוט, חלק ב'

סיימנו את הפוסט הקודם עם בעיה: יציאת ה-DTR של רכיב ה-USB-to-TTL, שאמורה לאתחל את לוח הארדואינו לצורך טעינה של תוכנית חדשה, לא ממלאת את תפקידה. למה זה קורה, ומה אפשר לעשות בנידון?

האתחול שאינו נגמר

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

כדי לוודא שהמיקרו-בקר לא יאותחל בטעות, ויקבל תמיד את המתח הדרוש לפעולה רגילה, הוא מחובר למתח 5V של לוח הארדואינו דרך נגד של 10K אום. נגד כזה נקרא כידוע pull-up, מכיוון שתפקידו "למשוך" את המתח למעלה. הערך הגבוה של הנגד הזה מבטיח שלמרות המתח הגבוה יחסית, יעבור שם מעט מאד זרם. למשל, אם תחברו את רגל הפלוס של נורית LED לפין RESET של הארדואינו ואת רגל המינוס שלה ל-GND, היא תאיר חלש.

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

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

Reset/DTR
אות אתחול רצוי ומה שה-DTR נותן

הפתרון: קבל באמצע חוט

בתאוריה, אפשר לתכנת מיקרו-בקר כך שיתרגם את ירידת המתח הממושכת ב-DTR ל"פולס" קצר, אך זה פתרון מיותר ובזבזני. במקום זה, רוב המקורות שראיתי שמדברים על הנושא מציעים לשים קבל באמצע החוט שמוליך מפין ה-DTR לפין ה-RESET. לכאורה, זה רעיון משונה: הרי קבל אינו מוליך, אז איך האות יעבור דרכו? ובכלל, מה הקשר בין קבל, שמשמש לעתים קרובות לייצוב ו"החלקה" של תנודות חשמליות קטנות, לבין אות ON/OFF לוגי?

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

Capacitor as hole
מודל הקבל כבור, שמתמלא בחשמל כאשר יש הפרש פוטנציאלים (הבדל גובה, באיור) בין רגליו

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

השינוי בהפרש הפוטנציאלים הוא פתרון החידה של ה-DTR. במצב רגיל, המתח ש-DTR נותן הוא גבוה ודומה למתח שנגד ה-pull-up יוצר בפין RESET. אין הפרש פוטנציאלים, הקבל לא עושה כלום ולמעשה הכל עובד כאילו אין בכלל קו DTR. אך ברגע שהמתח ב-DTR נופל, נוצר הפרש פוטנציאלים בקבל: ה"בור" נפער והוא מתחיל לצבור את החשמל מה-pull-up על חשבון פין RESET! כל עוד הקבל בתהליך התמלאות, פין RESET לא מקבל את המתח מנגד ה-pull-up ומרגיש כאילו הוא מחובר ל-Ground. בשלב זה האתחול מתבצע. מספר חלקיקי שניה מאוחר יותר הקבל מתמלא (הזמן המדויק תלוי בקיבולת שלו) והמתח חוזר לקו. פין RESET מרגיש שוב מתח גבוה, והמיקרו-בקר חוזר לפעולה. ככה כל זה נראה על מסך הסקופ:

כל מה שנותר לעשות זה להלחים את הקבל יפה לאמצע החוט שיוצא מה-DTR, ואפשר לתכנת את הארדואינו בקלות עם הרכיב החיצוני, כמעט בדיוק כמו עם חיבור USB הסטנדרטי שלו. אני השתמשתי בקבל בערך של 10 מיקרו פאראד כי זה מה שהיה לי בהישג יד, אך גם ערכים אחרים יעבדו, כל עוד הם גדולים מספיק כדי להחזיק את ה-RESET במתח אפס יותר מ-2.5 מיקרו-שניות (לפי דרישות המפרט של המיקרו-בקר).

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

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

שום דבר לא זורם לתוך ה-DTR רק מפני שהתנגדות המוצא שלו מאד גדולה (אני מניח שמהסיבה הזאת בדיוק).