בעבר אמרתי שלוחות תואמי ארדואינו הם טובים פחות או יותר כמו המקוריים. לאחרונה, ההמלצה הזו מתבררת כיותר ויותר בעייתית. זה התחיל עם חיקויי הנאנו מ-buyincoins.com שמייצב המתח שלהם נשרף לכמה חבר'ה, המשיך עם הארדואינו Uno הזול-עד-כדי-חשד שכלל, כך הסתבר, מיקרו-בקר מדגם ATmega8 במקום ATmega328, ועכשיו יש לנו "תכשיט" חדש – לוח Pro Mini זול מאד שאצל חלק מהאנשים פשוט לא עובד. את הדגם הזה קל לזהות (ראו בתמונה), וכשראיתי לוח חשוד באיביי ב-2.5 דולר בלבד החלטתי להסתכן ולקנות אותו. אם הוא יעבוד, הרווחתי; אם לא, יהיה לי אתגר לנסות להבין מה לא בסדר – וגם סביר להניח שאקבל החזר. הוא לא עבד… אז הנה לכם פתרון התעלומה.
הדבר הראשון שעשיתי עם הלוח, כפי שהיה עושה כל משתמש טיפוסי, היה לחבר אותו בעזרת מתאם USB-to-UART למחשב ולנסות להעלות אליו קוד Blink מסביבת הפיתוח של ארדואינו. התהליך נתקע בשלב הצריבה (Upload), עם ההודעה הנוראה והמוכרת:
stk500_getsync(): not in sync: resp=0x00
כבר מזמן הסברתי את משמעות ההודעה הזו, אם כי בהקשר של לוחות ארדואינו רגילים שהמתאם כבר מובנה לתוכם. היא אומרת, כמעט תמיד, שיש איזו בעיה ב-Bootloader שצרוב במיקרו-בקר. המיקרו-בקר עצמו, אגב, היה מדגם ATmega328P כמו שצריך.
אם כן, איזו בעיה יש ב-Bootloader? קיבלתי רמז עבה מאד לעניין כשהבחנתי שהלד המובנה של פין 13 מהבהב פעם ב-16 שניות. כמעט כל תואמי הארדואינו שראיתי מגיעים עם תוכנה שמהבהבת בלד פעם בשניה – צורבים אותה מן הסתם במפעל במסגרת בקרת האיכות. אם זו אותה תוכנה, אך היא עובדת פי 16 לאט יותר, יש מצב שהמיקרו-בקר עצמו עובד לאט מדי – וזה יסביר גם את חוסר היכולת של סביבת הפיתוח לתקשר איתו.
פתחתי את סביבת הפיתוח המקצועית Atmel Studio 6, חיברתי את הצורב AVRISP MKII למחשב ולפינים המתאימים בלוח הסורר, וקראתי את ערכי הפיוזים של המיקרו-בקר. מי שקרא את הפוסט שלי על מקורות השעון של ה-ATtiny85 יודע שבעזרת הפיוזים אפשר לבחור בין שעון פנימי לחיצוני, במהירויות שונות. בלוחות ארדואינו טיפוסיים השעון מתבסס על גביש חיצוני בתדר 16MHz, ללא חלוקה. בלוח הבעייתי, זה מה שראיתי:
קריאת הפיוזים של המיקרו-בקר ב-Pro Mini הבעייתי
הפיוז CKDIV8 מסומן, והערך של SUT_CKSEL מתחיל ב"INTRCOSC_8MHZ". בעברית, זה אומר שהוא מכוון לשעון הפנימי, שמהירותו 8MHz, עם חלוקה ב-8. כלומר, העסק עובד כרגע במהירות של מגהרץ אחד בלבד במקום 16, וזה מסביר את ההבהוב האיטי ואת בעיית התקשורת.
התיקון נראה כעת פשוט: רק לשנות את הפיוזים האלה לערכים הנכונים והלוח יהיה כמו חדש, לא? אז זהו, שלא. ברגע שצרבתי את הערכים החדשים, המיקרו-בקר נאלם דום לחלוטין, ואפילו הפסיק להגיב לצורב. הייתי יכול באותה מידה לנסות לתקשר עם ביצה קשה.
אבל זה לא היה סתם מזל רע: גם זה רמז עבה מאד! אם המיקרו-בקר דומם כשהפיוזים שלו מכוונים לגביש החיצוני, סימן שיש כנראה בעיה בגביש. את זה קשה יותר לבדוק באמצעים ביתיים – החיבורים וההלחמות באזור, בכל אופן, נראו בסדר – ומצד שני, זה מסתדר יופי עם העובדה שהמיקרו-בקר היה מכוון לשעון הפנימי במקום לגביש. סביר להניח שמדובר בסדרה שלמה של לוחות שנדפקה בייצור, אז במקום לזרוק לפח, איזה אינטליגנט החליט לשנות את הפיוזים של המיקרו-בקרים ולהעמיד פנים כאילו כלום לא קרה. אף אחד לא ישים לב, נכון?
אוקיי, אז מה עושים עכשיו עם מיקרו-בקר שמכוון לשעון שאינו קיים? זהו מלכוד רציני, כי מכיוון שאין לו שעון, אין שום דרך לדבר איתו אפילו כדי לכוון אותו לשעון אחר. זה הזמן לנסות דברים שלא הייתי מנסה עם לוח תקין…
ראשית, הסתכלתי במיפוי הפינים של המיקרו-בקר הזה וחיפשתי את פין XTAL1. כאשר מכוונים את המיקרו-בקר למקור שעון חיצוני (לא גביש), לשם נכנס אות השעון (ראו בתמונה למעלה). לקחתי לוח ארדואינו רגיל, כתבתי לו קוד שמחליף את המצב של פין 13 מ-HIGH ל-LOW במהירות המקסימלית האפשרית, וכמו רופא שנותן מכת חשמל אימתנית לאדם שלבו הפסיק לפעום, העברתי את הסיגנל הזה עם חוט מפין 13 ישירות אל פין XTAL1 הזעיר של המיקרו-בקר בלוח ה-Pro Mini (עם אדמה משותפת לשני הלוחות כמובן). וזה עבד! המיקרו-בקר נטול הגביש השתכנע שזה שעון לגיטימי וחזר לחיים. תאמינו לי, זה ממש לא נוח לעבוד ככה עם יד אחת שמחזיקה את החוט במקום… אבל זה הספיק לזמן שהייתי צריך כדי להחזיר את הפיוזים לשעון הפנימי, ובלי חלוקה.
עכשיו הלוח עבד ב-8MHz. לרוע המזל, ל-ATmega328 אין יחידת PLL פנימית שמאפשרת לו לרוץ ב-16MHz, כמו שיש ב-ATtiny85, כך שזה המקסימום שהלוח הזה יוכל לעבוד בו. לא נורא, סביבת הפיתוח של הארדואינו מכירה גם אופציה כזו (ללוחות שעובדים ב-3.3V, אבל זה לא משנה לנו).
במהלך הבדיקות והניסויים צרבתי קוד על המיקרו-בקר דרך Atmel Studio, מה שגרם למחיקה של ה-Bootloader. לא נורא, חשבתי לעצמי, הזדמנות טובה לבדוק את האופציה של צריבת Bootloader חדש, דרך סביבת הפיתוח של ארדואינו, באמצעות לוח ארדואינו מתווך (Arduino as ISP). הסתבר שזו היתה טעות מרה, כי כשמנסים לצרוב בשיטה הזו, התהליך האוטומטי מעדכן גם את הפיוזים! כלומר כל העבודה שעשיתי עד כה ירדה לטמיון, המיקרו-בקר שוב חיפש גביש חיצוני, ושוב צריך היה להחיותו בדרך הקשה.
אם כן, מצאתי את קובץ ה-Bootloader המתאים (שנקרא ATmegaBOOT_168_atmega328_pro_8MHz.hex ומסתתר אי-שם בתיקיות ההתקנה של ארדואינו) וצרבתי אותו באמצעות Atmel Studio וה-AVRISP MKII ישירות לזיכרון של הלוח האומלל. צריבה ישירה כזו לא משנה את הפיוזים, וכעת היה לי לוח פועל עם Bootloader. לסיום הבדיקה הפעלתי שוב את סביבת הפיתוח של ארדואינו, חיברתי את הלוח למתאם USB-to-UART והעליתי אליו קוד Blink בהצלחה מלאה.
האופציה השניה והטיפה יותר נוחה היא להשקיע עוד ארבעים אגורות בערך ולהשיג לוח נורמלי מלכתחילה…
נ.ב. עדכון של הרגע האחרון – המוכר הציע לשלוח לי לוח חדש כפיצוי. האם אני מריח עוד הרפתקה? 😉
אצלי יש עכשיו בעיה הפוכה, יש לי 4 פרו מיני, בכולם אני מקבל את השגיאה הזאת, כולם מהבהבים בסדר, חוץ מאחד, שמהבהב פי כמה יותר מהר, לא מצליח אפילו לספור במדויק… אני מניח שזה משהו כמו שש פעמים בשניה.
מה מוגדר "בסדר" ומה "מהר מדי" בלוח שקנית בסין ושלא אתה כתבת את הקוד שעליו? 😉
שלום,
גם אני נתקלתי בבעיית העלאת התוכנה לבקר ולאחר שיטוטים מצאתי הסבר שאומר כך:
ללחוץ על הRESET בלוח הארדואינו. ללחוץ על הUPLOAD ושנייה לאחר מכן לשחרר את הRESET. אצלי זה עובד ופתר את בעיית ההודעה והתיכנות.
זו בעיה מסוג אחר – אתחול ידני לא היה עוזר במקרה שתיארתי כאן.
בקריאה שניה ומעמיקה – אתה צודק זו בעיה שונה.
בכול מקרה, אני חדש עם הלוחות של הארדואינו אבל משחק שנים עם מיקרוקונטרולרים ואלקטרוניקה. חייב להחמיא לך על האתר ועל השיתוף בידע גם פה וגם בפורום- תענוג וישר כח !
אשמח לדעת אם הבעיה שאני נתקלתי בה מוכרת ואולי שווה להוסיף אותה ואת פתרונה. מצרף קישור – התשובה מ Spaceman88 עזרה לי.
תודה !
http://forum.arduino.cc/index.php?PHPSESSID=7c5dbe6718c04e63dca3b1f366578cf6&topic=114344.msg924121#
התייחסתי לנושא הזה בעבר, כשדיברתי על המתאם USB-to-UART (ר' https://www.idogendel.com/whitebyte/archives/1323 ). גם השיטה הידנית יכולה לעבוד אבל היא מאד לא נוחה…
תודה!
האמת שהסתגרתי יופי עם PROMINI שעלה לי 4$ !
לגבי אונו
המייצב הולך אם דוחפים לו 12 V וצורכים קצת מה 5, אני הכנסתי להם 5-7 וולט וזה עבד יפה
(3 לוחות מ 50 נשרפו – אבל זה בתנאים קיצונים, וזה שווה כדי לקנות לוח ב 10$ )
בחיבור 5V ימדוייק ישר ל5V עובד לי יופי, ויש הרבה פרוייקטים שזה מספיק
אגב למי שאין צורב משוכלל יכול לצרוב bootloader שמשתמש בגביש הפנימי 8MHz בצורה הרגילה בעזרת ארדואינו מתווך (Arduino as ISP)
אפשר למצוא אותו כאן http://arduino.cc/en/Tutorial/ArduinoToBreadboard
וואלה, נכון – זה מופיע שם בסעיף Minimal Circuit.
עוד אפשרות נחמדה אבל לא כלך כך קלה לביצוע היא להשתיל לו גביש חדש ולחבר אותו ישירות לרגליים של הבקר ולחתוך את הנתיבים הישנים שלהם.
החיסרון הוא א. שזו הלחמה עדינה מאוד.
ב. החיבור מן הסתם יהיה מאוד חלש ויתפרק בקלות
ג. אפשר להשיג לוחות טובים ב2.5$
יכול להיות שהחלפה של הגביש היתה עובדת (הרי מה יכול להיות מקולקל שם? או הגביש או הקבלים שלו; החיבורים והנתיבים נראים בסדר). הצרה היא שזו אכן עבודה מאד עדינה, והגבישים היחידים שיש לי הם Through-hole, הרבה יותר מדי גדולים בשביל להצמיד איכשהו ללוח הזה…