🛠️ خطای آپلود ESP32: حل Failed to connect و Timed out waiting for packet header
کد را نوشتهای، دکمهی Upload را زدهای، کامپایل تمام شده و بعد چند خط قرمز: A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header. این پرتکرارترین خطای آپلود ESP32 روی برد ESP32 است و خوشبختانه تقریباً هیچوقت یعنی برد سوخته است. در این آموزش اول میفهمیم موقع آپلود چه اتفاقی میافتد، بعد پیامهای رایج را معنی میکنیم و قدم به قدم، از ساده به سخت، مشکل را حل میکنیم.
موقع آپلود چه اتفاقی میافتد؟
آردوینو IDE بعد از کامپایل، برنامهای به اسم esptool را اجرا میکند. esptool باید تراشه را در حالت دانلود (Download mode) ریاستارت کند؛ یعنی لحظهی روشن شدن، پین GPIO0 باید LOW باشد. روی بیشتر بردها دو خط کنترلی تراشهی USB به سریال (DTR و RTS) از طریق دو ترانزیستور این کار را خودکار انجام میدهند: EN را پایین میکشند، GPIO0 را پایین نگه میدارند و EN را رها میکنند. عبارت Connecting....____ یعنی esptool دارد همین کار را تکرار میکند و منتظر جواب بوتلودر داخلی ESP32 است. پیام «Timed out waiting for packet header» یعنی این جواب هیچوقت نرسید. معنی خود بوتلودر را هم در واژهنامه ببین.
پیامهای رایج و معنیشان
| پیام | معنی | اول این را امتحان کن |
|---|---|---|
| Failed to connect to ESP32: Timed out waiting for packet header | برد وارد حالت دانلود نشد | دکمهی BOOT |
| Failed to connect to ESP32: No serial data received | پورت باز شد ولی هیچ دادهای نیامد | پورت درست، BOOT، کابل |
| Wrong boot mode detected (0x13)! The chip needs to be in download mode | برد در حالت اجرای عادی بالا آمد | دکمهی BOOT یا خازن EN |
| could not open port ... Access is denied | یک برنامهی دیگر پورت را گرفته است | بستن سریال مانیتور و برنامههای دیگر |
| پورت در منوی Tools خاکستری است یا نیست | ویندوز برد را نمیشناسد | کابل داده و درایور |
| Invalid head of packet یا MD5 of file does not match | داده وسط راه خراب شد | کم کردن Upload Speed |
اگر خطای تو پیش از این مرحله و در کامپایل است، مثلاً «was not declared in this scope»، مشکل از کد است نه آپلود؛ آن را در ارورهای رایج آردوینو ببین.
حل مشکل قدم به قدم
۱. ترفند دکمهی BOOT
سریعترین راه: Upload را بزن و وقتی Connecting... ظاهر شد، دکمهی BOOT (روی بعضی بردها IO0) را فشار بده و نگه دار. وقتی درصدهای Writing at 0x... شروع شد، رهایش کن. روش دستی کاملتر: BOOT را نگه دار، یکبار دکمهی EN (یا RST) را بزن و رها کن، بعد BOOT را رها کن؛ حالا برد در حالت دانلود منتظر است و Upload را بزن. بعد از آپلود یکبار EN را بزن تا برنامهی جدید اجرا شود.
۲. راهحل دائمی: خازن ۱۰ میکروفاراد
روی خیلی از بردهای ارزان، مدار ریاستارت خودکار کمی زود عمل میکند. یک خازن الکترولیتی ۱۰ میکروفاراد بین پین EN و GND (پایهی منفی به GND) این زمانبندی را درست میکند و دیگر لازم نیست دکمه را نگه داری.
۳. کابل، پورت و درایور
- خیلی از کابلهای USB فقط برای شارژند و سیم داده ندارند. اگر با وصل کردن برد هیچ پورت تازهای در Device Manager زیر Ports (COM & LPT) ظاهر نمیشود، اول کابل را عوض کن.
- اگر وسیلهای با علامت زرد و اسم ناشناخته ظاهر شد، درایور تراشهی USB برد را نصب کن: CP210x برای بردهایی که تراشهی Silicon Labs دارند و CH340 برای بقیه. روی خود تراشهی کوچک کنار سوکت USB نوشته شده است.
- هاب USB و پورت جلوی کیس را کنار بگذار و مستقیم به پورت پشت کامپیوتر وصل کن.
نصب کامل هسته و درایورها را در نصب ESP32 در آردوینو IDE قدمبهقدم گفتهایم.
۴. برد و پورت درست
از منوی Tools، برای بردهای معمولی DevKit گزینهی ESP32 Dev Module را انتخاب کن. ESP32-S3 و ESP32-C3 گزینههای خودشان را دارند و اگر برد را اشتباه انتخاب کنی، esptool دنبال تراشهی دیگری میگردد. پورت را هم یکبار با کشیدن و وصل کردن برد چک کن تا بدانی کدام COM مال اوست.
۵. پورت اشغال
سریال مانیتور در یک پنجرهی دیگر آردوینو IDE، برنامههایی مثل Cura یا یک ترمینال سریال باز، پورت را قفل میکنند و خطای Access is denied میدهند. همه را ببند و دوباره امتحان کن.
۶. سرعت آپلود
در منوی Tools، Upload Speed را از ۹۲۱۶۰۰ به ۱۱۵۲۰۰ کم کن. با کابل بلند یا تراشهی USB ضعیف، سرعت بالا داده را خراب میکند. آپلود کندتر میشود ولی مطمئنتر. دربارهی معنی این عدد، نرخ باود را ببین.
۷. مدار روی پینهای بوت
برد را از بردبورد و همهی سیمها جدا کن و یکبار تنها آپلود کن. پینهای GPIO0، GPIO2، GPIO12 و GPIO15 در لحظهی روشن شدن نقش تعیین حالت دارند. مثلاً اگر GPIO12 به چیزی وصل باشد که آن را HIGH کند، تراشه ولتاژ حافظهی فلش را اشتباه انتخاب میکند و آپلود شکست میخورد. GPIO2 هم در حالت دانلود باید LOW یا آزاد باشد. پینهای ۶ تا ۱۱ هم به حافظهی فلش وصلاند و هیچوقت نباید استفاده شوند. جزئیات در پین اوت ESP32 است.
۸. برد خواب است یا مدام ریاستارت میشود
اگر برنامهی قبلی برد را به دیپ اسلیپ میبرد یا بلافاصله کرش میکند، esptool فرصت حرف زدن پیدا نمیکند. روش دستی قدم ۱ (BOOT را نگه دار، EN را بزن) برد را قبل از اجرای برنامهی قبلی در حالت دانلود نگه میدارد.
۹. بردهای با USB داخلی (S3 و C3)
بعضی بردهای ESP32-S3 و ESP32-C3 تراشهی USB جدا ندارند. اگر برنامهای USB را از کار انداخته باشد، پورت ناپدید میشود. BOOT را نگه دار، RST را بزن، BOOT را رها کن؛ پورت تازهای ظاهر میشود که باید همان را انتخاب کنی. برای دیدن خروجی سریال روی این بردها، گزینهی USB CDC On Boot را در منوی Tools روشن کن.
۱۰. آخرین آزمایش
اگر هیچکدام جواب نداد، از خط فرمان دستور esptool.py --port COM5 flash_id را اجرا کن (شمارهی پورت خودت را بگذار). اگر این هم با دکمهی BOOT جواب نداد و برد روی کامپیوتر دیگری هم همینطور است، احتمالاً تراشهی USB یا خود ماژول آسیب دیده است.
کد تست بعد از حل مشکل
وقتی آپلود موفق شد، این کد کوچک را بریز. اگر در سریال مانیتور با سرعت ۱۱۵۲۰۰ پیام «Upload OK» و مشخصات تراشه را دیدی و LED آبی روی برد چشمک زد، همهچیز درست است:
// Upload test: if you can read this in the Serial Monitor, uploading works.
const int LED = 2; // built-in LED on most ESP32 DevKit boards
bool on = false;
void setup() {
Serial.begin(115200);
delay(500);
pinMode(LED, OUTPUT);
Serial.println("Upload OK!");
Serial.print("Chip model: ");
Serial.println(ESP.getChipModel());
Serial.print("Cores: ");
Serial.println(ESP.getChipCores());
Serial.print("Flash size (MB): ");
Serial.println(ESP.getFlashChipSize() / (1024 * 1024));
}
void loop() {
on = !on;
digitalWrite(LED, on ? HIGH : LOW);
delay(500);
}
اگر بهجای متن، حروف درهم دیدی، سرعت سریال مانیتور روی ۱۱۵۲۰۰ نیست. اگر بعد از هر آپلود برد ریاستارت میشود و پیام Brownout میبینی، تغذیه یا کابل ضعیف است.
شبیهساز در عیبیابی چه کمکی میکند؟
در شبیهساز کابل و درایور و دکمهی BOOT وجود ندارد؛ پس خطای آپلود هم نیست. همین ویژگی برای عیبیابی مفید است: کد را اول در شبیهساز اجرا کن. اگر آنجا درست کار کرد، مطمئنی مشکل آپلود از اتصال و سختافزار است، نه از برنامه. و تا وقتی برد واقعی را درست کنی، کارت متوقف نمیماند. نمونهی آمادهی سلام ESP32 — چشمک دو LED در تینکرکد فارسی است؛ باز کردنش رایگان است و اجرای برد ESP32 اشتراک Plus میخواهد. اگر میخواهی کد را با کامپایلر واقعی هم بسنجی، دربارهی کامپایل واقعی آنلاین بخوان؛ این قابلیت هم جزو امکانات Plus است.
بعد از اینکه برنامه روی برد رفت، اگر نوبت وصل شدن به شبکه رسید و آنجا گیر کردی، ESP32 به وایفای وصل نمیشود را ببین. همهی آموزشهای این برد هم در صفحهی ESP32 هستند.
کدت را اول در شبیهساز امتحان کن 🛠️سؤالهای رایج
دکمهی BOOT را دقیقاً کی باید نگه دارم؟
وقتی در پایین آردوینو IDE عبارت Connecting همراه با نقطهها ظاهر شد، دکمهی BOOT را فشار بده و نگه دار تا درصدهای Writing at شروع شوند، بعد رها کن. اگر این کار همیشه لازم است، یک خازن ۱۰ میکروفاراد بین EN و GND مشکل را دائمی حل میکند.
چرا پورت ESP32 در آردوینو IDE خاکستری است یا اصلاً نیست؟
یا کابل فقط شارژ است و سیم داده ندارد، یا درایور تراشهی USB برد (CP2102 یا CH340) نصب نیست. کابل دیگری امتحان کن و در Device Manager ببین برد زیر Ports ظاهر میشود یا با علامت زرد.
آیا در شبیهساز هم خطای آپلود میگیرم؟
نه. در شبیهساز کابل و پورت USB وجود ندارد و کد مستقیم اجرا میشود. همین به عیبیابی کمک میکند: اگر کد در شبیهساز درست کار میکند، میدانی مشکل آپلود از اتصال و سختافزار است، نه از برنامه.