70 lines
3.9 KiB
Markdown
70 lines
3.9 KiB
Markdown
# MKS SERVO42C Arduino Library (V1.1.2)
|
||
|
||
Удобная библиотека для управления сервошаговыми моторами MKS SERVO42C через UART (RS485). Позволяет работать с мотором как с полноценным сервоприводом, используя данные встроенного 16-битного энкодера.
|
||
🛠 Описание функций (API)
|
||
1. Инициализация и Питание
|
||
|
||
MKS42C(HardwareSerial& serial, uint8_t address = 0xE0) Конструктор. Передайте объект Serial (например, Serial2) и HEX-адрес мотора из настроек экрана.
|
||
|
||
void setEnable(bool state) Управление током обмоток.
|
||
|
||
true — вал заблокирован (удержание);
|
||
|
||
false — вал расслаблен (можно крутить рукой).
|
||
|
||
2. Управление движением
|
||
|
||
void run(int16_t speed) Рекомендуемый метод для свободного вращения.
|
||
|
||
Принимает скорость от -127 до 127.
|
||
|
||
Положительная скорость — CW (по часовой), отрицательная — CCW (против).
|
||
|
||
void run(uint8_t dir, uint8_t speed) Классический метод. dir: 0 (CW) или 1 (CCW). speed: 0–127.
|
||
|
||
void rotateDegrees(float degrees, uint8_t speed) Поворот на заданный угол относительно текущего положения.
|
||
|
||
Пример: rotateDegrees(-180.5, 60) повернет вал на пол-оборота против часовой.
|
||
|
||
void stop() Мгновенная программная остановка (торможение).
|
||
|
||
3. Чтение данных и обратная связь
|
||
|
||
float readPosition() Возвращает угол вала в текущем круге (0.00° – 359.99°).
|
||
|
||
Вернет -1.0 при потере связи.
|
||
|
||
long readAbsolutePosition() Самая важная функция для навигации. Возвращает общее число импульсов с момента включения.
|
||
|
||
1 оборот = 65536 единиц.
|
||
|
||
bool isBusy() Интеллектуальная проверка движения. Возвращает true, если мотор еще выполняет команду или если вал вращается.
|
||
|
||
🧭 Примеры использования
|
||
Возврат в абсолютный "0" (Bang-Bang Control)
|
||
|
||
Если нужно вернуть мотор точно в ту точку, где он был при включении, используйте этот алгоритм в основном коде:
|
||
C++
|
||
|
||
long current = motor.readAbsolutePosition();
|
||
// Выбираем направление: если мы в плюсе, едем назад (-40), если в минусе — вперед (40)
|
||
int16_t targetSpeed = (current > 0) ? -40 : 40;
|
||
|
||
motor.run(targetSpeed);
|
||
|
||
while (true) {
|
||
current = motor.readAbsolutePosition();
|
||
// Условие выхода: пересечение нулевой отметки (с допуском 10 импульсов)
|
||
if (targetSpeed < 0 && current <= 10) break;
|
||
if (targetSpeed > 0 && current >= -10) break;
|
||
delay(10);
|
||
}
|
||
motor.stop();
|
||
|
||
⚠️ Технические заметки
|
||
|
||
Протокол: Команды передаются пакетами с проверкой CRC8 (сумма байтов).
|
||
|
||
Скорость: Оптимальная скорость работы UART — 38400 или 115200 бод.
|
||
|
||
Лимиты: Команда rotateDegrees имеет внутренний лимит прошивки на максимальное число шагов за раз. Для очень больших перемещений (сотни оборотов) используйте метод run(). |