Implements the first working feature: the device records audio to the microSD
card, toggled by the button, with LED status and per-recording JSON metadata.
What changed:
- firmware/src/audio.{h,cpp}: mic capture via the core-bundled ESP_I2S. Dev board
uses I2S standard mode (INMP441/ICS-43434); XIAO uses PDM mode (onboard mic).
Presents 16-bit PCM mono to callers regardless of board.
- firmware/src/storage.{h,cpp}: microSD on a dedicated HSPI bus + a streaming
WavWriter that writes a 44-byte PCM header and patches RIFF/data sizes on close;
plus sidecar JSON metadata writer.
- firmware/src/recorder.{h,cpp}: idle/recording state machine; creates
/recordings/<id>.wav, pumps mic chunks in on update(), finalises + writes
<id>.json (Recording schema from api/openapi.yaml) on stop.
- firmware/src/ux.{h,cpp}: debounced button (short press toggles) + status LED
patterns (idle/recording/error), active-low aware.
- firmware/src/main.cpp: wires ux + recorder; loop toggles on button and drains
the mic while recording.
- firmware/include/audio_config.h: 16 kHz mono 16-bit, chunk size, rec dir.
- firmware/include/pins.h: added XIAO PDM mic + onboard SD pins, LED active-low flag.
- state/: TODO, ARCHITECTURE, NOTES updated for M1 and the deferred follow-ups.
Why:
- Recording is the foundation every later milestone (transfer, upload, transcription)
builds on. Kept dependency-free (only core-bundled ESP_I2S + SD) for simple CI builds.
Notes:
- Not compiled locally (no PlatformIO on the dev host) or hardware-verified; Forgejo
Actions CI builds both board profiles. Follow-ups tracked in state/TODO.md:
INMP441 16-bit level calibration, and real NTP timestamps (ids are uptime-based
until M2 brings WiFi/NTP).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| include | ||
| src | ||
| platformio.ini | ||
| README.md | ||
OpenScribe firmware
ESP32-S3 recorder firmware. Built with PlatformIO + Arduino-ESP32.
Status: M0 scaffold. Boots and reports the board profile + PSRAM. Audio, storage, WiFi, REST API, uploader and BLE land in milestones M1-M4 (see
../state/TODO.md).
Boards
Two profiles, matching ../hardware/BOM.md:
esp32s3_dev(default) - ESP32-S3 devkit with PSRAM, external I2S mic + SD module.xiao_esp32s3- Seeed XIAO ESP32-S3 (Sense): compact, onboard PDM mic + microSD.
Build and flash
pio run # build default env (esp32s3_dev)
pio run -e xiao_esp32s3 # build the compact profile
pio run -t upload # flash over USB
pio device monitor # serial console at 115200
Install PlatformIO (pip install platformio or the VS Code extension). On Windows install
the USB-serial driver (CP210x / CH34x) so the board enumerates a COM port.
Layout
platformio.ini Build profiles (esp32s3_dev, xiao_esp32s3)
include/pins.h Pin map (override per board; defaults = BOM Build B)
src/main.cpp Entry point + module seams
Design
The device records audio to microSD and syncs three ways: BLE (control/provisioning),
WiFi REST API (transfer to the app), and independent WiFi upload to object storage when on
charge. See ../state/ARCHITECTURE.md and the API in ../api/openapi.yaml.