// Подключаем библиотеку
#include <Servo.h>
// Определяем пины
#define SERVO_PIN 3
// Диапазон углов сервопривода
const uint8_t START_ANGLE = 0;
const uint8_t END_ANGLE = 180;
const uint8_t MAX_SPEED = 5; // Максимальная скорость
const uint8_t ACCELERATION = 1; // Ускорение
// Создаем объект класса
Servo myservo;
void setup() {
Serial.begin(9600);
myservo.attach(SERVO_PIN);
myservo.write(START_ANGLE); // Установить начальный угол
}
void loop() {
uint8_t current_position = START_ANGLE; // Начальная позиция
uint8_t speed = 0; // Начальная скорость
uint8_t traveled_distance = 0; // Счетчик для пройденного расстояния при ускорении и замедлении
// Ускорение
while (speed < MAX_SPEED && current_position < END_ANGLE) {
speed += ACCELERATION;
current_position += speed;
// Убедимся, что текущий угол не превышает END_ANGLE
if (current_position > END_ANGLE) current_position = END_ANGLE;
Serial.print("Ускорение - Угол: ");
Serial.println(current_position);
myservo.write(current_position);
delay(15);
traveled_distance += speed;
}
// Считаем расстояние, оставшееся для постоянной скорости
uint8_t remaining_distance = (END_ANGLE - START_ANGLE) - 2 * traveled_distance;
uint8_t constant_speed_steps = remaining_distance / MAX_SPEED;
// Движение с постоянной скоростью
for (uint8_t i = 0; i < constant_speed_steps; i++) {
current_position += MAX_SPEED;
if (current_position > END_ANGLE) current_position = END_ANGLE;
Serial.print("Постоянная скорость - Угол: ");
Serial.println(current_position);
myservo.write(current_position);
delay(15);
}
// Замедление
while (speed > 0 && current_position < END_ANGLE) {
current_position += speed;
speed -= ACCELERATION;
// Убедимся, что текущий угол не превышает END_ANGLE
if (current_position > END_ANGLE) current_position = END_ANGLE;
Serial.print("Замедление - Угол: ");
Serial.println(current_position);
myservo.write(current_position);
delay(15);
}
delay(100);
// Возврат к начальному положению для повторения цикла
myservo.write(START_ANGLE);
delay(1000); // Пауза перед следующим циклом
}