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;