This project controls an robot arm remotely by moving a similar robot arm. The sensing arm looks like a joystick to the computer.
The robot arm kit I bought didn't come with instructions, so the vendor pointed me at some written in Chinese.
Fortunately Google Translate was there to help me out - https://translate.google.com/translate?hl=en&sl=zh-CN&tl=en&u=http://www.yfrobot.com/forum.php?mod=viewthread&tid=2398
During construction I used my position sensing servos in place of standard servos, but otherwise followed the instructions here. Subsequently however, I've changed the joints around a bit to make it more appropriate for my ROV target.
Using a robot chassis to control a remote robot chassis requires position sensors in the controlling chassis. Because the robot frame was designed to accommodate servos, the easiest way to add position sensors is to buy a bunch of cheap servos, and modify them to provide position feedback. It turns out you can buy such things from Adafruit (see https://www.adafruit.com/products/1404) but at $15 a piece, these seems a little pricey. All I need is a servo sized box which turns a potentiometer to produce a voltage proportional to its position.
Instead I bought a bunch of cheap servos (such as these http://www.ebay.com/itm/10Pcs-High-Speed-Torque-Standard-Servo-for-S3003RC-Car-Helicopter-Airplane-Boat-/301763979131) which cost me $3.50 each and modified them to provide the position feedback.
Modify these servos is really simple. First unscrew the based the servo unit by removing the four screws.
This exposes the control board and motor.
If you lift the control board you'll find a potentiometer underneath it. This is what we want access to. There are three wires connecting the PCB to the potentiometer. We need to sense the voltage found on the center wire.
As with all servos, these are operated using three wires: power, ground and control. I still need power and ground for the servo (we need a voltage to be divided by the pot) but I no longer need the control wire - so I reused this to provide the position output instead. To do this I unsoldered the control wire from its current position on the pcbs, and re-soldered it to the central lead from the potentiometer.
Below you see the three wires - ground, power and control (white):
Here the white wires has been moved to a pin which is connected to the center of the potentiometer. Fortunately, in this servo at least, the potentiometer is attached to an easy to reach point on the PCB.
Now, when the servo is powered, the control lead will provide a voltage proportional to the position of the servo.
Finally, because we're only using this servo for feedback, I disconnected the motor so it would never be powered. You can do this by simply cutting the wires, or you can unsolder them (which is what I did).
All that remains is to pop the top back on, and we have a position sensing "servo" which can be used in the robot arm controller.
I decided my ROV needed a robot arm when I original conceived it. First, I like the idea of my robot being able to interact with its environment. Second, since my kids are involved with the MATE program, I wanted a chance to investigate robot manipulators for myself (so they didn't have all the fun).
The robot arm itself is constructed using a cheap Chinese 6-dof robot arm kit and a number of underwater servos. The question was how best to control it.
My original thought was to use some sort of 3D positional scanner - specifically the Leap Motion Controller. The demos looked very cool, especially the way it "sees" and track your hand. I wrote the software to take the hand and finger position, do the appropriate reverse kinematic math, and apply it to the movement of the robot arm. Unfortunately, at least when I originally tried this, the Leap Motion tracking just wasn't good enough and consistent enough to track my hand, especially as I would attempt to grab objects. It would suddenly loose the position of my arm and hand. Not great if you're trying to manipulate a remote object underwater.
My second though was simply to use a joystick to move the arm in the X/Y/Z space. Again, using a little math, it was possible to move the arm on the robot and manipulate the grabber; and while this worked, it wasn't the most natural way to operate a remote hand.
May third, current, and documented here, solution was to construct a remote arm controller. The idea was to build an exact duplicate of the robot arm which would be kept on land. Instead of servos, I would place position sensors at each joint, and use these values to control the servos on the robot. The result, as the controller moves, so does the robot arm - one mirrors the movements of the other.