آموزش عیبیابی بوت ESP8266 / ESP32
آموزش عیبیابی بوت ESP8266 / ESP32
راهنمای جامع شناسایی و رفع مشکلات بوت، نصب و استفاده از esptool
چرا این آموزش؟
میکروکنترلرهای ESP8266 و ESP32 از محبوبترین تراشههای WiFi/IoT هستند، اما بسیاری از کاربران با مشکلات بوت، پروگرام نشدن و ریستهای مکرر دستوپنجه نرم میکنند. این راهنما تمام حالتهای بوت، ابزار esptool و رایجترین خطاها را به زبان ساده توضیح میدهد.
! نکات مهم قبل از شروع
- تمام پینهای ESP 3.3V هستند و تحمل 5V ندارند (لاین دیتایی که بین سنسور ها وصل میشود مشکلی ندارد چون جریان بسیار پایینی دارند)
- برای پروگرام کردن نیاز به USB-TTL Converter با درایور نصبشده دارید
- از کابل USB دیتا (نه شارژ) استفاده کنید
- پینهای Strapping در زمان بوت نباید به اشتباه HIGH/LOW شوند
۱ مبدل USB به TTL چیست؟
تعریف ساده
USB-TTL Converter یک مبدل سریال است که ارتباط USB کامپیوتر را به پروتکل UART (سریال TTL) تبدیل میکند. چیپهای ESP8266/ESP32 از طریق این پروتکل پروگرام میشوند.
انواع رایج چیپهای مبدل
! نکته مهم در نصب درایور
اگر برد شما توسط ویندوز شناسایی نمیشود یا پورت COM نمایش داده نمیشود، ابتدا درایور مربوطه را نصب کنید.
اگر در نصب به مشکل بر خوردید میتوانید از طریق آموزش نصب دستی درایور اقدام به نصب درایور نمایید.
اتصال USB-TTL به ESP8266
نکته برای کاربران برد توسعه (Dev Board):
اگر از بردهای توسعه آماده مانند NodeMCU، Wemos D1 Mini یا ESP32 DevKit استفاده میکنید، این بردها معمولاً چیپ USB-TTL (معمولاً CH340 یا CP2102) را روی خود برد دارند و نیازی به مبدل جداگانه نیست. کافی است برد را مستقیماً با کابل USB به کامپیوتر وصل کنید.
اتصال USB-TTL به ESP32
توجه: پینهای GPIO1 (TX) و GPIO3 (RX) در ESP8266 و ESP32 یکسان هستند. تفاوت اصلی در پینهای کنترل بوت (GPIO0، GPIO2، GPIO15) است که در بخشهای بعدی توضیح داده میشود.
۲ نصب و راهاندازی esptool
esptool چیست؟
esptool.py ابزار رسمی پایتونی شرکت Espressif برای پروگرام کردن، خواندن، پاک کردن و عیبیابی تراشههای ESP8266 و ESP32 است. این ابزار تمام حالتهای بوت را مدیریت میکند و قدرتمندترین روش برای کار با فلش ESP است.
روش نصب در ویندوز
- ابتدا Python 3.7 (به بالا) را از python.org نصب کنید. هنگام نصب، گزینه "Add Python to PATH" را تیک بزنید.
- CMD (Command Prompt) را به صورت Administrator باز کنید (کلیک راست روی Start → Windows Terminal (Admin))
- دستور زیر را اجرا کنید:
راهنمای کاربران ویندوز:
اگر دستور pip شناسایی نشد، مسیر Python را به PATH اضافه کنید یا از py -m pip install esptool pyserial استفاده کنید.
نکته: در Linux ممکن است نیاز به pip3 یا اجرا با sudo داشته باشید.
نکته مهم:
در نسخههای قدیمیتر esptool از دستور esptool.py version استفاده میشد. در نسخههای جدیدتر (4.x به بالا) دستور صحیح esptool version است (بدون .py). اگر دستور اول کار نکرد، دستور دوم را امتحان کنید.
بررسی نصب
خروجی باید نسخه نصبشده را نشان دهد (مثلاً 4.8.1).
نصب در Arduino IDE
اگر از Arduino IDE استفاده میکنید، esptool به صورت خودکار همراه با بردهای ESP نصب میشود:
- Arduino IDE را باز کنید
- به File → Preferences بروید
- در قسمت Additional Board Manager URLs این لینک را اضافه کنید:
https://dl.espressif.com/dl/package_esp32_index.json
- به Tools → Board → Board Manager بروید
- "ESP32" یا "ESP8266" را جستجو و نصب کنید
- esptool به صورت خودکار نصب میشود و در پوشه
C:\Users\[Username]\AppData\Local\Arduino15\packages\قرار میگیرد
۳ حالتهای بوت ESP8266
پینهای تعیینکننده بوت
ESP8266 با سه پین GPIO0، GPIO2 و GPIO15 حالت بوت خود را در زمان روشن یا ریست تعیین میکند. این پینها در لحظه ریست نمونهبرداری میشوند.
توجه: GPIO2 دارای مقاومت Pull-up داخلی است و نیازی به مقاومت خارجی ندارد. GPIO15 باید همیشه LOW باشد (مقاومت Pulldown خارجی 10K).
تفسیر لاگ بوت ESP8266
در بادریت 74880 در Serial Monitor لاگ بوت قابل مشاهده است:
جدول مقادیر rst cause:
مقدار boot mode (m,n) - توضیح کامل:
الگوی بوت: boot mode : (m,n) که در آن m وضعیت سه پین GPIO (15, 0, 2) را نشان میدهد و n محل فایل بوت را نشان میدهد.
جدول مقادیر m (وضعیت پینها):
جدول مقادیر n (محل فایل بوت):
مثال تفسیر:
boot mode:(3,6) → GPIO15=LOW, GPIO0=HIGH, GPIO2=HIGH → بوت از فلش (Normal Mode). SDIO LowSpeed V1 IO, UART1 booting.
boot mode:(1,6) → GPIO15=LOW, GPIO0=LOW, GPIO2=HIGH → UART Bootloader (Download Mode). SDIO LowSpeed V1 IO, UART1 booting.
۴ حالتهای بوت ESP32
پینهای Strapping ESP32
ESP32 دارای 5 پین Strapping است که در زمان ریست نمونهبرداری میشوند. این پینها با مقاومتهای داخلی Weak Pull-up/down همراه هستند.
! هشدار مهم GPIO12
اگر GPIO12 در زمان بوت HIGH شود، ولتاژ فلش به 1.8V تغییر میکند و چیپ نمیتواند بوت شود! این پین دارای Pull-down داخلی است، اما از اتصال مقاومت Pull-up به آن خودداری کنید.
تفسیر لاگ بوت ESP32
جدول مقادیر rst:0xNN:
مقادیر boot:0xNN:
- 0x13 (00010011): SPI_FAST_FLASH_BOOT - بوت عادی از فلش
- 0x03 (00000011): DOWNLOAD_BOOT - حالت پروگرام (GPIO0=LOW)
- 0x01: SDIO_REI_FEO_V1_BOOT - حالت SDIO
۵ دستورات پرکاربرد esptool
۱. شناسایی چیپ و اطلاعات اولیه
۲. پاک کردن فلش
۳. نوشتن فریمور (Flash Write)
! تفاوت حالتهای فلش:
- QIO (Quad I/O): 4 خط داده - سریعترین
- QOUT (Quad Output): 4 خط خروجی
- DIO (Dual I/O): 2 خط داده - سازگارتر
- DOUT (Dual Output): 2 خط خروجی - سازگارترین
اگر برد شما با QIO کار نکرد، از DIO یا DOUT استفاده کنید.
۴. خواندن فلش
۵. بررسی و تحلیل فایل باینری
۶. دستورات پیشرفته
۶ رایجترین خطاها و راهحلها
خطا: "Failed to connect to ESP32/ESP8266: Timed out waiting for packet header"
علت: چیپ وارد حالت Download Mode نشده است.
راهحل:
- دکمه BOOT (GPIO0) را نگه دارید، دکمه EN (RST) را فشار دهید و رها کنید، سپس BOOT را رها کنید
- خازن 10µF بین پین EN و GND لحیم کنید (برای اتوماتیک شدن)
- سرعت باد را کم کنید:
--baud 115200 - کابل USB را عوض کنید
- مقاومت Pulldown 10K روی GPIO0 و GPIO15 بررسی کنید
خطا: "Wrong boot mode detected (0x13)! The chip needs to be in download mode"
علت: GPIO0 HIGH است و چیپ در حالت Normal Boot است.
راهحل:
- GPIO0 را به GND وصل کنید و دوباره ریست کنید
- مدار Auto-reset (DTR/RTS) را بررسی کنید
- مقاومتهای Pull-up روی GPIO0 را بررسی کنید
خطا: "Invalid head of packet (0xXX): Possible serial noise or corruption"
علت: نویز سریال یا مشکل اتصال.
راهحل:
- کابل USB کوتاه و باکیفیت استفاده کنید
- برد را از بردبورد جدا کنید (ممکن است پینهای فلش اتصال کوتاه شده باشند)
- سرعت باد را کم کنید:
--baud 9600 - منبع تغذیه را بررسی کنید (FTDI داخلی 3.3V برای ESP کافی نیست)
خطا: "A serial exception error occurred: read failed"
علت: مشکل درایور یا دسترسی به پورت.
راهحل:
- درایور USB-TTL را نصب یا بروزرسانی کنید (راهنمای CH340)
- پورت صحیح را انتخاب کنید
- در Linux کاربر را به گروه dialout اضافه کنید:
sudo usermod -a -G dialout $USER - نرمافزار دیگری پورت را اشغال نکرده باشد
چگونه برنامهای که پورت سریال را اشغال کرده پیدا کنیم؟
در ویندوز:
برای پیدا کردن سریع و آسان برنامهای که پورت COM را اشغال کرده، از نرمافزار COM Port Monitor استفاده کنید:
- نرمافزار را از GitHub دانلود کنید: github.com/DMohammed/COM-Port-Monitor
- فایل
COM Port Monitor.exeرا اجرا کنید (نیاز به نصب ندارد) - پورت مورد نظر (مثلاً COM3) را انتخاب کنید
- نرمافزار به صورت خودکار نشان میدهد کدام برنامه در حال استفاده از آن پورت است
- حالا میدانید کدام برنامه پورت شما را اشغال کرده و میتوانید آن را ببندید
نکته:
رایجترین برنامههایی که پورت COM را اشغال میکنند:
- Arduino IDE (Serial Monitor باز)
- PlatformIO (VS Code)
- Putty, Tera Term, RealTerm
- ESP-IDF یا esptool در حال اجرا
- نرمافزار چاپگر (اگر پورت COM به چاپگر متصل شده)
در لینوکس:
خطا: "Brownout detector was triggered" (ESP32)
علت: افت ولتاژ ناگهانی.
راهحل:
- کابل USB کوتاه و باکیفیت استفاده کنید
- از هاب USB با تغذیه خارجی استفاده کنید
- رگولاتور 3.3V برد را بررسی کنید
- بارهای سنگین (رله، سروو، LED) را از منبع جداگانه تغذیه کنید
- خازن Decoupling 100nF + 10µF نزدیک پین تغذیه اضافه کنید
خطا: "rst cause:4, boot mode:(3,6)" - ریست مکرر ESP8266
علت: Watchdog سختافزاری به دلیل هنگ کردن.
راهحل:
- کد را بررسی کنید - حلقههای بینهایت یا delay طولانی
- تابع
ESP.wdtFeed()در loop اضافه کنید - مقدار تغذیه را بررسی کنید (WiFi جریان زیادی مصرف میکند)
- از
yield()یاdelay(0)در حلقههای طولانی استفاده کنید
خطا: "Invalid header at 0x1000" (ESP32)
علت: بوتلودر خراب یا در آدرس اشتباه فلش شده.
راهحل:
- فلش را کاملاً پاک کنید:
erase_flash - بوتلودر صحیح را در آدرس 0x1000 بنویسید
- GPIO2 را بررسی کنید (نباید HIGH باشد در زمان GPIO0=LOW)
- ولتاژ VDD_SDIO را بررسی کنید (GPIO12 نباید HIGH باشد)
مشکل: پروگرام میشود اما برنامه اجرا نمیشود
علتهای احتمالی:
- حالت فلش اشتباه (QIO به جای DIO) - با
--flash_mode dioتست کنید - سایز فلش اشتباه انتخاب شده
- بوتلودر موجود نیست یا خراب است
- پینهای GPIO6-GPIO11 به فلش داخلی متصل هستند و نباید استفاده شوند
۷ پروگرام کردن دستی (بدون Auto-Reset)
اگر برد شما مدار Auto-Reset ندارد، باید به صورت دستی چیپ را وارد Download Mode کنید:
نکته برای کاربران برد توسعه:
بردهای توسعه مانند NodeMCU، Wemos D1 Mini و ESP32 DevKit معمولاً دکمههای BOOT (یا FLASH) و EN (یا RST) را روی برد دارند. از این دکمهها استفاده کنید.
روش صحیح (دو دکمه):
- دکمه BOOT (یا FLASH) را نگه دارید - این GPIO0 را LOW میکند
- دکمه EN (یا RST) را فشار دهید و رها کنید - این یک پالس ریست میدهد
- دکمه BOOT را رها کنید
- حالا چیپ در Download Mode است و میتوانید پروگرام کنید
روش با سیمکشی برای ESP8266:
روش با سیمکشی برای ESP32:
تبریک! با تمرین این روش، میتوانید هر برد ESP را حتی بدون دکمههای اختصاصی پروگرام کنید.
۸ راهنمای Arduino IDE برای کاربران ویندوز
تنظیمات صحیح در Arduino IDE
- Tools → Board → برد مناسب را انتخاب کنید:
- ESP8266: "NodeMCU 1.0 (ESP-12E Module)" یا "Generic ESP8266 Module"
- ESP32: "ESP32 Dev Module" یا "DOIT ESP32 DEVKIT V1"
- Tools → Port → پورت COM صحیح را انتخاب کنید (مثلاً COM3)
- Tools → Upload Speed → 115200 یا 921600
- Tools → Flash Size → 4MB (32Mb) برای اکثر بردها
- Tools → Flash Mode → DIO (اگر QIO کار نکرد)
پیدا کردن پورت COM در ویندوز
- برد را به USB وصل کنید
- کلیدهای Win + X را فشار دهید → Device Manager
- به بخش Ports (COM & LPT) بروید
- برد شما باید با نامی مانند "USB-SERIAL CH340 (COM3)" یا "Silicon Labs CP210x (COM4)" نمایش داده شود
- اگر نمایش داده نشد، درایور را نصب کنید
نکته مهم برای کاربران ویندوز:
اگر Arduino IDE نمیتواند برد را پروگرام کند اما esptool کار میکند، ممکن است نسخه esptool داخلی Arduino IDE قدیمی باشد. از Tools → Board → Boards Manager بردها را بروزرسانی کنید.
مشکل رایج: "esptool.py not found" در Arduino IDE
راهحل:
- Arduino IDE را کاملاً ببندید و دوباره باز کنید
- برد را از Boards Manager حذف و دوباره نصب کنید
- اگر مشکل حل نشد، esptool را به صورت دستی نصب کنید (بخش 2)
برای سوالات بیشتر به انجمن مراجعه بفرمایید.