I've been working hard all day to get this to work.

I'm playing around with the math module in python. I eventually want the following code to help me control the speed of a servo motor. The idea is to get the servo speed to accelerate and then decelerate as it reaches its set position--in a parabolic way you might say.

The problem is I'm getting wavy numbers apparently from the algorithm I've set up and it needs to be a nice smooth transition.

from __future__ import division
import math
import time

def Interpolation():
    EffectPercentage = 1
    Step = 1
    nSteps = 32
    MovementStepPercentage = EffectPercentage/nSteps*Step
    print MovementStepPercentage
    while Step << 32:
        Interpolation = (1-math.sin(MovementStepPercentage*180+90))/2*EffectPercentage+MovementStepPercentage*(1-EffectPercentage)
        print "Interpolation =", Interpolation
        Step = Step+1
        print "Step =", Step
        MovementStepPercentage = EffectPercentage/nSteps*Step
        print MovementStepPercentage
        time.sleep(0.0035)
        if Step == 32:
            break

Interpolation()

I know a thing or two about math, but not enough to get this to work apparently... any pointers?

This is left bit shift

while Step << 32:
#
while Step < 32:     ## instead?

If you want to increase the speed of a motor, at higher motor speeds the same increase will yield a greater increase in the speed of the motor because of the initial friction which may be part of the reason that there isn't a smooth increase.

Also, depending on the version of Python you are using, you may be getting an integer instead of a floating point.

MovementStepPercentage = EffectPercentage/nSteps*Step  ## an integer
MovementStepPercentage = float(EffectPercentage)/nSteps*Step  ## convert the result to float 
#
#  which affects this 
Interpolation = (1-math.sin(MovementStepPercentage*180+90))/2*EffectPercentage+MovementStepPercentage*(1-EffectPercentage)
#
# note that the above line is the same as
# (and not sure if you want it this way or not)
(1-math.sin( (MovementStepPercentage*180) +90))

Did that solve the problem?

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.