Accelstepper - как переключиться с полного шага на полушаг в цикле?
Я использую библиотеку Accelstepper
для управления униполярным шаговым двигателем. В моем проекте я хотел бы запустить степпер в полношаговом режиме, когда мне нужна скорость, и в полушаговом режиме, когда мне нужна точность. Как вы знаете, выделение полного шага/полушага делается в самом начале скетча...
Я нашел обходной путь, создав два экземпляра Accelstepper
для одного и того же шагового двигателя. То есть:
Accelstepper fast(FULL4WIRE, 2,3,4,5);
Accelstepper slow(HALF4WIRE, 2,3,4,5);
При этом, когда я вызываю (пропуская другие детали кода) fast.run()
, двигатель движется быстро (полный шаг), а когда я вызываю slow.run()
он движется медленно, так как находится в полушаговом режиме.
Но;
Когда дело доходит до определения текущего положения двигателя, этот обходной путь не работает, поскольку две функции возвращают два разных значения: fast.currentPosition()
и sl ow.currentPosition( )
. Таким образом, этот обходной путь становится бесполезным.
Мой первый вопрос: есть ли способ в Accelstepper
переключаться с полного шага на полушаг и наоборот при выполнении (скажем, в цикле)? Если да, то второй вопрос можно пропустить.
Вторая функция: XX.currentPosition()
возвращает значение переменной, а именно "_currentPos", которое вычисляется в файле Accelstepper.cpp
. Насколько я понимаю, значений _currentPos
становится столько же, сколько экземпляров Accelstepper
. В моем случае один для быстрых, а другой для медленных, и как-то они хранятся и рассчитываются по отдельности без какой-либо путаницы. Есть ли способ получить доступ (внешний?) и установить эту переменную из скетча, ссылаясь на конкретный экземпляр Accelstepper
? Вкратце, есть ли способ скопировать одну позицию двигателя в другую?
Большое спасибо.
@Nkgunel, 👍0
1 ответ
В документации упоминается функция setCurrentPosition()
.
void AccelStepper::setCurrentPosition ( long position )
Сбрасывает текущее положение мотора, чтобы везде, где мотор быть прямо сейчас считается новой нулевой позицией. Полезно для установка нулевой позиции на степпере после начального аппаратного позиционный ход. Имеет побочный эффект установки текущего двигателя скорость до 0.
Параметры
position Положение в шагах, где сейчас находится двигатель.
Используйте функцию currentPosition()
, чтобы получить текущую позицию из любого режима. Вам нужно будет решить, хотите ли вы, чтобы «быстрые» или «медленные» шаги были фактическим подсчетом, и когда вы переключаетесь с одного контекста на другой, захватите текущую позицию последнего использованного режима и установите новую позицию в режим, который вы будете использовать дальше, возможно, умножив или разделив на 2 по мере необходимости.
- контент» не захватывается
- Получение имени перечисления из экземпляра перечисления
- Объявленная переменная внутри void setup не видится в void loop
- Преимущества глобальных переменных перед статическими членами класса?
- Изменить/объявить константу в setup и использовать ее в цикле loop
- Как улучшить этот Код? (или как передать строку Char в функцию, чтобы она вела себя как переменная)
- Переменная устанавливает значение 32767 — MATLAB Arduino
- C++ против языка Arduino?
Хосе, спасибо за ответ. Но это не решает проблему. Учтите, что двигатель находится в нуле, когда он перемещается на 100 шагов с помощью fast.run(), а затем он перемещается на 50 шагов с помощью slow.run()... В этом случае fast.currentPosition() возвращает 100, а slow.currentPosition( ) возвращает 50, но на самом деле мотор находится в положении 150! Заметьте, мотор всего один, хотя заявлено 2 раза. Сбрасывая позицию с помощью setCurrentPosition, вы теряете начальную точку. Если вы имеете в виду, что я должен записывать движения и пересчитывать их в своем эскизе, это становится слишком сложным, поскольку движения зависят от многих подфункций., @Nkgunel
Извините, я не был более ясным. Также используйте функцию
currentPosition()
. Вам нужно будет решить, хотите ли вы, чтобы «быстрые» или «медленные» шаги были фактическим подсчетом, и когда вы переключаетесь с одного контекста на другой, захватите текущую позицию последнего использованного режима и установите новую позицию в режим, который вы будете использовать дальше, возможно, умножив или разделив на 2 по мере необходимости., @jose can u cЯ думал, что функция setCurrentPosition() предназначена только для установки текущего положения двигателя на «0». Однако можно установить любую текущую позицию. Таким образом, с помощью этой информации стало возможным копировать/добавлять одно положение двигателя к другому, просто учитывая размеры шага., @Nkgunel