Update README.md

This commit is contained in:
Mirivlad 2022-03-20 03:14:09 +08:00 committed by GitHub
parent 08df10b3b0
commit 9f4a6fd0be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 117 additions and 0 deletions

117
README.md
View File

@ -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<STEPPER2WIRE> stepper(шаговНаОборот, step, dir); // драйвер step-dir
GStepper2<STEPPER2WIRE> stepper(шаговНаОборот, step, dir, en); // драйвер step-dir + пин enable
GStepper2<STEPPER4WIRE> stepper(шаговНаОборот, pin1, pin2, pin3, pin4); // драйвер 4 пин
GStepper2<STEPPER4WIRE> stepper(шаговНаОборот, pin1, pin2, pin3, pin4, en); // драйвер 4 пин + enable
GStepper2<STEPPER4WIRE_HALF> stepper(шаговНаОборот, pin1, pin2, pin3, pin4); // драйвер 4 пин полушаг
GStepper2<STEPPER4WIRE_HALF> 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<STEPPER2WIRE> 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);
}
}
```