Двигать шаговый двигатель вперед и назад
Итак, я пытаюсь переместить шаговый двигатель на половину оборота (1024 шага), и как только это будет завершено, заставьте его двигаться вперед и назад примерно на 100 шагов в любом направлении.
Однако у меня возникли некоторые проблемы с этим, потому что, хотя он будет двигаться в одном направлении, он не будет двигаться в другом.
void setup()
{
stepper1.setMaxSpeed(1000);
stepper1.moveTo(1024);
stepper1.setAcceleration(100);
Serial.begin(19200);
while(!Serial);
}
void loop()
{
stepper1.run();
static int ctr = 0; //значение счетчика для хранения того, сколько раз происходило движение вперед и назад
if(stepper1.currentPosition() == 1024){
backMotion(stepper1.currentPosition());
forthMotion(stepper1.currentPosition());
ctr++;
}
// if(stepper1.currentPosition() == 824 && ctr > 0 && ctr < 30){
// forthMotion(stepper1.currentPosition());
// }
}
void backMotion(int value){
int current = value;
int back_distance = current - 200; //расстояние для перемещения назад
stepper1.moveTo(back_distance);
}
void forthMotion(int value) {
int current = value;
int forth_distance = current+200;
stepper1.moveTo(forth_distance);
}
Поэтому, когда я вызываю функцию forthMotion сразу после функции backMotion, она будет просто двигаться вперед. Что для меня не имеет никакого смысла. Разве это не должно двигаться назад, а затем вперед в бесконечном цикле? Потому что он достигнет 1024, вернется к 824, снова достигнет 1024 и так далее, и так далее...
Кроме того, когда я вызываю функцию обратного перемещения, разве код Arduino не должен блокироваться в этом, больше ничего не выполняется во время работы?
Изменить: Код, похоже, работает, когда я раскомментирую оператор if в функции цикла.
@Zaid Humayun, 👍2
Обсуждение2 ответа
Степперы обычно не имеют обратной связи о своем положении (в отличие от сервоприводов). Обычно вы просто указываете шаговому движку, сколько и как быстро вращаться. В отличие от сервоприводов, которым вы указываете, в какое положение поворачиваться.
Вы уверены, что используете степпер?
Ничто в опубликованном вопросе не подтверждает вашу теорию., @Chris Stratton
Думаю, решение может быть таким:
в обратном движении
void backMotion(){
int back_distance = - 200; //расстояние, на которое нужно вернуться
stepper1.moveTo(back_distance);
}
В движении вперед
void forthMotion() {
int forth_distance = 200;
stepper1.moveTo(forth_distance);
}
В цикле
void loop()
{
stepper1.run();
static int ctr = 0; // значение счетчика для хранения того, сколько раз произошло движение вперед и назад
stepper1.moveTo(1024);
while(ctr < 30){
backMotion();
delay(500);
forthMotion();
delay(500);
ctr++;
}
// if(stepper1.currentPosition() == 824 && ctr > 0 && ctr < 30){
// forwardMotion(stepper1.currentPosition());
// }
}
Ваш основной код будет таким
void setup()
{
stepper1.setMaxSpeed(1000);
stepper1.moveTo(1024);
delay(3000); // ждем пока степпер доберется до места назначения
stepper1.setAcceleration(100);
Serial.begin(19200);
while(!Serial);
}
void loop()
{
stepper1.run();
static int ctr = 0; // значение счетчика для хранения того, сколько раз произошло движение вперед и назад
while(ctr < 30){
backMotion();
delay(500);
forthMotion();
delay(500);
ctr++;
}
// if(stepper1.currentPosition() == 824 && ctr > 0 && ctr < 30){
// forwardMotion(stepper1.currentPosition());
// }
}
void backMotion(){
int back_distance = - 200; //расстояние, на которое нужно вернуться
stepper1.moveTo(back_distance);
}
void forthMotion() {
int forth_distance = 200;
stepper1.moveTo(forth_distance);
}
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Запустить два степпера одновременно
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Питание двух шаговых двигателей с драйверами A4988
- Управление функцией включения на драйвере микрошагового устройства
- Шаговый двигатель с датчиком HCSR-04
- Шаговый двигатель не работает с платой A4988
- Nema 17, Arduino Uno и шаговый двигатель ~2H42B
Пожалуйста, отредактируйте свой вопрос, чтобы включить [Минимальный, полный и проверяемый пример](http://stackoverflow.com/help/mcve) кода, а не только фрагментов. Ваш текущий фрагмент не показывает, какие библиотеки вы используете или как вы объявили и инициализировали объект "stepper1". В любом случае, пожалуйста, отредактируйте свой вопрос, чтобы включить эту информацию через MCVE., @James Waldby - jwpat7
Похоже, вам не хватает нескольких " stepper1.runSpeedToPosition();`, @Mikael Patel
@MikaelPatel - зачем мне нужна функция runSpeedToPosition?, @Zaid Humayun
В руководстве говорится: "Работает с выбранной в данный момент скоростью до тех пор, пока не будет достигнута целевая позиция". Возможно, вы захотите дать шаговому устройству некоторое время для завершения операции. http://www.airspayce.com/mikem/arduino/AccelStepper/MultiStepper_8pde-example.html, @Mikael Patel
Вам также необходимо определить, что такое "шаг 1" в вашей области., @Isaac Turner