0

This is a pretty basic question - essentially I want to know the difference between adjusting the basic sweep code (from the library) in terms of the "delay" instruction and the "pos += 1" (in steps of 1 degree) instruction.

For my project I want my servo to move 60 degrees at the same frequency as a heart beating relatively fast (lets say two beats a second). I.e., the servo moves from zero to 60 degrees twice in one second. Should I adjust the 'delay' or the 'position' instruction from the library? What's the difference? Does it matter which one I adjust as long as it does what I need it to?

Thanks for your time!

2
  • when it comes to programming microcontrollers, the microcontroller does exactly what you tell it to do, no more, no less .... regarding servo moves from zero to 60 degrees twice in one second, you can only move zero to 60 once ..... you have to return to zero before the action can be repeated .... the microcontroller will not return the servo to zero without a specific instruction to do so
    – jsotola
    Commented Nov 13, 2018 at 2:59
  • as long as it does what I need it to .... you have not clearly defined how the servo should move, so the question is not answerable
    – jsotola
    Commented Nov 13, 2018 at 3:02

2 Answers 2

0

Changing the delay and leaving the increment to one generally gives a "smoother" movement. In fact, if you want for instance to move (roughly) five times faster than the example you can either move the delay to 3ms or increment the position by 5. This is what happens at the position request:

Time   0  3  6  9 12 15 18 21 24 27 30 33 ...
Delay  0  1  2  3  4  5  6  7  8  9 10 11 ...
Incr.  0  0  0  0  0  5  5  5  5  5 10 10 ...

Now, usually I try to use the delay approach as much as I can; the limitations on that approach are that it becomes more CPU consuming if you should also perform other actions between two movements (which is not your case, since you are using delays).

In order to perform four 60° movements in one second you should wait roughly 4ms between calls.

In any case, even if the single increment is the best solution, as long as you perform one movement every 10-20ms you won't be able to see any differences, so even increasing the position by 3 every 12ms or by 5 every 20ms is fine. If you start hearing a "pulsed" noise or see the motor going "jerkily" reduce the increments and the delay.

Note: You can also use multiple increments in order to have "fractional" delays. For instance, if you want to have one increment every 3.5ms, instead of using delayMicroseconds you can perform two increments every 7ms.

0

Servo send out command pulse about 50 Hz. that mean no point to update servo position more frequent than that. Servo.write() give resolution of 1 degree. if you need more resolution you can use servo.writeMicroseconds() For my approach I calculate position trajectory as function of time and update servo position in while loop using millis() as time base. Anyway I finish it and implement to library called accServo https://github.com/Menginventor/accServo

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.