Не получается изменить скорость шагового двигателя

Всем привет. Написал скетч для управления подачей стола фрезерного станка. Невзирая на кривизну кода, он работает. Кроме одной задумки - при включенной подаче в любую сторону и нажатии кнопки, должна включиться ускоренная подача. А она не включается. Помогите, пожалуйста, разобраться где я ошибся.

#include <AccelStepper.h>
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#define motorInterfaceType 1
AccelStepper myStepper(1, 2, 3);

struct SpeedTable {
  int step;
  char* name;
} type;

SpeedTable speed[] = {              //Таблица подач
  { 67, "20 ММ/МИН " },
  { 100, "30 ММ/МИН " },
  { 150, "45 ММ/МИН " },
  { 210, "63 ММ/МИН " },
  { 267, "80 ММ/МИН " },
  { 333, "100 ММ/МИН" },
  { 417, "125 ММ/МИН" },
  { 533, "150 ММ/МИН" },
  { 600, "180 ММ/МИН" },
  { 700, "210 ММ/МИН" },
};

bool left;          // Переменная состояния переключателя подачи влево
bool right;         // И вправо
bool sfeed;         // Переменная состояния кнопки ускоренной подачи
bool down = 8;      // Переменная состояния кнопки уменьшения скорости подачи
bool up = 9;        // Переменная состояния кнопки увеличения скорости подачи
char feedname = 0;  // Переменная для вывода скорости подачи на дисплей
int feed = 0;       // Переменная для шагов двигателя
const int enPin = 4;      // 
const int dirPin = 3;     // Пины для шагового двигателя
const int stepPin = 2;    //
const int stepsPerRevolution = 400;     // Шагов на оборот
#define in_s 5          // Пин кнопки ускоренной подачи
#define in_l 6          // Пин переключателя подачи влево
#define in_r 7          // И вправо

void setup() 
{
  lcd.init();                       
  lcd.backlight();                  
  lcd.setCursor(2, 0);              
  lcd.print("WEISAN BF-28");        
  lcd.setCursor(2, 1);              
  lcd.print("FEED CONTROL");
  delay(2000);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Скорость подачи");
  lcd.setCursor(0, 1);
  lcd.print(speed[feedname].name);
  myStepper.setAcceleration(2000);
}

void button() {                                         // Обработка нажатий кнопок
  down = digitalRead(8);
  up = digitalRead(9);

  if (up == LOW && down == HIGH && feed < 9 && feedname < 9)                  // Увеличение скорости подачи
  {
    delay(400);

    feed = (feed + 1) % (sizeof(speed) / sizeof(speed[0].step));              

    feedname = (feedname + 1) % (sizeof(speed) / sizeof(speed[0].name));

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Скорость подачи");
    lcd.setCursor(0, 1);
    lcd.print(speed[feedname].name);
    Serial.println(feed);
  }
  if (down == LOW && up == HIGH && feed > 0 && feedname > 0) {                  // Уменьшение скорости подачи
    delay(400);

    feed = (feed - 1) % (sizeof(speed) / sizeof(speed[0].step));
    feedname = (feedname - 1) % (sizeof(speed) / sizeof(speed[0].name));
  
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Скорость подачи");
    lcd.setCursor(0, 1);
    lcd.print(speed[feedname].name);
  }
}



void loop() 
{
  button();
  sfeed = digitalRead(5);
  left = digitalRead(6);
  right = digitalRead(7);

  if (left == HIGH && right == HIGH)          // Отключение питания двигателя
  {
    digitalWrite(enPin, HIGH);
  }

  if (left == LOW)                            // Подача влево
  {
    digitalWrite(enPin, LOW);
    digitalWrite(dirPin, HIGH);
    myStepper.setMaxSpeed(speed[feed].step);
    myStepper.moveTo(200000000);
  }

    if (left == LOW && sfeed == LOW)          // Ускоренная подача (не работает)
  {
    digitalWrite(enPin, LOW);
    digitalWrite(dirPin, HIGH);
    myStepper.setMaxSpeed(2000);
    myStepper.moveTo(200000000);
  }

  if (right == LOW)                           // Подача вправо
  {
    digitalWrite(enPin, LOW);
    digitalWrite(dirPin, LOW);
    myStepper.setMaxSpeed(speed[feed].step);
    myStepper.moveTo(200000000);
  }

  if (right == LOW && sfeed == LOW)           // Ускоренная подача (не работает)
  {
    digitalWrite(enPin, LOW);
    digitalWrite(dirPin, LOW);
    myStepper.setMaxSpeed(2000);
    myStepper.moveTo(200000000);
  }
  
  
  myStepper.run();
}

Хотите кому-то впарить станок с дохлыми мозгами? :thinking:

Нет. К своему станку прикручиваю. там подач не было изначально.

Ну. тогда не может потому, что вы не можете нажать обе кнопки одновременно? Да и вроде надо скорость указывать, а не предел. Не?

Влево/вправо - трехпозиционный переключатель. В нейтрали двигатель отключается, а в других положениях вращается. Когда, предположим, включена подача вправо и обработка детали закончена, хотелось бы ускоренной подачей передвинуть стол дальше. Но не получается, мысль начала буксовать.

Попробовать сначала зажать кнопку “sfeed” (в простОе), а уж потом переключатель (он с фиксацией)?

@Mech , объясните, что Вы делаете в строках 73, 75 и далее.

  1. При нажатии кнопки из массива выбирается следующее значение шагов в секунду
  2. Из массива выбирается текстовое описание для вывода на дисплей.

А далее изменения выводятся на дисплей

Вы невнимательны: 74 у Вас вообще пустая строка.
А в 73 из массива ничего не выбирается. (кстати, если уж отвечаете, отвечайте подробнее: из какого массива и как именно вычисляется следующее)

Вот из этого.
Прошу прощения за невнимательность, изменить не получилось.

При нажатии кнопок изменения скорости вращения (выбор из таблицы) все корректно работает. Не работает только sfeed

Неочевидные названия дефайнов, которые…нигде не используются. Тяжело читать код “берём сигнал с пина 5…”

Тут нет переполнения случайно?
Условия в строках 112,120,128 и 136 как-то через опу, мне кажется: сначала включается подача, потом ускоренная подача. Наверно лучше проверять в обратном порядке.

Я в упор не вижу, где в 73 строке нажимается кнопка и что-то выбирается из массива.

Видите ли, программа всегда работает в точности так, как ее написал программист.
Но не всегда это совпадает с тем, как он хотел ее написать.
У меня сложилось впечатление, что в строках 73, 75 и аналогичных далее Вы написали не то, что хотели.
Но что Вы хотели, я не знаю, поэтому и спрашиваю.
Давайте пока остановимся на строке 73. Напишите подробно, что Вы в ней хотели сделать.

Согласен. Спасибо что показали.

Переполнения нет, мотор вращается. Условия, вроде бы, правильные - сначала подача, потом ускоренная.

Это сокращается вот так:

Фуух! Первый и последний раз пишу код с телефона. Ну его нах!
Сначала проверяем подачу, и внутри уже смотрим ускоренную.

1 лайк

if (up == LOW && down == HIGH && feed < 9 && feedname < 9) В условии проверяется нажатие нужной кнопки и невыход за верхнюю границу массива

Увеличение переменной feed на 1 (значение step из таблицы)

Вы не находите, что кроме увеличения на 1, здесь еще что-то есть?
Что?

А вот это работает! Огромное Вам спасибо. Сейчас еще это все проанализирую, чтобы понять полностью.

На нынешнем моем уровне знаний я не вижу еще чего-то. Оно работает как мне нужно. Если Вас не затруднит, подскажите что сделано неправильно или добавлено лишнего.