• Blogs
• Circuit 3A: Servo Motors

## Circuit 3A: Servo Motors

• Public
By Adam Kroeker July 9, 2022 - 1:30pm

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 motorint maxAngle = 160; //will rotate in each direction.int minDelay = 1; //The min and max delays specify how fast the servo motorint 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 moveint 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.