esp32_micropython is an all-in-one command-line utility designed to simplify flashing MicroPython firmware and managing file deployments on ESP32-C3 SuperMini boards (and compatible variants) that feature a built-in USB-C connector for direct serial communication.
It leverages esptool for flashing firmware and mpremote for file system operations and REPL interaction.
- Flash MicroPython firmware (downloads official ESP32-C3 USB-enabled firmware by default).
- List available serial ports and set a default device.
- Upload individual files, directory contents, or entire directories to the device.
- Download files, directory contents, or entire directories from the device using a unified command.
- List files, display directory trees, and delete files/directories on the device.
- Run MicroPython scripts remotely.
- Simplified commands for common operations.
Before you begin, it's crucial to correctly identify your ESP32-C3 board and ensure it can be stably connected to your computer.
- Chip Markings: These boards typically use the ESP32-C3 System-on-Chip. Look for silkscreen markings on the chip like
ESP32-C3 FH4...or similar. The general pattern isESP32-C3 XX Y ZZZZZZ T U? VVVVVVV WWWWWWWWWWwhereXXindicates flash/temperature,Yis flash size,ZZZZZZis a date/lot code, etc. - Visual Cues:
- USB-C connector for power and data.
- Two push-buttons:
BOOT(often IO0) andRST(Reset). - Specific pin labels (refer to board documentation if available).
- A power LED.
For a detailed guide on board identification, pinouts, and establishing a stable USB connection (especially the BOOT button procedure for flashing), please refer to the guide: docs_md/identify_board.md.
You can install the esp32_micropython utility and its dependencies (esptool, mpremote, pyserial) using pip:
pip install esp32_micropython(If installing from local source, you'd typically use pip install . or python setup.py install from the project root.)
Ensure that Python and pip are correctly installed and configured in your system's PATH.
The utility is invoked from your terminal or PowerShell:
esp32 [global_options] <command> [<args>...]Global Options:
--port <PORT_NAME>or-p <PORT_NAME>: Temporarily overrides the configured COM port for the current command. For example,esp32 --port COM7 flash.
Before most operations, you need to tell the tool which serial port your ESP32-C3 is connected to.
-
esp32 devicesLists all available serial (COM) ports detected on your system. The currently selected/configured port will be marked with an asterisk (*).esp32 devices
-
esp32 device [PORT_NAME] [--force]Sets or tests the COM port.esp32 device COM5: SetsCOM5as the active port for subsequent commands and saves it to.esp32_deploy_config.json. It will test the port first.esp32 device: If a port is already configured, it tests the connection to the configured port. If no port is configured, it lists available ports.esp32 device COM5 --force: SetsCOM5even if the initial connection test fails.
Tip for already flashed devices: If your device is already flashed with MicroPython and running, it should respond to the test. If
mpremotecan't connect, ensure the device isn't in a tight loop or stuck. For a new or problematic device, you might need to set the port with--forcebefore flashing.
This command erases the ESP32-C3's flash and installs MicroPython firmware.
-
esp32 flash [firmware_source] [--baud BAUD_RATE]firmware_source(optional):- If omitted, the tool attempts to download the latest known official USB-enabled MicroPython firmware for ESP32-C3 from
micropython.org. - You can provide a direct URL to a
.binfile. - You can provide a path to a local
.binfirmware file.
- If omitted, the tool attempts to download the latest known official USB-enabled MicroPython firmware for ESP32-C3 from
--baud BAUD_RATE(optional): Sets the baud rate for flashing (default:460800).
Shorthand Usage:
# Ensure device port is set first (e.g., esp32 device COM5) esp32 flashThis will use the default firmware URL.
Important:
- The device MUST be in bootloader mode for flashing. Typically:
- Unplug the ESP32.
- Press and hold the
BOOT(or IO0) button. - While still holding
BOOT, plug in the USB-C cable. - Wait 2-3 seconds, then release the
BOOTbutton.
- The tool will prompt for confirmation before erasing and writing.
- If you have many COM ports, and you're unsure which one is the ESP32, check Windows Device Manager (under "Ports (COM & LPT)") before and after plugging in the device (in bootloader mode) to see which port appears.
-
esp32 upload <local_source> [remote_destination]Uploads files or directories from your computer to the ESP32's filesystem.Understanding
local_sourceand trailing slashes for directories:- If
local_sourceis a file: It's always uploaded as that single file. - If
local_sourceis a directory and ends with a/(or\on Windows, e.g.,my_dir/): The contents ofmy_dirare uploaded. - If
local_sourceis a directory and does not end with a/(e.g.,my_dir): The directorymy_diritself (including its contents) is uploaded.
Understanding
remote_destination:- If omitted, the destination is the root (
/) of the ESP32's filesystem. - If provided, it specifies the target directory on the ESP32. The tool will create this directory if it doesn't exist.
Scenarios & Examples:
- Upload a single file to root:
esp32 upload main.py # Result on ESP32: /main.py - Upload a single file to a specific remote directory:
esp32 upload utils.py lib # Result on ESP32: /lib/utils.py (lib/ will be created if needed) - Upload contents of a local directory to root:
# Assuming local_project/ contains file1.py and subdir/file2.py esp32 upload local_project/ # Result on ESP32: /file1.py, /subdir/file2.py
- Upload contents of a local directory to a specific remote directory:
esp32 upload local_project/ remote_app # Result on ESP32: /remote_app/file1.py, /remote_app/subdir/file2.py - Upload a local directory itself to root:
esp32 upload my_library # Result on ESP32: /my_library/... (contains contents of local my_library) - Upload a local directory itself into a specific remote directory:
esp32 upload my_library existing_remote_lib_folder # Result on ESP32: /existing_remote_lib_folder/my_library/...
- If
-
esp32 upload_all_cwdA basic command that attempts to upload all eligible files and directories from your current working directory (CWD) on your computer to the root of the ESP32. It excludes common non-project files like.git,__pycache__, etc.# From your project's directory esp32 upload_all_cwd
-
esp32 download <remote_source_path> [local_target_path]Downloads files or directories from the ESP32 to your computer. This command behaves similarly touploadbut in reverse.Understanding
remote_source_pathand trailing slashes for directories:- If
remote_source_pathpoints to a file on the ESP32 (e.g.,/data/log.txt): The file is downloaded. - If
remote_source_pathpoints to a directory on the ESP32 and ends with a/(e.g.,/logs/): The contents of that remote directory are downloaded into the specifiedlocal_target_path.- To download the contents of the root directory, use
//(e.g.,esp32 download // local_root_backup).
- To download the contents of the root directory, use
- If
remote_source_pathpoints to a directory on the ESP32 and does not end with a/(e.g.,/config): The directoryconfigitself (including its contents) is downloaded and created within thelocal_target_path.
Understanding
local_target_path:- If omitted, the download target is the current working directory (
.) on your computer. - If provided, it specifies the local directory where items will be placed or the local filename if downloading a single file to a specific name. The tool will create this directory if it doesn't exist.
Scenarios & Examples:
- Download a remote file to the current local directory:
esp32 download /boot.py # Result: ./boot.py locally - Download a remote file to a specific local directory, keeping its name:
esp32 download /lib/utils.py my_local_lib # Result: ./my_local_lib/utils.py locally (my_local_lib/ created if needed) - Download a remote file to a specific local path and name: (mpremote behavior for
cp :remote_file local_file_path)esp32 download /data/sensor.dat backup/latest_sensor.dat # Result: ./backup/latest_sensor.dat locally - Download a remote directory (e.g.,
logs) and its contents into the current local directory:esp32 download /logs # Result: ./logs/... locally (creates a 'logs' folder in CWD) - Download a remote directory (e.g.,
data) and its contents into a specified local directory (backup_data):esp32 download /data backup_data # Result: ./backup_data/data/... locally - Download the contents of a remote directory (e.g.,
/app/) into the current local directory:esp32 download /app/ . # Result: Files and subdirectories from /app/ on device are copied into ./ locally # Example: if /app/main.py and /app/gfx/img.png exist, # they become ./main.py and ./gfx/img.png
- Download the contents of a remote directory (e.g.,
/lib/) into a specified local directory (local_libs_backup):esp32 download /lib/ local_libs_backup # Result: Contents of /lib/ on device are copied into ./local_libs_backup/ locally # Example: if /lib/tool.py exists, it becomes ./local_libs_backup/tool.py
- Download the contents of the device's root directory into a local directory
full_backup:esp32 download // full_backup # Result: All files and folders from device root copied into ./full_backup/
- If
-
esp32 list [remote_directory]oresp32 ls [remote_directory]Lists files and directories on the ESP32. The listing is recursive from the given path.remote_directory(optional): The directory to list (e.g.,/lib). Defaults to the root (/), listing top-level items.
Shorthand Usage:
esp32 list esp32 list lib
-
esp32 tree [remote_directory]Displays a tree-like view of files and subdirectories within the specified remote directory.remote_directory(optional): Defaults to root (/).
Shorthand Usage:
esp32 tree esp32 tree lib
-
esp32 delete [remote_path_to_delete]Deletes a file or directory (recursively) on the ESP32.remote_path_to_delete(optional): The file or directory to delete (e.g.,old_main.py,temp_files/).- If omitted or set to
/, the command will prompt for confirmation to delete all contents of the root directory. Use with extreme caution!
Shorthand Usage:
esp32 delete old_script.py esp32 delete my_module/ esp32 delete # Prompts to wipe root esp32 delete / # Also prompts to wipe root
-
esp32 run [script_name]Executes a MicroPython script that exists on the ESP32's filesystem.script_name(optional): The path to the script on the device (e.g.,app.py,tests/run_tests.py). Defaults tomain.py. Path is relative to the device root. The script's output (and any errors) will be displayed in your terminal.
Shorthand Usage:
esp32 run # Executes /main.py on device esp32 run services/scanner.py # Executes /services/scanner.py on device
-
Connection Issues / Device Not Detected:
- Ensure the USB-C cable supports data transfer (not just charging).
- Verify the correct COM port is selected (
esp32 devices,esp32 device <PORT>). - For flashing or if the device is unresponsive, make sure it's in bootloader mode. See Section 4.2 or
docs_md/identify_board.md. - Check if other serial terminal programs (Arduino IDE Serial Monitor, PuTTY, etc.) are holding the port open. Close them.
-
esptoolormpremotecommand not found:- Make sure
esptoolandmpremoteare installed:pip install esptool mpremote pyserial. - Ensure your Python scripts directory is in your system's PATH environment variable.
- Make sure
-
Firmware Flashed, but Device Unresponsive or
test_deviceFails:- The default firmware URL points to a generic ESP32-C3 USB-enabled build. While it works for many "SuperMini" clones, some ESP32-C3 boards might require a specific version or a build with different options.
- Try finding an alternative official MicroPython
.binfile for ESP32-C3 from micropython.org/download/esp32c3/ that matches your board's specifications (e.g., flash size, specific features if known). - Then, use the
flashcommand with the path to your downloaded file:esp32 flash path/to/your_downloaded_firmware.bin
- After flashing, physically reset the device (unplug/replug or RST button) before testing.
-
Upload/Download/List commands fail with "No response or mpremote error":
- Ensure MicroPython is running correctly on the device. Try
esp32 deviceto test basic connectivity. - If the device was just flashed, it might need a manual reset.
- The MicroPython script on the device might be stuck in an infinite loop or has crashed. Try resetting the board and connecting again quickly.
- Ensure MicroPython is running correctly on the device. Try
This utility aims to streamline your ESP32-C3 MicroPython development workflow. Happy coding!