I had no issues building the circuit. I modified the example code so that instead of having the position of the servo set by the position of the potentiometer, the servo constantly moves back and forth, and the potentiometer sets the speed at which the servo moves. Here is the code:
#include <Servo.h> //include the servo library
int minAngle = 20; //The min and max angles specify how far the servo motor
int maxAngle = 160; //will rotate in each direction.
int minDelay = 1; //The min and max delays specify how fast the servo motor
int maxDelay = 20; //will move back and forth between the min and max angles.
Servo myservo; //create a servo object
void setup() {
myservo.attach(9); //tell the servo object that its servo is plugged into pin 9
}
void loop() {
int servoPosition = myservo.read(); //Initial position of the servo
//This loop continues moving the servo motor until it reaches the maxAngle
while(servoPosition < maxAngle){
servoPosition++;
myservo.write(servoPosition);
delay(getDelayTime());
}
//This loop moves the servo motor in the other direction until it reaches the minAngle
while(servoPosition > minAngle){
servoPosition--;
myservo.write(servoPosition);
delay(getDelayTime());
}
}
//This method determines how fast the servo motor will move
int getDelayTime(){
int potPosition = analogRead(A0); //use analog read to measure the position of the potentiometer (0-1023)
int delayTime = map(potPosition, 0, 1023, minDelay, maxDelay); //convert the potentiometer number to an int between minDelay and maxDelay
return delayTime;
}
The code is based on the example program. My changes include the addition of variables to set the speed and the range of motion of the servo. I have also included two while loops inside the loop() function. These two while loops move the servo motor by incrementing or decrementing the servoPosition variable by one, calling myservo.write() with the new servoPosition value, and then calling delay() with the value returned by the getDelayTime() method. The getDelayTime() method uses the map() function to set the int value of delayTime based on the position of the potentiometer, which is then returned.
Here is a video of the program in action:
I did not have any major issues while writing the program. I initially used analogRead(A0) as the argument for the delay() function, so the getDelayTime() method was not needed. It did work, but the servo always moved slowly unless the potentiometer was turned practically all the way to one side. This is because analogRead(A0) could return a value as high as 1023. To reduce the range of values that can be used for the delay time I created the getDelayTime() method which uses the map() function to set the delay time. According to the Arduino documentation, the map() function maps a number from one range to a different range, so I used it to map the potentiometer value from its original range of 0 – 1023 to the range from minDelay to maxDelay.
The Landing is a social site for Athabasca University staff, students and invited guests. It is a space where they can share, communicate and connect with anyone or everyone.
Unless you are logged in, you will only be able to see the fraction of posts on the site that have been made public. Right now you are not logged in.
If you have an Athabasca University login ID, use your standard username and password to access this site.
We welcome comments on public posts from members of the public. Please note, however, that all comments made on public posts must be moderated by their owners before they become visible on the site. The owner of the post (and no one else) has to do that.
If you want the full range of features and you have a login ID, log in using the links at the top of the page or at https://landing.athabascau.ca/login (logins are secure and encrypted)
Posts made here are the responsibility of their owners and may not reflect the views of Athabasca University.