Go Down

Topic: servo code (Read 1 time) previous topic - next topic

Ghostbusters

with the Sparkfun inventor kit there is a circuit that controls a single servo with arduino. based on this code i want to build a robot, But i am having trouble understanding the underlined part of the code  at the very bottom

/*
SparkFun Inventor's Kit
Example sketch 08


Servo servo1;  // servo control object


void setup()
{
  // We'll now "attach" the servo1 object to digital pin 9.
  // If you want to control more than one servo, attach more
  // servo objects to the desired pins (must be digital).

  // Attach tells the Arduino to begin sending control signals
  // to the servo. Servos require a continuous stream of control
  // signals, even if you're not currently moving them.
  // While the servo is being controlled, it will hold its
  // current position with some force. If you ever want to
  // release the servo (allowing it to be turned by hand),
  // you can call servo1.detach().

  servo1.attach(9);
}


void loop()
{
  int position;
 
  // To control a servo, you give it the angle you'd like it
  // to turn to. Servos cannot turn a full 360 degrees, but you
  // can tell it to move anywhere between 0 and 180 degrees.

  // Change position at full speed:

  servo1.write(90);    // Tell servo to go to 90 degrees

  delay(1000);         // Pause to get it time to move

  servo1.write(180);   // Tell servo to go to 180 degrees

  delay(1000);         // Pause to get it time to move

  servo1.write(0);     // Tell servo to go to 0 degrees

  delay(1000);         // Pause to get it time to move
 
  // Change position at a slower speed:

// To slow down the servo's motion, we'll use a for() loop
  // to give it a bunch of intermediate positions, with 20ms
  // delays between them. You can change the step size to make
  // the servo slow down or speed up. Note that the servo can't
  // move faster than its full speed, and you won't be able
  // to update it any faster than every 20ms.

  // Tell servo to go to 180 degrees, stepping by two degrees

  for(position = 0; position < 180; position += 2)
  {
    servo1.write(position);  // Move to next position
    delay(20);               // Short pause to allow it to move
  }

  // Tell servo to go to 0 degrees, stepping by one degree

  for(position = 180; position >= 0; position -= 1)
  {                               
    servo1.write(position);  // Move to next position
    delay(20);               // Short pause to allow it to move
  }
}

Jantje

The sparkfun kit comes with lots of documentation and this is extremely well documented code. So I really wouldn't know what to add.
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

zoomkat

#7 below would be a good place to start.

http://forum.arduino.cc/index.php/topic,148850.0.html
Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

Ghostbusters

I THINK I NEED TO REPRASE THIS QUESTION. MY NEW QUESTION IS, WITH THE UNDERLINED CODE I DONT UNDERSTAND THE CODE AND WHAT MEANS WHAT TO ARDUINO. I AM MAKING A ROBOT AND I WANT TO USE SERVOS, HOWEVER THAT UNDERLINED CODE IS WHAT CONTROLS SPEED BUT I DONT UNDERSTAND HOW TO CONTROL THE SPEED WITH THAT CODE FORMAT. I HOPE YOU CAN UNDERSTAND MY QUESTION THANKS IN ADVANCE

AWOL

Quote
I THINK I NEED TO REPRASE rewrite THIS QUESTION without all the shoutiness.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Ghostbusters

sorry i didnt realize caps lock was on :smiley-red:

zoomkat

Below is the servo sweep example from the arduino IDE. There is a delay between the small servo moves so the overall movement of the servo is slowed down.

Code: [Select]

// Sweep
// by BARRAGAN <http://barraganstudio.com>
// This example code is in the public domain.


#include <Servo.h>

Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created

int pos = 0;    // variable to store the servo position

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}


void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  {                               
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}
Google forum search: Use Google Advanced Search and use Http://forum.arduino.cc/index in the "site or domain:" box.

JimboZA

What your undelined code is doing is going from 0 to 180 in steps of 2 degrees... Each servo1.write(position) is 2 degrees further than the last write, since the for's position += 2 is incrementing in 2's. (Zoomcat's is similar, but in 1's). BUT, each pass through the for also includes a delay(20) (or 15 in zoomcat's example) which causes a pause of 20ms between each 2 degree movement step.

See here to read up on how "for" works.

Without that loop and delay, if the servo was at say 0 degrees and you sent it a servo1.write(180) it would have gone from 0 to 180 as fast as it was able. Servo speed is quoted by the makers as the time to move through 60 degrees, such as 0.16 seconds for this one. (That's the speed with no load, obviously slower when it's trying to move something.)

HTH?
Arduino ethernet server here.... http://jimboza.gotdns.com:8085/

No PMs for help please

Ghostbusters

thanks guys you are awsome

Go Up