avrdude: stk500_getsync(): not in sync: resp=0x00

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

Arduino upload error
הודעת השגיאה המפורסמת

רקע: משמעות השגיאה

גם בפורומים הישראליים וגם באלה שבחו"ל אפשר למצוא המוני פניות של משתמשים שנתקלו בשגיאה "avrdude: stk500_getsync(): not in sync: resp=0x00". אפשר להניח שבקשות רבות עוד יותר לעזרה קשורות לשגיאה הזו, ופשוט לא ציטטו אותה. הודעת השגיאה הזו בעייתית במיוחד עבור מתחילים, כי היא מבלבלת מאד – אין סיכוי להבין אותה מקריאה בלבד בלי לדעת מה קורה מאחורי הקלעים. אך למעשה, מה שהיא אומרת זה דבר פשוט מאד: AVRDude, רכיב התוכנה במחשב שאחראי להעלאת הקוד המוכן אל המיקרו-בקר שבארדואינו, אינו מצליח להסתנכרן עם המיקרו-בקר.

מתוך זה אנחנו כבר לומדים שני דברים חשובים: קודם כל, שהקוד עבר בהצלחה את כל שלבי ההידור (קימפול). זה לא אומר שהוא יעשה בדיוק מה שאנחנו מצפים, אבל זה אומר שלא עשינו שום שגיאת תחביר בקוד עצמו. כבר טוב!

הדבר השני שאנחנו לומדים הוא שהמחשב מזהה את לוח הארדואינו. אילו לא היתה שום תקשורת – לדוגמה, אם הלוח מנותק לגמרי מהמחשב או שיש בעיה רצינית בכבל ה-USB – היינו מקבלים באופן מיידי את השגיאה הבאה (שימו לב בעיקר לשורה עם הרקע הכתום, שאומרת שהיציאה הטורית לא נמצאה כלל):

NoConnectionError
השגיאה שמתקבלת כשאין שום חיבור ללוח הארדואינו

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

* בארדואינו מדגם לאונרדו אין רכיב תקשורת כזה בנפרד – הוא מובנה לתוך המיקרו-בקר עצמו.

הכירו את ה-Bootloader

בטח שמתם לב, כשאתם מחברים את הארדואינו לחשמל או מאתחלים אותו, נורית ה-LED המובנית שלו מהבהבת ועוברות שניות ספורות עד שהוא מתחיל להריץ את התוכנית. כמובן, מיקרו-בקר כמו של הארדואינו לא כולל מערכת הפעלה שצריכה זמן כדי לעלות, והתוכנה שלכם יכולה בעיקרון להתחיל לפעול מיידית. מה שפועל באותן שניות ספורות עד שזה קורה היא תוכנה אחרת, שמכונה בשם הכללי Bootloader.

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

אתם בוודאי שואלים עכשיו בשביל מה צריך את ה-Bootloader בכלל, למה אי אפשר לצרוב את התוכנה ישירות על המיקרו-בקר דרך ה-USB – והתשובה היא, במילים פשוטות, שככה זה. צריבה ישירה של מיקרו-בקר היא תהליך מורכב שאי אפשר לבצע דרך פרוטוקול התקשורת הטורית שכבל ה-USB מציע.

אוקיי, אז עכשיו אנחנו יכולים לדייק ולומר שהשגיאה המפורסמת שבכותרת מופיעה לא סתם כשסביבת הפיתוח לא מצליחה להסתנכרן עם המיקרו-בקר, אלא ספציפית כשהיא לא מצליחה לדבר עם ה-Bootloader שעל המיקרו-בקר. ולזה יכולות להיות מספר סיבות:

1. אין על המיקרו-בקר תוכנת Bootloader. זה מצב נדיר, אבל אפשרי – למשל אם החלפתם את המיקרו-בקר המקורי בכזה שנקנה בנפרד, או אם צרבתם עליו תוכנה בצריבה ישירה, או אם ה-Bootloader נפגם איכשהו (אף פעם לא נתקלתי במקרה כזה, אך הוא אפשרי). הפתרון – לצרוב Bootloader חדש, אבל בזהירות!

2. יש Bootloader, אבל הוא לא ה-Bootloader הנכון. גם זה נדיר מאד, ויכול לקרות למשל אם החלפתם מיקרו-בקרים בין לוח Uno ללוח Duemilanove, או צרבתם Bootloader חדש שאינו מתאים ללוח. הפתרון: גם כאן, לצרוב בזהירות את ה-Bootloader הנכון.

3. יש Bootloader והוא הנכון, אך בטעות בחרתם בסביבת הפיתוח את הלוח הלא-נכון. זהו מצב נפוץ ביותר אם יש לכם יותר מסוג אחד של ארדואינו: כולם שוכחים מדי פעם להחליף את הלוח בתפריט Tools->Board בהתאם למה שמחובר כרגע, או שסתם האצבע מחליקה ומסמנת משהו אחר. סביבת הפיתוח מצפה לסוג מסוים של תגובות מה-Bootloader, ומכיוון שהוא לא מתנהג כצפוי, מתקבלת השגיאה. אגב, לעתים בחירה שגויה כזו נגמרת לא בהודעת שגיאה, אלא פשוט בהיתקעות במצב Uploading. הפתרון: לשים לב מה בוחרים.

4. יש Bootloader נכון שתואם את ההגדרה בסביבת הפיתוח, אבל קווי התקשורת לא פנויים. גם זה מצב נפוץ למדי. התקשורת בין המחשב ל-Bootloader שעל המיקרו-בקר נעשית באמצעות התקשורת הטורית, כלומר כניסות RX/TX של המיקרו-בקר, שמחוברות לפינים מספר 0 ו-1 בלוח הארדואינו. אם הפינים האלה מחוברים לרכיב נוסף, חיצוני, בזמן שמנסים להעלות תוכנית דרך ה-USB, יש סיכוי טוב שהדבר ישבש את התקשורת עם המחשב ויגרום לשגיאה. הפתרון: צריך לוודא שבזמן העלאת תוכנית חדשה דרך ה-USB, פין RX (המקלט – Receiver) לא מחובר לכלום. את השני, TX, אפשר בעיקרון להשאיר מחובר, כי הוא המשדר (Transmitter) ומה זה חשוב אם הוא ישדר במקביל לעוד מישהו.

5. חיבורים בעייתיים: לעתים נרצה להעלות תוכנה למיקרו-בקר לא דרך כבל USB אלא באמצעות ארדואינו אחר או מודול USB-to-UART. זה יכול לקרות אם בנינו "ארדואינו תוצרת בית" על מטריצה, או אם מדובר בלוח שבכלל אין לו חיבור USB (כגון דגמי מיני פרו), או מכל סיבה אחרת. במצבים כאלה קורה לפעמים שהחיבור לחשמל תקין, אך קווי התקשורת RX ו-TX מחוברים הפוך, או בצורה רופפת, או למקומות לא נכונים. גם אז ניתקל באותה הודעת שגיאה. הפתרון: לבדוק בשבע עיניים את החיבורים של מודול התקשורת.

6. מנהלי התקנים שגויים: ייתכן שמנהלי ההתקנים (דרייברים) שמותקנים במחשב עבור הארדואינו או מודול התקשורת אינם מתאימים לחומרה, והדבר משבש את התקשורת. תקלה מסיבה זו צפויה להופיע כבר בפעם הראשונה שמשתמשים בלוח ארדואינו או במודול תקשורת חדש, ובמיוחד אם מדובר בחומרה ממקור מפוקפק. הפתרון: הורידו את מנהלי ההתקנים העדכניים ביותר מ-arduino.cc, ואם זה עדיין לא עוזר, נסו לקרוא את הכיתוב על ג'וק התקשורת (זה הקרוב ביותר לחיבור ה-USB) ולחפש לפי זה באינטרנט את הקבצים המתאימים. [תודה ל-avi שהזכיר את הסיבה האפשרית והחשובה הזו לשגיאה]

סיכום

אם הודעת השגיאה הופיעה כשלוח הארדואינו מחובר למחשב בכבל ה-USB הרגיל, הסיבה היא כמעט תמיד סעיפים 3 או 4 שהוזכרו. אם החיבור הוא אחר יש לבחון גם את אפשרות 5. ואם שום דבר מאלה לא עוזר, בדקו גם את 6, את 1 ואת 2.

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

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

הוצאתי את הבקר מהתואם אונו
חיברתי tx-tx
rx-rx
5v-vcc
gnd-gnd
reset -DTR
וב"ה צרב הblink עלה כמו שצריך (:

אצלי לא מצאתי את הפיתרון ברשימה…
אני מנסה להעלות את הסקיצה דרך תואם אונו שהפכתי לצורב isp, חיברתי כמובן
11,12,13 ל11,12,13
10 לreset
5v לvcc
אדמה לאדמה
ועדיין השגיאה המעצבנת הזאת.
ניסיתי אפילו ללחוץ על הreset כמו שאמרו אבל לא הועיל.

עריכה: עכשיו אני רואה שכתבת במקום אחר שצריך קבל ולא חיברתי, יכול להיות שזו הבעיה?

בעת הופעת השגיאה אצלי ביצעתי חיפוש זריז בגוגל והגעתי לכאן.
תוך מס' שניות התברר כי הסיבה היא סעיף 4 כפי שרשמת תודה!

יש לציין שניתן לתכנת לא רק דרך arduino IDE , אלא גם דרך תוכנת Atmel Studio דרך תכנת ISP .

אני ראיתי שיש את אותה שגיאה אם חסרים דרייברים
(זה יכול לקרות אם מחליפים גרסא של התוכנה בלי להחליף את הדרייבר)