ארדואינו Uno R4 Minima – מה חדש (חלק א')

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

ארדואינו אונו R4 מינימה מטיל צל על ארדואינו R3
ארדואינו אונו R4 מינימה מטיל צל על ארדואינו R3

מבחינה שיווקית, לפחות, השם 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 כמובן, כדי למנוע קיצורי דרך לא רצויים בקוד המקומפל). בעזרת סקופ מדדתי את הזמן בין שינויי הפלט. בתמונה מוצגות מדידות עבור מספרים עשרוניים, לא על אותה סקאלה – פרקי הזמן המדויקים כתובים מתחת לשמות הלוחות:

זמני חישוב עם float, תוכנת בדיקה זהה ללוחות ארדואינו שונים
זמני חישוב עם float, תוכנת בדיקה זהה – שימו לב לפרקי הזמן מתחת לשמות הלוחות (לחצו לתמונה גדולה)
חישובי uint32_tחישובי float
R32370us15600us
R462us200us
פי כמה R4 מהיר יותר3878

מהירות השעון של 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 המקסימלי, זה מסקרן אבל לא הנושא שלנו פה.

פלט אנלוגי 8-ביט מארדואינו R4 Minima, בקפיצות של 64, פינים A0 ו-11
פלט של analogWrite ל-A0 (צהוב) ול-D11 (כחול). (לחצו לתמונה גדולה)

וזה עוד לא הכול. ל-R4 יש פקודה חדשה (למעשה הייתה קיימת כבר למספר דגמי ארדואינו אחרים), שנקראת analogWriteResolution, והיא מאפשרת לנו לקבוע את הרזולוציה, בביטים, של הפלט האנלוגי. שימו לב, חשוב מאוד: הפקודה הזו משפיעה על כל פיני הפלט האנלוגי, גם ה-DAC וגם ה-PWM ה"רגיל"!

פקודת analogWriteResolution מקבלת פרמטר אחד בלבד – מספר הביטים – עם ערך 1 עד 32 כולל, אם כי החומרה כמובן צנועה יותר: ה-DAC שמקושר לפין A0 מגיע בפועל רק עד 12 ביט. הקוד, לעומת זאת, מתנהג כאילו אין מגבלה. באחריותנו לזכור באיזו רזולוציה אנחנו עובדים ולשלוח ערכים בהתאם. לדוגמה, אם נקבע רזולוציה של 8 ביט, analogWrite עם הערך 255 תיתן לנו את הפלט המקסימלי, 5V; אם נקבע רזולוציה של 9 ביט, הפלט עבור 255 יהיה חצי מהמקסימום – 2.5V; וכן הלאה.

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

פלט סינוס מספריית analogWave
פלט סינוס מספריית analogWave (לחצו לתמונה גדולה)

קלט 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 ש"ח ליחידה, נכון לכתיבת פוסט זה.

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

לא שוכחים את הפרטנר הראשון, אבל בימינו יש עדיין יתרון לארדואינו על esp32 עם זכרונות של מגה בייטים, ויכולות אלחוטיות מתקדמות?