גם אם כותבים קוד ארדואינו בסביבת הפיתוח הבסיסית, לא חייבים להעלות אותו ללוחות ארדואינו קנויים – אפשר למעגלים ולוחות משלנו, כל עוד המיקרו-בקר מצויד ב-Bootloader הנכון. העסק נהיה קצת יותר מורכב כשעוברים לקוד שמיועד ל-Arduino Nano Every החדש. הנה הסיבות, ודרך קלה וזולה להתמודד איתן.
הרקע והבעיה
לפעמים יש משימות אמבדד שהפתרון הכי קל ומהיר עבורן, מבחינת תוכנה, הוא סביבת הפיתוח והספריות של ארדואינו. לוחות ארדואינו הפיזיים עצמם, לעומת זאת, הם בדרך כלל בזבזניים (במחיר, בחשמל, בגודל) ביחס למה שפרויקט צריך, וכל רכיב נוסף מחייב "מגינים" קנויים או בעבודת-יד שמסרבלים את החומרה ומקפיצים את העלויות עוד יותר. לכן, פתרון נפוץ הוא לתכנן ולייצר לוח בהתאמה אישית, ולשים עליו מיקרו-בקר בדיוק כמו זה שבלוחות הארדואינו, כגון ATmega328P או ATmega2560, שעליו צרבנו את ה-Bootloader המתאים (זהירות עם זכויות היוצרים ותנאי השימוש, כן?) כל מה שנדרש כעת הוא מתאם USB-to-UART זול, שיכול להיות חלק מהלוח עצמו או מודול חיצוני, וקיבלנו את הטוב משני העולמות.
כללי המשחק השתנו עם הגעתו של לוח ה-Nano Every, שמבוסס על המיקרו-בקר המודרני והחזק ATmega4809. החומרה של הלוח טובה יותר משל לוחות הארדואינו הקטנים ה"קלאסיים", ומפתחים מתקדמים יכולים להפיק המון מהיכולות המתקדמות של המיקרו-בקר. אבל אין עליו שום Bootloader. לא בגלל מגבלה טכנית כלשהי, פשוט מבחירה. ג'וק התקשורת שעל הלוח (שהוא בעצמו מיקרו-בקר מתקדם) מדבר עם המחשב ב-UART כרגיל, אך צורב את הקוד החדש ל-ATmega4809 דרך פין ייעודי אחד, בפרוטוקול שנקרא UPDI. כך נחסך שטח FLASH עבור הקוד הראשי, שגם מתחיל לרוץ מיד עם החיבור לחשמל.
הבעיה היא שאם ניצור לוח משלנו עם ATmega4809, ונרצה לצרוב לו קוד שמיועד ל-Nano Every ישירות מסביבת הפיתוח של ארדואינו, נצטרך מתאם מ-USB ל-UART ל-UPDI, ולמיטב ידיעתי אין מוצר כזה – בטח לא משהו שאפשר לקנות בסין בשני דולרים. לשים על כל לוח ג'וק תקשורת כמו זה שמותקן על ה-Every ולצרוב לו את הקוד הנכון זה אפילו עוד יותר מסובך, ויקר. אז בהנחה שלא בא לנו להשתמש בצורב מקצועי ובתוכנה מתווכת לצריבה, מה עושים?
פתרונות
אפשרות אחת היא להקריב Nano Every אחד ולהפוך אותו למתאם, על ידי כך שנסיר ממנו בזהירות את ה-4809 ונוציא חיווט מהפדים הנכונים אל קונקטור שיתחבר ללוח שלנו. זה דומה למה שהיינו עושים עם לוחות ה-MSP430 Launchpad הבסיסיים (שעלו בשלב מסוים $4.30, בעוד שצורב רשמי עלה פי חמישים בערך). מעניין לציין שמבין הפתרונות שמצאתי עד כה ברשת, אף אחד לא הציע את האופציה הזו. אז מה אם ההלחמה קצת מאתגרת?
אפשרות אחרת, שהיא הקלה והפשוטה מכל אלה שכן מצאתי, מצריכה רק מתאם USB-to-UART סטנדרטי ולוח Arduino Pro Mini. כך זה עובד:
שלב 1: ניגש ל-GitHub ונוריד מכאן את הקבצים ש-El Tangas יצר והנגיש באדיבותו. יש שם בפנים תיקייה שנקראת "source". נעתיק אותה במלואה לאיזשהו מקום במחשב שלנו. בתוך התיקיה הזו יש קובץ בשם jtag2updi.ino, אבל סביבת הפיתוח של ארדואינו לא תרצה לפתוח אותו כי שם הספריה שונה משם הקובץ. אז נשנה מראש את שם הספרייה במחשב ל-jtag2updi, נפתח את קובץ ה-ino (כן, הוא ריק, זה בסדר – יש שם עוד קבצים נלווים) ונצרוב אותו ללוח ה-Pro Mini בדיוק כמו שהיינו צורבים כל קוד ארדואינו רגיל. יש לנו עכשיו ביד מתאם UART-to-UPDI.
שלב 2: נחבר מתאם USB-to-UART פשוט אל ה-Pro Mini שלנו. רק ארבעה קווים: פלוס, אדמה, TX ו-RX. אנחנו לא רוצים שום Reset או DTR שם!
כמובן, אפשר להשתמש גם בלוח ארדואינו שאינו Pro Mini, ושכבר כולל מתאם מובנה. אבל אז נצטרך לנטרל את האיפוס האוטומטי של המיקרו-בקר כשנוצרת תקשורת עם סביבת הפיתוח. הנה כמה דרכים לעשות זאת.
שלב 3: נוציא מה-Pro Mini שלושה קווים אל לוח ה-4809 שלנו: פלוס, אדמה ו-UPDI, שיוצא כברירת מחדל מפין דיגיטלי מס' 6. כאן יש עוד קאץ' קטן: צריך לוודא שאין הבדלים משמעותיים ברמות המתח בין ה-Pro Mini לבין הלוח עם ה-4809. אם יש, מחלק מתח רגיל לא יספיק עבור פין UPDI, כי הפרוטוקול הוא דו-כיווני ושני הצדדים מנסים לשלוט בקו, לסירוגין.
וזהו, המתאם מוכן. בסביבת הפיתוח של ארדואינו נבחר לוח Nano Every רגיל, והקוד יעלה ללוח שלנו בלי בעיה. בדקתי את זה עם חיווט מאולתר, כפי שאפשר לראות בתמונה למעלה, ללוח הניסויים שהכנתי פעם ל-4809.