Cassette tape speed control

From Helpful
Revision as of 14:59, 17 October 2022 by Helpful (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Portable cassette player with a knob

Speed controlling a cassette player sounded like potentially nothing more than a potmeter and done.

It turns out that cassette tape motors are designed to keep constant speed under varying load and varying supply voltage. Which makes a lot of sense, particularly in portable designs where battery voltage will vary, but also in general because mechanical load from the tape does (though note that the tape is not pulled by the reel, but by the capstan/pinch roller[1] beside the head, and the reel just takes up the slack, with a slipping construction so that it works at varying amouts of tape as that means varying speeds. Still, that slipping construction will often be driven by the same motor and still presents varying, if slight, load), and even audio peaks might contribute(verify).

The player pictured here has a fixed-speed motor of the electromechanical variation, a governor made of weights on the commutator contacts that lift off at the intended speed (it also help it be a flywheel). See also cassette tape motors.

Modulating the power still wins in the end, because you're starving it of speed before that liftoff, though note that this will make it more warbley at low speeds. We'll call it lo-fi, and now it's a feature.

As such, aside from the microcontroller, the electronics consists of little more of a transistor, and code reading the dial value (and CV input to allow control directly from a sequencer), mapping to useful range of voltage/speed, and writing that to PWM.

The range in which the speed is usefully modulated between full and probably-too-slow is relatively narrow (0.8V of the ~5V range, iirc), but this is one-time calibration for a specific motor.

I'm setting the PWM registers directly, because Arduino analogWrite() is 8-bit, and when only ~15% of the total range does something, 8-bit is a bit granular.

I arbitrarily settled on 10-bit PWM, as a balance between a bit more precise, and its longer output speed being valid enough for this case due to the motor's inertia. I should experiment with PWM more, because it seems there are better ways to make a tradeoff that work well for this case.


This was a prototype, and it has a few issues:

I should've probably used a 3.3V uC, because it currently uses an Arduino Pro Micro at 5V, and when using the regulator the input needs to be >6V for it to function at all.

Batteries (the tape player thing takes 4 AAs) would quickly dip below that when actually still mostly full, so don't really work. So it's currently limited to working off a wallwart.

Also, when the motor engages, the voltage dips and the Micro resets, to recover a few seconds later.

At 7.5V it's immediate, but you certainly can't do that with batteries, and it makes the effective range for PWMing the motor even smaller.