Dioda na płytce świeci, ale komputer nie pokazuje portu. Po naciśnięciu BOOT i RESET urządzenie nagle wraca. Albo działają tylko jedne z dwóch identycznych gniazd USB-C. Takie objawy nie wystarczają do rozpoznania usterki — najpierw ustalmy, którędy rzeczywiście płyną dane.

USB-C opisuje złącze, a nie sposób programowania

Na płytkach spotkasz dwa główne rozwiązania:

Komputer → USB → konwerter USB–UART → TX/RX → mikrokontroler
Komputer → USB → natywny kontroler USB mikrokontrolera

W pierwszym przypadku komputer rozpoznaje osobny układ, np. CH343, CH340 lub CP2102. Sprawny i zasilany konwerter może zgłaszać się również wtedy, gdy ESP32 pozostaje w resecie. W drugim przypadku komunikację obsługuje sam ESP32. Aplikacja może zmienić funkcje pinów USB, wyłączyć kontroler albo wejść w sen, powodując zniknięcie urządzenia. Takie ograniczenia opisuje dokumentacja USB Serial/JTAG ESP32-S3.

Jeśli płytka ma dwa gniazda, sprawdzaj każde osobno. Oznaczenia typu UART, CH343, USB lub OTG pomogą, ale rozstrzygający jest schemat konkretnej rewizji. Więcej o osobnych adapterach przeczytasz w poradniku USB–UART.

Rodzina ESP32 to kilka różnych interfejsów

Układ Natywne USB D− / D+ Główny pin BOOT
Klasyczny ESP32, np. WROOM-32 Brak — GPIO0
ESP32-C3 USB Serial/JTAG GPIO18 / GPIO19 GPIO9
ESP32-C6 USB Serial/JTAG GPIO12 / GPIO13 GPIO9
ESP32-S2 USB OTG GPIO19 / GPIO20 GPIO0
ESP32-S3 USB OTG i USB Serial/JTAG GPIO19 / GPIO20 GPIO0

To numery GPIO układu, a nie numery kolejnych goldpinów. S2 nie ma sprzętowego USB Serial/JTAG znanego z C3/C6. Kontroler Serial/JTAG ma ustalone funkcje; dowolne urządzenia USB, np. HID, wymagają odpowiedniego kontrolera OTG i firmware. Możliwości USB w Arduino-ESP32, USB ESP32-C6.

Trzy etapy, trzy różne pytania

  1. Wykrycie USB: czy komputer odczytał deskryptory podłączonego urządzenia?
  2. Port szeregowy: czy sterownik utworzył port COM, ttyACM albo ttyUSB?
  3. Komunikacja aplikacji: czy program wysyła dane właśnie tym interfejsem?

Port może istnieć, choć program niczego nie wypisuje. Z kolei migająca dioda potwierdza tylko wykonywanie części programu — nie sprawność całej elektroniki.

Pierwszy test w Linuxie

Na czas testu odłącz dodatkowe moduły, przewody GPIO i zewnętrzne źródła zasilania. Zostaw samą płytkę podłączoną sprawdzonym kablem USB do danych. W terminalu uruchom:

sudo dmesg -w

Podłącz płytkę i w drugim terminalu wykonaj:

lsusb
ls -l /dev/ttyACM* /dev/ttyUSB* /dev/ttyCH343USB* 2>/dev/null
ls -l /dev/serial/by-id/ 2>/dev/null

Nowy identyfikator USB oznacza, że system rozpoznał urządzenie. Wpis ttyACM wskazuje port klasy CDC ACM, lecz sam w sobie nie dowodzi, że jest to natywne USB ESP32. CH343 również może korzystać z tego standardu; dedykowany sterownik WCH używa innych nazw. Źródło: sterownik CH343 producenta WCH.

Błędy deskryptorów, np. error -71 lub unable to enumerate, kierują uwagę na przewód, złącze, zasilanie i tor USB. Samo instalowanie kolejnych sterowników portu szeregowego nie jest wtedy pierwszym krokiem. Wypróbuj inny kabel i port komputera oraz sprawną płytkę na tym samym stanowisku.

Nazwy urządzeń mogą zmienić się po resecie. Gdy dostępny jest link w /dev/serial/by-id/, łatwiej rozpoznać tę samą płytkę. Jeśli port istnieje, ale aplikacja zgłasza Permission denied, sprawdź id oraz ls -l dla tego urządzenia. W wielu dystrybucjach dostęp zapewnia grupa dialout; w innych decydują inne grupy lub reguły udev. Po zmianie grup potrzebne bywa ponowne logowanie.

BOOT i RESET: uruchomienie fabrycznego bootloadera

Przy podłączonej płytce:

  1. Przytrzymaj BOOT.
  2. Naciśnij i puść RESET, RST albo EN.
  3. Puść BOOT.
  4. Ponownie sprawdź urządzenia i wybierz nowo utworzony port.

W ten sposób uruchamiasz tryb pobierania w ROM, zamiast dotychczasowego programu z Flash. Dla C3 i C6 BOOT zwykle wymusza niski stan GPIO9, a GPIO8 musi mieć odpowiedni wysoki poziom. W klasycznym ESP32, S2 i S3 podstawowym pinem jest GPIO0; pozostałe piny rozruchowe również mają znaczenie. Tryb startu C3, C6, S2.

Jeżeli natywne USB wróciło po tej procedurze, sprawdź konfigurację programu. Brak reakcji nadal wymaga sprawdzenia sprzętu, właściwego gniazda i skuteczności resetu; urządzenia ze zmienionymi ustawieniami zabezpieczeń mogą mieć ograniczony tryb pobierania. BOOT nie naprawia błędu enumeracji osobnego konwertera USB–UART.

Co zmienia USB CDC On Boot?

W Arduino IDE opcja USB CDC On Boot → Enabled dla obsługiwanej płytki pozwala skierować Serial na natywne USB. Dla UART0 dostępny jest wtedy zwykle Serial0. Na S3 dodatkowo znaczenie ma USB Mode: sprzętowe CDC/JTAG oraz USB-OTG/TinyUSB są różnymi konfiguracjami. Ustawienia zależą od modelu płytki i wersji pakietu. Menu narzędzi Arduino-ESP32.

Przykład dla C6 z natywnym USB i osobnym konwerterem podłączonym do UART0, przy włączonym USB CDC:

void setup() {
  Serial.begin(115200);
  Serial0.begin(115200);
  delay(1000);
}

void loop() {
  Serial.println("IMZ: konsola natywnego USB");
  Serial0.println("IMZ: konsola UART0");
  delay(1000);
}

Po wgraniu otwieraj kolejno port odpowiadający każdemu gniazdu. Dla UART ustaw monitor na 115200. To przykład diagnostyczny do dopasowania do schematu płytki, bez deklaracji testu sprzętowego. Włączenie CDC nie odłącza elektrycznie konwertera CH343.

Sprawdź bootloader bez kasowania pamięci

Zamknij monitor portu, wprowadź płytkę w Download Mode i użyj polecenia odczytującego identyfikator Flash, ze swoim portem:

python -m esptool --port /dev/ttyACM0 flash-id

To składnia esptool 5.x; w 4.x komenda nazywała się flash_id. Odczyt nie kasuje Flash, ale program może zresetować płytkę. Sukces potwierdza komunikację z bootloaderem i pamięcią, a nie pełny test Wi-Fi czy GPIO. Więcej przypadków opisuje diagnostyka esptool.

Gdzie szukać przyczyny?

Objaw Następny krok
Natywne USB działa tylko po BOOT + RESET Sprawdź firmware, tryb USB i użycie jego GPIO
Konwerter jest widoczny, konsola milczy Sprawdź port, Serial/Serial0 i baud rate
Port jest zajęty Zamknij inne monitory i aplikacje używające portu
Błąd deskryptora USB Inny kabel/port, kontrola złącza i zasilania
Brak portu mimo widocznego urządzenia USB Sprawdź interfejsy i właściwy sterownik

Nie łącz wyjść TX dwóch aktywnych nadajników ani nie podawaj 5 V na GPIO ESP32. Przy podłączaniu adaptera UART potrzebna jest zgodność poziomów logicznych i wspólna masa.

Jeśli problem pozostaje, przygotuj model płytki, oznaczenie gniazda, wynik BOOT + RESET i krótki log z momentu podłączenia. Z tych danych można zaplanować następny test; sam log nie określa przyczyny fizycznego uszkodzenia. Dla drugiego systemu przygotowaliśmy diagnostykę USB w Windows.