Управление ШД

Иван_N
Offline
Зарегистрирован: 20.12.2017

Доброго времени суток!

Прошу вашей помощи!

Вопрос стоит так: надо управлять ШД: 200 шагов в одну сторону, 200 шагов в другую, таких повторений нужно 2. Как использовать цикл for.

Написал код, двигатель делает шаги вперед и назад в бесконечном цикле.

#include <Stepper.h>
const int stepsPerRevolution = 256;
Stepper myStepper(stepsPerRevolution, 2, 4, 3, 5);
 
void setup() 
{
  myStepper.setSpeed(100);
  Serial.begin(9600);
  }
void loop() 
{
 
for (int i=0; i <= 2; i++)
 
{
   myStepper.step(stepsPerRevolution * 1);
  delay(20);
  myStepper.step(-stepsPerRevolution * 1);
  delay(20);
 
}
 
 
}
 
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Вы бы, что ли, с гугл транслэйтом почитали комменты в примерах к библе Stepper и выяснили, что такое stepsPerRevolution...
А это ничто иное, как количество шагов на полный оборот конкретного шаговика. К примеру, у меня есть ШД, на котором указан паратмер 2 градуса на шаг. Итого получаем 180 шагов на оборот. Что и указываем в stepsPerRevolution.
Что бы сделать полный  оборот вызываем myStepper.step(stepsPerRevolution). Что бы сделать один шаг - myStepper.step(1)
Цикл Вам не нужен - заведите переменную-счётчик и в лупе проверяйте, сколько раз выполнили действие.
 

static byte count = 0;
if (count < 2) {
     myStepper.step(200);
     delay(20);
     myStepper.step(-200);
     delay(20);
     count ++;
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

После for напишы 

while(true);

и все.

vk007
Offline
Зарегистрирован: 16.06.2015

Ну а как вы хотели? Цикл loop бесконечный сам по себе по определению, вот он и молотит все, что в нем, пока питание не выключить.

Перенесите то, что сейчас у него внутри в setup и оно выполнится только один раз (до перезагрузки контроллера).

И условие подкорректируйте. Сейчас цикл for будет выполняться 3 раза, а не 2, как вы хотите.

Иван_N
Offline
Зарегистрирован: 20.12.2017

меня интересует 100 циклов, а тут написал для примера (код скопировал с компилятора). как будет выглядеть вобщем.

vk007
Offline
Зарегистрирован: 16.06.2015

Иван_N пишет:

таких повторений нужно 2

Иван_N пишет:

меня интересует 100 циклов

Не знаю, как других, а меня просто умиляют такие вопрошающие. Сначала вы сказали одно, потом другое. Так может вам и не шаговиком вовсе управлять надо, а проморгать светодиодом?

Иван_N
Offline
Зарегистрирован: 20.12.2017

Спасибо за помощь откликнувшихся. Я привел пример по которому уже будет строиться весь проект, для понимания. Нет смысла тут описывать весь цикл.

Иван_N
Offline
Зарегистрирован: 20.12.2017
Вот чего я добивался. Все работает. Спасибо!
 
 
 
#include <Stepper.h> 
const int stepsPerRevolutionP = 256; 
Stepper myStepperP(stepsPerRevolutionP, 2, 4, 3, 5);   //двигатель паяльника
 
const int stepsPerRevolutionY = 256; 
Stepper myStepperY(stepsPerRevolutionY, 8, 10, 9, 11);   //двигатель стола по Y
 
const int stepsPerRevolutionX = 256; 
Stepper myStepperX(stepsPerRevolutionX, 14, 15, 16, 17);  //двигатель стола по Х
 
 
void setup() 
myStepperP.setSpeed(135); 
Serial.begin(9600);
 
myStepperY.setSpeed(135); 
Serial.begin(9600);
 
myStepperX.setSpeed(135); 
Serial.begin(9600);   
pinMode(6, INPUT);    //пуск программы
pinMode(7, INPUT);   //шаговый режим стола Y +
pinMode(22, INPUT);  //шаговый режим стола Y -
pinMode(23, INPUT);  //шаговый режим стола Х+
pinMode(24, INPUT);  //шаговый режим стола Х -
pinMode(25, INPUT);  //паяльники вниз
pinMode(26, INPUT);  //паяльники вверх
void loop(){ 
  
  if(digitalRead(6) == true){
    for (int i=0; i <= 9; i++)                    //цикл 70 шагов
    {
 for (int i=0; i <= 6; i++) {                    //подцикл на 7 шагов
 
  myStepperP.step(stepsPerRevolutionP * 2); 
  delay(20); 
  myStepperP.step(-stepsPerRevolutionP * 2); 
  delay(20); 
  myStepperY.step(stepsPerRevolutionY * 1); 
  delay(20);
 } 
  myStepperY.step(stepsPerRevolutionY * 4); 
  delay(20);
  }
}
if(digitalRead(7) == true){
  myStepperY.step(stepsPerRevolutionY * 1); 
  delay(800);
}
if(digitalRead(22) == true){
  myStepperY.step(-stepsPerRevolutionY * 1); 
  delay(800);
}  
if(digitalRead(23) == true){
  myStepperX.step(stepsPerRevolutionX * 1); 
  delay(800);
}  
if(digitalRead(24) == true){
  myStepperX.step(-stepsPerRevolutionX * 1); 
  delay(800);
if(digitalRead(25) == true){
  myStepperP.step(stepsPerRevolutionP * 1); 
  delay(800);
}   
if(digitalRead(26) == true){
  myStepperP.step(-stepsPerRevolutionP * 1); 
  delay(800);
}  
}
 
b707
Offline
Зарегистрирован: 26.05.2017

Иван, вы прочитали, что вам написали в сообщении №1 ? Оператор myStepperP.step(stepsPerRevolutionP * 2); сделает не 2 шага, а 512. вас это не смущает? или вы говорили "шаги", а на самом деле имели в виду обороты?

И что за бредовая запись stepsPerRevolutionP * 1 в последних шести блоках? Зачем на единицу умножать, что вы этим хотели сказать миру? :)

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Иван_N
Offline
Зарегистрирован: 20.12.2017

Повторюсь, что меня интересовало как в общем виде будет выглядеть данный цикл, а какие конкретно уставки для процесса - это уже будут подгоняться на месте у станка. Тема закрыта. Всем спасибо за помощь!