MKS42C/MKS42C.h

84 lines
2.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef MKS42C_H
#define MKS42C_H
#include <Arduino.h>
class MKS42C {
public:
/**
* @brief Конструктор
* @param serial Ссылка на HardwareSerial (например, Serial2)
* @param address Адрес мотора (по умолчанию 0xE0)
*/
MKS42C(HardwareSerial& serial, uint8_t address = 0xE0);
// --- Управление питанием ---
void setEnable(bool state); // Включить/выключить удержание вала
/**
* @brief Установка максимального крутящего момента (MaxT)
* @param torque Значение от 0 до 1200 (0x4B0)
* @return true если успешно
*/
bool setMaxTorque(uint16_t torque);
// --- Движение ---
/**
* @brief Непрерывное вращение (Команда 0xF6)
* @param dir Направление: 0 - CW (по часовой), 1 - CCW (против)
* @param speed Скорость (0-127)
*/
void run(uint8_t dir, uint8_t speed);
/**
* @brief Непрерывное вращение
* @param speed Скорость от -127 до 127 (минус меняет направление)
*/
void run(int16_t speed);
/**
* @brief Поворот на заданный угол (Команда 0xFD)
* @param degrees Угол в градусах (положительный - CW, отрицательный - CCW)
* @param speed Скорость (0-127)
*/
void rotateDegrees(float degrees, uint8_t speed);
/**
* @brief Мгновенная остановка (Команда 0xF7)
*/
void stop();
// --- Чтение данных (Команда 0x30) ---
/**
* @brief Чтение текущего угла в пределах одного круга
* @return Угол от 0.0 до 359.99 или -1.0 при ошибке
*/
float readPosition();
/**
* @brief Чтение абсолютной позиции (с учетом оборотов)
* @return Общее количество импульсов (1 оборот = 65536 единиц энкодера)
*/
long readAbsolutePosition();
/**
* @brief Проверка, движется ли мотор в данный момент
* @return true если занят, false если остановился
*/
bool isBusy();
private:
HardwareSerial* _serial;
uint8_t _addr;
long _lastAbsPos = 0;
unsigned long _lastMoveTime = 0;
bool _isMoving;
// Вспомогательные функции
uint8_t calculateCRC(uint8_t* data, uint8_t len);
void sendRaw(uint8_t* data, uint8_t len);
void clearBuffer();
};
#endif