README
This commit is contained in:
parent
dd32cde2f3
commit
2a40402a54
110
README.md
110
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
|
||||
Лимиты: Команда rotateDegrees имеет внутренний лимит прошивки на максимальное число шагов за раз. Для очень больших перемещений (сотни оборотов) используйте метод run().
|
||||
Loading…
Reference in New Issue