| Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); | |
| // Servo pulse limits (tune for your specific servos) | |
| float currentAngle = 0; // Start at 90 degrees | |
| float targetAngle = 0; | |
| int angleToPulse(float angle) { | |
| return map((int)angle, 0, 180, SERVOMIN, SERVOMAX); | |
| } | |
| void setup() { | |
| Serial.begin(9600); | |
| Serial.println("Type an angle (0–180) and press Enter:"); | |
| pwm.begin(); | |
| pwm.setPWMFreq(50); | |
| delay(10); | |
| // Initialize both servos to center position | |
| int pulse = angleToPulse(currentAngle); | |
| pwm.setPWM(0, 0, pulse); | |
| pwm.setPWM(1, 0, pulse); | |
| } | |
| void loop() { | |
| if (Serial.available()) { | |
| int angle = Serial.parseInt(); | |
| if (angle >= 0 && angle <= 180) { | |
| targetAngle = angle; | |
| Serial.print("Slowly moving servos to "); | |
| Serial.print(targetAngle); | |
| Serial.println(" degrees..."); | |
| // Smoothly step toward target angle | |
| float step = 0.10; // smaller = smoother and slower | |
| int delayTime = 5; // larger = slower (try 50 or 70 for extra slow) | |
| if (targetAngle > currentAngle) { | |
| for (float pos = currentAngle; pos <= targetAngle; pos += step) { | |
| int pulse = angleToPulse(pos); | |
| pwm.setPWM(0, 0, pulse); | |
| pwm.setPWM(1, 0, pulse); | |
| delay(delayTime); | |
| } | |
| } else { | |
| for (float pos = currentAngle; pos >= targetAngle; pos -= step) { | |
| int pulse = angleToPulse(pos); | |
| pwm.setPWM(0, 0, pulse); | |
| pwm.setPWM(1, 0, pulse); | |
| delay(delayTime); | |
| } | |
| } | |
| currentAngle = targetAngle; | |
| Serial.println("Done!"); | |
| } else { | |
| Serial.println("Please enter an angle between 0 and 180."); | |
| } | |
| // Clear serial buffer | |
| while (Serial.available()) Serial.read(); | |
| } | |
| } | |