[בשעה טובה, הגיע הזמן לסגור את הסיפור הזה ולהעלות את הפוסט הנוכחי, שנכתב לפני כארבעה חודשים…] בפוסט הקודם נתקלתי בכמה קשיים, אבל בסופו של דבר הצלחתי להעלות אל המסך את הדפים שעיצבתי, ומרוב שמחה הסתערתי על המקלדת וכתבתי במכה אחת את כל הקוד הדרוש ליישום "עמדת המשוב" שלי בצד הארדואינו. עכשיו נותר רק לחבר ביניהם – וגם זה, מסתבר, לא מובן מאליו.
מתח הפוך וקצת יותר נמוך
הסינים שלחו לי, ביחד עם המסך, לוח מתאם קטן שמקבל גם את אספקת המתח הראשית (12V) וגם חיבור UART-על-גבי-USB למחשב. הוא עבד מצוין, אבל כשבדקתי את הקווים שיוצאים מהמסך עצמו – אלה שאמורים להיות UART גולמי – גיליתי שהם ב-3.3V, וגם בקוטביות הפוכה, זאת אומרת שכאשר הקו לא פעיל, המתח בו הוא אפס. בדיוק ההיפך מארדואינו. בדפי הנתונים הבטיחו שהמסך יודע לדבר ב-RS485, ב-RS232 או ב-TTL (זה דבר שהקונה אמור לסכם עם Stone בעת ההזמנה). אז כן, קיבלתי מה שנקרא TTL, אבל זה לא ה-UART שציפיתי לו.
כדי שלוח ארדואינו יוכל לדבר ישירות עם המסך, צריך להמיר את האותות בין 5V ל-3.3V ולהיפך, למשל באמצעות מודול Level shifter (או להשתמש בלוח ארדואינו פחות נפוץ שעובד בעצמו ב-3.3V), וגם להפוך אותם מ-LOW ל-HIGH ומ-HIGH ל-LOW, למשל בעזרת ג'וק שערי NOT ישן וטוב. בעודי מנסה לחשוב איזה פתרון יהיה הכי פחות מבולגן על מטריצה, נזכרתי פתאום בלוח הארדואינו Nano Every החדש. הוא אמנם עובד ב-5V כך שהמרת המתחים עדיין חיונית, אבל (וזו אחת הסיבות שאני אוהב את המיקרו-בקר שבו, ה-ATmega4809) יש אפשרות להפוך את הקלט והפלט הדיגיטלי בכל פין שנרצה, כולל אלה של ה-UART. אני יכול להעלות אליו את הקוד שכתבתי, להוסיף שינוי ברגיסטרים המתאימים כדי להפוך את הקוטביות, להעביר את האותות דרך Level shifter וזהו.
למתעניינים, בתוך פונקציית ה-setup שלי, הנה הפקודות שהופכות את הקוטביות בפינים 1 ו-0 (לפי מספור ארדואינו, או PC4 ו-PC5 במספור ה"רשמי"), שמשמשים לתקשורת UART. שימו לב גם שבקוד הארדואינו זה יהיה Serial1, לא Serial הרגיל שב-Every מדבר אך ורק דרך ה-USB. הטריק הזה לא יעבוד בשום לוח ארדואינו אחר.
PORTC_PIN4CTRL |= 0x80;
PORTC_PIN5CTRL |= 0x80;
אה, כן, הכבל שהסינים שלחו לי להתחברות חופשית למסך מסתיים בקונקטור DB9, אז נדרש גם מתאם כדי להתחבר אליו בנוחות. בסופו של דבר, כל החומרה נראית ככה:
אם הייתי מפתח מערכת תעשייתית לייצור בכמות גדולה, הדברים האלה היו נכנסים באופן טבעי לתכנון ול-PCB. צריך כמובן לקחת אותם בחשבון, אבל זה לא סיפור גדול. לעומת זאת כשמנסים לפנות לקהל המייקרים, כפי ש-Stone עושה כעת, זוהי משוכה שלא בטוח שהמייקר הטיפוסי ישמח להתמודד איתה.
מבנה הפאקטים בשידור
דרך סביבת הפיתוח אפשר לשנות כמה מהפרמטרים של התקשורת, אם רוצים. כברירת מחדל, מדובר ב-UART רגיל (8 ביטים, בלי Parity, ביט עצירה יחיד) בקצב 115200 באוד, וכל שידור לכל כיוון מתחיל בהקדמה של שני בייטים קבועים: 165 ואחריו 90 (בהקסדצימלי זה A5 ו-5A בהתאמה). עבור הסמיילי העצוב, הגדרתי בסביבת הפיתוח שהמספר שיישלח אחרי לחיצה הוא 0x0000 (ערך 0 על פני 16 ביטים), ולכן השידור במלואו ייראה כך:
ה-6 הוא מספר הבייטים שבהמשך השידור. אחריו מופיע 131 (הקסדצימלי 83), שהוא הקוד שמציין שאנחנו מקבלים כאן מידע מהזיכרון הכללי של המסך. שני הבייטים הבאים הם ביחד הקסדצימלי 0D00 – הכתובת בזיכרון שממנה אנחנו מקבלים את המידע, ואם נבדוק שוב בסביבת הפיתוח נראה שזו אכן הכתובת שהוקצתה לאלמנט של הסמיילי העצוב. אחר כך בייט יחיד שאומר כמה ערכים אנחנו עומדים לקבל (במקרה זה, ערך אחד בלבד) ולסיום, הערך עצמו – שגודלו שני בייטים, וזה הקוד שהגדרתי כאמור.
המסך יעבור כעת אוטומטית לדף התודה, ואחרי חמש שניות נרצה שהוא יחזור לדף המשוב. לשם כך נשדר למסך את הרצף הבא (הפעם אציג אותו כאן בהקסדצימלי):
A5 5A 04 80 03 00 00
זו שוב אותה תחילית קבועה, אחריה מספר הבייטים בשאר ההודעה (4), פקודה מספר 0x80 (כתיבה לרגיסטר, שזה מקום קבוע בזיכרון שלא שייך לאלמנט ספציפי), מספר הרגיסטר שאליו כותבים (בייט יחיד, כאשר 3 הוא מספר הרגיסטר שקובע מהו הדף הנוכחי) ו-00,00 זהו מספר הדף/תמונה המבוקש. כשהמסך יקבל את השידור הזה, הוא יחזור לדף 0 עם הסמיילים הממתינים ללחיצה, ונוכל לקבל פידבק ממשתמש נוסף.
כדי להכיר את המבנה המדויק של כל סוג פקודה כזו, עיינו במסמך ה-User Development Guide של Stone.
הגרסה החדשה של סביבת הפיתוח, שהורדתי אחרי הפוסט הקודם, דומה מאוד לקודמת (טיפה יותר מסודרת, אולי) ובמקרה או שלא במקרה, באמצעותה הצלחתי להעלות קוד למסך דרך זיכרון נייד בלי בעיה. גם היישום עצמו עבד יפה, אם כי בגלל הקורונה וכל הבלגן, הסרטון שמוכיח את זה קצת הלך לי לאיבוד, אז תצטרכו פשוט להאמין לי 🙂
מסקנות
אז מה השורה התחתונה, עבור מייקרים שמחפשים תצוגת HMI זמינה, נוחה וזולה ככל האפשר עבור פרוייקט יחיד או מספר מוגבל של יחידות?
נתחיל בשאלה קצת שונה, אבל רלוונטית: למה לא ללכת ישר על Raspberry Pi עם מסך מגע קטן, שהוא בדרך כלל גם זול יותר? מבחינת התכנות (אם אתם יודעים לתכנת), מהירות המעבד ונפח הזיכרון, אין ספק שפתרון מבוסס-פיי יכול להיות הרבה יותר גמיש, מתוחכם ומרשים. מצד שני, התכנות יהיה מורכב יותר (להמציא את הגלגל כל פעם מחדש, אלא אם בניתם תשתית ל-HMI משל עצמכם), והמערכת תהיה פחות סלחנית לאתחולים והפסקות חשמל. דמיינו עמדת משוב ביציאה מהרצאה, שמישהו דרך בטעות על איזה כבל, ועכשיו המערכת צריכה דקה שלמה כדי לעלות שוב… כבר לא יישאר מי שיענה! כמו כן, אם כי זה בוודאי מקרה נדיר יותר, מה תעשו אם המערכת שלכם צריכה יותר ממסך אחד אבל שכולם יהיו בשליטה מרכזית?
אז נניח שהחלטנו ללכת על מסך HMI ייעודי. יש יותר מחברה אחת ויותר משתיים שמייצרות מסכים כאלה, ואפשר להשיג אותם די בקלות באמאזון, עליאקספרס וכדומה. מבחינת קלות הפיתוח (כולל הלמידה, סביבת הפיתוח עצמה והממשק הפיזי), הייתי אומר ש-Stone בינוניים. מישהו צריך לשבת שם – מישהו שיודע טוב אנגלית – ולכתוב מחדש כמו שצריך את ה-UI ואת המדריכים. אבל זה נכון גם למוצרים של חברות אחרות. מבחינת היכולות והאפשרויות של המסך עצמו, הוא שגרתי למדי (לדוגמה, אפשר להשמיע קובצי קול ויש RTC, אבל אין GPIO).
מה שכן מצא חן בעיניי הוא איכות החומרה: הרושם הוא ש-Stone מתייחסים ברצינות לאספקט הזה, וכתוצאה מכך סביר שהמסכים שלהם ישרדו לאורך זמן גם בשטח. באתר שלהם הם אפילו מפרסמים את שמות היצרנים (המוכרים) שמהם הם קונים את הרכיבים. אבל אני מסתכל על משהו אחר, על המערכת מבוססת לוח ה-Blue pill שהם שלחו לי בשביל תוכנת ההדגמה. יש שם שני מודולים מתווכים קטנים, שמישהו טרח לשים עליהם שרינק. הם לא היו חייבים לעשות את זה, ועצם העובדה שהם חשבו על כך בכלל מעידה על תשומת לב שחסרה הרבה פעמים במוצרים סיניים. אני משווה את זה למסך Nextion אחד שקניתי פעם והתפרק לי בידיים, ושלא הסכימו לתת לי עליו שום החזר…
לסיכום הסיכום: עוד לא ראיתי פתרון אינטואיטיבי באמת למייקרים. איזה מסך HMI שלא תבחרו, תמיד תצטרכו להשקיע וללמוד בשלב ראשון איך עובדים איתו. מעבר לזה, אם אתם מחפשים משהו מגניב, חדשני ומשוכלל – נסו יצרן אחר. לעומת זאת אם הדרישה שלכם היא בעיקר משהו אמין שיעבוד, ולא אכפת לכם להשתמש בסביבת פיתוח ככה-ככה, המסכים של Stone הם אפשרות שכדאי לקחת בחשבון.
איזה עוד חברות יש שמייצרות מסכים טובים חוץ מ Stone ו Nextion?
מסכים באופן כללי או HMI? לכל יצרן יש מסכים עם פרמטרים אחרים וכלי פיתוח אחרים, מאוד קשה להשוות (אפילו אם הייתי מתעסק בתחום הזה ביומיום, ואני לא). בין החברות הלא-סיניות ששמעתי עליהן יש את 4D Systems, את Newhaven Displays ואת Exor. בסין יש בערך מיליון יצרנים…