So these are the motors I bought. They're standard Lego Technic NXT servomotors with integral optical encoders. They're about £7 each on bricklink.
No-load speed: 170 RPM
No-load current: 60mA
Stall current: 2A
Stall torque: 50N.cm
Integral over-voltage protection: 15V
Integral over-current protection: PTC self-resettable fuse trips at 600mA
Integral gearbox: 1:48 reduction
Integral encoder: Quadrature optical encoder. I've just tested it and the encoder works on both 3.3V and 5V
Here's the motor pinout:
Pin 1 - white - motor terminal 1
Pin 2 - black - motor terminal 2
Pin 3 - red - encoder 0V (gnd)
Pin 4 - green - encoder Vcc (3.3V - 5V)
Pin 5 - yellow - encoder output A
Pin 6 - blue - encoder output B
I've crimped standard breadboard "dupont" connectors onto the wires so I can power it with anything. Here's my test setup with a spare pi zero W providing the 3.3V to the encoder:
And here's the oscilloscope trace of the encoder output while the motor is running with no load:
I'm looking at driving these with either a DRV8835 or a TB6612FNG module. Both of these are dual motor drivers with a full H bridge so they can reverse the motor as well as doing PWM speed control. They're also very cheap from eBay\China.
For feedback I'll probably connect the encoders to the Pi IO pins and use pigpio to count the pulses.