сломал мозг.. что не так с кодом

rolla

✩✩✩✩✩✩✩
5 Мар 2023
3
0
Доброе время суток всем.
кому не трудно - посмотрите мой скетч.... уже мозг сломал....

если изменяю вручную переменную stepperSt (строка 37) то режимы 1,2,3,4,5 отрабатываются как нужно
но стоит обрабатывать их кнопками
(использую библиотеку "OneButton.h" , пробовал обрабатывать encButton -- но как то не срослось.... ).
судя по монитору COM порта должно работать . переменная stepperSt изменяется кнопками
и case выбираются правильно ... НО...
нажимаю и удерживаю ЛЕВО или ПРАВО - ШД - двигается правильно
пытаюсь включить режим ТАРГЕТТ - ШД молчит.....
-------------------------------------------------------------------------------------------------

C++:
[code]
/* шаговый двигатель NEMA23, драйвер к нему TB6600, три тактовых кнопки, два потенциометра, светодиод.
  режимы работы  шагового двигателя определяются кнопками
  КнЛЕВО - при нажатии и удержании - ШД вращается в ЛЕВО
  КнПРАВО -при нажатии и удержании - ШД вращается в ПРАВО
       <двойной клик>  по КнЛЕВО или КнПРАВО - запускается режим ТАРГЕТ (крутит туда-сюда относительно текущей позиции на определенный угол)
       <клик>  по КнЛЕВО или КнПРАВО - двигатель останавливается  (с обмоток снимается напряжение, вал двигателя можно свободно вращать рукой)
  КнТАРГЕТ - при <нажатии и удержании>  - двигатель останавливается  с обмоток снимается напряжение, вал двигателя можно свободно вращать вручную
         - при отпускании ранее нажатой кнопки КнТАРГЕТ> двигатель переходит в режим ТАРГЕТ - крутит туда-сюда относительно текущей позиции на определенный угол
  Потенциометр СКОРОСТЬ - регулирует скорость вращения двигателя от Vмин, до Vмакс.
  Потенциометр УГОЛ - изменяет угол поворота в режиме ТАРГЕТ от Uмин градусов до Uмакс градусов
*/
//---------------------------------------------------------------------------------
#define DRIVER_STEP_TIME 1  // задержка 1 мкс для драйвера ШД (TB6600)
#define PIN_POT_V     A5    // пин потенциометра для  Скорость
#define PIN_POT_U     A4    // пин потенциометра для Угол таргетирования
#define PIN_LED_0       A0    // пин  светодиода индикации
#define speedmin 50         // минимальная скорость в шаг/сек
#define speedmax 3200       // максимальная скорость в шаг/сек
#define tarmin 50           // минимальный угол в шагах
#define tarmax 800          //максимальный угол в шагах#include <FIFO.h>


#include <GStypes.h>
//#include <GyverPlanner.h>
//#include <GyverPlanner2.h>
//#include <GyverStepper.h>
#include <GyverStepper2.h>
#include <StepperCore.h>
#include "OneButton.h"

OneButton btnLeft(5, false);    // кнопка ЛЕВО на 5 пин, подключена VCC
OneButton btnRight(6, false);   // кнопка ЛЕВО на 6 пин, подключена VCC
OneButton btnTarget(7, false);   // кнопка ЛЕВО на 7 пин, подключена VCC
//--------------------------------------------------------------------------------
GStepper2<STEPPER2WIRE> stepper(800, 8, 9, 10);    // параметры ШД 800 шагов/оборот, step, dir, en  на пины 8,9,10 соответственно
//---------------флажок для состояния ШД------------------------------------------
int stepperSt = 1; // 1 - не вращается, 2 - вращается влево, 3 - вращается вправо, 4- временно не вращается , 5 - таргет

//----------- для мигания светодиода ---------------------------------
int ledState = LOW;             // состояние светодиода
long previousMillis = 0;        // время последнего переключения светодиода
long interval = 100;           // интервал между включение (милисекунды)
//---------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  //-------------- связываем функции кнопки ЛЕВО-----------------------------------
  btnLeft.attachClick(click1);        //клик
  btnLeft.attachDoubleClick(doubleclick1);  //двойной клик
  btnLeft.attachLongPressStart(longPressStart1); //долгое  нажатие (удержание)старт
  btnLeft.attachLongPressStop(longPressStop1);    //отпускание после долгого удержания

  //----------  связываем функции кнопки ЛЕВО----------------------------------------
  btnRight.attachClick(click2);             //клик
  btnRight.attachDoubleClick(doubleclick2);   //двойной клик
  btnRight.attachLongPressStart(longPressStart2); //долгое нажатие (удержание) старт
  btnRight.attachLongPressStop(longPressStop2);   //отпускание после догого удержания

  // ------------------связываем функции кнопки ТАРГЕТ -------------------------------
  btnTarget.attachClick(click3);             //клик
  btnTarget.attachLongPressStart(longPressStart3); //долгое нажатие (удержание) старт
  btnTarget.attachLongPressStop(longPressStop3);   //отпускание после догого удержания
  //--------------------------------------------------------------------------------------

  btnLeft.setDebounceTicks(50);  //Время, в течение которого игнорируются дополнительные изменения уровня.(50 msec)
  btnLeft.setClickTicks(500);   // Тайм-аут, используемый для того, чтобы отличить одиночные клики от двойных(500 msec)
  btnLeft.setPressTicks(800);   //Продолжительность удержания кнопки для срабатывания длительного нажатия (800 msec)

  btnRight.setDebounceTicks(50);  //Время, в течение которого игнорируются дополнительные изменения уровня.(50 msec)
  btnRight.setClickTicks(500);   // Тайм-аут, используемый для того, чтобы отличить одиночные клики от двойных(500 msec)
  btnRight.setPressTicks(800);   //Продолжительность удержания кнопки для срабатывания длительного нажатия (800 msec)

  btnTarget.setDebounceTicks(50);  //Время, в течение которого игнорируются дополнительные изменения уровня.(50 msec)
  btnTarget.setClickTicks(500);   // Тайм-аут, используемый для того, чтобы отличить одиночные клики от двойных(500 msec)
  btnTarget.setPressTicks(800);   //Продолжительность удержания кнопки для срабатывания длительного нажатия (800 msec)

  //----------потенциометры скорости V, угла таргетирования U---------------------
  pinMode(PIN_POT_V, INPUT);       // пин потенциометра скорости как ВЫХОД (подключение левый пин VCC, средний пин - А5, правый пин GND)
  pinMode(PIN_POT_U, INPUT);       // пин потенциометра угла как ВЫХОД (подключение левый пин VCC, средний пин - А4, правый пин GND)
  //---------------------------------------------------------- -------------------
  pinMode(PIN_LED_0, OUTPUT);
}

void loop() {
  // тикаем кнопки
  btnLeft.tick();
  btnRight.tick();
  btnTarget.tick();

  //Serial.println(stepperSt);
  // =========== ПОЕХАЛИ ==========================================================
  switch (stepperSt) {      // 1 =============== ШД выключен ======================
    case 1: {
        Serial.println("кейс 1");
        Serial.println(stepperSt);
        stepper.brake();    // тормозим
        stepper.reset();    // сбрасываем позицию в 0
        stepper.disable();  //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками
        digitalWrite(PIN_LED_0, HIGH);
      }
      break;
    case 2:  {               // 2 ============= едем в ЛЕВО =========================
        
         Serial.println("кейс 2");
         Serial.println(stepperSt);
        stepper.enable();                   //ШД включить
        stepper.setSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax));
        stepper.tick();
        digitalWrite(PIN_LED_0, LOW);
      }
      break;
    case 3:  {               // 3 ============= едем в ПРАВО ========================
         Serial.println("кейс 3");
         Serial.println(stepperSt);
        stepper.enable();                   //ШД включить
        stepper.setSpeed(-(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)));
        stepper.tick();
        digitalWrite(PIN_LED_0, LOW);
      }
      break;
    case 4:  {               //4 ============== ШД временно выключен =================
        Serial.println("кейс 4");
        Serial.println(stepperSt);
        stepper.brake();    // тормозим
        stepper.reset();    // сбрасываем позицию в 0
        stepper.disable();  //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками

        { // ---------------------- мигаем светодиодом-----------------------------
          unsigned long currentMillis = millis();
          if (currentMillis - previousMillis > interval) {
            previousMillis = currentMillis;
            if (ledState == LOW)
              ledState = HIGH;
            else
              ledState = LOW;
            digitalWrite(PIN_LED_0, ledState);
          }
        }  //---------------------------------------------------------------------
      }
      break;
    case 5:  {    // 5============= ШД  в ТАРГЕТ ===========================
Serial.println("кейс 5");
        Serial.println(stepperSt);
        stepper.setMaxSpeed(map(analogRead(PIN_POT_V), 0, 1023, speedmin, speedmax)); // установка скорости  в шагах/сек
        stepper.setAcceleration(500);        // установка ускорения в шагах/сек2
        if (!stepper.tick()) {
          static bool dir;
          dir = !dir;
          stepper.setTarget(dir ? -(map(analogRead(PIN_POT_U), 0, 1023, tarmin, tarmax)) : map(analogRead(PIN_POT_U), 0, 1023, tarmin, tarmax));
        }
      }
      break;
  }
} //====================   end loop =====================================


// ============================== функции обратного вызова ЛЕВО ===========================================
//----------Эта функция будет вызвана, когда кнопка 1 была нажата 1 раз (и не последовало двойное нажатие кнопки).
void click1() {
  stepperSt = 1;
  //Serial.println("ЛЕВО клик");
} // click1
//-----------------  Эта функция будет вызываться при 2-кратном нажатии кнопки 1 в течение короткого промежутка времени.
void doubleclick1() {
  stepperSt = 5;
  // Serial.println("ЛЕВО  двойной клик");
} // doubleclick1
//------------------ Эта функция будет вызываться один раз при длительном нажатии кнопки ЛЕВО.
void longPressStart1() {
  stepperSt = 2;
  //Serial.println("ЛЕВО  долгое нажатие  start");
} // longPressStart1

// Эта функция будет вызвана один раз, когда кнопка 1 будет отпущена после длительного нажатия.
void longPressStop1() {
  stepperSt = 1;
  //Serial.println("ЛЕВО долгое нажатие stop");
} // longPressStop1


// ----- функции обратного вызова ПРАВО
void click2() {
  stepperSt = 1;
  //Serial.println("ПРАВО  клик");
} // click2

void doubleclick2() {
  stepperSt = 5;
  // Serial.println("ПРАВО  двойной клик.");
} // doubleclick2


void longPressStart2() {
  stepperSt = 3;
  // Serial.println("ПРАВО  долгое нажатие start");
} // longPressStart2

void longPressStop2() {
  stepperSt = 1;
  //Serial.println("ПРАВО долгое нажатие stop");
} // longPressStop2


// ----------------------- функции обратного вызова ТАРГЕТ---------------------------------
void click3() {
  stepperSt = 1;
  //Serial.println("ТАРГЕТ  клик");
} // click2


void longPressStart3() {
  stepperSt = 4;
  // Serial.println("ТАРГЕТ долгое нажатие start");
} // longPressStart2


void longPressStop3() {
  stepperSt = 5;
  //Serial.println("ТАРГЕТ  долгое нажатие stop");
} // longPressStop2


// End
[/CODE]
 

Alex_HF

★✩✩✩✩✩✩
11 Мар 2023
40
16
Сначала в case 4
stepper.disable(); //ШД выключаем - напряжение с обмоток снято,вал можно свободно вращать руками

потом переходим после отпускания в case 5 че-то там делаем, а двигатель отключен остается