פרויקט: כרטיס ביקור UART

מבדיחה בפייסבוק לקיט אמיתי: כמה פרטים טכניים על קיט "כרטיס הביקור" שהכנתי עבור האקתון הארדואינו.

דוגמית מקוד כרטיס הביקור
דוגמית מקוד כרטיס הביקור

איך זה התחיל

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

האילוצים הנ"ל פסלו מראש כל אפשרות של מסך או מטריצת לדים ראויה לשמה, אז איפה אוכל להציג את הפרטים שלי? רגע, כמעט כל המשתתפים בהאקתון הם מייקרים שמתעסקים עם ארדואינו… אז אפשר ליצור מעגל שיפיק פלט UART, ושישדר את המידע דרך לוח ארדואינו אל ה-Serial Monitor הפשוט והמוכר שישמש לו כתצוגה. כדי ליצור פלט UART בקצב שידור סביר לא צריך הרבה – לשם כך יספיק הג'וק PIC12F675, ממנו היו לי כשלושים ומשהו יחידות שקניתי בעבר במזרח הרחוק.

ה-PCB

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

ידעתי בערך מה אני רוצה שהמעגל יעשה, וידעתי אילו רכיבים יש לי ב"מלאי" הביתי שיוכלו לשמש בו, אז מיהרתי ל-KiCAD ויצרתי מעגל פשוט:

ה-PCB של הקיט ב-KiCAD
ה-PCB של הקיט ב-KiCAD

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

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

הצד השני של ה-PCB

הצד השני של ה-PCB

תוכן השידור

שידור ה-UART חייב לכלול, כמובן, את השם, כתובת האתר והאימייל שלי. מעבר לזה רציתי להוסיף – מין רעיון פרוע – את קוד המקור של כרטיס הביקור עצמו. מהר מאד הבנתי שגם בעזרת הכיווץ הכי יצירתי, אין שום דרך לאחסן קוד קריא שלם בשטחי הזיכרון המוגבלים-מאד של המיקרו-בקר הבסיסי הזה. החלטתי לשים את הקוד במקום אחר, ולהוסיף לשידור שלי QR-Code שיוביל אליו. ה-QR-Code בנוי מ"פיקסלים" בשני צבעים, וקוד שגודלו 21×21 פיקסלים בלבד (56 בייטים ברוטו) מספיק כדי לשמור כתובות אתרים קצרות.

הבעיה היתה שבפונט ברירת המחדל של ה-Serial Monitor אין תו "בלוק" מלא, וצריך תו כזה כדי ליצור QR-Code נורמלי. הפכתי את המגבלה הזו לאתגר נוסף למשתמשים – הקוד מצויר בתו ASCII מספר 219, שב-Serial Monitor נראה כמו U עם ^ למעלה ("Û"), אבל בפונט Terminal, שקיים למשל כאופציה ב-Notepad של Windows, הוא נראה – לפחות במחשב שלי! – כמו הבלוק הרצוי.

מכיוון שגופנים הם כמעט תמיד גבוהים יותר מאשר רחבים, כדי ליצור את ה"פיקסלים" הריבועיים של ה-QR-Code המיקרו-בקר משדר כל תו פעמיים.

כיווץ טקסט

המידע על הפיקסלים של ה-QR Code נשמר בזיכרון ה-EEPROM של הג'וק, שגודלו 128 בייטים, מה שהשאיר לי שם 72 בייטים פנויים. הטקסט שרציתי לכלול בשידור, אפילו אחרי צמצום של דברים מיותרים (כמו "http://" בכתובת האתר), תפס 83 בייטים. מה עושים?

ובכן, אם תסתכלו על טבלת ASCII, תראו שרוב התווים בה בעצם לא רלוונטיים לטקסט באנגלית. כל קוד מתחת ל-32 ומעל 127 מיותר, אז נשארו לנו 96 תווים. כדי לייצג אותם מספיקים 7 ביטים לתו, אבל עדיין נצטרך 73 בייטים ברוטו בשביל המידע. המעבר ל-6 ביטים לתו הכריח אותי בין השאר להיפטר מהאותיות הלא-רישיות (a עד z) ולהישאר רק עם הרישיות (A עד Z).

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

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

תזמון נכון

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

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

הבאג

וכמובן, איך אפשר בלי איזו פאשלה קטנה. בקיט שלי, פין האיפוס של הג'וק ("MCLR") הוא צף, כפי שהשארתי אותו לא פעם בניסויים קטנים על שולחן העבודה. בדרך כלל זה לא מפריע, אבל הסתבר שדווקא בקיט שלי אנשים נתקלו באיפוס אקראי, שהתבטא כפלט UART משובש מאד. הפתרון הוא פשוט – לשים נגד Pull-up לפין הזה – ולשם כך אפשר אפילו להשתמש בנגד הנוסף שצירפתי לקיט כ"בונוס"… אבל עדיין, די מרגיז לגלות טעות כזו בדיעבד, ואני יכול רק לשמוח שלמדתי את הלקח הזה בקנה המידה הקטן יחסית של הקיט הנוכחי.

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

אחלה קיט ורעיון
עדיין לא יצא לי להלחים