Как считать шаги шагового двигателя с помощью AccelStepper?

Я хочу включить двигатель и подсчитать, сколько всего оборотов он сделает, пока не включится концевой выключатель. После этого я хочу считать раунды против часовой стрелки, пока не будет нажат другой концевой выключатель. Для этого я использую AccelStepper и библиотеку ezButton.

Вот мой код:

      if ((limitSwitch_XV.getState() == LOW) && (limitSwitch_XE.getState() == LOW) && rightDirectionX) {
        while (1) {
          stepper1.step(-1);
          stageSizeX++;
        }
      }

Но здесь у меня есть ошибка, которая говорит, что я не могу использовать int в step(): 'virtual void AccelStepper::step( long int)' защищен в этом контексте stepper1.step(1);

Итак, как я могу считать шаги и двигаться шаг за шагом в заданном направлении, пока не дойду до концевого выключателя с помощью AccelStepper?

, 👍2

Обсуждение

Зачем нужно самому контролировать каждый шаг? Вы также можете установить его на определенную скорость, а затем в цикле вызвать stepper1.run(), а также проверить наличие концевого выключателя. Как только концевой выключатель активируется, вы можете остановить двигатель и считать положение. Разница в положении между «до» и «после» — это количество пройденных шагов., @chrisl

можете ли вы привести мне пример для этого?, @Korte Alma

а также как я могу изменить направление тогда?, @Korte Alma


1 ответ


Лучший ответ:

0

Вы получаете эту ошибку, потому что метод step() защищен в классе AccelStepper. Он не предназначен для вызова пользователем. Вместо этого AccelStepper хочет, чтобы вы указали, какое движение вы хотите (перемещение на определенное расстояние/в определенную точку/с определенной скоростью), а затем часто вызывали метод AccelStepper.run() (или AccelStepper.runSpeed()), который затем выполнит шаги, когда придет время, исходя из вашего запланированного движения.


Если вы хотите решить свою проблему, у вас есть два основных способа сделать это:

  • С AccelStepper: настройте шаговый двигатель на работу с определенной скоростью в правильном направлении, затем в цикле вызовите stepper1.runSpped() и проверьте свой концевой выключатель с помощью digitalRead( ). Итак, что-то вроде:

      stepper1.setCurrentPosition(0);
      stepper1.setSpeed(20); // Измените скорость в соответствии с вашими потребностями, отрицательные значения позволяют двигателю вращаться в другом направлении
      while(limitSwitch_XV.getState() == HIGH){ // Предположим, что концевой выключатель не нажат, когда HIGH
          stepper1.runSpeed();
      }
      int revolutions = stepper1.currentPosition() / steps_per_revolution;
    
  • или без AccelStepper: в зависимости от вашего драйвера шагового двигателя вы можете использовать менее сложную библиотеку шагового двигателя (например, библиотеку ардуино Stepper) или просто управлять шаговым двигателем напрямую с помощью digitalWrite() вызовы (на контакт Dir и на контакт Pulse). В этом случае вы можете сделать каждый шаг самостоятельно, после каждой проверки концевого выключателя с помощью digitalRead(). Что-то в этом роде (я предполагаю, что шаговый драйвер с контактом dir и импульсным контактом, а не с несколькими фазовыми контактами):

      digitalWrite(dir_pin, direction); // укажите здесь HIGH или LOW в зависимости от желаемого направления
      int pos = 0;
      while(limitSwitch_XV.getState() == HIGH){
          digitalWrite(pulse_pin, HIGH);
          delayMicroseconds(10);
          digitalWrite(pulse_pin, LOW);
          pos++;
          delayMicroseconds(50); // Изменить это значение в соответствии с желаемой скоростью
      }
      int revolutions = pos / steps_per_revolution;
    

Обратите внимание, что оба фрагмента кода полностью не протестированы, и вам нужно самостоятельно создать окружающий код. Они только подчеркивают принцип.

,

Что здесь steps_per_revolution?, @Korte Alma

Вы хотели знать количество оборотов, пока не нажмете концевой выключатель. Для преобразования пройденных шагов в количество оборотов вам нужно количество шагов на оборот. Это значение зависит от конфигурации вашего двигателя и драйвера., @chrisl