pico-read is an ESP32-C6 speed-reading device built with ESP-IDF and LVGL. The firmware reads .txt books from the ESP filesystem at runtime and renders them with a fixed anchor-letter reading UI.
This project is currently supported on macOS and Linux only.
Windows support is planned, but it is not documented or tested yet.
esp32-c6-gui/: ESP-IDF firmware projectbooks/: source.txtbooks packaged into the device filesystem image
This repo does not commit large vendored ESP-IDF components.
The firmware declares its dependencies in esp32-c6-gui/main/idf_component.yml, and ESP-IDF downloads them automatically on the first build. That keeps the repository small while still allowing a fresh clone to build directly.
Install the required host tools with Homebrew:
brew install git cmake ninja ccache dfu-util python@3.11 pkg-config wgetClone and install ESP-IDF in a separate directory:
mkdir -p ~/esp
cd ~/esp
git clone -b v5.2 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32c6Load the ESP-IDF environment in each shell before building or flashing:
source ~/esp/esp-idf/export.shcd esp32-c6-gui
idf.py buildOn the first build, ESP-IDF will fetch managed dependencies such as lvgl/lvgl and espressif/led_strip.
Do not use /dev/cu.usbmodem1101 blindly. That is only an example.
Find the real port first:
ls /dev/cu.*Then unplug the board, run it again, plug the board back in, and run it again. The new device is the board you should flash. On macOS it is usually something like:
/dev/cu.usbmodem.../dev/cu.SLAB_USBtoUART
Flash with the actual port:
cd esp32-c6-gui
idf.py -p /dev/cu.usbmodemACTUALPORT flashIf you want serial logs immediately after flashing:
cd esp32-c6-gui
idf.py -p /dev/cu.usbmodemACTUALPORT flash monitorIf flashing fails with:
Could not open /dev/cu....the port is busy or doesn't exist
check these first:
- The port name is real and matches the current plugged-in board.
- No other serial monitor, terminal, or IDE is already using that port.
- The board is still connected after the last reset.
If the board does not enter download mode automatically:
- Hold
BOOT. - Tap
RESET. - Release
BOOT. - Run the flash command again.
Add or edit .txt files inside books/, then rebuild and reflash:
cd esp32-c6-gui
idf.py build flash -p /dev/cu.usbmodemACTUALPORTThe firmware packages the books/ folder into a SPIFFS image during build and streams the selected book from the device filesystem at runtime.
- Do not activate the project-local
.venvwhen runningidf.py. - Use the ESP-IDF environment from
source ~/esp/esp-idf/export.sh. - The active reader UI code lives in
esp32-c6-gui/main/LVGL_UI/display_words.c. - The runtime text filesystem backend lives in
esp32-c6-gui/main/LVGL_UI/display.c.