כמיטב המסורת, בניתי לכבוד החג חנוכייה אלקטרונית קטנה. הפעם מדובר בחנוכייה שאפשר לתפעל ממרחק באמצעות שלט רחוק של טלוויזיה.
לפני כמה שנים קניתי שעון יד סיני עם משדר אינפרה-אדום, שאמור לתפקד כמעין שלט רחוק בסיסי לטלוויזיות ולמכשירי DVD. אין לי בכלל מכשירים כאלה בבית, אבל חשבתי שבטח אמצא לו מתישהו שימוש לפרויקט כזה או אחר. השעון האומלל תלה בי מבט מאשים בכל פעם שפתחתי את מגירת השמונצים, עד שלא יכולתי לשאת זאת עוד והחלטתי לבנות פרויקט במיוחד בשבילו – חנוכייה עם לדים בשלט רחוק.
הכלל היחיד שהגדרתי לעצמי מראש היה לא להשתמש בספריות ה-IR של ארדואינו, כי אין בזה שום אתגר. במקום הארדואינו לקחתי קודם כל מקלט IR סטנדרטי (38KHz) ולוג'יק אנלייזר, והסתכלתי על צורת הסיגנל שמתקבל כברירת מחדל בלחיצה על "הפעלה/כיבוי", "למעלה" ו"למטה" בשעון (אני אפילו לא יודע אם הכוונה להחלפת ערוצים או לעוצמת קול).
הסיגנלים נשלחים שוב ושוב במחזוריות כל עוד הלחיצה נמשכת; אפילו לחיצה קצרה מספיקה לשניים עד ארבעה עותקים. הנה סיגנלים בודדים של שלוש הפקודות:
אותות מלחצנים שונים של שעון היד עם השלט הרחוק
זה נראה טוב. כל סיגנל מתחיל ב-LOW של כ-2.4 אלפיות השנייה, ואחריו 12 קטעי HIGH באורך אחיד פחות או יותר (כ-0.6ms) שביניהם מרווחי LOW קצרים (0.6ms) או ארוכים (1.2ms). אפשר לדמיין שקטעי ה-LOW הארוכים מחלקים את קטעי ה-HIGH לקבוצות – למשל, הסיגנל העליון הוא 1,2,2,3,4 והאמצעי הוא 5,3,4 – אבל אפילו הקיבוץ הזה מיותר. אם נקרא לקטע LOW קצר בשם "0" ולארוך בשם "1", אפשר לתאר כל פקודה כזו בתור מספר בן 12 ביטים בלבד. המספר העליון הוא 2704, האמצעי 144 והתחתון 2192. אתם מוזמנים לבדוק.
דרך אגב, השעון יודע "לדבר" עם הרבה דגמי מכשירים, והוא בא עם טבלה ענקית של קודים לכל מיני יצרנים. סביר להניח שאפשר למצוא שם סיגנלים מורכבים הרבה יותר, אבל היה לי מזל כנראה, והפרוטוקול שמופעל כברירת מחדל הוא פשוט.
מכיוון שצריך רק 2 בייטים כדי לתאר כל אחד משלושת הסיגנלים האלה, בחרתי במיקרו-בקר PIC12F675 הצנוע בתור ה"מוח" של המערכת. השליטה ב"נרות" תתבצע באמצעות ג'וק 595 שמצריך 3 פיני פלט, פין פלט נוסף ישלוט בשמש, ופין ה-GPIO הפנוי החמישי יקרא את הפלט של מקלט ה-IR.
המיקרו-בקר רץ על שעון פנימי בתדר 1MHz (במדידה של פעולות בשנייה), והגדרתי טיימר שיעורר פסיקה אחת ל-1024 תקתוקים – שזה קרוב מאד לאלפית שנייה, רק עם הנוחות של ספירה בבסיס בינארי במקום עשרוני. בפונקציית הפסיקה, הטיימר הזה מוסיף 1 למשתנה שנקרא msCount.
ברגע שמופיעה ירידה במתח ממקלט ה-IR, אני מאפס את msCount ואת הטיימר, וברגע שמופיעה עלייה אני בודק מה הערך של msCount. אם הוא 2, סימן שהופיע ה-LOW של תחילת הסיגנל. אם msCount הוא 1, אז זה היה LOW ארוך ("1"), ואם msCount לא הספיק להגיע אפילו ל-1, אז זה היה LOW קצר ("0"). אני צובר את הביטים האלה לתוך משתנה זמני וסופר כמה מהם הגיעו, וכשהספירה מגיעה ל-12 אני משווה את המשתנה הזמני לשלושת המספרים שמצאתי למעלה. אם נמצאת התאמה, המיקרו-בקר מבצע את הפקודה: המספר הראשון מדליק או מכבה את החנוכייה כולה, השני מוסיף נר דולק (מימין לשמאל) והשלישי מכבה נר (בסדר הפוך).
כיוון שכל סיגנל חזר על עצמו, כאמור, כמה פעמים ברציפות, הוספתי השהייה של רבע שנייה אחרי כל פקודה חוקית, כדי להבטיח שלחיצה קצרה תגרום לפעולה הרלוונטית רק פעם אחת.
אחרי שכל זה עבד, הוספתי עוד שתי תכונות, בשביל הקטע: כשמכבים את החנוכייה המיקרו-בקר עובר למצב שינה, כך שצריכת החשמל נמוכה מאוד. מקלט ה-IR ממשיך לפעול, והוא מעיר את המיקרו-בקר כשמגיע שידור חדש. כמו כן, הבייט שקובע אילו "נרות" דולקים לא נכתב כמו שהוא ל-595, אלא רק אחרי פעולת bitwise AND עם בייט רנדומלי. הכתיבה הזו מתבצעת שוב ושוב ובמהירות, עם בייט רנדומלי אחר בכל פעם, והתוצאה הסופית מזכירה קצת הבהוב טבעי של נרות.
חג חנוכה שמח!
השלט שולח כל פקודה כמה פעמים אבל חלק ממנה עלול לא להגיע(הפרעות וכו), ואז כשתתחיל אותה הפקודה עוד פעם הפקודה עלולה להיחשב כמשהו אחר.
איך אתה מתמודד עם זב בקוד?
לא בטוח שהבנתי את השאלה עד הסוף… בעזרת טיימר אלפיות השנייה אני הרי מזהה את הסיגנל של תחילת פקודה, כך שגם אם פקודה מסוימת השתבשה בדרך, הקוד לא יעשה כלום (כיוון שהוא לא יבין מה הפקודה המשובשת) ופשוט יחכה לתחילת הפקודה הבאה.
מזמן חשבתי על אתר שכל מייקר כותב את המלאי שמונצים שלו ואז אפשר החלפות בין מייקרים.
הבונוס: השמונץ מגיע עם מישהו שפעם ניסה להפעיל אותו
היו כל מיני מחשבות כאלה גם בעבר – החיסרון הגדול הוא שאם המייקרים לא גרים/עובדים קרוב זה לזה, העלויות והיעילות של הדואר הישראלי הופכים את העסק ללא כדאי לעומת הזמנה מסין…
אנשים ישמחו לנסוע לדעתי – גם עצם המפגש יכול ליצור "אינטראקציות חברתיות" נחמדות, טיולים, הפריה הדדית וכו'.
יוכלו ליעץ זה לכאביו של זה …
אתה מוזמן לנסות 🙂
כל הכבוד. חג שמח!
(אין קוד?)
כתיבה מעולה! תודה!
ומעניין מה אפשר לעשות אם מערבבים את מגירות השמונצים של כולם.
יש קוד… אצלי 🙂
השמונץ של האחד הוא הזהב של האחר – אם נערבב את כל המגירות, כל אחד יגלה שם פתאום המון דברים שהוא ממש חייב, ובסוף לכולם יהיו מגירות שמונצים חדשות 🙂