GyverStepper. Обсуждение библиотеки

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
сохранить состояние направления для каждого мотора и потом его восстановить.
Пробовал - не прокатило.. Почему так, не понял. Может библиотека, действительно, читает пин перед стартом?
Или DIR в ней ReadOnly и операция его изменения игнорируется.

Похоже, придётся забить на эту "параллельную затею", не судьба сэкономить пины..
Попробую ещё оставить STEP впараллель на драйверах, может хоть с этим прокатит. Пинов как раз хватит для проекта. :)
Не знаю только, как "понравится" stepper-у пин D13 ардуины - светодиод к нему подключён.
В принципе, мешать он не должен, но.. На крайний случай, выпаяю его.
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
@KovAlex, по мне - так проблема сильно переусложнена. Зачем Вам две конкурирующие "сущности" GStepper2? Управляйте одной, а моторы переключайте с помощью Enable.
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
Управляйте одной, а моторы переключайте с помощью Enable.
Гм.. А этот вариант я почему-то и не рассматривал... Попробую..
Я правильно вас понял, что "электрическая часть" (параллельные STEP и DIR и два отдельных EN) остаётся без изменений, только stepper будет один?
И в его конфигурации будет отсутствовать параметр EN, которым я буду манипулировать из своего кода, поднимая/опуская соотв. пины.
Код:
GStepper2<STEPPER2WIRE> stepper(шаговНаОборот, step, dir);
Интересно, а команды stepper.enable/disable оставлять, или они уже не потребуются?
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
@KovAlex, да, с конфигурацией именно так (электрически всё параллельно, кроме enable). Так как шинами enable Вы будете управлять сами, вне библиотеки, то эти методы Вам в самой библиотеке не нужны.
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
Так как шинами enable Вы будете управлять сами, вне библиотеки, то эти методы Вам в самой библиотеке не нужны.
А как же тогда насчёт этого -
void disable(); // отключить питание и EN
void enable(); // включить питание и EN
Что здесь вообще означает, "питание"? На драйвер (А4988) всего три сигнала приходят: STEP, DIR и ENABLE.
Или это имеет смысл для других драйверов?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
EN управляет подачей питания на обмотки, если мотор не крутиться, но EN включен, то мотор находиться в режиме удержания положения - вал будет крутиться с трудом, при этом мотор будет сильно греться, Если отключен, то вал легко поворачивается .
Если использовать драйвера типа TMC2208, то таки драйверов есть автоматическое снижение тока при удержании положения, мотор не греется так сильно как с 4988. И теоретически EN можно не трогать.
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
EN управляет подачей питания на обмотки, ...
Это мне известно.
А вот это -
И теоретически EN можно не трогать.
я вообще не понял.. Как я смогу (в обсуждаемом варианте) НЕ трогать EN???
Да и вообще - вопрос был про
отключить/включить питание и EN
В комментарии присутствует "И", что подразумевает "и то и это". Т.е., как я понимаю, это "разные люди".
И если с "EN" всё понятно, то вот с "питанием" - нет.
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
@KovAlex, Вам проще попробовать, чем пытаться интерпретировать описание.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Не трогать EN можно только для одного мотора на набор пинов.

EN включено и питание мотора включено
EN выключено и питание мотора выключено
Работают только в паре.

При включенном EN на обмотки мотора подается ток. При импульсе на STEP полярность обмоток меняется (если грубо) и мотор делает шаг. Т.е. ток будет на обмотках всегда. Но если не дергать STEP мотор не крутиться, а удерживает положение вала, получается такой тормоз.

Что не понятно я "не понятно"
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
Что не понятно я "не понятно"
Не понятно, к чему это всё для моего случая.
Ну да ладно..
Вариант с одним GStepper и двумя драйверами/моторами с запараллеленными STEP/DIR и собственным управлением EN, вроде как прокатил.
"Вроде" - потому-что не всё гладко в авто-режиме (когда данные азимут/элевация прилетают с компьютера).
Что собственно и ожидалось.
Пока ищу, где накосячил..

В процессе поиска появился такой вопрос - многократный вызов stepper.ready() и stepper.getStatus(), не сбрасывает, случаем, эти флаги?
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
В процессе создания контроллера управления поворотным устройством антенны, споткнулся с проблемой отказа работы ОДНОЙ кнопки аналоговой клавиатуры.
Сразу поясню, почему спрашиваю здесь.
Причина такова - ТОЛЬКО после останова ШД(GStepper2 ISR) на заданной позиции, подпрограмма обработки клавиатуры перестаёт "видеть" одну кнопку.
Тупо не видит и тупо ОДНУ кнопку!
Клавиатура примитивная - три резистора, соединённых последовательно с VCC, три кнопки подключают "GND" с точек соединения резисторов.
Первая "точка соединения" подключена к А3 ардуино нано.
Работать перестаёт кнопка, подключающая "GND" на пин А3.
Код:
Код:
#include <EncButton.h>

EncButton enc(2, 3, 4);                 // энкодер с кнопкой CLK, DT, SW
VirtButton btnUP;
VirtButton btnDWN;
VirtButton btnSET;

// создаём массив значений сигналов с кнопок
int16_t sigs[3] = {
  340, 140, 0
};

enum {
  None = 0,
  UpClick,
  DownClick,
  UpHold,
  DownHold,
  SelClick,
  SelHold,
  TurnRight,
  TurnLeft,
  TurnRH,
  TurnLH,
  EClick
};

#include "AnalogKey.h"

// указываем пин, количество кнопок и массив значений
AnalogKey<A3, 3, sigs> keys;

// подпрограмма чтения клавиатуры

int8_t ReadKey() {
  int8_t code = 0;
  if (btnUP.tick(keys.status(0))) {
    if (btnUP.click()) code = UpClick;
    if (btnUP.hold())  code = UpHold;
  }
  if (btnDWN.tick(keys.status(1))) {
    if (btnDWN.click())code = DownClick;
    if (btnDWN.hold()) code = DownHold;
  }
  if (btnSET.tick(keys.status(2))) {
    if (btnSET.click())code = SelClick;
    if (btnSET.hold()) code = SelHold;
  }
  if (code) return code;
  else return None;
}
Другие две кнопки (btnUP и btnDWN) ReadKey в это время "видит", кнопку btnSET - ни в какую..

Третий день выношу мозг себе и коллеге.. :(
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,292
953
... три резистора, соединённых последовательно с VCC, три кнопки подключают "GND" с точек соединения резисторов. Первая "точка соединения" подключена к А3 ардуино нано.
Т.е.:
VCC
-
R1
|-----A3----btnSET---GND
R2
|---btnUP---GND
R3
|---btnDWN---GND

Так? А каковы номиналы резисторов? Возможно, что кнопка имеет плохой контакт и не даёт точного нуля на выходе. Можно попробовать увеличить последнее значение в массиве sigs.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Возможность выводить отладочные сообщения в монитор порта есть ? Если есть -просто вывести перед чтением клавиатуры аналоговое значение с пина А3 и посмотреть на сколько значение меняется до управления и после управления при нажатии на кнопку set
Не хватает кода части где выдается результат метода keys.status(n)
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
Да, клавиатура такая, как вы "нарисовали".
Аппаратной проблемы нет однозначно. Кнопки новые, все напряжения +- соответствуют указанным в массиве числам.
Ещё раз повторюсь - клавиатура работает без нареканий во всех частях софта до момента использования моторов.
После чего перестаёт работать ТОЛЬКО кнопка btnSEL. Как будто какая-то "маска" накладывается на данные порта А3.
Кстати, сейчас моторы не подключены( это я про то, что могли влиять импульсы от обмоток двигателей).
Не хватает кода части где выдается результат метода keys.status
Не понял, о чём вы?..

P.S. Интересное кино.. Чтобы посмотреть значения на пине клавиатуры, добавил в начало ReadKey следующее
Код:
void ReadKey() {
int16_t v = analogRead(A3);
Serial.print("A3=");
Serial.println(v);
...
}
и кнопка перестала реагировать на работу stepper-а!! Работает во всех случаях.
Я в ступоре... Что за такую "защёлку" ставит stepper, которую "снимает" analogRead?? :unsure:
Кстати, данные analogRead соответствуют (небольшой +-, конечно) измеренным напряжениям.
И btnSEL выдаёт "чистый 0".
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Ну а какие значения то выдает при нажатой кнопке без работы и с работой степера ? на сколько разные/одинаковые ?
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
Одинаковые.

P.S. Методом дедукции с коллегой удалось родить грандиозный и непонятный костыль.
В setup (!!!) скетча добавили строку - analogRead(A3);
И проблема ушла..

ЧуднЫ дела твои, ARDUINO! :)
 
Изменено:

tirukaly

✩✩✩✩✩✩✩
26 Сен 2023
3
0
Здравствуйте. Помогите!) Всю голову уже сломал. Шаговый мотор имеет несколько режимов работы. По Serial передается переменная, на основании этой переменной выбирается функция. Но функция должна работать до передачи другой переменной, а в моем случае работает только на долю секунды: один шаг мотора, я подозреваю. Второй день гуглю, все бестолку.
C++:
#define SMOOTH_ALGORITHM
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(6400, 4, 3, 2);
int speed;

void setup() {
  Serial.begin(9600);
}
void loop() {
  speed = Serial.read ();
  switch (speed) {
    case 's': Slow ();
    break;
    case 'f': Fast ();
    break;
  }
}
    
void Slow () {
  stepper.setRunMode(FOLLOW_POS);
  stepper.setMaxSpeed(400);
  stepper.setAcceleration(500);
  if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -400 : 400);
      }
}

void Fast () {
  stepper.setRunMode(FOLLOW_POS);
  stepper.setMaxSpeed(2000);
  stepper.setAcceleration(2000);
  if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -400 : 400);
      }
}
 

poty

★★★★★★✩
19 Фев 2020
3,292
953
@tirukaly,
1. Что делает Ваш код, если входной команды нет? Вы это как-то обрабатываете сейчас? Мне вот интересно, что Вы "гуглите" по этой проблеме?
2. Если Вы будете постоянно вызывать функции Slow и Fast, для того, чтобы они "работали", что Вы получите? (Подсказка - переменная dir)
 
  • Лойс +1
Реакции: tirukaly

tirukaly

✩✩✩✩✩✩✩
26 Сен 2023
3
0
@poty, до поступления команды через Serial мотор стоит, после поступления должен непрерывно работать в одном из режимов. Потом еще команда - и дальше непрерывно в другом режиме.
Гуглил я многое. Сначала думал, что неправильно посылаю сигналы на Serial, пока не вычитал про отладку. Потом думал (и все еще думаю), что есть какие-то особенности с использованием if, либо с связанные с тем, что loop выполняется циклично, а значит в переменная speed постоянно обнуляется. Так то опыт программирования небольшой есть, но только на С, поэтому хватаю везде по верхам, чтобы задуманное решить.
Вот про dir не понял. Это же просто направление вращения?
 

vortigont

★★★★★★✩
24 Апр 2020
1,021
542
Saint-Petersburg, Russia
@tirukaly, вы хоть в документацию заглянули о том что возвращает функция
Serial.read()? Подсказка: она возвращает (-1) если через сериал ничего не пришло. Дальше думайте сами что получится у вас в switch и почему все стоит кроме одного шага когда все-таки вы иногда что-то отправляете в порт.
 
  • Лойс +1
Реакции: poty

tirukaly

✩✩✩✩✩✩✩
26 Сен 2023
3
0
@vortigont, Спасибо за ответы. Я немного поправил код. Теперь Сериал отфильтровывает -1, в терминале вижу только f, carriage return и line feed (повторил простой скетч с управлением светодиодом, там они не мешают, подумал, что и здесь значение не должны иметь). Так же поменял свитч на более понятные мне условия. Однако проблема все равно на месте. Можете дать более очевидную подсказку?) С обеда сижу, ковыряюсь и так и эдак. Код управления мотором взят из библиотеки Алекса, отдельно от условий работает как надо.
C++:
#define SMOOTH_ALGORITHM
#include <GyverStepper.h>
GStepper<STEPPER2WIRE> stepper(6400, 4, 3, 2);
char speed;

void setup() {
  Serial.begin(9600);
  Serial.println ("test_begin");
  stepper.setRunMode(FOLLOW_POS);
}
void loop() {
 
  if (Serial.available() > 0) {
    speed = Serial.read ();
    Serial.print("I received: ");
    Serial.println(speed);
  }
    
  if (speed == 's') {
    stepper.setMaxSpeed(400);
    stepper.setAcceleration(500);
    if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -400 : 400);
      }
  }
  else if (speed == 'f') {
    stepper.setRunMode(FOLLOW_POS);
    stepper.setMaxSpeed(4000);
    stepper.setAcceleration(4000);
    if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -400 : 400);
      }
  }
  else {
    stepper.setMaxSpeed(100);
    stepper.setAcceleration(100);
    if  (!stepper.tick()) {
        static bool dir;
        dir = !dir;
        stepper.setTarget(dir ? -40 : 40);
      }
  }
 
}
@tirukaly, решение лежало на поверхности... Пишу для тех, кто столкнется с такой же проблемой. Всем спасибо.
C++:
static char speed = 0;
  if (Serial.available() > 0) {
    char input = Serial.read();
      if (input != '\n' && input != '\r') {
        speed = input;
        }
  }
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,281
1,306
Москва
Не надо ничего фильтровать, кроме базара.
У сериал есть отличная функция : Serial.available(), что возвращает ttue в случае наличия в буфере новых , непрочитанных данных.
 

Sabonius

✩✩✩✩✩✩✩
7 Мар 2021
4
0
Понимаю, что очень чайницкий вопрос, но

Использую GStepper2.
Мне нужно, чтобы двигатель резко менял направление вращение например каждые 2 оборота.
И чтобы помнил сколько ему ещё крутиться, поэтому останавливать и делать setTarget() не годится.
Для этого подходит функция reverse().

Вот это не работает. И кстати какую bool переменную нужно передавать в reverse и зачем?
C++:
if ((stepper.pos % 400 == 0)) {
    guide.reverse(1);
  }
 

Chak

✩✩✩✩✩✩✩
6 Янв 2024
3
0
Всем привет
У меня есть вот такой мотор LSA421S14-A-UKBN-152 с вот такими характеристиками
1713425728486.png
И есть драйвер TB67S249FTG и стандартный H-bridge LM298N

когда подключаю мотор через LM298N и использую библиотеку GyverStepper2 всё работает
когда подключаю мотор через TB67S249FTG с другой библиотекой - то всё то же работает, но когда хочу использовать GyverStepper2 с этим драйвером, то он не хочет даже запускаться

На TB67S249FTG ток вроде как настроен правильно и Vref выставлен в 1.10 v (с другими библиотеками всё работает)
на TB67S249FTG пробовал ставить режим работы full step и 1/2 step

мне кажется, что у меня проблема с созданием объекта мотора (не очень понимаю из моего даташита сколько шагов полный оборот)

пытался запустить код из примера homing (на 4 пиновом драйвере всё ок, а на 2 пиновом - не хочет работать)

C++:
#include <Arduino.h>
#include "Debug.h"
#include "GyverStepper2.h"

#define dirPin 12
#define stepPin 11
#define enPin 10
void homing();

#define LIMSW_X 3

GStepper2<STEPPER2WIRE> stepper(2048, stepPin, dirPin, enPin);


void setup()
{
    Serial.begin(9600);
    pinMode(LIMSW_X, INPUT_PULLUP);
    delay(1000);
    DEBUGLN("setup");
    homing();     
}

void loop()
{
}

void homing()
{
    stepper.enable();
    DEBUGLN("start homing");
    if (digitalRead(LIMSW_X))
        DEBUGLN("start");
    {                          // если концевик X не нажат
        stepper.setSpeed(-10); // ось Х, -10 шаг/сек
        while (digitalRead(LIMSW_X))
        {                   // пока кнопка не нажата
            stepper.tick(); // крутим
        }
        // кнопка нажалась - покидаем цикл
        stepper.brake(); // тормозим, приехали
        DEBUGLN("finish");
    }
    stepper.reset(); // сбрасываем координаты в 0
}
может кто-то может подсказать куда смотреть, ибо я уже ничего не понимаю