#ifndef MKS42C_H #define MKS42C_H #include 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