GyverLibs / ServoSmooth

Библиотека для плавного управления сервоприводами с Arduino
MIT License
22 stars 3 forks source link

latest PIO Foo Foo Foo

Foo

ServoSmooth

Библиотека для плавного управления сервоприводами

Совместимость

Совместима со всеми Arduino платформами (используются Arduino-функции)

Документация

К библиотеке есть расширенная документация

Содержание

Установка

Инициализация

ServoSmooth servo;
ServoDriverSmooth servo;    // для PCA9685

Использование

void write(uint16_t angle);                 // аналог метода из библиотеки Servo
void writeMicroseconds(uint16_t angle);     // аналог метода из библиотеки Servo
void attach(uint8_t pin);                   // аналог метода из библиотеки Servo
void attach(uint8_t pin, int min, int max); // аналог метода из библиотеки Servo. min по умолч. 500, max 2400
void detach();                              // аналог метода detach из библиотеки Servo
void start();                               // attach + разрешает работу tick
void stop();                                // detach + запрещает работу tick

boolean tick();                             // метод, управляющий сервой, должен опрашиваться как можно чаще.
                                            // Возвращает true, когда целевая позиция достигнута.
                                            // Имеет встроенный таймер с периодом SERVO_PERIOD
boolean tickManual();                       // метод, управляющий сервой, без встроенного таймера.
                                            // Возвращает true, когда целевая позиция достигнута
void setSpeed(int speed);                   // установка максимальной скорости (градусы в секунду)
void setAccel(float accel);                 // установка ускорения (0.05 - 1.0). При значении 1 ускорение максимальное. 0 - отключено
void setAccel(int accel);                   // установка ускорения в градусах/сек/сек (рабочее от 1 до ~1500). 0 - отключено
void setTarget(int target);                 // установка целевой позиции в мкс (500 - 2400)
void setTargetDeg(int target);              // установка целевой позиции в градусах (0-макс. угол). Зависит от min и max
void setAutoDetach(boolean set);            // вкл/выкл автоматического отключения (detach) при достижении угла. По умолч. вкл
void setCurrent(int target);                // установка текущей позиции в мкс (500 - 2400)
void setCurrentDeg(int target);             // установка текущей позиции в градусах (0-макс. угол). Зависит от min и max
void setMaxAngle(int maxAngle);             // установка макс. угла привода
int getCurrent();                           // получение текущей позиции в мкс (500 - 2400)
int getCurrentDeg();                        // получение текущей позиции в градусах (0-макс. угол). Зависит от min и max
int getTarget();                            // получение целевой позиции в мкс (500 - 2400)
int getTargetDeg();                         // получение целевой позиции в градусах (0-макс. угол). Зависит от min и max
void smoothStart();              // вызывать сразу после attach(пин, таргет). Смягчает движение серво из неизвестной позиции к стартовой. БЛОКИРУЮЩАЯ НА 1  СЕК!

Пример

Остальные примеры смотри в examples!

/*
   Данный код плавно управляет одной сервой (на пине 2)
   при помощи потенциометра (на пине А0)
   Документация: https://alexgyver.ru/servosmooth/
*/

#include <ServoSmooth.h>
ServoSmooth servo;

void setup() {
  Serial.begin(9600);
  servo.attach(2, 600, 2400);  // 600 и 2400 - длины импульсов, при которых
  // серво поворачивается максимально в одну и другую сторону, зависят от самой серво
  // и обычно даже указываются продавцом. Мы их тут указываем для того, чтобы
  // метод setTargetDeg() корректно отрабатывал полный диапазон поворота сервы

  servo.setSpeed(50);   // ограничить скорость
  servo.setAccel(0.3);      // установить ускорение (разгон и торможение)

  servo.setAutoDetach(false);   // отключить автоотключение (detach) при достижении целевого угла (по умолчанию включено)
}

void loop() {
  // желаемая позиция задаётся методом setTarget (импульс) или setTargetDeg (угол), далее
  // при вызове tick() производится автоматическое движение сервы
  // с заданным ускорением и ограничением скорости
  servo.tick();   // здесь происходит движение серво по встроенному таймеру!

  int newPos = map(analogRead(0), 0, 1023, 0, 180); // берём с потенцометра значение 0-180
  servo.setTargetDeg(newPos);                       // и отправляем на серво
}

Версии

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать: