Repository navigation
Releases: owahltinez/coaster
Release list
Coaster v0.3.1
First non-rc release of the v0.3 coaster hardware. The board is identical to
v0.3.0-rc3 (the package the first batch was ordered from); what's new is the
v0.3.1 enclosure — a print-tested rework of the donut-piston lid and tray — and a
firmware/tooling addition for hands-free batch programming. Supersedes the v0.3.0 rcs.
Changes since v0.3.0-rc3
- Enclosure lid (Top): anti-stick drainage, v0.3.1. A printed test showed a sweating
glass capillary-bonds to the smooth lid and lifts the coaster with the glass; a recessed
bump field made it worse (floods and seals into a suction cup). The fix is drainage:
12 radial channels (2.0 mm wide at the glass face, 0.8 mm uniform depth, ~40°
self-supporting tapered walls) run from the center out to r42, stopping ~3 mm short of
the rim so the face-down print keeps a clean first-layer edge. The channels cross the
outer flexure hinge over 12 discrete underside backing bars, so the press click is
preserved. The plain flat lid is kept in-tree asenclosure/coaster-v0.3.FCStd. - Enclosure shell: thinned and snap arms reworked. The shell is 1 mm thinner
(assembled height 8.1 mm), with a reworked snap-arm ring and a 1.6 mm snap-arm beam. - Enclosure tray (Bottom): 0.6 mm board-seat floor. The seat floor is now three full
print layers (was an awkward 2.5) via a 0.1 mm shallower recess; board seat and overall
height are effectively unchanged. - Firmware: post-flash confirm blink. The flashing station arms a one-shot EEPROM
flag as the last verified programming step; the next boot plays a distinct rapid
blink and clears it. A good flash shows on the board itself, once, and never in the
field. 540 bytes (was 422). - Tooling: hands-free flashing station.
make flash-loopflashes + fuses + verifies
each board as it's plugged onto the UPDI jig, edge-triggered on insertion — flash a
stack of boards without watching the screen. - No PCB change. Board, BOM, CPL, and gerbers are identical to rc3/rc2 (KT-0603W
LEDs, 100 Ω).
Reproducibility
Regenerated (content) from the tagged source with the pinned, digest-locked toolchains:
| Toolchain | Pin |
|---|---|
| Commit | b9e46ef822af68df23c23ea734fe0f7638f931bd |
| KiCad (board, fab bundle) | kicad/kicad@sha256:165c81785b2df23a09892f4cc53bc0095a83b469bfbbe07989670d64049677a7 (10.0.2) |
| avr-gcc (firmware) | debian@sha256:1275c5673a6135ff07b289ddafe4e2270dceb08eda14c0c69bb1b93ee25a9416 (trixie, gcc-avr 14.2.0) |
| FreeCAD (enclosure) | FreeCAD 1.1.1 headless on the same trixie base |
Verify downloads with sha256sum -c SHA256SUMS.
Assets
| Asset | What it is |
|---|---|
…-gerbers.zip, …-bom.csv, …-cpl.csv |
The three JLCPCB uploads (identical to rc3) |
…-board.png, …-1to1.pdf, …-board.step |
Fab review: render, 1:1 paper fit-check, 3D model |
…-firmware.hex |
ATtiny202, 540 bytes. Fuse bodcfg=0x06 (1.8V BOD, sampled) |
…-{top,bottom}.{step,stl} |
3D-printed shell: v0.3.1 drainage-channel lid + base tray |
SHA256SUMS |
Checksums over every asset above |
Ordering (JLCPCB)
Qty 30, Economic SMT, top side, white soldermask. ≈ $0.74 USD parts/board;
≈ $100–105 AUD shipped. Boards arrive blank — flash over UPDI (make fuses once, then
make flash, or make flash-loop for a batch) and drop in a CR2016.
Carried-over caveat from rc3: ROTATION_CORRECTION is still empty (raw KiCad angles).
On a fresh order, verify orientations on the assembly preview — BT1's mouth faces
WEST and LED cathodes (pad 1) face board center — before paying; a fix is
CPL-only, gerbers don't change.
Coaster v0.3.0-rc3
Third release candidate of the v0.3 coaster hardware, and the package the first
batch is ordered from. Pre-release: no v0.3 unit has been physically built or
validated yet. Once a first article passes the checklist below, this is promoted to a
final v0.3.0. Supersedes rc1 and rc2.
Changes since v0.3.0-rc2
- Enclosure synced to the v0.3 donut-piston Top. The repo had been carrying the old
v0.2.1 spiral-flexure shell (three bodies, including a clear-PETG Shield). v0.3 is a
solid donut-piston: a continuous top skin that deflects as a whole on a ring of snap
arms, with no spiral cuts — so there's no open liquid path and the shield is gone. The
enclosure now exports Top + Bottom only. - No PCB change. The board, BOM, CPL, gerbers, and firmware are identical to rc2
(KT-0603W LEDs, 100 Ω). If you already uploaded rc2's files, the order side is unchanged.
(rc2's enclosure assets were the stale v0.2.1 shell. They were not edited in place — that
would have broken the tag↔asset match — hence this fresh rc3 built entirely from one commit.)
Reproducibility
Regenerated (content) from the tagged source with the pinned, digest-locked toolchains:
| Toolchain | Pin |
|---|---|
| Commit | 3d5e6c1106e6273d5e300500e26f0aba5337dce1 |
| KiCad (board, fab bundle) | kicad/kicad@sha256:165c81785b2df23a09892f4cc53bc0095a83b469bfbbe07989670d64049677a7 (10.0.2) |
| avr-gcc (firmware) | debian@sha256:1275c5673a6135ff07b289ddafe4e2270dceb08eda14c0c69bb1b93ee25a9416 (trixie, gcc-avr 14.2.0) |
| FreeCAD (enclosure) | FreeCAD 1.1.1 headless on the same trixie base |
Verify downloads with sha256sum -c SHA256SUMS.
Assets
| Asset | What it is |
|---|---|
…-gerbers.zip, …-bom.csv, …-cpl.csv |
The three JLCPCB uploads (identical to rc2) |
…-board.png, …-1to1.pdf, …-board.step |
Fab review: render, 1:1 paper fit-check, 3D model |
…-firmware.hex |
ATtiny202, 422 bytes. Fuse bodcfg=0x06 (1.8V BOD, sampled) |
…-{top,bottom}.{step,stl} |
3D-printed shell: donut-piston lid + base tray (no shield) |
SHA256SUMS |
Checksums over every asset above |
Ordering (JLCPCB)
Qty 30, Economic SMT, top side, white soldermask. ≈ $0.74 USD parts/board;
≈ $100–105 AUD shipped. Boards arrive blank — flash over UPDI (make fuses once, then
make flash) and drop in a CR2016.
Before promoting to final v0.3.0
- Assembly preview orientation —
ROTATION_CORRECTIONis empty (raw KiCad angles).
Verify BT1's mouth faces WEST and LED cathodes (pad 1) face board center. A fix
is CPL-only; gerbers don't change. - First-article checklist — programming; sleep < 5 µA; show plays, press costs no
measurable charge; brightness through a real glass (100 Ω start — toward 68 Ω if dim,
150 Ω if it drains fast); worn-battery degrades gracefully; button behaviors; splash test
(the solid piston lid sheds water — nothing reaches the PCB).
Coaster v0.3.0-rc2
Second release candidate of the v0.3 coaster hardware (ATtiny202 board), and
the package the first batch is ordered from. Pre-release: no v0.3 board has been
physically built or validated yet. Once a first article passes the checklist below,
this is promoted to a final v0.3.0.
Changes since v0.3.0-rc1
- LEDs: XL-1608UWC-04 → KT-0603W (C2290). rc1's LED was chosen on a rationale that
didn't hold up against the datasheet: XL-1608UWC-04 is 130 mcd @ 20 mA, while the
KT-0603W is 360 mcd @ 5 mA. White LEDs are all ~2.7–3.4 V Vf and a CR2016 gives only
~0.3 V of headroom, so these LEDs run at a few mA — never 20 mA — and light-per-mA at
low current is what matters. At the operating point the KT-0603W is ~11× brighter,
and it's a Basic part (no $3 feeder fee). - R1–R4: 150 Ω → 100 Ω (C22775). A little more current now that the efficient LED,
not the resistor, sets brightness. Starting value — tuned on the first article.
The gerbers and drill are content-identical to rc1 (component values live on F.Fab,
not the silkscreen). If you already uploaded rc1's board files, re-upload only
bom.csv and cpl.csv — the board itself is unchanged.
Reproducibility
Regenerated byte-for-byte (content) from the tagged source with the pinned, digest-locked
toolchains — no host tools:
| Toolchain | Pin |
|---|---|
| Commit | a916536ae044a2cb3cfe55eca43189cd01696a02 |
| KiCad (board, fab bundle) | kicad/kicad@sha256:165c81785b2df23a09892f4cc53bc0095a83b469bfbbe07989670d64049677a7 (10.0.2) |
| avr-gcc (firmware) | debian@sha256:1275c5673a6135ff07b289ddafe4e2270dceb08eda14c0c69bb1b93ee25a9416 (trixie, gcc-avr 14.2.0) |
| FreeCAD (enclosure) | FreeCAD 1.1.1 headless on the same trixie base |
Rebuild from a clean checkout of the tag with make build && make fab. Verify downloads
with sha256sum -c SHA256SUMS.
Assets
| Asset | What it is |
|---|---|
…-gerbers.zip, …-bom.csv, …-cpl.csv |
The three JLCPCB uploads (gerbers == rc1) |
…-board.png, …-1to1.pdf, …-board.step |
Fab review: render, 1:1 paper fit-check, 3D model |
…-firmware.hex |
ATtiny202, 422 bytes. Fuse bodcfg=0x06 (1.8V BOD, sampled) |
…-{top,bottom,shield}.{step,stl} |
3D-printed shell: flexure lid, PCB tray, membrane shield |
SHA256SUMS |
Checksums over every asset above |
Ordering (JLCPCB)
Qty 30, Economic SMT assembly, top side, white soldermask. Per-board parts
≈ $0.74 USD (LED feeder fee now gone); ≈ $100–105 AUD shipped. Boards arrive blank —
flash over UPDI (make fuses once, then make flash) and drop in a CR2016.
Before promoting to final v0.3.0
- Assembly preview orientation checks —
ROTATION_CORRECTIONis empty (raw KiCad
angles). Verify: BT1's insertion mouth faces the WEST board edge, and the LED
cathodes (pad 1) face the board center (the KT-0603W is a new part, so re-confirm its
orientation). A fix is CPL-only — gerbers don't change. - First-article checklist — programming works; sleep current < 5 µA; show plays and a
press costs no measurable charge; brightness through a real glass (100 Ω is a start
— toward 68 Ω if dim, toward 150 Ω if it drains fast); worn-battery degrades gracefully;
press-during-show / long-press / double-press behave; splash test.
Coaster v0.3.0-rc1
First release candidate of the v0.3 coaster hardware (ATtiny202 board). This
is the manufacturing package the first batch is ordered from. It is a pre-release:
no v0.3 board has been physically built or validated yet. Once a first article passes
the checklist below (and any orientation/brightness fix is folded in), this is promoted
to a final v0.3.0.
What v0.3 is
A ground-up redesign of the v0.2 board (ATtiny13A, EasyEDA), now KiCad with the circuit
defined as data in pcb/design.py. Highlights, each tracing to a v0.2 lesson:
- ATtiny202 MCU — real brown-out detector, UPDI single-wire programming, ~1µA sleep.
- Button on a GPIO with pin-interrupt wake — presses cost ~0 µAh (v0.2 woke by
dead-shorting the cell, ~11 µAh/press). - Low-side MOSFET driver + one series resistor per LED — LED current set by design.
- Brighter LEDs (XL-1608UWC-04, ~3× the light) and a slimmer CR2016 holder.
- 3-pad UPDI header — programming can't collide with the LEDs.
Reproducibility
Every artifact below is regenerated byte-for-byte from the tagged source with the
pinned, digest-locked toolchains — no host tools involved:
| Toolchain | Pin |
|---|---|
| Commit | f23d66c4d8e4dcc178d2df05738b99fc2744633d |
| KiCad (board, fab bundle) | kicad/kicad@sha256:165c81785b2df23a09892f4cc53bc0095a83b469bfbbe07989670d64049677a7 (10.0.2) |
| avr-gcc (firmware) | debian@sha256:1275c5673a6135ff07b289ddafe4e2270dceb08eda14c0c69bb1b93ee25a9416 (trixie, gcc-avr 14.2.0) |
| FreeCAD (enclosure) | FreeCAD 1.1.1 headless on the same trixie base |
Rebuild from a clean checkout of the tag with make build && make fab (see tools/).
Verify downloads with sha256sum -c SHA256SUMS.
Assets
| Asset | What it is |
|---|---|
…-gerbers.zip, …-bom.csv, …-cpl.csv |
The three JLCPCB uploads — the exact manufacturing inputs |
…-board.png, …-1to1.pdf, …-board.step |
Fab review: render, 1:1 paper fit-check, 3D model |
…-firmware.hex |
ATtiny202, 422 bytes. Fuse bodcfg=0x06 (1.8V BOD, sampled) |
…-{top,bottom,shield}.{step,stl} |
3D-printed shell: flexure lid, PCB tray, membrane shield |
SHA256SUMS |
Checksums over every asset above |
Ordering (JLCPCB)
Qty 30, Economic SMT assembly, top side. Upload the gerbers/BOM/CPL; set
white soldermask (the board face is the reflector behind the LEDs). Per-board parts
≈ $0.74 USD; ≈ $100–105 AUD shipped. Boards arrive blank — flash over UPDI
(make fuses once, then make flash) and drop in a CR2016 (cells are not part of the
JLCPCB order).
Before promoting to final v0.3.0
Nothing here has touched real hardware. Open items:
- Verify part orientations on the JLCPCB assembly preview —
ROTATION_CORRECTION
indesign.pyis empty, so the CPL angles are raw KiCad angles. The one that bites:
BT1's insertion mouth must face the WEST board edge. Record any fix and re-run
make fabbefore paying. - First-article checklist (validate one unit before committing the batch):
programming works; sleep current < 5µA; show plays and a press costs no measurable
charge; brightness through an actual glass (150Ω is a starting value — may rework to
100Ω); worn-battery degrades gracefully with no reset loop; press-during-show /
long-press / double-press behave; splash test.
Coaster v0.2.1
Final release of the v0.2 board line. The hardware design has moved on to v0.3 (see pcb/ on main), so this release wraps up everything needed to build, flash, and print the v0.2 coaster.
Changes since v0.2.0
- Firmware: long-press brown-out fix — the show now plays only on a true power-on reset (
PORF), making a worn-battery reset-relight loop impossible, with a soft-start settle phase so a cell depressed by a long press recovers before the bright phase. - Enclosure: first release of the 3D-printed shell. The FreeCAD source (
enclosure/coaster.FCStd) is now in the tree with a headless STEP/STL export build (make -C enclosure build).
Assets
| Asset | Notes |
|---|---|
coaster-v0.2.1-firmware.hex |
ATtiny13A, 282 bytes. Fuses: lfuse=0x6A, hfuse=0xFD (1.8V BOD). Flashing recipe and gotchas in the README at this tag |
coaster-v0.2.1-schematic.{svg,png} |
Schematic renderings of the v0.2 board |
coaster-v0.2.1-schematic.net |
Protel netlist (canonical machine-readable circuit) |
coaster-v0.2.1-{top,bottom,shield}.stl |
3D printing assets: spiral-flexure lid, PCB tray, thin insert between PCB and lid |
coaster-v0.2.1-{top,bottom,shield}.step |
Same bodies as STEP, for CAD interference checks |
The schematic assets describe the v0.2 board and are carried over from tag v0.2.0 (the v0.2 EasyEDA design source lives in the tree at that tag); the pcb/ directory at this tag already contains the in-development v0.3 KiCad design.
v0.2.0 — first stable firmware for the v0.2 board
First stable firmware for the v0.2 coaster board.
- Fixes the reset-relight loop on worn batteries (BOD at 1.8V + crash cookie in .noinit SRAM)
- Breathing glow effect with perceptually-corrected fade-out
- PWM-capped LED current for longer battery life (~13 µAh per show, ~6 years standby)
Flashing (USBasp): make fuses && make install, or with just avrdude using the attached hex:
avrdude -c usbasp -p attiny13a -B 32kHz -U hfuse:w:0xfd:m -V -U flash:w:main.hex
avrdude -c usbasp -p attiny13a -B 16kHz -U flash:v:main.hex
Required fuses: lfuse=0x6A (factory default), hfuse=0xFD (BOD at 1.8V — required, see README).