From 2a40402a549b691f804e6aec62623b74107c2593 Mon Sep 17 00:00:00 2001 From: Artur Date: Sat, 4 Apr 2026 23:57:47 +0500 Subject: [PATCH] README --- README.md | 110 +++++++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index c4be157..b22980d 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,70 @@ -# MKS SERVO42C Arduino Library - -Легкая библиотека для управления умными шаговыми моторами MKS SERVO42C через интерфейс RS485/UART. Поддерживает чтение высокоточного энкодера (16 бит) и управление движением в реальном времени. - -🚀 Основные возможности - - Движение: Поворот на заданный угол, бесконечное вращение, мгновенная остановка. - - Обратная связь: Чтение текущего угла (0-360°) и абсолютной позиции (с учетом полных оборотов). - - Умный статус: Отслеживание завершения движения (isBusy) через анализ данных энкодера. +# MKS SERVO42C Arduino Library (V1.1.2) +Удобная библиотека для управления сервошаговыми моторами MKS SERVO42C через UART (RS485). Позволяет работать с мотором как с полноценным сервоприводом, используя данные встроенного 16-битного энкодера. 🛠 Описание функций (API) -Конструктор +1. Инициализация и Питание -MKS42C(HardwareSerial& serial, uint8_t address = 0xE0); + MKS42C(HardwareSerial& serial, uint8_t address = 0xE0) Конструктор. Передайте объект Serial (например, Serial2) и HEX-адрес мотора из настроек экрана. - serial: Ссылка на аппаратный Serial (например, Serial2 для ESP32). + void setEnable(bool state) Управление током обмоток. - address: CAN/RS485 адрес мотора (по умолчанию 0xE0). + true — вал заблокирован (удержание); -Управление движением -void setEnable(bool state); + false — вал расслаблен (можно крутить рукой). -Включает (true) или выключает (false) ток в обмотках. При false вал можно вращать рукой, при true мотор удерживает позицию. -void run(int16_t speed); +2. Управление движением -Самый удобный способ вращения. * Передавай положительное значение (например, 40) для вращения по часовой стрелке. + void run(int16_t speed) Рекомендуемый метод для свободного вращения. - Передавай отрицательное значение (например, -40) для вращения против часовой стрелки. + Принимает скорость от -127 до 127. - Диапазон скорости: от -127 до 127. + Положительная скорость — CW (по часовой), отрицательная — CCW (против). -void rotateDegrees(float degrees, uint8_t speed); + void run(uint8_t dir, uint8_t speed) Классический метод. dir: 0 (CW) или 1 (CCW). speed: 0–127. -Поворот на точный угол относительно текущей позиции. + void rotateDegrees(float degrees, uint8_t speed) Поворот на заданный угол относительно текущего положения. - degrees: Угол (например, 90.0 или -720.0). + Пример: rotateDegrees(-180.5, 60) повернет вал на пол-оборота против часовой. - speed: Скорость движения (1-127). + void stop() Мгновенная программная остановка (торможение). -void stop(); +3. Чтение данных и обратная связь -Мгновенная программная остановка мотора. -Чтение данных -float readPosition(); + float readPosition() Возвращает угол вала в текущем круге (0.00° – 359.99°). -Возвращает текущий угол вала в диапазоне 0.00° ... 359.99°. + Вернет -1.0 при потере связи. - Если возвращает -1.0, значит возникла ошибка связи (CRC или таймаут). - -long readAbsolutePosition(); - -Возвращает общее количество импульсов энкодера с момента включения. + long readAbsolutePosition() Самая важная функция для навигации. Возвращает общее число импульсов с момента включения. 1 оборот = 65536 единиц. - Значение может быть отрицательным. Это лучший способ отслеживать пройденный путь. + bool isBusy() Интеллектуальная проверка движения. Возвращает true, если мотор еще выполняет команду или если вал вращается. -bool isBusy(); +🧭 Примеры использования +Возврат в абсолютный "0" (Bang-Bang Control) -Проверяет, движется ли мотор. - - Библиотека анализирует пакеты статуса от мотора и изменение данных энкодера. - - Возвращает true, если вал еще вращается. - -📐 Формулы для ручного управления - -Если ты хочешь реализовать свою логику в основном коде: - - Градусы в импульсы: Pulses=360Degrees×65536​ - - Импульсы в градусы: Degrees=65536Pulses×360​ - -📋 Пример: Возврат в абсолютный ноль - -Этот код заставляет мотор крутиться в сторону «нулевой» точки, пока он ее не достигнет. +Если нужно вернуть мотор точно в ту точку, где он был при включении, используйте этот алгоритм в основном коде: C++ -void backToZero() { - long currentPos = motor.readAbsolutePosition(); - - // Выбираем скорость: если мы в плюсе, едем назад (-40), если в минусе — вперед (40) - int16_t speed = (currentPos > 0) ? -40 : 40; - motor.run(speed); +long current = motor.readAbsolutePosition(); +// Выбираем направление: если мы в плюсе, едем назад (-40), если в минусе — вперед (40) +int16_t targetSpeed = (current > 0) ? -40 : 40; - while (true) { - currentPos = motor.readAbsolutePosition(); - // Останавливаемся, когда пересекли ноль или подошли очень близко - if (speed < 0 && currentPos <= 10) break; - if (speed > 0 && currentPos >= -10) break; +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(); } +motor.stop(); -⚠️ Важные замечания +⚠️ Технические заметки - Общая земля: Обязательно соедини GND контроллера и GND драйвера мотора. + Протокол: Команды передаются пакетами с проверкой CRC8 (сумма байтов). - Скорость UART: Убедись, что в коде Serial.begin(38400) и в настройках на экране мотора скорость совпадает. + Скорость: Оптимальная скорость работы UART — 38400 или 115200 бод. - Резисторы: Для длинных линий UART (более 1 метра) рекомендуется использовать подтягивающие резисторы или модули RS485 \ No newline at end of file + Лимиты: Команда rotateDegrees имеет внутренний лимит прошивки на максимальное число шагов за раз. Для очень больших перемещений (сотни оборотов) используйте метод run(). \ No newline at end of file