Необходимо сделать так, чтобы шаговый двигатель вращался на 30 полушагов до тех пор, пока метка не достигнет концевика, затем, чтобы двигатель возвращался в положение обратное и определял его по другому концевику в начале пути. #include<AccelStepper.h> #define HALFSTEP 8 // Определение пинов для управления двигателем #define motorPin1 2 // IN1 на 1-м драйвере ULN2003 #define motorPin2 3 // IN2 на 1-м драйвере ULN2003 #define motorPin3 4 // IN3 на 1-м драйвере ULN2003 #define motorPin4 5 // IN4 на 1-м драйвере ULN2003 // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4 // для использования AccelStepper с 28BYJ-48 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup(){ pinMode(13, OUTPUT); stepper1.setMaxSpeed(800.0); stepper1.setAcceleration(100.0); stepper1.setSpeed(100); stepper1.moveTo(30); } void loop(){ // Изменяем направление, если шаговик концевика if(digitalRead(13)==HIGH) { stepper1.moveTo(digitalRead(0)==HIGH); stepper1.run(); } stepper1.run(); } Это мои соображения, но они не работают. Помогите, пожалуйста.
Во-первых, код отфарматируйте автоматически и вставьте в соответствующий тег (слева от кавычек). Во-вторых, код содержит кучу ошибок и нестыковок. Например, как эти строки должны работать в паре? Код (C++): pinMode(13, OUTPUT); .... if(digitalRead(13)==HIGH) В-третьих, что вы хотели добиться этой строкой? Код (C++): stepper1.moveTo(digitalRead(0)==HIGH); Ну и так далее. Даже если считать, что библиотека работоспособная. А для начала попробуйте хотя бы задачу поставить вменяемую. Что должен делать шаговик, шагать 30 шагов или шагать пока не сработает концевик? И когда решите, тогда и попробуйте еще раз написать программу.
Код (C++): #include<AccelStepper.h> #define HALFSTEP 8 // Определение пинов для управления двигателем #define motorPin1 2 // IN1 на 1-м драйвере ULN2003 #define motorPin2 3 // IN2 на 1-м драйвере ULN2003 #define motorPin3 4 // IN3 на 1-м драйвере ULN2003 #define motorPin4 5 // IN4 на 1-м драйвере ULN2003 // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4 // для использования AccelStepper с 28BYJ-48 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup(){ pinMode(13, OUTPUT); stepper1.setMaxSpeed(800.0); stepper1.setAcceleration(100.0); stepper1.setSpeed(100); stepper1.moveTo(30); } void loop(){ // Изменяем направление, если шаговик концевика if(digitalRead(13)==HIGH) { stepper1.moveTo(digitalRead(0)==HIGH); stepper1.run(); } stepper1.run(); } Шаговик должен пройти 30 шагов, остановиться, дальше опять пройти 30 шагов и так пока не дойдет до концевика, затем вернуться в исходную точку и все повторяется.
Исходная точка - это достижение координаты 0 или срабатывание второго концевика и обнуление координаты?
Код (C++): #include<AccelStepper.h> #define HALFSTEP 8 // Определение пинов для управления двигателем #define motorPin1 2 // IN1 на 1-м драйвере ULN2003 #define motorPin2 3 // IN2 на 1-м драйвере ULN2003 #define motorPin3 4 // IN3 на 1-м драйвере ULN2003 #define motorPin4 5 // IN4 на 1-м драйвере ULN2003 AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); void setup(){ pinMode(13, OUTPUT); stepper1.setMaxSpeed(800.0); stepper1.setAcceleration(100.0); stepper1.setSpeed(100); } void loop(){ int val=0; val=val+30; stepper.runToNewPosition(val); delay(500); stepper1.moveTo(digitalRead(0)==HIGH); } Вот еще одна моя попытка, но она тоже не работает.
В точке, откуда было начато движение стоит второй концевик, к которому система возращается после срабатывания первого - это исходная точка.
Даю 146% что в данном случае имелось ввиду не это. Чувак просто хочет считать состояние концевика, но не умеет этого сделать.
Автору даю совет. Шаговик делает шаг (два, три и тп), проверяет состояние пина. Если он нажат меняем направление и крутим так же до другого концевика. В общем, меняется только направление движения и опрашиваемый концевик.
Код (C++): #include<AccelStepper.h> #define HALFSTEP 8 // Определение пинов для управления двигателем #define motorPin1 2 // IN1 на 1-м драйвере ULN2003 #define motorPin2 3 // IN2 на 1-м драйвере ULN2003 #define motorPin3 4 // IN3 на 1-м драйвере ULN2003 #define motorPin4 5 // IN4 на 1-м драйвере ULN2003 // Инициализируемся с последовательностью выводов IN1-IN3-IN2-IN4 // для использования AccelStepper с 28BYJ-48 AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); int btnPin = 13; int step=0; void setup() { pinMode(btnPin, INPUT); stepper.moveTo(30); stepper.setMaxSpeed(800.0); stepper.setAcceleration(100.0); stepper.setSpeed(100); } void loop() { if (digitalRead(btnPin)) { stepper.moveTo(-stepper.currentPosition()); } else { if (stepper.distanceToGo() == 0) {stepper.moveTo(stepper.currentPosition() - 1);} delay(800); // stepper.run(); } } Вот еще одна попытка, но не работает вообще. Помогите, пожалуйста.
Как сделать, чтобы он в одну сторону вращался по 30 шагов много раз? Он у меня один раз прокручивается и все.
Код (C++): while (digitalRead(inPin1)==LOW) { // Make the Stepper move CW until the switch is deactivated Stepper1.moveTo(val); Stepper1.run(); val=val+30; delay(5); } Насколько я помню, если в цикл while поместить переменную, постоянно увеличивающуюся, то он постоянно должен двигаться в одну сторону. Но почему-то это не работает.