Introduction: Servo Tutorial
Using an Arduino to control a servo motor with the use of two pushbuttons.
Step 1: Get the Appropriate Components
Please use the links provided if you need any of the components also check out the site for other great arduino goodies, they ship worldwide for free and there service is great. Plus you support me :)
Go to the site here.
Thanks for your support.
1) Arduino Link: Arduino Compatible Uno R3 Rev3 Development Board
2) Breadboard Link: Half-size 400-Pin Electronics DIY Breadboard or 830-Point Solderless Electronics DIY Breadboard
3) Push Buttons Link: DIP P4 Sqaure Switch Push Buttons (100-Pack)
4) Jumper Cables Link: Multicolored 40-Pin DuPont Breadboard Jumper Wires (20cm)
5) Two 10k Ohm Resistors Link: DIY Universal 1/4W 1% Metal Film Resistor (600PCS)
6) Servo Motor Link: Tower Pro SG90 9g Gear Steering Servo
Step 2: Connect the Power
Connect the GND and 5V
Step 3: Connect the Servo
Red to 5V
Brown/Black to GND
Orange to pin 9
Step 4: Connect the Buttons
One of the buttons to DIGITAL 2
The other to DIGITAL 4
Step 5: Check the Circuit
Make sure the circuit is correct
Step 6: The Code
I used the Sweep example from Arduino and altered it to work.
#include <Servo.h>
const int buttonPin = 2;
const int buttonPin2 = 5;
int buttonState = 0;
int buttonState2 = 0;
Servo servoA;
int position = 0;
void setup() {
servoA.attach(9);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2,INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin2);
if(buttonState ==HIGH && position < 180){
servoA.write(position++);
delay(5);
}
if(buttonState2 == HIGH && position > 3){
servoA.write(position--);
delay(5);
}
}
35 Comments
5 years ago
I tried to get the code to work, but i keep getting this error:
"error compiling for board Arduino/genuino uno."
so I need some help on how to fix this. thanks!
Reply 4 years ago
Hi, this is a late reply, but if you have not found the solution here it is:
You should just change the "servo" in the #include to "Servo".
Good luck!
Reply 3 years ago
Thanks Steve1062840,
That include line has caused me a lot of hassle... Something to do with Instructables text to html conversion in its editor. I've gone in to the HTML now and edited it. Hope it's all good now.
Gavin
Question 4 years ago
Hello, when I press the pushbutton, it doesn't move the servo. I have already checked my wiring and I checked my code. What do you think it could be?
5 years ago
Hi everyone, I have a servo motor project and I would like some help, I'll see if I can explain;
- 2 servos, - 2 puch buttom; I want to control one of the servants and the other servant is controlled by the first one through the angle
I'll give you an example (when pressing the buttom the servo walks from ¨0 to 50¨ degrees after reaching the 50 degrees the other walks from ¨0 to 30¨ degrees when reaching the 30 degrees
when I reach 30 degrees the first servo continues from where it stopped and goes from ¨50 to 99¨ degrees I thank the help
Reply 5 years ago
Hi lazaroracingl,
What you are describing should be easy enough to achieve with a series of if and else if statements.
Something like the following should work (I haven't tested this code),
if(buttonState == HIGH){
if(position1 < 50){ //first stage
position1++;
}else if(position2 < 30 && position1 == 50){ //second stage
position2++;
}else if(postion2 == 30 && position1 < 99){ //third stage
position1++;
}
}
servoOne.write(position1);
servoTwo.write(position2);
delay(5);
Obviously, you'll have to fill in the missing code parts.
Good luck,
Gavin.
5 years ago
everything works excellent! Do you have any code to move 3 or more servos? Thank you!
Reply 5 years ago
Hi UlisesC17,
Sorry for the delayed response, I don't have access to three servos but I would imagine you just define more and more servos...
E.g.
Servo servoA;
Servo servoB;
...
Servo servoN;
Then later on in the code you will have to attach them to different pins
E.g
servoA.attach(9);
servoB.attach(10);
You will also have to declare variables to keep track of the individual positions etc.
Goodluck...
Regards
Gavin
5 years ago
My servo keeps rotating back to a some kind of initial position..any ideas why?
5 years ago
figured it out, i had to capitalize the S at the beginning
5 years ago
also, here's the entire message.
Arduino: 1.8.5 (Windows Store 1.8.10.0) (Windows 10), Board: "Arduino/Genuino Uno"
C:\Users\smell\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:1:19: fatal error: servo.h: No such file or directory
#include <servo.h>
^
compilation terminated.
exit status 1
Error compiling for board Arduino/Genuino Uno.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
5 years ago
In the first picture under the heading 'Step 5: Check the Circuit' the white wire is at the 6th position from the right, isn't that DIGITAL 5?
Reply 5 years ago
Hi Chupo_cro,
It does look that way in the photo, I have made the change in the code.
It doesn't really matter, you could make it anyone of the digital pins... Just change the number in the code accordingly.
Thanks for pointing this out.
Regards
Gavin
6 years ago
I am using a modified servo motor(TowerPro MG995) which allow me to rotate continuously. are this set up and codes still relevant for this servo? If not, what is the alternative? thx in advance
Reply 6 years ago
Hi Ammar, unfortunately the code will not work with a continuous rotation servo and there is no simple change to the code that will rectify it...
The following link discusses the topic in more depth.
https://forum.arduino.cc/index.php?topic=267166.0
Unfortunately I do not have a continuous rotation servo to figure it out with.
Regards
Gavin
6 years ago
Dear, Gavin, thanks for sharing. I have one doubt, however: what is the function of the "int position=0;" line?
Kind regards!
Reply 6 years ago
Hi TeresoM,
The function of that line is to set the position integer to zero. If you look further down in the code we set the servos position to that integer. So 0 will be the most it can go in the one direction and 180 will be the most it can go in the other. We then increase/decrease the value of this integer depending on which button is being pressed.
Sorry for the untimely response.
Regards
Gavin
6 years ago
Seems the servo runs too fast, how to reduce it?
Reply 6 years ago
Hi ghorgex,
To reduce the speed at which the servo rotates you can increase the value in the delay functions. i.e. Increase delay(5); to say delay(10); this will effectively halve the rotation speed.
Regards
Gavin
7 years ago
The code on this page will not verify. Get High was not declared in this scope. Can you help???