#ifndef MKS42C_H #define MKS42C_H #include #include class MKS42C { public: /** * @brief Конструктор класса * @param serial Ссылка на объект HardwareSerial (например, Serial2) * @param address UART адрес мотора (по умолчанию 0xE0) */ MKS42C(HardwareSerial& serial, uint8_t address = 0xE0); /** * @brief Включить или выключить удержание вала * @param state true - включить (Enable), false - отключить (Disable) */ void setEnable(bool state); /** * @brief Остановка двигателя */ void stop(); /** * @brief Установить текущую позицию как нулевую (Home) * Данные записываются в EEPROM драйвера. */ void setHome(); /** * @brief Установка крутящего момента через ограничение тока * @param ma Ток в миллиамперах (рекомендуется 0 - 2000) */ void setTorque(uint16_t ma); /** * @brief Запустить непрерывное вращение * @param dir Направление: 0 - CW (по часовой), 1 - CCW (против часовой) * @param speed Скорость вращения (0 - 255) */ void run(uint8_t dir, uint8_t speed); /** * @brief Поворот на определенное количество градусов * @param degrees Угол (положительный или отрицательный) * @param speed Скорость вращения (0 - 255) */ void rotateDegrees(float degrees, uint8_t speed); /** * @brief Чтение текущей позиции вала (0-360 градусов) * @return Позиция в градусах (float) */ float readPosition(); /** * @brief Чтение абсолютной позиции энкодера (с учетом полных оборотов) * @return Количество импульсов (14-бит энкодер: 16384 на оборот при MStep 16) */ long readAbsolutePosition(); /** * @brief Проверка, завершил ли мотор движение (по команде rotateDegrees) * @return true - мотор еще в пути, false - мотор остановился */ bool isBusy(); /** * @brief Проверка состояния защиты (блокировка вала) * @return true - сработала защита (Protect), false - нормальная работа */ bool isBlocked(); private: HardwareSerial* _serial; uint8_t _addr; bool _moving; uint8_t calculateCRC(uint8_t* data, uint8_t len); void sendRaw(uint8_t* data, uint8_t len); void clearBuffer(); }; #endif