במשך השנים ראינו המון לוחות ארדואינו חדשים מופיעים, מקבלים קצת הייפ, ואז נשכחים או אפילו מבוטלים רשמית. האם ה-Minima החדש, שמוצג כדור הבא של הלוחות ה"קלאסיים", יצליח לחמוק מהגורל הזה?
מבחינה שיווקית, לפחות, השם R4 מעיד על כך שלא מדובר בסתם עוד לוח ארדואינו: לכאורה, הוא היורש הרשמי של Uno R3 – הארדואינו המוכר, הבסיסי והאיקוני ביותר ב-12(?) השנים האחרונות. הצורה, המידות והחיבורים נשארו זהים (פרט לסוג קונקטור ה-USB), ואילו המיקרו-בקר 8-ביט הוותיק הוחלף ב-R7FA4M1AB3CFM של Renesas – מיקרו-בקר 32-ביט עם:
- ליבת ARM Cortex M4
- זיכרון FLASH בגודל 256KB
- זיכרון SRAM בגודל 32KB
- 8KB FLASH נפרדים שמשמשים כ-EEPROM
- מהירות שעון 48MHz
- והוא אפילו עובד ב-5V!
אבל הקטע בארדואינו אף פעם לא היה היכולות של המיקרו-בקר, אלא נוחות השימוש והספריות המוכנות. ל-R3 כבר יש את כל זה, אז השאלה היא האם R4 יוכל לעמוד בסטנדרט הקיים מצד אחד, ומצד שני להציע גם דברים חדשים ושימושיים מספיק כדי להצדיק את ההחלפה.
נתחיל את הסקירה הזו בדברים החדשים. ל-R4 יש, על הנייר, הרבה יתרונות ביחס ל-R3, אבל בפוסט זה אתמקד בשלושה שלדעתי הם מצד אחד בסיסיים, ומצד שני בולטים ו/או יכולים להיות משמעותיים במגוון תסריטי שימוש:
- מהירות המעבד, ובמיוחד היכולת המוצהרת שלו לבצע חישובי float (מספרים עם נקודה עשרונית) בחומרה במקום בתוכנה
- פלט DAC (המרת ערך מספרי למתח אנלוגי)
- קלט ADC ברזולוציה של 14 ביט (ה-R3 נותן רק 10 ביט)
מהירות חישוב
כדי להשוות בין הלוחות הרצתי את אותו קוד בדיוק על שניהם, בשתי גרסאות: עם מספרים שלמים ועם מספרים עשרוניים. הקוד שינה את הפלט בפין 13 בכל פעם שהוא סיים סדרה של כמה מאות חישובים לא טריוויאליים (המשתנים הוגדרו כ-volatile כמובן, כדי למנוע קיצורי דרך לא רצויים בקוד המקומפל). בעזרת סקופ מדדתי את הזמן בין שינויי הפלט. בתמונה מוצגות מדידות עבור מספרים עשרוניים, לא על אותה סקאלה – פרקי הזמן המדויקים כתובים מתחת לשמות הלוחות:
חישובי uint32_t | חישובי float | |
R3 | 2370us | 15600us |
R4 | 62us | 200us |
פי כמה R4 מהיר יותר | 38 | 78 |
מהירות השעון של R4 גדולה פי שלושה משל R3, ומשתני 32-ביט טבעיים לו; לכאורה, השילוב של שני ההבדלים האלה מספיק כדי להסביר את ההבדל בזמני הריצה עבור uint32_t. לגבי ה-float, ברור שקורה כאן משהו נוסף שמגדיל את המהירות – אם כי, למען האמת, ציפיתי להבדל עוד יותר גדול. האם באמת בוצע חישוב בחומרה כמו שהבטיחו, או שזה רק עניין של אסמבלי יעיל יותר? סביבת הפיתוח של ארדואינו לא מאפשרת גישה נוחה מאחורי הקלעים, אבל אפשר להסתכל על ההבדלים בגודל הקוד המקומפל: חישוב float בתוכנה אמור להוסיף לו כמות נאה של בייטים. ואכן, כשהשוויתי את שתי גרסאות הקוד ל-R3, הגרסה עם ה-float תפסה 660 בייטים יותר מהגרסה עם ה-uint32_t, אבל ב-R4 ההבדל היה 4 בייטים בלבד.
אגב, ב-R4, התוכנה הקטנה הזו לבדה תפסה כ-39KB זיכרון FLASH ו-4K זיכרון SRAM – יותר מכל מה שיש ל-R3. אך זה מגיע כמובן מכל מיני הגדרות וספריות ליבה שארדואינו כולל בכל קוד שהוא. אם התוכנה שלי הייתה ארוכה פי שניים, היא לא הייתה תופסת פי שניים זיכרון.
לסיכום ביניים – אף על פי שלא הייתי מנסה לבצע בעזרתו עריכת וידאו, ה-R4 מבצע חישובים הרבה יותר מהר מה-R3 הקלאסי, ואם יש לכם יישום שצריך קצת גרפיקה זריזה על מסכים פשוטים, פונקציות טריגונומטריות או משהו בסגנון, ה-R4 יעשה לכם חיים הרבה יותר קלים.
פלט DAC
לוח R4 מעניק לנו גישה ל-DAC דרך פין אחד בלבד, A0. מאז ומעולם היה צריך להסביר למייקרים מתחילים שפקודת analogWrite של ארדואינו לא נותנת מתח אנלוגי אמיתי אלא אות PWM עם Duty Cycle משתנה – והנה, סוף כל סוף, אם נשתמש בפקודה הזו על פין A0 ב-R4 נקבל פלט אנלוגי ממש. אבל שימו לב, הזרם שה-DAC מסוגל לספק הוא אפסי, לא תוכלו להפעיל באמצעותו רמקול או לד רציניים בלי תיווך של איזשהו מגבר.
כתבתי תוכנית קצרה שקוראת ל-analogWrite עבור פינים A0 ו-D11, מ-0 עד 255 בקפיצות של 64 (בערך). אפשר לראות בקלות את ההבדל בין המתח האנלוגי (בצהוב) לעומת ה-PWM הרגיל (תכלת) – נתעלם בינתיים מהירידות המוזרות ב-PWM המקסימלי, זה מסקרן אבל לא הנושא שלנו פה.
וזה עוד לא הכול. ל-R4 יש פקודה חדשה (למעשה הייתה קיימת כבר למספר דגמי ארדואינו אחרים), שנקראת analogWriteResolution, והיא מאפשרת לנו לקבוע את הרזולוציה, בביטים, של הפלט האנלוגי. שימו לב, חשוב מאוד: הפקודה הזו משפיעה על כל פיני הפלט האנלוגי, גם ה-DAC וגם ה-PWM ה"רגיל"!
פקודת analogWriteResolution מקבלת פרמטר אחד בלבד – מספר הביטים – עם ערך 1 עד 32 כולל, אם כי החומרה כמובן צנועה יותר: ה-DAC שמקושר לפין A0 מגיע בפועל רק עד 12 ביט. הקוד, לעומת זאת, מתנהג כאילו אין מגבלה. באחריותנו לזכור באיזו רזולוציה אנחנו עובדים ולשלוח ערכים בהתאם. לדוגמה, אם נקבע רזולוציה של 8 ביט, analogWrite עם הערך 255 תיתן לנו את הפלט המקסימלי, 5V; אם נקבע רזולוציה של 9 ביט, הפלט עבור 255 יהיה חצי מהמקסימום – 2.5V; וכן הלאה.
רבים ירצו, מן הסתם, להיעזר ב-DAC כדי להפיק גל סינוס. מסתבר שיש ספריה גם לזה, כפי שאפשר לראות במדריך הרשמי ל-DAC. היא נוחה במובן זה שלא צריך להגדיר טיימר ולעדכן לבד את ערכי ה-DAC השונים כל שבריר שנייה, אבל אם ספרתי נכון, בגל הסינוס נעשה שימוש ב-13 ערכים שונים בלבד – בהחלט לא ניצול מקסימלי של היכולות.
קלט ADC ברזולוציה 14 ביט
בשביל לקרוא פוטנציומטר ולשלוט בעזרתו במנוע סרבו סיני קטן, רזולוציית ה-ADC של R3 מספיקה בהחלט. מה עושים בכלל עם רזולוציה גבוהה פי 16? תסריט אחד נפוץ, יחסית, הוא מדידת זרם: מעבירים את הזרם לצרכן דרך נגד מדויק, מודדים כמה מתח נופל על הנגד, ואז מחשבים בעזרת חוק אוהם מה הזרם.
והנה הבעיה: ככל שערך הנגד גדול יותר, כך – זה החוק – המתח שנופל עליו גדול יותר לכל זרם נתון, וככל שהמתח הזה יותר גדול כך יותר קל לנו למדוד אותו. אבל זה אומר שאנחנו "מרעיבים" את הצרכן ולא נותנים לו את מלוא המתח שהוא צריך. אם נתחכם וניתן מתח גבוה יותר למערכת כולה, ובמקרה הצרכן יסתפק בזרם נמוך מהצפוי, הוא יחטוף מתח גבוה מדי. אין ברירה אלא לבחור בנגד עם ערך נמוך מאוד, שיפיל מעט מאוד מתח – אבל אז נצטרך רזולוציה גבוהה כדי למדוד את המתח הזה.
כשמודדים טווח של 0-5 וולט ברזולוציית ADC של 10 ביט, גם אם נניח שאין שום "רעש" ושגיאות בדרך, כל יחידה היא שוות ערך ל-0.0049 וולט. מצאתי אצלי נגדים בערך 0.39 אוהם (בשביל מדידות זרם, אפילו זה נחשב ערך גבוה); בשביל להפיל 0.0049 וולט, הזרם דרך נגד כזה צריך להיות כ-12.5 מיליאמפר. כלומר, בתנאים שתיארתי, זו "יחידת המדידה" המינימלית של זרם ש-R3 יוכל לזהות. ה-R4 לעומת זאת רגיש פי 16 – כ-0.78 מיליאמפר.
ישנם עוד פרמטרים ואופציות של מדידה שלא התייחסתי אליהם כאן; מה שחשוב הוא העיקרון, שעם ADC של 14 ביט אנחנו יכולים לעשות כמה דברים שלא יכולנו לעשות עם ארדואינו R3. מה שחייבים לזכור זה שברירת המחדל של המדידה ב-R4 היא עדיין 10 ביט, וכדי לשנות אותה צריך לקרוא לפונקציה analogReadResolution עם הערך 14. לא אלאה אתכם בתיאורי מעגלים ופלטים משעממים – מספיק לומר שניסיתי, וה-ADC של ה-R4 אכן רגיש הרבה יותר.
לקראת הפוסט הבא
מה שנותר כעת זה לבדוק מספר ספריות נפוצות כדי לראות אם R4 תומך בהן. עד אז, R4 נראה מועמד לא רע להפוך ללוח הארדואינו הקלאסי הבא. שלושה דברים שכדאי לזכור: ראשית, ארדואינו הבטיחו באתר שלהם ש-R3 לא הולך לשום מקום – הם ימשיכו לייצר ולמכור אותו; שנית, נכון להיום R4 זול יותר מ-R3; ושלישית, אולי הסימן הכי טוב להתבססות של R4 בשטח – כבר ניתן להשיג בעליאקספרס חיקויים סיניים זולים! כ-15 ש"ח ליחידה, נכון לכתיבת פוסט זה.
לא שוכחים את הפרטנר הראשון, אבל בימינו יש עדיין יתרון לארדואינו על esp32 עם זכרונות של מגה בייטים, ויכולות אלחוטיות מתקדמות?
נראה לי שהשאלה הזו נשאלה, באינסוף וריאציות, מאז שיצא לשוק המיקרו-בקר השני בהיסטוריה 😀
התשובה, כרגיל, היא שיתרון נמדד ביחס לפרמטרים רבים ושונים, שלכל אחד מהם משקל שונה לכל משתמש ובכל יישום, ולכן לעולם לא תהיה תשובה "אוניברסלית". העיקר לשמור על ראש פתוח.