Skip to content

Repository files navigation

latest PIO Foo Foo Foo

Foo

MultiServo

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

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

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

Содержание

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

MultiServoDriver

Базовый класс драйвера, на его основе можно сделать поддержку других драйверов

class DriverProxy {
    // записать микросекунды. 0 отключает канал
    bool writeMicroseconds(uint16_t us);

    // записать угол или микросекунды
    bool write(uint16_t angle, uint16_t minUs = MinPulse, uint16_t maxUs = MaxPulse, uint16_t maxAngle = 180);
};

// доступ через []
DriverProxy operator[](uint8_t channel);

// записать микросекунды. 0 отключает канал
virtual bool writeMicroseconds(uint8_t channel, uint16_t us) = 0;

MultiServoDriverPCA9685

Класс для работы с драйвером PCA9685, наследует MultiServoDriver:

MultiServoDriverPCA9685(uint8_t address = 0x40, TwoWire& wire = Wire) : _wire(wire), _addr(address) {}

// подключен
bool isConnected();

// запустить
bool begin(uint16_t freq = 50);

// отключить выходы и перевести PCA9685 в режим сна
bool end();

// установить частоту ШИМ в Гц
bool setPWMFrequency(uint16_t freq);

// получить реальную частоту ШИМ
uint16_t getPWMFrequency();

// установить измеренную частоту генератора (умолч. 25000000) - после неё нужно перенастроить частоту ШИМ
void setOscFreq(uint32_t freq);

// получить установленную частоту генератора
uint32_t getOscFreq();

// записать микросекунды
bool writeMicroseconds(uint8_t channel, uint16_t us);

// записать угол или микросекунды
bool write(uint8_t channel, uint16_t angle, uint16_t minUs = MinPulse, uint16_t maxUs = MaxPulse, uint16_t maxAngle = 180);

// прочитать микросекунды
int32_t readMicroseconds(uint8_t channel);

// отключить канал
bool disable(uint8_t channel);

// отключить все каналы
bool disable();

MultiServo

Класс серво, привязанной к драйверу MultiServoDriver. Соответствует Arduino Servo API, за исключением конструктора:

MultiServo(MultiServoDriver& drv);

bool attach(uint8_t channel, uint16_t pulse = MultiServoDriver::DefPulse);
bool attach(uint8_t channel, uint16_t minUs, uint16_t maxUs);
void detach();
bool writeMicroseconds(uint16_t value);
uint16_t readMicroseconds();
bool write(uint16_t value, uint16_t maxAngle = 180);
uint16_t read(uint16_t maxAngle = 180);
bool attached();

Управление

Библиотека может использоваться в двух режимах:

  • Управление напрямую через драйвер с указанием канала. Драйвер не хранит минимум и максимум импульса, не умеет автоматически поворачивать на угол
  • Создание отдельного объекта серво, привязанного к драйверу, и управление через него. Хранит минимум и максимум импульса и имеет привычный Servo API. Это может быть удобно, если нужно передать куда-то именно объект сервопривода со стандартным API, например для шаблонного полиморфизма

Тестовый проект в симуляторе.

Примеры

#include <Arduino.h>
#include <MultiServo.h>
#include <MultiServoDriverPCA9685.h>

MultiServoDriverPCA9685 driver;  // создаём драйвер
MultiServo servo(driver);        // серво на этом драйвере

void setup() {
    Serial.begin(115200);

    Wire.begin();
    if (!driver.begin()) {
        Serial.println("Driver error");
    }

    servo.attach(1);                    // подключаем серво к 1 каналу драйвера
    servo.write(100);                   // повернуть серво на угол
    driver.writeMicroseconds(3, 1500);  // повернуть серво на 3 канале через драйвер напрямую
    driver[3].writeMicroseconds(1500);  // ещё один вариант управления через драйвер, тоже на 3 канал
}

void loop() {
    // servo
    for (int angle = 0; angle <= 180; angle++) {
        servo.write(angle);
        delay(5);
    }

    for (int angle = 180; angle >= 0; angle--) {
        servo.write(angle);
        delay(5);
    }

    // driver
    for (int servo = 0; servo < 16; servo++) {
        for (int angle = 0; angle <= 180; angle++) {
            driver[servo].write(angle, 500, 2500);
            delay(5);
        }

        for (int angle = 180; angle >= 0; angle--) {
            driver[servo].write(angle, 500, 2500);
            delay(5);
        }
    }
}

Версии

  • v1.0.0

Установка

  • Библиотеку можно найти по названию MultiServo и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь

Обновление

  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

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

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

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

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Библиотека для управления сервоприводами через многоканальный драйвер

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages