Skip to content

Latest commit

 

History

117 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Digital Sharpening Guide

Turn a ~$20 M5StickC Plus into a live knife-sharpening angle coach. It magnets straight onto the flat of your blade — the stick already has a magnet in its back — and the screen fills with color so you can feel your angle drift without looking up from the stone:

  • 🟩 Green — you're holding the target angle
  • 🟦 Blue — too low, raise the spine
  • 🟥 Red — too high, lower the spine

Plus automatic per-side stroke counting (for balanced bevels), an optional out-of-tolerance buzzer, and an end-of-session summary.

License: MIT Platform Flash in browser

New here from r/sharpening? 👋 The fastest path: pick a supported device (see What you'll need), then flash it in your browser — no coding required.

Live angle feedback while sharpening — the screen stays green while holding the target bevel angle on a whetstone

▶️ Holding the target angle on a whetstone — screen stays green. Watch the full clip with sound » · Built in the open after folks on r/sharpening asked for the code.


What's new in v1.0.0

1.0. The core loop — calibrate, hold the colour, count the strokes, read the summary — has been stable on the bench for months, so this is the release that stops calling itself a preview. One new thing on screen:

  • Battery icon in the top-right corner of every screen: four bars, a + beside it while it's charging over USB, a single dash if the reading isn't available. It's polled once every ten seconds, so it costs nothing you'd notice.

The rest of what's below shipped in v0.3.0 and is unchanged here.

From v0.3.0

The angle reading sits still now. A sharpening stroke pushes the blade sideways, and the filter's guard against that was nearly blind to it: 0.18 g of sweep — the level the firmware already counts as a stroke — tilted its gravity reference 10.2° while barely changing its magnitude, so it sailed through unrejected. v0.3.0 averages the gravity reference before it steers the angle (stroke acceleration cancels out over a cycle, gravity doesn't) and stops the displayed number and the colour from flip-flopping on sub-degree noise. Simulated, that's 2.3–4× steadier depending on how fast you stroke.

Steady mode is on by default, and you can still switch it off on the device — hold B on the TOLERANCE screen — to compare against the old behaviour on the same knife, same stone, in the same session.

Also new:

  • Accuracy check — hold A on SET TARGET. Lay the device flat, press A, then stand it on a known angle and read the number at 0.1°. Answers "is this thing actually right?" in about twenty seconds. There are printable wedges if you don't own an angle block.
  • Time on-angle — the session summary now shows what share of the session you held inside tolerance. Stroke count says how much you did; this says how well, and it's the number that should climb as your technique does.
  • Past sessions — hold B on the summary screen for your last five.
  • Gyro bias refreshes whenever the device is verifiably still, so thermal drift doesn't accumulate across a long session.

Fixes:

  • A crash, reset, or reflash no longer leaves a zombie session that comes back as RESUME? for the previous knife (and its zero) the next time you sleep and wake.
  • Session time now survives Plus / Plus2 deep-sleep resume, same as stroke counts and time-on-angle. It used to reset to 00:00 because it was a raw millis() stamp.
  • Power-key on Plus2 / S3 no longer treats the wake / power-on press as “off.” Plus2 was going back to sleep when you let go; S3 could power itself off immediately after boot.

From v0.2.1: the 25° and 28° presets (B cycles 12° / 15° / 17° / 20° / 22° / 25° / 28° / CANCEL), a splash that shows the real firmware version, and pinned build dependencies so a release rebuilds byte-for-byte.

⚡ Flash the update in your browser — takes about a minute, no tools needed. What would help most: does green still arrive fast enough? Smoothing trades response for calm — if green now feels late, that's the thing worth telling me. Open an issue either way. The diagnostic builds can measure the old vs. new filter on your own hardware.


It doesn't care how you stuck it on

This is the part that makes the number trustworthy, and it's easy to miss because it looks like setup friction.

Most digital angle gauges measure raw tilt. Stick one on a blade even slightly skewed — rotated a few degrees toward the tip — and the number is wrong, with nothing on screen to tell you. You'd have to notice by feel.

The two-step calibration captures a flat reference and the cutting edge's hinge axis, then measures the bevel as rotation about that axis. Lengthwise skew drops out of the maths entirely. A crooked mount reads the same as a straight one, and one calibration serves both faces of the blade — flip the knife, keep sharpening.

That's why there are two steps instead of one. It's not setup; it's the reason the reading means something.


⚠️ Read this first

This is a hobby project, shared because people asked for it — not a precision instrument. It's a coach to build muscle memory, not a jig that holds the angle for you.

  • It tells you where your angle is; you still do the sharpening. Don't trust it blindly on an expensive knife until you've checked it — there's a built-in accuracy check (hold A on SET TARGET) and there are printable angle wedges to check it against.
  • Stroke-count and filter thresholds are still being tuned against real sessions — counts may be off by a stroke or two. Feedback welcome (see Contributing).
  • Mind the edge: you're handling a sharp knife near a small electronic device. Go slow the first few passes.

What you'll need

Basically just the stick — roughly $20. The M5StickC Plus already has a magnet in its back, so there's nothing else to buy.

Item What to get Search terms ~Cost
The device — pick one Three boards are supported. ⚠️ Not the original M5StickC (non-Plus, smaller ST7735 screen) — that model is not supported.
M5StickC Plus Fully validated on real hardware. ESP32-PICO, MPU6886, 1.14" ST7789V2, AXP192, passive buzzer. M5StickC Plus ESP32 $18–25
M5StickC Plus2 ⚠️ Compile-verified + code-reviewed against M5Stack datasheets; needs a community tester — please flash and open an issue. ESP32-PICO-V3-02, MPU6886, same screen, no PMIC, passive buzzer. M5StickC Plus2 $20–28
M5StickS3 ⚠️ Compile-verified + code-reviewed against M5Stack datasheets; needs a community tester — please flash and open an issue. ESP32-S3, BMI270, same screen, M5PM1 PMIC, codec speaker. M5StickS3 $25–35
USB-C cable A data cable (not charge-only) to flash it. You probably already have one.

That's the whole shopping list. All three supported sticks have a magnet built into their back, so they stick to a steel blade with nothing extra. If your unit's built-in magnet doesn't grip firmly enough, glue on a small neodymium magnet (~10 × 5 mm N35, a ~$1 add-on) with 5-min epoxy or VHB tape.

Why these three M5Stick models? From v0.2.0 the firmware is board-guarded at compile time (src/board.h, build flag SG_BOARD_*): each board gets its own binary, built from one codebase, that adapts to its IMU (MPU6886 on Plus/Plus2, BMI270 on S3), power management (AXP192 on Plus, G4 hold-pin on Plus2, M5PM1 on S3), and status LED pin. If you accidentally flash the wrong binary, the firmware shows a red WRONG FIRMWARE screen instead of misbehaving silently. If you already own a Plus, you're set. If you have a Plus2 or S3 — please try it and report back.

Board support status: M5StickC Plus — validated on real hardware. M5StickC Plus2 and M5StickS3 — compile-verified and code-reviewed against the M5Stack datasheets, but not yet confirmed on a physical device (the maintainer does not own them). All three share one codebase. If you have a Plus2 or S3, please flash it and open a GitHub issue with your results.


Mounting (nothing to build)

The M5StickC Plus has a magnet in its back, so there's no assembly: just press it onto the flat of the blade, screen facing you. No soldering, no glue, no wiring.

Optional: if the built-in magnet doesn't hold firmly on your knife, glue a small neodymium magnet (~10 × 5 mm N35) to the back with 5-minute epoxy or VHB tape.


Flashing the firmware

Option A — Flash in your browser (recommended, no tools)

  1. Open miamimoe.github.io/digital-sharpening-guide in desktop Chrome, Edge, or Opera (Web Serial isn't supported on Safari, Firefox, or phones).
  2. Plug your device into your computer with a USB-C data cable.
  3. Select your board from the device picker (M5StickC Plus / Plus2 / S3), then click ⚡ Flash it now, pick the serial port (often shown as CP2104 / USB Serial), and hit Install.
  4. If the device doesn't show up, install the CP210x USB driver and reconnect.

A prebuilt binary is also attached to every GitHub Release if you'd rather flash with esptool yourself (offset 0x0).

Option B — Build from source (for developers)

Requires PlatformIO:

git clone https://github.com/miamimoe/digital-sharpening-guide.git
cd digital-sharpening-guide

pio run -e m5stick-c-plus              # build for M5StickC Plus
pio run -e m5stick-c-plus2             # build for M5StickC Plus2
pio run -e m5stick-s3                  # build for M5StickS3

pio run -e m5stick-c-plus -t upload    # flash over USB (change -e for your board)
pio device monitor -b 115200           # serial log
pio test -e native                     # run the desktop unit tests

The only library dependency is M5Unified (pulled automatically).


How to use it

Once flashed, the device walks you through everything on-screen. A full session:

  1. Power on. You'll see a SHARPENING GUIDE splash, then SET TARGET.
  2. Set your target angle. Either:
    • hold the device at the angle you want and press A to capture it, or
    • press B to cycle the presets (12° / 15° / 17° / 20° / 22° / 25° / 28°) and press A to pick one.
  3. Set tolerance. Press B to cycle TIGHT ±2° / NORMAL ±3° / EASY ±5°, then A to confirm. (Start with NORMAL or EASY.)
  4. Zero-calibrate (2 quick steps). This is what makes it angle-accurate regardless of how the device is rotated on the blade:
    • Step 1/2 — "Lay flat on stone": rest the blade flat on your stone, press A, hold still for the countdown.
    • Step 2/2 — "Raise to your angle": lift the spine to roughly your sharpening angle, press A, hold still.
    • (If it says "KEEP STILL", just set it down for a second — or tap B to force the capture.)
  5. Sharpen. The whole screen turns green / blue / red. Chase green. The center number is your stroke count for the current side.
  6. Switch sides. When you flip the knife to sharpen the other face, press B to switch the device to the other side — that side's stroke count picks up where it left off. (If the angle reads off after re-mounting, short-press A to re-zero in place.)
  7. End the session. Long-press ASESSION summary (target, tolerance, strokes per side, time, time on-angle). Press A for a new session, hold B for your last five sessions, or B to sleep.

Controls

Button Short press Long press
A (front) confirm / capture / re-zero end session (→ summary) / accuracy check (SET TARGET)
B (side) cycle option / switch blade side toggle buzzer (ACTIVE) / toggle steady mode (TOLERANCE) / session history (SUMMARY)
Power (left side) sleep / wake hold 6 s = full power-off (AXP192 / Plus only — see note below)

⚠️ The "hold 6 s = full power-off" behavior is AXP192-specific and applies to the M5StickC Plus only. On the Plus2 and S3, the power button is managed by the board's own power IC through M5Unified; the long-hold power-off behavior may differ slightly.


How it works

  • Edge-axis bevel measurement. The two-step zero calibration captures both a flat reference and the cutting-edge hinge axis. The bevel angle is measured as rotation about that axis, so tip-to-heel skew doesn't inflate the reading and a single calibration serves both faces of the blade.
  • Mahony AHRS filter fuses gyro + accelerometer at 50 Hz, with per-session gyro-bias capture and a snap-to-raw recovery when the device is verifiably still.
  • Motion-based stroke counting. Passes are detected as horizontal linear-acceleration peaks (with hysteresis + a refractory interval) while you're on-angle — not from angle-dwell timing.
  • Battery-aware. Idle sleep, screen dimming, an 80 MHz CPU clock, and a one-click power key. On the Plus/Plus2 this is a true deep sleep with the session preserved in RTC RAM, so waking resumes where you left off — strokes, time-on-angle, and session duration. On the M5StickS3 the power button is owned by the M5PM1 PMIC (not a wake-capable GPIO), so the device fully powers off instead — a power-key press turns it back on with a fresh boot (the in-progress session isn't resumed on the S3). Figure on roughly an hour or two of continuous use on the small cell (untuned — your mileage will vary).

More detail lives in docs/ — the design spec, implementation plan, and hardware bring-up checklist.

Repo layout

src/        firmware modules — app state machine, angle math, Mahony filter,
            stroke/side/input FSMs, zero-cal capture, UI, power, persistence
test/       native (desktop) unit tests for the pure-logic modules
docs/       design spec, bring-up checklist, and the browser-flasher page

Troubleshooting

Symptom Fix
Browser flasher can't see the device Use desktop Chrome/Edge/Opera, try a different data USB-C cable, and install the CP210x driver.
Screen stuck on "KEEP STILL" during calibration Set the device down on the bench for a second so it can capture — or tap B to force the capture.
Angle reads wrong / drifted after re-mounting or flipping the knife Short-press A to re-zero in place.
IMU FAULT on boot Power-cycle. If it persists, re-flash; this is the documented MPU6886/AXP192 I²C quirk — see docs/.
Stroke count is off by a few Known — thresholds are still being tuned. Please send your numbers (see Contributing).
Plus2 wakes, then sleeps when you let go of the power key Fixed in v0.3.0 — it now ignores that wake press. Re-flash from the flasher.
S3 turns on and immediately powers off Same family as above; v0.3.0 drains the power-on click. If it still happens, the M5PM1 may be hard-resetting on a single click — open an issue.
Resume shows the previous knife after a crash / reflash Fixed in v0.3.0 — a non-sleep boot now discards the leftover session.

Known limitations (v1.0.0)

  • Stroke-count and Mahony kp/ki thresholds are first-pass guesses still being tuned on real stones.
  • No companion app, BLE, or logging by design — it's meant to be a glanceable, standalone coach.
  • Board support: the M5StickC Plus is validated on real hardware. The M5StickC Plus2 and M5StickS3 are compile-verified and code-reviewed against M5Stack datasheets, but not yet confirmed on a physical device — if you own one, please flash it and open a GitHub issue with results. That includes the battery icon: the Plus2 reads its cell through an ADC divider and the S3 through the M5PM1, neither of which has been checked against a real charge curve yet.

Contributing

Issues and PRs welcome — especially real-world tuning data (your hand-counted strokes vs. what the device reported, knife/stone/angle). That's the single most useful thing right now. Open an issue with what worked, what didn't, and your hardware. See CONTRIBUTING.md.

License

MIT © 2026 Another Dumb Idea, LLC. Do whatever you like with it — build one, mod it, sell your own version. Attribution appreciated, not required.

About

Digital Sharpening Guide — M5StickC Plus firmware that gives live angle feedback and stroke counting while sharpening knives

Topics

Resources

Contributing

Stars

10 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages