A DC-Motor with optical feedback sounds like a pretty good option. They are also much cheaper, are they not?
Would I be able to control such a motor appropriately with a standard board like the arduino? Imagine I were moving 2kg 30centimers, and I want this to react as a human hand would (same speed, start time), would this even be possible?
And controlling it with an arduino is no problem. You've got to main options for the sensor - either an optical tracker that is pointed at the shaft and detects the presence of a striped/marked point which appears once every revolution, or the (cheaper but just as reliable, really) solution of an iR sender/receiver pair monitoring the turning of something (imagine a motor shaft turning a fan. The iR pair would be positioned perpendicular to the fan blades, each time a blade crosses the path of the iR, a signal is generated).
iR is cheaper.
An arduino (or just about any other microcontroller) has an operating frequency way over the rotational speed of the motor. Both optical and iR sensors can easily handle the relatively-slow rotational speed of the shaft. I've used an MC68k from, what, 20 or 30 year old production lines(?) to pull this off. The code is dead simple, just connect the iR/optical output to a counter (which comes built-in in several of the arduino input ports) (you'll need to run it through an inverter first, if you're doing the iR approach) and then loop over the count until it's moved as far as you need it to.
The human hand isn't crazy fast the way you're thinking. If you've ever seen a stepper motor snap from one position to another, that is real acceleration. Basic DC motors typically have lower acceleration than that - their acceleration and speed will vary greatly depending on the model chosen.
2KG is not a light weight. I would have recommended the stepper approach, but you'll need motors about the size of your fist running at 12V and a relatively high current to rotate an object of that size. Basic statics says that the farther away from the point of rotation a weight is applied, the stronger its force. You've got 2KG distributed (I assume) evenly across the 30cm surface, it's going to be quite the weight to turn against gravity, so stepper motors are out.
Servos, which are basically your run-of-the-mill DC motors with their own close-lood feedback system will work. But you'll have better luck with the larger variety of DC motors available online or in your local electronics store.
Nice, that's exactly the info I want to hear. By the way, I need to also measure the position of the object being turned. That is, I was intending for my robot to have two modes - training mode and execution mode, so your DC suggestion makes it even better.
Thing is - I don't want to skimp on the positioning logic - I need it pretty accurate in space (sub millimeter) and in time. Overshooting the target is fine, I'll correct it with one of those algorithms.
What is the most arduino compatible and accurate measurement method that will handle both use-cases? I should be able to use it both to control my DC motor, and also to record the position of the wheel being turned, even when the motor is switched off?
For a similar project we used the IR sensors off a USB ball mouse along with homemade encoder wheels to provide motor feedback. This method costs next to nothing and is pretty damn accurate.
It was a ball mouse which featured two scroll wheels, meaning we could recieve feedback from 4 DC motors using a standard USB interface & mouse driver.
We used the mouse buttons as triggers to mark the rotation stop points for use in the initialization routine.
The motors we ended up using were high end electric RC car motors. They were the highest torque in the smallest package we could realistically get that still fitted our budget.
You can't. Once your device is switched-off, you can't know what position it will start up in. The easiest option is to have an initialization routine that will move the motor to a known position. For instance, move it all the way clockwise until it jams (assuming there's a limited range of motion) or until it signals a button, whatever that it has reached a position. This is known as calibration or zeroing.
You can get motors with encoders built into them that are very, very accurate. You can decode their pulses into position with a quadrature decoder like the HCTL-2020.
Would I be able to control such a motor appropriately with a standard board like the arduino? Imagine I were moving 2kg 30centimers, and I want this to react as a human hand would (same speed, start time), would this even be possible?