סקירה של החיישן והמודול הזולים והנפוצים למדידת משקל, ואיך עובדים איתם גם כאשר המשימה מורכבת יותר מאשר תסריטי הדוגמה הפשוטים שבאינטרנט.
לא מזמן נכנסתי לפרויקט שמצריך מדידת משקלים בכמויות ובקצבים שחורגים מאוד ממשחקי הארדואינו הרגילים. אחרי בירור קצר הבנתי שספריית הארדואינו שמוכרת לכל מייקר לא תספיק: צריך לצלול לדפי הנתונים ולקוד כדי לסחוט ביצועים ראויים לשמם.
עקרון הפעולה של Load Cell ושל HX711
כצפוי, יש בשוק המון סוגים ודגמים של חיישנים/מתמרים שמסוגלים למדוד משקל. הסוג שרוב המייקרים המתחילים נתקלים בו נקרא Single Point Load Cell, כמו זה שבתמונה למטה. חיישנים כאלה מגיעים במידות שונות ומותאמים למדידה של משקלים שונים (עד 5 ק"ג, 10, 20, 50 וכו'). העיוות הקל של המתכת כשמופעל עליה לחץ הופך, בתוך החיישן, להתנגדות משתנה במה שנקרא Wheatstone bridge. זוהי רביעיית נגדים שמסודרת בשני מחלקי-מתח מקבילים, אחד קבוע ואחד עם נגד משתנה. כשמספקים מתח לגשר הזה (דרך החוט האדום והחוט השחור של החיישן), שינוי בהתנגדות מיתרגם לשינוי בהפרש המתחים בין המוצאות של מחלקי המתח – בחוט הלבן ובחוט הירוק. השינויים האלה הם זעירים וצריך להתאמץ ממש, פיזית, כדי להבחין בהם במולטימטר.
שיטה מקובלת (שוב, בקרב מייקרים שהתחנכו על ארדואינו) היא לחבר את החיישן למודול HX711. הסימון HX711 הוא למעשה השם של השבב שנמצא בלב המודול, ומי שרוצה יכול להשיג אותו גם בנפרד. זהו ממיר אנלוגי-לדיגיטלי עם קלט דיפרנציאלי, ייצוב מתח עבור החיישן, הגברה פנימית ורזולוציית מדידה גבוהה (24 ביט). הרזולוציה וההגברה הן כמו מיקרוסקופ לשינויי המתח הזעירים בחיישן, וכך המיקרו-בקר שלנו, שקורא את תוצאות ההמרה מהשבב הזה, יכול לקבל מידע מדויק לגבי הלחץ שמופעל על החיישן.
אגב, ה-HX711 הוא לא השבב היחיד מסוגו. ה-NAU7802 של Nuvoton, למשל, עושה כמעט בדיוק אותו דבר רק עם תקשורת I2C.
פרטים טכניים קטנים וחשובים
קודם כל, הסתכלו על תמונת החיישן למעלה. בצד שמאל רואים שיש עליו מדבקה עם חץ ירוק, שמראה את כיוון הכוח הנכון: בשקילה רגילה, החץ הזה אמור להצביע לרצפה. את החיישן מקבעים למשהו יציב ואופקי (בצד החוטים) ולמשטח השקילה (בצד החץ) באמצעות ברגים, בצורה כזו ששום דבר חוץ מהברגים, או ספייסרים, לא ייגע בו וישבש את המדידה. זהירות גם מפעולת מנוף מכאנית: אמנם קיימים חיישנים עם פיצוי מסוים לכוחות שפועלים לא-בדיוק-מלמעלה, אבל אלה לא החיישנים הסיניים שמוצאים בזול בעליאקספרס.
נעבור למודול ה-HX711. יש כמה מודולים שונים בשוק, ואם לא יודעים מראש על מה להסתכל, זו ממש חידה. הביטו למשל על המודול של Sparkfun: יש לו חמישה חיבורים בצד החיישן, לפי צבעי החוטים שיוצאים ממנו + "צהוב" מסתורי. לעומת זאת במודול סיני כמו בתמונה הבאה יש שישה חיבורים: שניים לחשמל ושני זוגות, A ו-B, שלכל אחד מהם יש פלוס ומינוס. מה קורה פה?
ובכן, לשבב HX711 יש פיצ'רים שכל לוח חושף בצורה שונה, ויותר או פחות נוחה למשתמש. נתחיל בזה שיש לו שני ערוצי קלט: ערוץ A עם הגברה פי 64 או 128 לבחירתנו, וערוץ B עם הגברה קבועה פי 32. אם השגתם מודול כמו של Sparkfun, החיבורים הנוחים הם רק לערוץ A. ערוץ B נגיש דרך החורים שקרובים למרכז הלוח, ותצטרכו להוסיף נגדים וקבל. אבל עם מודול כמו בתמונה פה, או במעגל שתתכננו לבד סביב השבב, תוכלו לחבר שני חיישנים נפרדים בנוחות (כאשר יציאות החשמל, שמוסמנות ב-E, משותפות לשניהם). דבר שני, הסתכלו מימין למעלה בתמונה: שני מקומות לנגדים, רק אחד מהם מאוכלס בנגד 0. מסומנים 10Hz ו-80Hz. זה מאפשר לקבוע את קצב הדגימה. בלוחות אחרים, האופציה הזו מסודרת בצורה אחרת. לכל התכונות האלה יש גם מגבלות, כפי שעוד נראה.
פרוטוקול התקשורת עם HX711
הספרייה המוכרת לארדואינו עובדת, ויש לה יכולות מתקדמות כמו המרת יחידות נוחה, פונקציית עזר לכיול ידני ועוד. עם זאת, ברמה של קריאת הנתונים הגולמית היא מגושמת ולא יעילה. למי שמעוניין לכתוב משהו טוב ומהיר יותר לבד, הנה הפרטים החשובים על הפרוטוקול.
כדי לדבר עם ה-HX711 צריך שני פיני GPIO במיקרו-בקר: קו פלט שיוציא פולסים (ה"שעון", מסומן על המודול כ-SCK) וקו קלט שיקרא מהמודול ביטים ("נתונים", DOUT או DT). ה-XH711 מחזיק את קו DOUT במצב HIGH עד שהוא מוכן לשלוח נתונים חדשים, ואז הוא מוריד את המתח ב-DOUT ל-LOW. חייבים לוודא שהמתח נמוך לפני שמתחילים קריאה חדשה, אחרת יגיעו נתונים משובשים. קצב הדגימה שהזכרתי קודם קשור לזמן ההמתנה, כאשר המחיר של המתנה קצרה יותר הוא אובדן של קצת דיוק במדידה.
הקריאה מתחילה ב-24 פולסים של השעון (מעברים מ-LOW ל-HIGH). משך הזמן של כל חלק בפולס, גם ה-LOW וגם ה-HIGH, חייב להיות לפחות 0.2 מיליוניות השנייה – זהירות עם מיקרו-בקרים בעלי שעון מערכת מהיר! כמו כן, ה-HIGH חייב להסתיים תוך 50 מיליוניות השנייה, כי קצת יותר מזה וה-HX711 ייכנס למצב שינה. בפולס תקין, מרגע שקו השעון עבר מ-LOW ל-HIGH, תוך 0.1 מיליוניות השנייה יופיע ביט בקו DOUT ונוכל לקרוא אותו משם. הביטים יוצאים לפי הסדר מהגדול (MSB) לקטן, ומהווים מספר בינארי בן 24 ביטים, עם סימן (בשיטת המשלים ל-2). להרבה מאוד קומפיילרים אין טיפוס נתונים "טבעי" של 24 ביט, וצריך לקחת גם את זה בחשבון.
אבל רגע, אמרנו שיש שני ערוצים, והגברות שונות. מאיזה מהם הגיע המספר שקראנו זה עתה? כאן מגיע החלק המוזר ביותר של הפרוטוקול: בחירת הערוץ של הקריאה הנוכחית התבצעה בקריאה הקודמת. מיד אחרי 24 הפולסים לקריאת הביטים, השעון שלנו חייב להפיק בזריזות עוד אחד, שניים, או שלושה פולסים, ומספרם יקבע איזה ערוץ ישודר בקריאה הבאה, לפי הפירוט הזה:
- 25 פולסים = הקריאה הבאה תהיה מערוץ A, הגברה פי 128
- 26 פולסים = הקריאה הבאה תהיה מערוץ B (הגברה פי 32)
- 27 פולסים = הקריאה הבאה תהיה מערוץ A, הגברה פי 64
כן, גם אם הקריאה הבאה היא בעוד שבוע, וגם אם אנחנו לא יודעים עדיין איזה ערוץ נרצה לקרוא, עלינו לקבוע משהו כבר עכשיו. בהנחה שהחוש הנבואי שלנו לא מפותח מספיק, אז ברגע האמת לא תהיה ברירה אלא לבצע קריאה מקדימה ולזרוק אותה לפח, רק בשביל להגדיר את הערוץ הרצוי.
אפרופו, המפרט אומר שאחרי אתחול של ה-HX711, המדידה הראשונה תגיע כברירת מחדל מערוץ A עם הגברה פי 128.
והנה עוד מוקש: ברגע ששינינו את הערוץ או את ההגברה, יש פרק זמן ארוך עד ל"התייצבות" של הקריאה הבאה – 0.4 שניות(!) בקצב דגימה 10Hz, או שמינית מזה בקצב 80Hz. כן, אם תקראו למשל את ערוץ A ו-B לסירוגין כשהמודול מכוון לקצב 10Hz, המידע בפועל יגיע ב-2.5Hz.
אם כל שבריר שנייה חשוב לכם מספיק כדי לתכנן את המעגל כולו לבד או להתעסק עם החומרה, אפשר להאיץ עוד יותר את פעולת השבב. הוא פועל, כברירת מחדל, עם מתנד פנימי בתדר של כ-11.06MHz, אך אפשר לחבר לו גביש או לספק אות שעון חיצוני עד 20MHz ובכך לזרז את כל הפעולות כמעט פי שניים. שימו לב, בשימוש באות שעון חיצוני, לפי המפרט הוא צריך לעבור דרך קבל 20pF AC-Coupled (יעני, בטור).
לא רק משקל
לכל Load cell (לא "כל דגם", בכללי, אלא ממש לכל יחידה) יש סטיה קבועה משלו בהתנגדות, שאי אפשר לדעת מראש. צריך למדוד אותה כשאין עומס, ולהחסיר מכל מדידה עתידית. בנוסף יש "רעש" אקראי בלתי נמנע בכל מדידה ומדידה, גם ב-Load cell עצמו וגם ב-HX711, שצריך להתחשב בו – למשל לחשב ממוצע על פני מדידות מרובות. אחרי כל זה, אנחנו יכולים לקחת משקולת עם משקל ידוע ומדויק, לאסוף את המספרים הגולמיים שמתקבלים מהחיישן ובחישוב חד-פעמי לגלות את יחס ההמרה מהם ליחידות משקל סטנדרטיות. לא לשכוח את ההגברה – הרי עבור אותה משקולת בדיוק, ערוץ מוגבר פי 128 ייתן תוצאה גדולה פי ארבעה מערוץ מוגבר פי 32.
כאן רק מתחיל החלק המעניין. ניקח לוח עץ צר וארוך ונשעין אותו על שני חיישנים, אחד בכל קצה. נכייל את המערכת, ואז נשים משקולת חדשה על הלוח. סכום הערכים שיגיעו מהחיישנים ייתן לנו את המשקל המלא של המשקולת, אבל היחס ביניהם יגיד לנו עוד משהו – איפה לאורך הלוח נמצאת המשקולת. לדוגמה, אם הלוח מאוזן לגמרי והערכים (אחרי הכיול) זהים בשני החיישנים, אז המשקולת בהכרח באמצע הדרך ביניהם. אם המשקל על חיישן ב' גדול פי שניים מהמשקל על חיישן א', אז המשקולת היא בשני-שליש הדרך מ-א' ל-ב', וכן הלאה.
את אותו העיקרון אפשר להרחיב גם לשני ממדים, ובעזרת ארבעה חיישנים לזהות את מיקום המשקולת על גבי משטח מרובע. כבר חשבתי על פרויקט פנאי שמבוסס על העיקרון הזה – פרטים בעתיד…
היי
לאיזה רמות דיוק הגעת ובאיזה משקל מקסימלי של load cell?
כי לי הייתה סטיה בגרמים, שכל משקל מטבח סיני היה הרבה יותר מדוייק.
אין לי מידע על דיוק אבסולוטי כי לא עבדתי עם משקולות כיול. במדידות עצמן היה "רעש" אקראי, כל מדידה משהו אחר, בסדר גודל של פלוס/מינוס גרמים בודדים – כאשר ה-load cell מיועד למשקל של עד 10 קילוגרם. אם נניח ש-load cell של קילוגרם אחד מגיב לפי אותן פרופורציות, אז הסטיות שלו אמורות להיות קטנות מגרם אחד. אפשר גם לחשב ממוצע או חציון על פני מספר מדידות כדי להקטין את הרעש, ולבצע כיול מסודר כדי לקזז טעויות קבועות.
מעניין אותי באיזה load cells ובקרים משתמשים במשקלי מטבח.
כי הם מאוד קטנים, זולים, ומדוייקים על הגרם עד רמה של 7 KG ויותר
בדקת משקלים כאלה על פני כל הטווח עם משקולות כיול? יכול להיות שהם בכלל לא מדויקים כמו שכתוב על האריזה (במיוחד אלה הזולים). מעבר לזה, יש load cells שבנויים לקזז השפעות של מרחק העומס מנקודת המשען, יכול להיות שהם גם מכוילים יותר טוב באופן כללי – ואת היחידות שלא עמדו בסטנדרטים המפעל מוכר לנו בעליאקספרס בזול 😉