• warning: file_get_contents(https://raw.githubusercontent.com/MyRobotLab/myrobotlab/develop/src/main/resources/resource/DiyServo//service/DiyServo.py) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/html/myrobotlab/themes/superclean/repoFile.php on line 38.
  • warning: file_get_contents(https://raw.githubusercontent.com/MyRobotLab/myrobotlab/develop/src/main/resources/resource/DiyServo//service/DiyServo2.py) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/html/myrobotlab/themes/superclean/repoFile.php on line 38.



The DiyServo service is a service that can be used as a normal servo, but it's built from a motor and an analog input. The idea is that you should be able to use any motor and any analog input to byild your own servo. The circuit below can be used to connect the motor and the servo to a single Arduino. But it's also possible to configure in alternate ways. 



Please note that from version 1.0.2274, the configuraion of the DiyServo is different from earlier versions. It now starts a Motor / MotorDualPwm service as a layer between the DiyServo service and the Arduino.

I made two different scripts to show some alternate configurations.


Example for develop:

#file : DiyServo.py edit raw

# This is a demo of the setup for DiyServo. 
# This setup is valid from version 1.0.2274
# The difference compared to earlier versions is that it now
# starts a MotorDualPwm service that connects to the Arduino
# Before the DiyServo connected directly to the Arduino.
# Config
# start optional virtual arduino service, used for test
if ('virtual' in globals() and virtual):
    virtualArduino = runtime.start("virtualArduino", "VirtualArduino")
# Start of script for DiyServo
# Analog input A0 is the same as digital 14 on the Arduino Uno
A0 = 14
# Start the Arduino
arduino = runtime.start("Arduino","Arduino")
# Start the MotorDualPwm. You can use also use a different type of Motor
motor = runtime.start("diyservo.motor","MotorDualPwm")
# Tell the motor to attach to the Arduino and what pins to use
# Start the DiyServo
servo = runtime.start("diyservo","DiyServo")
servo.attach(arduino,A0) # Attach the analog pin 0
# Set the PID values. This example shows what DiyServo has as default.
servo.pid.setPid("diyservo", 0.020, 0.001, 0.0)
# At this stage you can use the gui or a script to control the DiyServo

hairygael's picture

I just love it !!! Thanks

I just love it !!!

Thanks guys for this fantastic MRL service.

I have been dreaming of this, ever since I burned my first servo!!

SylvainJeanneton's picture

Turn left or right

Thanks your code is very usefull, thanks a lot. But it commands only the speed. How can we command the way ? In other words turn left or turn right with a middle point ? (it exists potentiometer with middle point. I 'm shure of this.) In fact we need both speed and way left or right.


Mats's picture


In the example I only have the motor out to show that it works.

Kwatters built the complete DiServo as you can see int his post. So it works in both directions and you can use it just like any other servo. But you have to  mount the pot, so that it turns with the joint.



If you built one and only can control speed, then you need a different motor control board.

If  you for example use that board from the drill, then it will only move in one direction and only control speed.

I use a BTS7960B that I bought from here.


I also use a IBT-4 board from here:


I tested the drillmotor with a LN298N board, but it was not powerful enough.

I also tried this board, but it could only drive the motor in one direction: 



hairygael's picture

Hello Mats, I'm working on

Hello Mats,

I'm working on the legs for InMoov right now. Until now I have been using the DIY Servo in a very basic way, but I would like to know if the DIY Servo is compatible with the enable and disable function?

Mats's picture

autoEnable / autoDisable

Hi Gael

Not currently. But the intention is that you should be able to replace any Servo with DiyServo.


moz4r's picture

Hi ! There is a thing to

Hi ! There is a thing to check to look forward, I stuck on something. ( with my hardware )

The targetPos is never reached, currentPosInput ( potentiometer state ) is few degres up or down ( getCurrentPosInput() ).

It is transparent if we don't look at it.

Seem pid missing a little thing when it is near the position goal ( I played with it, no success,final exact position never reached ).

In this exemple I asked 90 input pos, and final pos is stucked near 96.

Some ideas guys ?