From 9f4a6fd0beb20ab7682eaaf438a388f46db98b87 Mon Sep 17 00:00:00 2001 From: Mirivlad Date: Sun, 20 Mar 2022 03:14:09 +0800 Subject: [PATCH] Update README.md --- README.md | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/README.md b/README.md index 6bb5e4a..a66eba5 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,120 @@ uint8_t clicks; // доступ к счётчику кликов uint8_t hasClicks(); // вернёт количество кликов, если они есть bool hasClicks(uint8_t num); // проверка на наличие указанного количества кликов ``` + +##### GyverStepper2 by AlexGyver + +###### Логика работы + +- setTarget()/setTargetDeg() отправляет мотор на указанную позицию +- Движение происходит в tick(), который нужно опрашивать постоянно. Либо в tickManual, который нужно вызывать с периодом, полученным из getPeriod() и пересчитывать на каждом шаге +- tick() вернёт true, если мотор крутится +- ready() однократно вернёт true, если мотор доехал до цели и остановился +- Во время движения к цели можно вызвать pause(), тогда мотор доедет до точки и остановится, ready() не вернёт true +- Во время движения к цели можно вызвать stop(), тогда мотор затормозит с заданным ускорением, ready() не вернёт true +- Во время движения к цели можно вызвать brake(), тогда мотор остановится, ready() не вернёт true +- После остановки можно вызвать resume(), мотор продолжит движение к цели +- Постоянное вращение задаётся setSpeed()/setSpeedDeg(). Остановиться можно резко - stop() или brake() +- Скорость и ускорение можно задать в любое время, но применяются они после остановки мотора! + +###### Инициализация + +```cpp +GStepper2 stepper(шаговНаОборот, step, dir); // драйвер step-dir +GStepper2 stepper(шаговНаОборот, step, dir, en); // драйвер step-dir + пин enable +GStepper2 stepper(шаговНаОборот, pin1, pin2, pin3, pin4); // драйвер 4 пин +GStepper2 stepper(шаговНаОборот, pin1, pin2, pin3, pin4, en); // драйвер 4 пин + enable +GStepper2 stepper(шаговНаОборот, pin1, pin2, pin3, pin4); // драйвер 4 пин полушаг +GStepper2 stepper(шаговНаОборот, pin1, pin2, pin3, pin4, en); // драйвер 4 пин полушаг + enable +``` + +###### Использование + +```cpp +// === наследуется из Stepper ==== +void step(); // сделать шаг +void invertEn(bool val); // инвертировать поведение EN пина +void reverse(bool val); // инвертировать направление мотора +void disable(); // отключить питание и EN +void enable(); // включить питание и EN +void attachStep(void (*handler)(uint8_t)); // подключить обработчик шага +void attachPower(void (*handler)(bool)); // подключить обработчик питания + +int32_t pos; // текущая позиция в шагах +int8_t dir; // направление (1, -1) + +// ========= GStepper2 ========== +// тикер +bool tick(); // тикер движения, вызывать часто. Вернёт true, если мотор движется +bool tickManual(); // ручной тикер для вызова в прерывании таймера с периодом getPeriod(). Вернёт true, если мотор движется +bool ready(); // однократно вернёт true, если мотор доехал до установленной позиции и остановился + +// вращение +void setSpeed(int16_t speed); // установить скорость в шагах/сек и запустить вращение +void setSpeed(float speed); // установить скорость в шагах/сек (float) и запустить вращение + +// движение к цели +void setTarget(int32_t ntar, GS_posType type = ABSOLUTE); // установить цель в шагах и опционально режим ABSOLUTE/RELATIVE +void setTargetDeg(int32_t ntar, GS_posType type = ABSOLUTE); // установить цель в градусах и опционально режим ABSOLUTE/RELATIVE +int32_t getTarget(); // получить целевую позицию в шагах + +void setAcceleration(uint16_t nA); // установка ускорения в шаг/сек^2 +void setMaxSpeed(int speed); // установить скорость движения при следовании к позиции setTarget() в шагах/сек +void setMaxSpeed(float speed); // установить скорость движения при следовании к позиции setTarget() в шагах/сек, float +void setMaxSpeedDeg(int speed); // установить скорость движения при следовании к позиции в град/сек +void setMaxSpeedDeg(float speed); // установить скорость движения при следовании к позиции в град/сек, float + +void setCurrent(int32_t npos); // установить текущую позицию +int32_t getCurrent(); // получить текущую позицию +void reset(); // сбросить текущую позицию в 0 + +// всякое +uint32_t getPeriod(); // получить текущий период тиков +void brake(); // резко остановить мотор +void pause(); // пауза - доехать до заданной точки и ждать (ready() не вернёт true, пока ты на паузе) +void resume(); // продолжить движение после остановки/паузы +uint8_t getStatus(); // текущий статус: 0 - стоим, 1 - едем, 2 - едем к точке паузы, 3 - крутимся со скоростью, 4 - тормозим + +// ===== ДЕФАЙНЫ НАСТРОЕК ===== +// дефайнить перед подключением библиотеки +#define GS_NO_ACCEL // отключить модуль движения с ускорением (уменьшить вес кода) + +#define GS_FAST_PROFILE размер_массива (например 10) +Включает быстрый планировщик скорости. Участок разгона/торможения разбивается +на указанное количество отрезков (+8 байт SRAM на участок), на них скорость будет одинаковая. +Это позволяет быстро вычислять скорость мотора и достигнуть 30000 шаг/с на участке разгона +(в обычном режиме в два раза меньше). +``` + +###### Пример + +```cpp +#include "GyverStepper2.h" +GStepper2 stepper(2048, 2, 3); + +void setup() { + Serial.begin(9600); + //stepper.enable(); + stepper.setMaxSpeed(100); // скорость движения к цели + stepper.setAcceleration(200); // ускорение + stepper.setTarget(300); // цель +} + +bool dir = 1; +void loop() { + stepper.tick(); // мотор асинхронно крутится тут + + // если приехали + if (stepper.ready()) { + dir = !dir; // разворачиваем + stepper.setTarget(dir * 300); // едем в другую сторону + } + + // асинхронный вывод в порт + static uint32_t tmr; + if (millis() - tmr >= 30) { + tmr = millis(); + Serial.println(stepper.pos); + } +} +```