InMoov , MyRobotLab and Notes on the HS 805BB potentiometer extraction


The below article is a work in progress, it talks a bit about InMoov and MRL at a higher level, but it does have some commentary about reworking the HS 805 BB  servo for continious operation and extracting the potentiometer.


How Servomotors Control Position

A potentiometer is a variable resistor that acts as a voltage divider.  As you rotate the actuator of the potentiometer, the resistance measured from the center tap to the ground pin will increase or decrease depending on the direction of rotation.  When the servo is powered up, the center pin of the potentiometer measures a voltage: Vo/Vi = R2 / (R1+R2). This voltage represents the current angle that the servo is rotated to.  The servo control board reads this voltage and determines if it needs to turn on the motor in forward or reverse to rotate to the desired angle. When the voltage at the center tap reaches the expected value corresponding to the angle that the servo was told to move to, the motor will turn off.


The Gear Ratio

The InMoov shoulder is driven by three separate servomotors connected to worm gears. The gearing ratio of the worm gears is different than the normal gearing ratio of the servo motors. As a result, telling the servo to rotate 90 degrees does not yield a 90-degree rotation in the arm.  To address and fix this problem you need to disassemble the servomotor and extract the internal potentiometer so that it can be affixed to the gearbox. Doing this will allow the servo to measure the angle of the gearbox and not the angle of the servo rotation.


Printing The Parts

The first step is to 3D print the parts for the shoulder gearbox using files downloaded from

The gearboxes are designed to be used with the HS-805BB servomotors from HiTech, but any other servo with the same size should be able to work. Note:  Some servomotors have square potentiometers and some have round potentiometers. Be sure to print the appropriate shape potentiometer holder from the InMoov parts.

The worm gear will be taking the bulk of the stress while in operation, so I recommend printing the worm gear with a higher infill. For example, using two shells and a 75% infill. The rest of the parts, I printed with two shells and a 25% infill. It’s very important that the parts move freely so that the servomotor will be able to easily turn the worm gear. Depending on the slicer and printer, you may want to try 1 shell or other settings to make sure the parts fit

               Sand and prep the parts to ensure that they fit smoothly together and that they rotate.

Re-wiring the Servo

Once the parts have been sanded and dry fit, it’s time to take apart the servomotor to extract the potentiometer and turn it into a continuous rotation servo.

Start by unscrewing the six small screws from the bottom of the servo using a precision screwdriver bit. Once the bottom of the servo has been removed, slide off the top to reveal the gears. Pull the gears off the top of the servo, leaving just the bearings and the mounting pegs.

The motor is usually glued to the inside of the housing, so you’ll want to tap each side of the servo with a hammer, but not so hard as to damage the case. This will break apart the glue, making it easier to slide out the servo control board and motor. Using a small screwdriver or other tool, push the motor out from the top of the servo housing.

Once the motor and servo control board have been removed, the three wires to the potentiometer will still be connected. Unscrew the small screw holding the potentiometer in place so it will also slide out.

Next, solder a 1-foot extension to each of the contact points on the bottom of the servo controller board. I use red, black, and white wires for power, ground, and the control PWM signal. These will run outside of the servo housing so the potentiometer can be inserted into the gear housing. Cut the potentiometer away from the servo control board and solder it to connect it to the end of the extension wires.


Modifying the Gears for Continious Operation

The largest gear has a stopping block on it that prevents the servo from rotating past 180 degrees. Using a knife or other tool, break the stopping block off the large gear. When the gears are reassembled on top of the servo, they should rotate freely.

Replace the servo control board in the housing, reattach the gears to the top and screw the servo back together, being sure to leave the new extension wires and the potentiometer extending out of the servo case. In order to be able to reassemble the servo, a small amount of plastic should be nibbled away with some pliers to allow for extra space in the servo casing where the power cables normally exit.


Once the servo is reassembled, screw the worm gear onto the servo arm. Make sure the screws are small enough so that they do not interfere with the gear housing. I use a bench grinder to make the heads of the screws flush with the surface of the worm gear.

Add plenty of grease to the gearbox and to the gears. Finish assembly by placing the servo and worm and piv gears into the gearbox and screwing it all together.


Replacing the Potentiometer

Insert the extracted potentiometer into the holder and screw it securely in place. Over-tightening the screws could damage the potentiometer, so be sure to only screw them down enough to keep the potentiometer from falling out of the holder.

Line up the actuator of the potentiometer with a hole in the pivot gear. If you are assembling the right shoulder you will need to swap the red and black wires to make the potentiometer rotate in the opposite direction.


Note: The  servo motors can draw a lot of power while operating, so attempting to power them off of the USB port of your computer will not provide enough current. It is recommended that you use an external power source. When using an external power source, it’s very important that the both the Arduino and the servo have a common ground connected. Without a common ground the servo will behave oddly and will likely jitter and twitch due to electronic noise.


Connect the power and ground to the servo, attach the signal pin from the Arduino to one of the digital pins on the Arduino (digital pins on the Arduino typically support PWM.) 


Section Heading TKTKInMoov Control Software

Download MyRobotLab ( and program the Arduino with the Arduino sketch that comes with the software. Launch MyRobotLab and start an Arduino service and a Servo service. Specify the COM port that the Arduino is connected to via the GUI of MRL. In the admin GUI for the Servo in MRL you can specify the Arduino service and the pin that it is connected to. Select the appropriate pin and Arduino board, and click Attach. This will attach to the servo and you will now be able to use the slider control to move the servo forward and backward.  MyRobotLab also supports python as a scripting language, as well as restful APIs.

               Good luck with your InMoov build!


Here's some photos for this article.





The article is probably a bit dated, and incoherent in places. sorry about that.  Before we get started, a quick message aboue


Well, one thing I learned in putting together a few of these gear boxes is that the potentiometers can be damaged very easily.  They can over rotate, or pull apart.  They might have certain angles that they read as an open circuit, and other anges that they read correctly.  Whatever it is, I definitely broke a lot of potiometers.

As a result, I decided to find some pots that were about the same size and electrical specs so I ordered up some 10k ohm linear sweep 270 degree of rotation pots.

Here's one of those installed in the elbow of "Harry"...





Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
jaideepjoshi's picture

Not sure I understand this part

Connect the power and ground to the servo, attach the signal pin from the Arduino to one of the digital pins on the Arduino (digital pins on the Arduino typically support PWM.) ??

U mean servo to arduino. Right?

Mats's picture

Removing motor


I use a little different method to avoid damaging the servo and the PCB.

After opening the servo, I unsolder the three legs on the motor. I use a vacuum pump or solder wick to remove the solder. That way I can take the PCB out without removing the motor. Then I use a file to make the opening for the cables larger. Next step is to open the cogwheel side and remove the three large cogwheels. I cut of the stop on the large cogwheel. Then I unscrew the pot and move it outside the box without unsoldering it. After that I put the cogwheels back in again.  Then I can put the PCB back and solder the three pins to the motor again. And then screw the housing back.

It's similar to the method shown here:

So far I haven't destroyed any servo. I destroyed one pot by overheating it. 

If I were to do it again, I would use the method that Juerg suggests here to extend the cable:


jaideepjoshi's picture

Now on 6th servo

Now on my 6th servo+potentiometer combo. Plus I am now armed with a OHM Meter to make sure the pot is ok.

So Now:
I have a servo that has the pot removed.
Servo is up and spinning when powered to breadboard and external power without any another connections.
Pot has been tested via ohm meter to be at 5K.
I connect a extension between the pot and servo.
I test the ohm meter at the servo end and the pot registers at 5K.
I use the following script to connect my servo to set to position 0:
#include <Servo.h> 

Servo myservo;

void setup() 
  myservo.write(0);  // set servo to 0

void loop() {} 

I add power to the breadboard and connect the servo to pin 9.

Per Gael:
"Now turn by hand the potentiometer until the servo stops turning. This is your 0° degree position."
This clearly does not happen. Servo keeps spinning. Nothing happens when I turn the pot. I could send a pic if anyone is interested.
Any ideas, what am I missing???
Thanks in advance.


Mats's picture

Centering the servo

Just as a test, I think it would be better to test the center position, not an extreme value.
And also make sure that you have a separate power supply for the servo with common ground.

#include <Servo.h> 

Servo myservo;

void setup() 
  myservo.write(90);  // set servo to center

void loop() {} 
philrobo's picture

Hi i am trying make my torso servos stand still on Zero position


Iam trying to put my torso servos stand still at Zero postion or center position, but when they  pluged in to 6 volts through  inmoov power board, they start rotating towards one direction and not trying to stop any where in between, to avoid the damage of body parts and motors iam unplugiging it,

Can you please give me a solution to make it stand still at center position.



Mats's picture

90 is center, not 0


The problem is with the script. A servo can be set between 0 and 180 degrees.

Far left is 0 and far right is 180. Center position = 90.

If you set it to 0 it will try to move to the extreme left position.

#include <Servo.h> 
Servo myservo;
void setup() 
  myservo.write(90);  // set servo to center position
void loop() {} 


philrobo's picture

actually iam talking about my top stomach motors

actually iam talking about my top stomach motors, they are not staying in center the two motors are rotating in a direction the whole body is bending one side and tending to break the body parts,at that point i am unplugging the power and rotating it with hands to normal position

is the pot have to be solderd as it is or we have to swap the end wires

please somebody help

kwatters's picture


Maybe the polarity to the potentiometer is reversed?  Normally, if you set the servo to 90 degrees, it should move towards the center of the potentiometer and slow down when you get there.  If the polarity of the wires to the potentiometer are reversed, it will accelerate away from the center...  not converge towards it. 

good luck!