Javadoc link

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. 

DiyServo

 

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.

[[/service/DiyServo.py]]

[[/service/DiyServo2.py]]

 

Example code (from branch develop):
# 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
port="COM3"
# start optional virtual arduino service, used for test
if ('virtual' in globals() and virtual):
    virtualArduino = runtime.start("virtualArduino", "VirtualArduino")
    virtualArduino.connect(port)
# 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")
arduino.connect(port)
# 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
motor.setPwmPins(10,11)
motor.attach(arduino)
# 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)
servo.moveTo(90)
# At this stage you can use the gui or a script to control the DiyServo

hairygael

8 years ago

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

7 years 10 months ago

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.
Thanks
Friendly.
Sylvain.

 

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.

http://myrobotlab.org/content/diy-servo-service

----

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.

http://www.ebay.com/itm/191833193918?_trksid=p2057872.m2749.l2649&ssPag…

I also use a IBT-4 board from here:

http://www.ebay.com/itm/182073487693?_trksid=p2057872.m2749.l2649&ssPag…

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: 

http://www.ebay.com/itm/6V-24V-10A-DC-Motor-Speed-Driver-PWM-Adjustable…

 

hairygael

7 years 2 months ago

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?

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 ?

Example configuration (from branch develop):
!!org.myrobotlab.service.config.DiyServoConfig
autoDisable: false
clip: true
controller: null
enabled: true
idleTimeout: null
inverted: false
listeners: null
maxIn: 180.0
maxOut: 180.0
minIn: 0.0
minOut: 0.0
peers:
  motor:
    autoStart: true
    name: diyservo.motor
    type: MotorDualPwm
  pid:
    autoStart: true
    name: diyservo.pid
    type: Pid
pin: null
rest: 90.0
speed: null
sweepMax: null
sweepMin: null
synced: null
type: DiyServo