This one isn't a build log — it's a “wouldn't this be cool” that I've been turning over, written down before I forget it. I want to build a tuning knob for my SDR that feels like the VFO on a five-thousand-dollar radio — the heavy flywheel spin, the crisp detents, the hard stops at the ends of a menu — except every bit of that feel is software, and I can change it on a whim. No gearboxes, no clutches, no weighted flywheels. Just a motor, a sensor, and a control loop.
Instead of a cheap mechanical encoder, you use a brushless gimbal motor as the knob itself — driven under field-oriented control (FOC), with a magnetic absolute encoder (an AS5600) reading a little magnet on the shaft. The motor is no longer something you drive to a position; it's something you feel through. The control loop reads exactly where the knob is, thousands of times a second, and pushes back with precisely the torque you tell it to. This is the Scott Bezek SmartKnob trick (github.com/scottbez1/smartknob), and it's built on the SimpleFOC library.
Because the feel is entirely software-defined, one physical knob becomes every knob:
A couple of buttons switch which profile is live. It's not just a tuning knob — it's a whole control surface hiding in a single knob.
The obvious question for anyone with a parts bin full of quadcopter gear: can't I just use a brushless ESC? No. A normal drone ESC spins the motor open-loop, commutating on back-EMF, with no idea where the rotor actually is and no low-speed torque control at all — the exact opposite of what a haptic knob needs. You need a proper FOC driver that closes the loop around the encoder. You can buy the motor, an AS5600 encoder, and a SimpleFOC Mini driver together as a kit for about $35, then add a small microcontroller — an ESP32 or an RP2040 — to run the loop.
Give the virtual knob a mass and a damping term, track its angular velocity, and command motor torque from that model. It resists from a standstill like there's a flywheel behind it, carries momentum once it's spinning, and coasts to a stop through the damping. Layer detents on top of that and you get “heavy but clicky” — the thing every good radio VFO does and no cheap encoder ever will.
Here's the inversion I keep coming back to. In a traditional radio, the satisfying heft comes from real mass — a weighted flywheel, a heavy machined knob. Here the motor synthesizes the weight, so the physical knob can be featherweight and still feel like a chunk of brass. Mass becomes a setting, not a material. I can 3D-print the knob or mill a thin hollow aluminum shell purely for looks, and dial the felt weight per mode — feathery for fast band-scanning, ponderous for fine tuning. A physically light knob actually gives the control loop more authority, since there's no heavy rotor fighting the motor. The whole thing lives or dies on a fast, low-latency control loop — which is exactly why it gets its own dedicated microcontroller instead of sharing a busy processor.
I'm building this to talk to my Raspberry Pi cyberdeck's SDR software. The knob is an input device: turn it, its microcontroller sends a clean tuning event to the Pi, the Pi retunes the SDR. Nothing clever has to happen on the radio side — it's just a very good knob feeding the software that's already running. And because the feel is all in firmware, it can grow new behaviors over time without touching a single piece of hardware.
The real work is mechanical, not electrical. I'll mill the knob on the 3018, and the one rule there is to keep the diametric sensing magnet out on the shaft where the encoder can see it — aluminum nearby is fine, but the knob body must not shroud the magnet or the position sensing goes to mush. Then it's tuning the feel: the mass and damping constants, the detent strength, the encoder gap. That's the fun part, and it's exactly the kind of thing that's easy to iterate on the bench.
That's the idea. Every piece is real, cheap, and either off-the-shelf or something I can make on the mill. More if and when I start building it.