-
Notifications
You must be signed in to change notification settings - Fork 0
Releases: marceld23/Pixel-Pets
v1.0.3
Small follow-up to 1.0.2. One firmware fix that closes a regression introduced in 1.0.2, and a docs correction so the next person doesn't lose hours to the same wrong setup steps.
Pip-S3 deep sleep now actually wakes back up
1.0.2's "real deep sleep after 3 min idle" plus the USB-PHY detach were both correct, but together they exposed a third bug: M5Unified::Power_Class::_setupBoard() has no case for board_M5StickS3 in the _wakeupPin switch, so _wakeupPin stayed at 255 (GPIO_NUM_MAX). M5.Power.deepSleep(0, true) then skipped its esp_sleep_enable_ext0/1_wakeup() call, the chip entered deep sleep with no wakeup source at all, and the only way back was a PMIC power-cycle.
1.0.3 manually configures BtnA (GPIO11, RTC-capable on ESP32-S3) as an ext1 active-low wakeup source before handing off to M5.Power.deepSleep(). Same one-line workaround applied in the brownout-protection boot path. After the fix: a short BtnA press wakes the Stick S3 cleanly from deep sleep.
The StickC Plus 2 path (pip env, ESP32-PICO) is unchanged — its wakeup pin (GPIO35 = power button) was already correctly mapped in M5Unified.
Pip setup docs corrected for M5StickS3 (K150) hardware
The old docs/setup-pip.md "S3 revision" procedure ("hold BtnA, press the side reset button") was the original PLUS2 S3 revision procedure, where BtnA happens to be wired in parallel with GPIO0 and there's a separate reset button. On the newer M5StickS3 (SKU K150) — what most people now buy — BtnA is GPIO11 (not GPIO0) and there's no separate reset button (only the PM1 PMIC button). The published procedure simply could not trigger download mode on K150 hardware.
The setup doc now splits the S3 path into two clearly-labelled variants:
- PLUS2 S3 revision keeps the BtnA + reset procedure
- M5StickS3 (K150) gets a Hat2-Bus G0 ↔ GND bridge procedure with a PMIC cold-boot trigger
- Full 16-pin Hat2-Bus pinout table included (G0 on pin 4, GND on pin 1, plus UART pins for the recovery path)
Plus:
- 1 Hz slow green LED blink documented as the visual confirmation that the chip is in ROM bootloader
- UART recovery flash recipe added for the case where the Stick S3's USB-C connector has developed loose D+/D- contacts (power pins still work, USB enumeration dead even on a fresh OS install). Wire a USB-TTL adapter to Hat2-Bus G43 / G44 / GND, enter download mode the usual way, flash through the adapter with
esptool --before no_reset. Confirmed working as the only path back for one user's stick after the USB-C port wore out across many cold-boot cycles.
Downloads
Single-image firmware files are attached below — flash to offset 0x0 with esptool write_flash 0x0 pixel-pets-v1.0.3-<pet>.bin. See docs/setup-pip.md for the Pip-specific download-mode procedure.
Full changelog: README → Version history → 1.0.3
Assets 7
v1.0.2 — motion-gesture reliability + Pip-S3 USB-PHY detach
Small follow-up to 1.0.1 — two real fixes plus a homepage tweak.
Highlights
Motion gestures — Spielen / Regen / Singen now clearly distinguishable. Shake-magnitude thresholds dropped 1.0 g → 0.7 g (kid-sized wrist motions reproducibly couldn't reach the old threshold), vertical-dominance relaxed 1.0 → 0.6 so realistic up-down hand motions qualify for "rain", and one decisive down-flick now fires the shower instead of needing two. Singing redesigned end-to-end: was "upright + tilt-left + tilt-right" with a rising-edge bug that prevented firing whenever the pet was already slightly tilted; now it's heave-up + tilt-left-then-right — the user must transition the pet from low to upright within 800 ms, which guarantees gx ≈ 0 at sequence start. A pet just sitting on the desk no longer triggers Singing spontaneously. Help page 8 updated in DE + EN: "Hochheben, links + rechts kippen" / "Lift it up, tilt left + right".
Pip-S3 robust USB-PHY detach before deep sleep. 1.0.1's Serial.flush() + Serial.end() + 100 ms grace wasn't aggressive enough on every M5-Stick variant — one tested unit still disappeared from the host after deep sleep and required a 60-second unplug to recover. 1.0.2 forces GPIO19 / GPIO20 (D- / D+) to input + pull-mode floating before esp_deep_sleep_start(), collapsing the D+ pull-up so Windows sees an unambiguous detach. Grace bumped to 200 ms (Windows sometimes doesn't register the detach in under that). Plus: M5.Power.isCharging() is now polled up to ×ばつ at boot with 50 ms gaps — the PMIC's charging-detect isn't stable for the first few ms after power-up, and a single early read could falsely route the pet into the brownout-protection deep-sleep branch with USB still plugged in.
Site / homepage. New 2-minute YouTube-Short feature reel between the hero demo and the deep-dive embed — voice control on Muffin, ESP-NOW Friends gift exchange and a Pip wrist-flick treat throw, on real hardware. Caption translated DE / EN.
Full changelog with all bullets: README — Version history
Install
The Release CI workflow attaches per-pet .bin files (pixel-pets-v1.0.2-muffin.bin, -goo-goo, -visu, -pip, -pip-s3) — flash via M5Burner ("Custom Firmware" → upload .bin) or esptool.py --chip <esp32|esp32s3> write_flash 0x0 pixel-pets-...bin. Existing pets keep their NVS state when upgraded (animal / language / friends-mode / WiFi creds).
Assets 7
v1.0.1 — Reliability fixes
Reliability release — same features as 1.0.0, but the rough edges that surfaced after launch are fixed. No protocol changes; existing pets keep their NVS state when upgraded.
Highlights
Friends mode — now reliable across all pet pairs. Switched ESP-NOW PHY from LR to standard 802.11 B/G/N (LR had reproducible interop problems between ESP32 and ESP32-S3), pets run in WIFI_AP_STA so the CoreS3 stack stops dropping broadcasts, and gift packets switch to unicast once the partner's MAC is known. Plus a "reach-back Ready" mechanism so the faster tapper doesn't go silent on the slower partner.
Web radio — stutter-free, knacks-free, tap-resilient. Audio decoder now runs on its own FreeRTOS task pinned to core 1; pet sounds are suppressed during playback (no more I2S bus fight); volume slider actually applies; the pet ignores all interaction except the Media-stop tap; "Brauche WLAN" overlay when no WiFi is configured.
Pip — no more "bricked-looking" Stick S3. Firmware now explicitly tears down the USB-CDC stack before deep sleep — without this the ESP32-S3's D+ pull-up stayed asserted and the host saw the device as "still attached, frozen", invisible on the next reset. Also: Pip's treat / wand sender now matches the home-pet receiver's PHY (BGN + AP_STA), restoring announcements after the Friends-mode switch.
Smaller wins: ?lang=de/?lang=en URL overrides on the site, per-env firmware artifacts on every CI run, Module-LLM setup script extracted with CI lint, CodeQL / lychee / Dependabot / typos / pio check added.
Full changelog with section breakdown: README — Version history
Install
The CI workflow attaches per-pet .bin files (pixel-pets-v1.0.1-muffin.bin, -goo-goo, -visu, -pip, -pip-s3) — flash via M5Burner or esptool at offset 0x0. Existing pets can be re-flashed without losing their saved state (animal / language / play-time / friends-mode / WiFi creds all in NVS).
Assets 7
Pixel Pets 1.0.0 — first stable release
First stable release. Three pet variants — Muffin (CoreS3 + Module-LLM), Visu (CoreS3 alone), Goo-Goo (Core2) — plus the optional Pip pocket accessory (StickC PLUS2), all verified end-to-end on real hardware.
Headline features
- 🐻 Three animals — pick Bear / Cat / Dog on first boot, switch any time in Settings.
- 🌍 World-aware pet — real weather, sunrise / sunset and moon phase from your IP-resolved location (open-meteo + ip-api), all cached in NVS. The scene adapts through Morning / Day / Evening / Night.
- 🎤 Offline voice control (Muffin only) — wake word "Muffin", Whisper-Base ASR + Qwen3-0.6B intent classifier on the Module-LLM. No cloud, no audio leaves the device.
- 📷 Front camera + selfies (Muffin / Visu) — proximity wake-up, 5-slot LittleFS gallery, pet-overlay selfies.
- 🤝 ESP-NOW Friends + Pip accessory — pets in radio range pair with a synchronised tap and exchange gifts / hearts / food / toys; the Pip pocket companion fires treats with a wrist-flick.
- 📻 Kid-safe web radio — WDR Die Maus (DE) / Fun Kids UK (EN), pet sways to the beat.
- 🎮 Mini-games + scenes — squat / jump / yoga, butterflies / mushrooms / surf / scorpion / asteroids / cross-the-street, foraging, five toys, scene travel between Bedroom / Meadow / Forest / Beach / City / Desert / Space.
- 👨👩👧 Parent-friendly — configurable session limit (5–120 min), optional `-setup.local` web dashboard, captive-portal Wi-Fi setup, no cloud, no tracking.
- 😄 Eleven moods + gestures — driven by happiness / energy / fullness needs; touch zones, IMU-based petting / shake / stand reactions, somersault on circle drag, sing-and-applause when tilted upright.
Pre-built firmware (no PlatformIO needed)
Five merged binaries are attached to this release. Each is a single file at flash offset `0x0` containing bootloader + partitions + OTA selector + app — flash any of them with M5Burner (Custom Firmware → upload .bin) or with `esptool.py`:
| Pet | Binary | Hardware |
|---|---|---|
| Goo-Goo | `pixel-pets-v1.0.0-goo-goo.bin` (~3.0 MB) | M5Stack Core2 |
| Visu | `pixel-pets-v1.0.0-visu.bin` (~3.1 MB) | M5Stack CoreS3 |
| Muffin | `pixel-pets-v1.0.0-muffin.bin` (~3.1 MB) | M5Stack CoreS3 + Module-LLM1 |
| Pip | `pixel-pets-v1.0.0-pip.bin` (~1.1 MB) | M5StickC PLUS2 (ESP32-PICO) |
| Pip (S3 rev.) | `pixel-pets-v1.0.0-pip-s3.bin` (~1.1 MB) | M5StickC PLUS2 (S3 revision) |
Flash via esptool:
```bash
Goo-Goo / Pip (ESP32, e.g. COM3):
esptool.py --chip esp32 --port COM3 --baud 921600 write_flash 0x0 pixel-pets-v1.0.0-goo-goo.bin
Visu / Muffin / Pip-S3 (ESP32-S3):
esptool.py --chip esp32s3 --port COM5 --baud 921600 write_flash 0x0 pixel-pets-v1.0.0-muffin.bin
```
1 Muffin's binary alone is not enough — voice control needs a one-time Linux setup on the Module-LLM (ADB workflow, Whisper, Qwen3, TTS-disable). Follow `docs/setup-muffin.md` Step 2 after flashing the .bin.
For the StickC PLUS2 S3 download-mode dance (BtnA + reset before flashing), see `docs/setup-pip.md`.
License note: Goo-Goo / Visu / Muffin binaries link the GPL-3.0 `schreibfaul1/ESP32-audioI2S` library for web radio decoding, so these distributed binaries inherit GPL-3.0 obligations (full corresponding source is in this repository). The Pip binaries stay MIT-only.
Build it yourself instead
Per-pet setup guides ordered by difficulty (🟢 Goo-Goo → 🟢 Visu → 🟡 Pip → 🔴 Muffin) live under `docs/`. The `README.md` has the Fastest-start table with shop links and the full per-pet matrix.
Story
This is a small father-and-son project. Justus (10) brought the ideas, tested every build, and made the design calls. Marcel (Papa) translated his ideas into briefs the AI could execute and added the technical bits that don't fit on a kid's whiteboard. Every line of firmware was co-authored with Claude (Anthropic) under our direction.
The full story lives in `CREDITS.md`.
Full version history
A detailed per-target breakdown of what shipped is in the README's Version history section.
Support the project
If you built one — or just enjoyed reading — please drop a ⭐. Justus checks the count on Sundays.
Beyond stars: open Issues for feature ideas, send PRs (a new sound, scene, face animation or language string is a great first contribution), or share photos and videos in Discussions. No CLA, no Slack, just GitHub.