> ## Documentation Index
> Fetch the complete documentation index at: https://docs.protonverse.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Proton AI Core Troubleshooting: Fixes for Common Issues

> Diagnose and fix common Proton AI Core issues including upload errors, camera failures, Wi-Fi problems, missing COM ports, and boot loops.

If something is not working as expected, this guide walks you through the most common issues encountered when setting up and using Proton AI Core. Work through the relevant section below before reaching out to support — most problems can be resolved in a few steps.

<AccordionGroup>
  <Accordion title="Board not detected / No COM port">
    If your operating system does not show a COM port or serial device after plugging in Proton AI Core, try the following steps in order:

    * **Use a data-capable USB-C cable.** Many USB-C cables are charge-only and cannot carry data. Swap to a cable you know works for data transfer.
    * **Install the correct USB driver.** Proton AI Core uses a USB-to-UART bridge that requires a driver on some systems. Visit the [Driver Installation guide](/setup/drivers) for the correct installer for your OS.
    * **Try a different USB port.** Some USB hubs or ports do not supply enough power or have signalling issues. Connect directly to a port on your machine.
    * **Linux users — add yourself to the `dialout` group.** Run `sudo usermod -aG dialout $USER`, then log out and back in. Without this, Linux will deny access to the serial device.
  </Accordion>

  <Accordion title="Upload fails / esptool error">
    Upload failures are almost always caused by the board not entering bootloader mode at the right moment, or by a conflicting process holding the serial port.

    * **Manually enter bootloader mode.** Hold the **BOOT** button on the board, then tap **RESET**. Keep holding BOOT until the upload starts in your IDE, then release it.
    * **Check your board and port selection.** In Arduino IDE, confirm you have selected **ESP32S3 Dev Module** under Tools → Board, and the correct port under Tools → Port.
    * **Lower the upload speed.** Open Tools → Upload Speed and set it to **115200**. This is slower but more reliable on noisy USB connections.
    * **Close the Serial Monitor before uploading.** An open Serial Monitor holds the serial port and prevents esptool from connecting. Close it first, then upload.
  </Accordion>

  <Accordion title="Camera initialization failed (esp_camera_init() returns non-zero)">
    A non-zero return value from `esp_camera_init()` means the firmware could not establish communication with the camera module. Check each of the following:

    * **Reseat the ribbon cable.** Disconnect the camera ribbon, re-insert it fully, and close the latch. A partially seated cable is the most common cause of this error.
    * **Verify your pin definitions.** The camera pin numbers must match your board's schematic. Pin numbers for Proton AI Core are **To be confirmed** — download the pinout PDF from the [Downloads](/resources/downloads) page once available.
    * **Confirm your camera module is OV2640 or OV3660.** Other camera modules are not supported and will fail to initialise.
    * **Enable PSRAM in board settings.** In Arduino IDE, go to Tools → PSRAM and set it to **Enabled**. PSRAM is required for JPEG frame capture and frame buffer allocation.
  </Accordion>

  <Accordion title="No output on Serial Monitor">
    If you open the Serial Monitor but see nothing — or only garbled characters — one of the following is usually the cause:

    * **Set the baud rate to 115200.** Use the dropdown in the bottom-right corner of the Serial Monitor to match the `Serial.begin(115200)` call in your sketch.
    * **Enable USB CDC On Boot.** In Arduino IDE, go to Tools → USB CDC On Boot and set it to **Enabled**. This is required for USB serial output on ESP32-S3.
    * **Press RESET after opening the Serial Monitor.** Some output is printed during early boot, before the monitor connects. Pressing RESET replays that output.
    * **macOS port selection.** On macOS, select the port listed as `/dev/cu.usbmodem...` rather than `/dev/tty.usbmodem...`. The `cu` variant is the correct one for serial communication.
  </Accordion>

  <Accordion title="Wi-Fi won't connect">
    If `WiFi.begin()` never reaches the `WL_CONNECTED` state, work through these checks:

    * **Double-check your SSID and password.** Both are case-sensitive. A single wrong character will cause the connection to fail silently.
    * **Use a 2.4 GHz network.** The ESP32-S3's Wi-Fi radio supports 2.4 GHz only. 5 GHz networks will not appear or connect.
    * **Watch for special characters in your SSID.** Certain characters (e.g. `"`, `\`, `#`) may need to be escaped in your source code. If possible, test with a simple alphanumeric SSID first.
    * **Move closer to the router.** During initial testing, work within a few metres of your access point to rule out signal strength as a variable.
  </Accordion>

  <Accordion title="Board reboots continuously (boot loop)">
    A continuous reboot cycle means the firmware is crashing during or shortly after startup. The three most common causes are memory exhaustion, a watchdog timeout, and insufficient power.

    * **Reduce tensor arena size or move it to PSRAM.** If you are running a TFLite model, the tensor arena is the most common source of stack overflows or heap failures. Allocate it in PSRAM (see the heap tip below) and reduce its size if possible.
    * **Add `delay()` or `yield()` in long loops.** The ESP32-S3 has a hardware watchdog that resets the chip if the main task does not yield to the scheduler. Insert a small `delay(1)` or `yield()` inside any tight loop.
    * **Check your power supply.** Underpowered USB ports — especially on older hubs — can cause brownouts that look like crashes. Use a powered USB hub or connect directly to your computer's USB port.
  </Accordion>

  <Accordion title="Out of memory (heap allocation failed)">
    Proton AI Core's internal SRAM is limited. When running camera capture and AI inference together, you will need to use PSRAM for large allocations.

    * **Use `heap_caps_malloc` to allocate in PSRAM.** Replace large `malloc()` calls with:
      ```c theme={null}
      uint8_t *buf = (uint8_t *) heap_caps_malloc(size, MALLOC_CAP_SPIRAM);
      ```
    * **Use a smaller frame size for camera captures.** Reduce the frame size to `FRAMESIZE_QVGA` or `FRAMESIZE_CIF` during development. Full-resolution frames consume significantly more memory.
    * **Return frame buffers promptly.** After processing each camera frame, call `esp_camera_fb_return(fb)` immediately to release the buffer back to the pool. Holding multiple frames simultaneously will exhaust PSRAM quickly.
  </Accordion>

  <Accordion title="BLE not advertising / not visible">
    If your phone or BLE scanner cannot see the Proton AI Core device, check the initialisation order and the advertising call.

    * **Call `BLEDevice::init()` first.** This must be the first BLE call in your sketch. Calling `BLEServer::createServer()` before `init()` will silently fail.
    * **Restart Bluetooth on your phone or laptop.** Toggle Bluetooth off and back on before scanning. Stale device caches can hide newly advertising peripherals.
    * **Confirm `BLEAdvertising::start()` is called in `setup()`.** If this call is placed inside `loop()` without a guard, it may be called repeatedly and interfere with the advertising state.
  </Accordion>
</AccordionGroup>

<Tip>
  Still stuck? Email **[support@protonverse.io](mailto:support@protonverse.io)** with your IDE version, operating system, and the full error output copied from the console. The more detail you provide, the faster we can help.
</Tip>
