0.000011574Hz, חלק ראשון

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

הרעיון הזה מטופש מכדי להשאיר אותו לנצח בגדר תיאוריה, נכון? 🙂

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

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

#include <avr/io.h>

int main(void)
{

    // Prepare value to load into PINB
    asm volatile("LDI R16, 1");
    // DDRB0 to Output
    asm volatile("OUT 0x17, R16");

    while (1) 
    {

        // It's Saturday:
        // Set bit 0 of PINB to toggle PB0
        asm volatile("OUT 0x16, R16");
        // Sunday has come
        asm volatile("OUT 0x16, R16");
  
        // Loop JMP will take 2 cycles,
        // so we need 3 more...
        asm volatile ("NOP");
        asm volatile ("NOP");  
        asm volatile ("NOP");
   
    }
}

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

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

כמה חשמל?

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

מודולי ה-Watchdog וה-Brownout detector כבר היו כבויים בהגדרות הפיוזים של המיקרו-בקר. כיבוי של החשוד הבא, מודול ה-ADC הפנימי, גילח רק 0.3 מיליאמפר. הצעד הבא, שמומלץ לעתים קרובות במיקרו-בקרים, הוא לתת ערך מוגדר לפיני הקלט שלא מחוברים לכלום – למשל באמצעות נגד ה-Pull up  הפנימי. זה הוריד משמעותית את הצריכה, ל-110 מיקרואמפר בערך. כיבוי של ה-Analog Comparator, עוד מודול שלא זוכה לתשומת לב רבה בדרך כלל, הביא אותי עד ל-70 מיקרואמפר. כל המספרים האלה הגיוניים לפי ה-Datasheet, ועדיין לא מגיעים לחיסכון שבמצב שינה עמוק רשמי (שאמור לקחת פחות ממיקרואמפר אחד).

מיותר לציין, אני מקווה, שכאשר הלד דולק הצריכה עולה בהתאם…

הפקת אות השעון

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

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

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

פניתי למומחה, שהציע לי כיוון אחר: מעגל השוואת מתחים מבוסס מגבר שרת (OpAmp) שתומך בהיסטרזיס. מצאתי תכנון של מעגל מתאים, אך הסתבר שהמגבר בו הוא לא סתם OpAmp אלא Comparator, ולא סתם Comparator אלא מסוג Push-Pull Output. כדי להבין למה ההגדרות האלה חשובות, אתם מוזמנים לקרוא את המסמך הזה. כיוון שלא היו לי רכיבים כאלה במלאי, הזמנתי כמה מסין – וימים ספורים לאחר מכן הכריזו בחנות המקוונת של TI על מבצע משלוח חינם, אז הזמנתי גם מהם, שיהיה. ההזמנה מ-TI הגיעה אחרי יומיים, זו מסין בערך חודש אחריה. בכל אופן, בדיקה ראשונית הראתה שהרכיב והמעגל עובדים כצפוי. וידאתי בעזרת סקופ שהפלט של הרכיב לא קופץ הלוך ושוב בזמן המעבר בין המצבים השונים, וכעת נשאר רק לבנות על בסיסו את ה"שעון" שלי.

בפרק הבא…

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

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *