84 lines
2.7 KiB
C++
84 lines
2.7 KiB
C++
#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 |