Как считать шаги шагового двигателя с помощью 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?
@Korte Alma, 👍2
Обсуждение1 ответ
Лучший ответ:
Вы получаете эту ошибку, потому что метод 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
- Шаговый двигатель не изменяет направления движения!
- Как переключить светодиод при нажатии кнопки?
- Как я могу использовать степпер для определенной степени?
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
Зачем нужно самому контролировать каждый шаг? Вы также можете установить его на определенную скорость, а затем в цикле вызвать
stepper1.run()
, а также проверить наличие концевого выключателя. Как только концевой выключатель активируется, вы можете остановить двигатель и считать положение. Разница в положении между «до» и «после» — это количество пройденных шагов., @chrislможете ли вы привести мне пример для этого?, @Korte Alma
а также как я могу изменить направление тогда?, @Korte Alma