diff --git a/README.md b/README.md index e30d4e6..44ca066 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Foo](https://img.shields.io/badge/Version-2.5-brightgreen.svg?style=flat-square)](#versions) +[![Foo](https://img.shields.io/badge/Version-2.6-brightgreen.svg?style=flat-square)](#versions) [![Foo](https://img.shields.io/badge/Website-AlexGyver.ru-blue.svg?style=flat-square)](https://alexgyver.ru/) [![Foo](https://img.shields.io/badge/%E2%82%BD$%E2%82%AC%20%D0%9D%D0%B0%20%D0%BF%D0%B8%D0%B2%D0%BE-%D1%81%20%D1%80%D1%8B%D0%B1%D0%BA%D0%BE%D0%B9-orange.svg?style=flat-square)](https://alexgyver.ru/support_alex/) @@ -380,6 +380,7 @@ int32_t getCurrent(); // получить текущую void reset(); // сбросить текущую позицию в 0 // всякое +void autoPower(bool mode); // автоотключение мотора при достижении позиции - true (по умолч. false) uint32_t getPeriod(); // получить текущий период тиков void brake(); // резко остановить мотор void pause(); // пауза - доехать до заданной точки и ждать (ready() не вернёт true, пока ты на паузе) @@ -781,6 +782,11 @@ void loop() { - v2.3 - fix compiler warnings, поддержка esp32 - v2.4 - повышена плавность движения шаговиков в Planner и Planner2. Исправлена бага в Stepper2 - v2.5 - исправлено плавное изменение скорости для KEEP_SPEED +- v2.6 + - disable() в виртуальном режиме отключает сигнал с мотора (для 4-проводных драйверов) + - улучшена производительность для step-dir драйверов + - добавил autoPower() в GStepper2 + - исправлен рывок при смене направления в GStepper ## Баги и обратная связь diff --git a/examples/Stepper/accelDeccelButton/accelDeccelButton.ino b/examples/Stepper/accelDeccelButton/accelDeccelButton.ino index 7668d6f..2e9f157 100644 --- a/examples/Stepper/accelDeccelButton/accelDeccelButton.ino +++ b/examples/Stepper/accelDeccelButton/accelDeccelButton.ino @@ -2,7 +2,8 @@ //#define SMOOTH_ALGORITHM #include -GStepper stepper(800, 2, 3, 12); +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { diff --git a/examples/Stepper/demo/demo.ino b/examples/Stepper/demo/demo.ino index 05a87e4..9a828bb 100644 --- a/examples/Stepper/demo/demo.ino +++ b/examples/Stepper/demo/demo.ino @@ -2,6 +2,7 @@ #include GStepper stepper(2048, 5, 3, 4, 2); + // мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами // то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 diff --git a/examples/Stepper/endSwitch/endSwitch.ino b/examples/Stepper/endSwitch/endSwitch.ino index c5f3c0b..c90bdea 100644 --- a/examples/Stepper/endSwitch/endSwitch.ino +++ b/examples/Stepper/endSwitch/endSwitch.ino @@ -1,8 +1,7 @@ // пример с концевиком #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { // наша задача - при запуске крутить мотор в сторону до нажатия на кнопку diff --git a/examples/Stepper/potPos/potPos.ino b/examples/Stepper/potPos/potPos.ino index 512fc7c..7e4f702 100644 --- a/examples/Stepper/potPos/potPos.ino +++ b/examples/Stepper/potPos/potPos.ino @@ -1,9 +1,8 @@ // установка позиции потенциометром #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { Serial.begin(115200); diff --git a/examples/Stepper/potSpeed/potSpeed.ino b/examples/Stepper/potSpeed/potSpeed.ino index 0037207..b4223a4 100644 --- a/examples/Stepper/potSpeed/potSpeed.ino +++ b/examples/Stepper/potSpeed/potSpeed.ino @@ -1,9 +1,8 @@ // установка скорости потенциометром #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости diff --git a/examples/Stepper/smoothAlgorithm/smoothAlgorithm.ino b/examples/Stepper/smoothAlgorithm/smoothAlgorithm.ino index c4adb4d..542eeeb 100644 --- a/examples/Stepper/smoothAlgorithm/smoothAlgorithm.ino +++ b/examples/Stepper/smoothAlgorithm/smoothAlgorithm.ino @@ -5,9 +5,8 @@ #define SMOOTH_ALGORITHM #include -GStepper stepper(2048, 2, 3, 4, 5); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { Serial.begin(115200); diff --git a/examples/Stepper/speed/speed.ino b/examples/Stepper/speed/speed.ino index 267ce3f..e237012 100644 --- a/examples/Stepper/speed/speed.ino +++ b/examples/Stepper/speed/speed.ino @@ -1,9 +1,8 @@ // крутимся с заданной скоростью #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { stepper.setRunMode(KEEP_SPEED); // режим поддержания скорости diff --git a/examples/Stepper/speedSerialControl/speedSerialControl.ino b/examples/Stepper/speedSerialControl/speedSerialControl.ino index ff8bfbc..ccc3a63 100644 --- a/examples/Stepper/speedSerialControl/speedSerialControl.ino +++ b/examples/Stepper/speedSerialControl/speedSerialControl.ino @@ -5,7 +5,8 @@ // отправь r для скорости 100 град/сек #include -GStepper stepper(2048, 5, 3, 4, 2); +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { Serial.begin(9600); diff --git a/examples/Stepper/stepdir/stepdir.ino b/examples/Stepper/stepdir/stepdir.ino deleted file mode 100644 index ebaf834..0000000 --- a/examples/Stepper/stepdir/stepdir.ino +++ /dev/null @@ -1,27 +0,0 @@ -// крутим мотор туда-сюда плавно с ускорением -// драйвер STEP-DIR - -#include -GStepper stepper(800, 2, 3, 4); -// 2 - STEP -// 3 - DIR -// 4 - EN - -void setup() { - // режим следования к целевй позиции - stepper.setRunMode(FOLLOW_POS); - - // установка макс. скорости в шагах/сек - stepper.setMaxSpeed(1000); - - // установка ускорения в шагах/сек/сек - stepper.setAcceleration(1000); -} - -int val = 2000; -void loop() { - if (!stepper.tick()) { - val = -val; - stepper.setTarget(val); - } -} diff --git a/examples/Stepper/stop/stop.ino b/examples/Stepper/stop/stop.ino index 2672d8d..e63004a 100644 --- a/examples/Stepper/stop/stop.ino +++ b/examples/Stepper/stop/stop.ino @@ -1,9 +1,8 @@ // пример работы stop() // на графике будет видно, как сместилась установка и мотор к ней затормозил #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { Serial.begin(115200); diff --git a/examples/Stepper/sweep/sweep.ino b/examples/Stepper/sweep/sweep.ino index 001e4a6..a3db2b6 100644 --- a/examples/Stepper/sweep/sweep.ino +++ b/examples/Stepper/sweep/sweep.ino @@ -1,9 +1,8 @@ // крутим мотор туда-сюда плавно с ускорением #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); void setup() { Serial.begin(115200); diff --git a/examples/Stepper/timerISR/timerISR.ino b/examples/Stepper/timerISR/timerISR.ino index a6c5874..988d870 100644 --- a/examples/Stepper/timerISR/timerISR.ino +++ b/examples/Stepper/timerISR/timerISR.ino @@ -2,9 +2,8 @@ // используется GyverTimers #include -GStepper stepper(2048, 5, 3, 4, 2); -// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами -// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2 +//GStepper stepper(2048, 5, 3, 4, 2); +GStepper stepper(2048, 2, 5); #include diff --git a/examples/Stepper2/SpeedControl/SpeedControl.ino b/examples/Stepper2/SpeedControl/SpeedControl.ino index 1492e49..a311eaa 100644 --- a/examples/Stepper2/SpeedControl/SpeedControl.ino +++ b/examples/Stepper2/SpeedControl/SpeedControl.ino @@ -1,7 +1,8 @@ // крутим мотор. Отправляй в сериал целое число, шаг/сек #include "GyverStepper2.h" -GStepper2 stepper(2048, 2, 3); +//GStepper2 stepper(2048, 5, 3, 4, 2); +GStepper2 stepper(2048, 2, 5); void setup() { Serial.begin(9600); diff --git a/examples/Stepper2/StepperControl/StepperControl.ino b/examples/Stepper2/StepperControl/StepperControl.ino index a4aa7bd..0cc541c 100644 --- a/examples/Stepper2/StepperControl/StepperControl.ino +++ b/examples/Stepper2/StepperControl/StepperControl.ino @@ -6,7 +6,8 @@ // r - продолжить //#define GS_NO_ACCEL #include "GyverStepper2.h" -GStepper2 stepper(2048, 2, 3); +//GStepper2 stepper(2048, 5, 3, 4, 2); +GStepper2 stepper(2048, 2, 5); void setup() { Serial.begin(9600); diff --git a/examples/Stepper2/homing/homing.ino b/examples/Stepper2/homing/homing.ino index 1f3d304..9806b2c 100644 --- a/examples/Stepper2/homing/homing.ino +++ b/examples/Stepper2/homing/homing.ino @@ -3,7 +3,8 @@ #define LIMSW_X 6 #include "GyverStepper2.h" -GStepper2 stepper(2048, 2, 3); +//GStepper2 stepper(2048, 5, 3, 4, 2); +GStepper2 stepper(2048, 2, 5); void setup() { // пуллапим. Кнопки замыкают на GND diff --git a/examples/Stepper2/sweep/sweep.ino b/examples/Stepper2/sweep/sweep.ino index e851076..c3f2c22 100644 --- a/examples/Stepper2/sweep/sweep.ino +++ b/examples/Stepper2/sweep/sweep.ino @@ -1,7 +1,8 @@ // крутим туда сюда, тикаем в loop #include "GyverStepper2.h" -GStepper2 stepper(2048, 2, 3); +//GStepper2 stepper(2048, 5, 3, 4, 2); +GStepper2 stepper(2048, 2, 5); void setup() { Serial.begin(9600); diff --git a/examples/Stepper2/sweepISR/sweepISR.ino b/examples/Stepper2/sweepISR/sweepISR.ino index e5f14e0..353fc7b 100644 --- a/examples/Stepper2/sweepISR/sweepISR.ino +++ b/examples/Stepper2/sweepISR/sweepISR.ino @@ -1,7 +1,8 @@ // крутим туда сюда, прерывание таймера #include "GyverStepper2.h" -GStepper2 stepper(2048, 2, 3); +//GStepper2 stepper(2048, 5, 3, 4, 2); +GStepper2 stepper(2048, 2, 5); void setup() { Serial.begin(9600); diff --git a/examples/Stepper2/sweep_FAST_PROFILE/sweep_FAST_PROFILE.ino b/examples/Stepper2/sweep_FAST_PROFILE/sweep_FAST_PROFILE.ino index 891a01b..9ea041a 100644 --- a/examples/Stepper2/sweep_FAST_PROFILE/sweep_FAST_PROFILE.ino +++ b/examples/Stepper2/sweep_FAST_PROFILE/sweep_FAST_PROFILE.ino @@ -3,6 +3,7 @@ // включаем быстрый профиль, 10 участков #define GS_FAST_PROFILE 10 #include "GyverStepper2.h" +//GStepper2 stepper(2048, 5, 3, 4, 2); GStepper2 stepper(2048, 2, 5); uint32_t tar = 60000; diff --git a/library.properties b/library.properties index 828f932..bedad75 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=GyverStepper -version=2.5 +version=2.6 author=AlexGyver maintainer=AlexGyver sentence=Fast library for stepmotor control and multi-axis planning diff --git a/src/GyverStepper.h b/src/GyverStepper.h index 1ffdb6c..35c1d2e 100644 --- a/src/GyverStepper.h +++ b/src/GyverStepper.h @@ -54,6 +54,11 @@ v2.3 - fix compiler warnings, поддержка esp32 v2.4 - повышена плавность движения шаговиков в Planner и Planner2. Исправлена бага в Stepper2 v2.5 - исправлено плавное изменение скорости для KEEP_SPEED + v2.6 + - disable() в виртуальном режиме отключает сигнал с мотора (для 4-проводных драйверов) + - улучшена производительность для step-dir драйверов + - добавил autoPower() в GStepper2 + - исправлен рывок при смене направления в GStepper */ /* @@ -221,7 +226,7 @@ class GStepper : public Stepper<_DRV, _TYPE> { if (_curMode && _accel != 0) smoothSpeedPlanner(); // планировщик скорости KEEP_SPEED - if (tickUs - _prevTime >= stepTime) { // основной таймер степпера + if (stepTime && tickUs - _prevTime >= stepTime) { // основной таймер степпера _prevTime = tickUs; #ifdef SMOOTH_ALGORITHM diff --git a/src/GyverStepper2.h b/src/GyverStepper2.h index f8e1ca7..139d11c 100644 --- a/src/GyverStepper2.h +++ b/src/GyverStepper2.h @@ -69,6 +69,7 @@ void reset(); // сбросить текущую позицию в 0 // всякое + void autoPower(bool mode); // автоотключение мотора при достижении позиции - true (по умолч. false) uint32_t getPeriod(); // получить текущий период тиков void brake(); // резко остановить мотор void pause(); // пауза - доехать до заданной точки и ждать (ready() не вернёт true, пока ты на паузе) @@ -151,7 +152,7 @@ class GStepper2 : public Stepper<_DRV, _TYPE> { #endif } else { // приехали if (revF) { - status = 0; + brake(); setTarget(bufT); return status; } @@ -195,6 +196,7 @@ class GStepper2 : public Stepper<_DRV, _TYPE> { dir = (speed > 0) ? 1 : -1; us = 1000000L / abs(speed); status = 3; + if (autoP) enable(); return 1; } @@ -284,6 +286,7 @@ class GStepper2 : public Stepper<_DRV, _TYPE> { #endif dir = (pos < tar) ? 1 : -1; status = 1; + if (autoP) enable(); readyF = 0; } @@ -410,9 +413,15 @@ class GStepper2 : public Stepper<_DRV, _TYPE> { #endif } + // автоотключение мотора при достижении позиции - true (по умолч. false) + void autoPower(bool mode) { + autoP = mode; + } + // остановить мотор void brake() { status = 0; + if (autoP) disable(); } // пауза (доехать до заданной точки и ждать). ready() не вернёт true, пока ты на паузе @@ -447,6 +456,8 @@ class GStepper2 : public Stepper<_DRV, _TYPE> { using Stepper<_DRV, _TYPE>::pos; using Stepper<_DRV, _TYPE>::dir; using Stepper<_DRV, _TYPE>::step; + using Stepper<_DRV, _TYPE>::enable; + using Stepper<_DRV, _TYPE>::disable; // ============================= PRIVATE ============================= private: @@ -474,6 +485,7 @@ class GStepper2 : public Stepper<_DRV, _TYPE> { uint8_t status = 0; bool readyF = 0; bool changeSett = 0; + bool autoP = false; uint32_t usMinN; bool sp0 = 0; diff --git a/src/StepperCore.h b/src/StepperCore.h index 0351ed3..a36bb92 100644 --- a/src/StepperCore.h +++ b/src/StepperCore.h @@ -102,7 +102,10 @@ class Stepper { setPin(3, 0); } if (_enPin != 255) digitalWrite(_enPin, !_enDir); - } else if (*_power) _power(0); + } else { + if (*_power) _power(0); + if (*_step && (_DRV == STEPPER4WIRE || _DRV == STEPPER4WIRE_HALF)) _step(0); + } } // включить питание и EN @@ -111,7 +114,10 @@ class Stepper { // подадим прошлый сигнал на мотор, чтобы вал зафиксировался if (_DRV == STEPPER4WIRE || _DRV == STEPPER4WIRE_HALF) step4(); if (_enPin != 255) digitalWrite(_enPin, _enDir); - } else if (*_power) _power(1); + } else { + if (*_power) _power(1); + if (*_step && (_DRV == STEPPER4WIRE || _DRV == STEPPER4WIRE_HALF)) step4(); + } } // подключить обработчик шага @@ -199,7 +205,10 @@ class Stepper { // шажочек степдир void stepDir() { if (_TYPE == STEPPER_PINS) { - setPin(1, (dir > 0) ^ _globDir); // DIR + if (_pdir != dir) { + _pdir = dir; + setPin(1, (dir > 0) ^ _globDir); // DIR + } setPin(0, 1); // step HIGH if (DRIVER_STEP_TIME > 0) delayMicroseconds(DRIVER_STEP_TIME); setPin(0, 0); // step LOW @@ -211,6 +220,7 @@ class Stepper { int8_t _enPin = 255; bool _enDir = false; bool _globDir = false; + int8_t _pdir = 0; int8_t thisStep = 0; void (*_step)(uint8_t a) = NULL;