Go Down

### Topic: Moving two servos incrementally every second (Read 724 times)previous topic - next topic

#### flotilla

##### Jul 08, 2012, 05:21 pm
Hi,  I am controlling the position of two servo's, (say A and B)

Let's say servo A and B both start at 1000ms position:

ServoA.writeMicroseconds(1000);
ServoB.writeMicroseconds(1000);

I want to be able to add to the position incrementally every second so say servo A starts at 1000 and moves 100ms every second and servo B starts at 1000 and moves 10ms every second.

I know I have to define two values, add to them every pass, then send that value to the servo position but I am slightly unsure on how to code this.

I think it is something like this:

Int APulse;
Int BPulse;

Void setup() {

APulse = 1000;
BPulse = 1000;

Void loop() {

ServoA.writeMicroseconds(APulse);
ServoB.writeMicroseconds(BPulse);

(this is the bit I don't understand, adding to APulse, BPulse by 100ms and 10ms, then feeding it back in
To the next loop)

Delay 1000; delays by a second then back around again.

}

From looking into example code I am assuming I need to use the map command but don't quite understand it.

Thanks!

#### drone

#1
##### Jul 08, 2012, 05:31 pmLast Edit: Jul 08, 2012, 05:34 pm by drone Reason: 1
Break it down into several, smaller problems -- you need to:

1) Measure the passing of time (so you can do something once every second)
2) Change a value
3) Write the changed value

So, consider the following pseudo-code and go from there..

Code: [Select]
`if currentTime - lastTime greater than threshold   then       increment value       write to motor       set lastTime to now`

To change the value in a variable, just set its new value - you can even use its old value to set it, e.g.:

Code: [Select]
`  var1 = var1 + 10;`

The scope of the variable determines its life...  If you declare it global (outside of a function), any changes you make are global, you can access it again from anywhere else, e.g.:

Code: [Select]
`int foo = 1;void setup() {}void loop() {  foo = foo + 1;}`

!c

#### johnwasser

#2
##### Jul 08, 2012, 05:33 pm

Code: [Select]
`Void loop() {    ServoA.writeMicroseconds(APulse);    ServoB.writeMicroseconds(BPulse);/* (this is the bit I don't understand, adding to APulse, BPulse by 100ms and 10ms, then feeding it back inTo the next loop) */    delay(1000);}`

You can use:
Code: [Select]
`    APulse = APulse + 100;    BPulse = BPulse + 10;`

Or the shorthand version:
Code: [Select]
`    APulse += 100;    BPulse += 10;`

You may want to add code for what to do when you reach 2000.
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp

#### flotilla

#3
##### Jul 08, 2012, 05:45 pm
Thankyou both very much. Very helpful and a lot simpler than I thought.

All the best

F

Go Up

Please enter a valid email to subscribe