פרויקט שהיה אמור להיות קליל וזריז הסתבך, ואני יכול רק לנחש שלא ממש תתפלאו לשמוע מה הייתה הסיבה… אבל בואו נראה בכל זאת מה בדיוק קרה שם ואיך התגברתי על התקלה.
מפה לשם, נודבתי להרצות בפני ילדי כיתה א' על מה-שלא-יהיה. בהתייעצות עם הצאצא הרלוונטי החלטנו שהנושא יהיה מערכות אלקטרוניות. ידעתי שהקהל קשוח ושסיפורים על אופטימיזציה של קוד למיקרו-בקרים לא יתקבלו בברכה, אז הצעתי לבנות איזשהו רמזור נחמד עם לדים, שהילדים יוכלו להפעיל בעזרת לחצנים, ושאחר כך ארדואינו יפעיל אוטומטית כדי להראות להם איך רמזור עובד באמת, בערך.
הצאצא נדלק על הרעיון, וביקש מייד להוסיף גם מכונית משטרה עם צ'קלקה שתרדוף אחרי עבריינים שנוסעים באדום. כל עוד לא מפרשים את הרעיון הזה באופן מילולי מדי, הוא דווקא מצוין: עוד קצת אקשן לחבר'ה, אפשר להדגים ככה איך עובד שלט רחוק (נוסיף לאדום ברמזור לד אינפרה-אדום, ומקלט IR לניידת המשטרה!) – וכל זה גם יהיה קל מאוד לביצוע, הרי רמזור וניידת בניתי עוד לפני שהצאצא הנ"ל נולד בכלל.
באחת מחנויות השמונצים הזולים השגתי מכונית פלסטיק, שתהווה את הבסיס הפיזי ל"ניידת", והתחלתי לעבוד על המעגל שיקלוט את שידור ה-IR ויפעיל את הצ'קלקה. בחרתי בחיישן מדגם TL1838 שהיה לי במגירה ושהשתמשתי בו בהצלחה בפרויקט הטרקטור בשלט רחוק. כתבתי קוד ל-PIC12F675 ענתיקה שינהל את הכול, וזה עבד… חוץ מזה שלפעמים הצ'קלקה התחילה לעבוד בלי שלחצתי על השלט.
המיקרו-בקר מזהה את פלט החיישן באמצעות פסיקה, כך שמבחינת תוכנה – לפחות בתוכנה קטנה ומינימליסטית כמו שכתבתי כאן – אין בעצם מה שיכול להשתבש. הסיגנל הסורר מגיע מבעיית חומרה. בדקתי היטב את כל המגעים וההלחמות, וידאתי שהחיישן מצויד בקבלים ומקבל מתח בדיוק לפי דרישות המפרט, וגם שללתי את האפשרות של מקור IR חיצוני עלום שמפעיל אותו (האותות הלא-רצויים הופיעו גם בחדר חשוך כשהחיישן מכוסה היטב). הסקופ הראה שהאותות האלה, שהופיעו במרווחים לא-סדירים של מספר שניות, נמשכים בין 50-150 מיליוניות השנייה, ושאין בסמוך להם שום קפיצת מתח באספקת החשמל לחיישן. מה נשאר?
לקחתי חיישן אחר מאותו דגם וחיברתי אותו, כמו שהוא, לחשמל. הוא הגיב נכון, בלי אזעקות שווא. ניתקתי את החיישן שהיה מולחם ללוח, חיברתי כמו שהוא לחשמל ו… האותות השגויים המשיכו להופיע. ייתכן אמנם שמשהו בלוח "דפק" את החיישן שהיה בו, אך בשלב זה כבר חיפשתי גם באינטרנט והגעתי לביקורת שפירסם מישהו שקנה, כמוני, כמה חיישנים כאלה בזול מסין. הוא התלונן שמתוך 10 חיישנים שקיבל, רק שניים פעלו היטב ובלי אותות אקראיים…
אז התעלומה נפתרה, וכפי שציינתי למעלה, הפתרון לא מפתיע במיוחד. אבל איך פותרים את הבעיה? דרך אחת היא כמובן לקחת חיישן אחר שכן עובד ולחבר אותו ללוח במקום זה התקול. שיטה אחרת היא לכתוב קוד שמסוגל להתמודד עם פלט לא יציב, ולשם האתגר זה מה שבחרתי לעשות. כיוון שאני יודע מה משך האותות השגויים, וזה קצר משמעותית מאותות לגיטימיים, הדרך הפשוטה ביותר היא למדוד באופן כלשהו את משך האות ולהגיב רק אם הוא עובר סף מסוים, נניח 0.3 אלפיות השנייה. זה בעצם מה שאנחנו עושים ב-debounce בסיסי של לחצנים.
לצורך העניין, ניקח את Timer0 של המיקרו-בקר הזה. זהו טיימר 8-ביט בסיסי שגורם לפסיקה כשהוא גומר לספור מ-0 עד 255. במהירות השעון הפנימי של ה-675', שהיא 1MHz, כל מחזור כזה לוקח כמובן כ-0.256 אלפיות שנייה – מספיק קרוב לערך שבחרתי קודם. אז אחרי ההגדרה ההתחלתית של הפרמטרים לטיימר (מקור שעון וכדומה), צריך רק לאתחל אותו בכל פעם שמתקבל אות מהחיישן, וכשהוא מסיים לספור, לבדוק אם הקלט מהחיישן עדיין מצביע על פעילות. בהנחה שהאותות האקראיים לא מגיעים בתדירות גבוהה מדי, נוכל לזהות כך אותות ממושכים ולהתעלם מהקצרים.
אחרי שעשיתי את זה, הסתבר שלעתים נדירות האות הסורר ממושך אפילו יותר ממה שמדדתי קודם, ועדיין היו התראות שווא. עדכנתי את הקוד כך שהטיימר יהיה איטי פי שניים (1:2 prescaler), והבעיה נעלמה לחלוטין. הצ'קלקה הופעלה כעת רק כשהגיע אות IR לגיטימי. ועכשיו – לרמזור!