פרויקט PIC: שלט רחוק IR לעוצמת תאורה

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

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

ובחזרה לעניין

בפעם הקודמת בחרתי את השעון הפנימי המהיר ביותר עבור ה-PIC12F1840, והגדרתי את המודול הפריפריאלי CCP1 שלו כך שיפיק אות PWM בתדר 38KHz שמתאים לשידורי אינפרה-אדום.

השלב הבא היה הגדרת מודול ה-UART (ליתר דיוק EUSART) לצורך שידור נתונים. ה-UART הוא אותו הדבר שעומד מאחורי הפינים RX/TX והאובייקט Serial של ארדואינו. כדי להפעיל אותו ב-PIC12F1840 צריך לבצע מספר פעולות פשוטות (מפורטות החל מדף 269 ב-Datasheet), והן פשוטות במיוחד אם אנחנו בוחרים, כמו במקרה שלי, בפרוטוקול ברירת המחדל הבסיסי.

ראשית, יש נוסחה שמזינים לתוכה את קצב השידור (Baud rate) הרצוי ואת תדר השעון של המיקרו-בקר, ומקבלים ערך שצריך לכתוב לרגיסטר מסוים. אחרי זה, בכתיבה של שני ביטים נוספים, נפעיל את המודול הפנימי ונחבר אותו לפין פלט. זהו, עכשיו צריך רק להזין את הנתונים, בייט אחרי בייט, לתוך הרגיסטר TXREG ולתת למודול מספיק זמן לעבד ולשלוח אותם. כמה זה מספיק? לא צריך לנחש ואפילו לא לחשב. כשהרגיסטר מתפנה לקבלת בייט חדש, הביט TXIF ברגיסטר PIR1 הופך ל-1 (מה שיכול גם לעורר פסיקה, אם נרצה), וכששידור הבייט הושלם סופית, הביט TRMT ברגיסטר TXSTA הופך ל-1.

בשלב הבא קראתי את המתח האנלוגי מפוטנציומטר באמצעות מודול ה-ADC (כמו analogRead בארדואינו). גם כאן יש עבודת הכנה קצרה (עמ' 114), ואחריה הצלחתי לקבל את הערך ולהמיר אותו לסקאלה של 0-255, כך שניתן יהיה לשדר אותו כבייט יחיד דרך ה-UART.

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

בתור הסיגנל האינפורמטיבי בחרתי את TX. מכיוון שב-UART רגיל מצב ברירת המחדל של TX הוא HIGH, ואני מעדיף דווקא לצמצם למינימום את השידורים, קבעתי שה-Carrier של HIGH יהיה GND. בתור Carrier למצב LOW הנדיר-יותר בחרתי את אות ה-PWM. ניטרלתי את פיני הפלט הרגילים של TX ושל ה-PWM, והפעלתי את זה של ה-Modulator. מעכשיו, כשאני כותב משהו ל-TXREG, הוא יוצא מה-Modulator הפוך על גבי גל נושא של 38KHz, ומפעיל ישירות את הלד האינפרה-אדום.

המחשת אופן הפעולה של ה-Modulator
המחשת אופן הפעולה של ה-Modulator

הטריק כאן הוא שמקלטי IR הנפוצים עובדים בעצמם בלוגיקה הפוכה: כברירת מחדל הם מוציאים HIGH, ורק כשהם קולטים גל נושא בתדר הנכון הפלט שלהם יורד ל-LOW. זאת אומרת, כאשר חיברתי את הפלט של מקלט IR רגיל לפין RX של ארדואינו, הארדואינו קלט את השידור שיצא מה-PIC ממש כאילו היה מחובר ביניהם חוט. כתבתי לארדואינו קוד קצר שמתרגם את הקלט הזה לעוצמת הארה (באמצעות PWM) של לד כחול רגיל, והמערכת היתה מוכנה.

תקריב של השלט הרחוק תקריב של השלט הרחוק (לחצו להגדלה)
תקריב של השלט הרחוק (לחצו להגדלה)

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

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

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

מערכת השלט הרחוק והמקלט בפעולה
מערכת השלט הרחוק והמקלט בפעולה

[לא לדאוג – בימים הקרובים אעלה לאחד מערוצי היוטיוב שלי סרטון הדגמה]

הפקת לקחים

נחזור לשאלה שהתחילה את כל הסיפור הזה: האם ה-PIC12F1840 מהווה תחליף ראוי ל-ATtiny85?

אין ספק שהייתי יכול ליצור שלט רחוק עם פונקציונליות זהה בעזרת הטייני. הנקודות החשובות הן כמה משאבים כל אופציה גוזלת ממני במשך הפיתוח, ומה שיותר חשוב – כמה משאבים היישום גוזל מהמיקרו-בקר. הקוד הנוכחי תופס 7% מזיכרון ה-Flash ו-9% מה-RAM של ה-PIC. סביבת הפיתוח טוענת שאם הייתי קונה את גרסת Pro של הקומפיילר, המספרים היו יורדים ביותר מחצי. אולי כן ואולי לא, בכל מקרה אלה מספרים נמוכים וספק אם הייתי מצליח להגיע לרמה מקבילה בטייני.

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

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

* אני השתדלתי להבין לעומק מה אני עושה; מי שרוצה לקצר תהליכים מוזמן להשתמש בכלי Code Configurator שבסביבת הפיתוח כדי להפיק אוטומטית קוד להגדרה של המודולים הפריפריאליים השונים.

להרשמה
הודע לי על
0 Comments
Inline Feedbacks
הראה את כל התגובות