Как одновременно вращать два или более шаговых двигателя, задавая МАССИВ углов?

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

int pulse=3;

int direc=4;

int pulse1=5;

int direc1=6;

int i,j,k;

float angle[5][3]={{360,360,3},{7,8,9},{11,12,13},{14,15,16},{17,18,19}};

float steps;

void motor1(){

  for(k = 0; k<=4; k++){

    Serial.println(angle[k][0]);

    steps = (1600*angle[k][0])/360;

    Serial.println(steps);

    for(j = 0; j<=steps;j++){

      digitalWrite(3,HIGH);

      delayMicroseconds(100);

      digitalWrite(3,LOW);

      delayMicroseconds(100);
        }

}

}

void motor2(){

  for(k = 0; k<=4; k++){

    Serial.println(angle[k][1]);

    steps = (1600*angle[k][1])/360;

    Serial.println(steps);

    for(j = 0; j<=steps;j++){

      digitalWrite(5,HIGH);

      delayMicroseconds(100);

      digitalWrite(5,LOW);

      delayMicroseconds(100);

        }

}

}

void setup() {
  Serial.begin(9600);

  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);    
}

void loop(){
    motor1();

    motor2();

   //пока(1);
}

, 👍0

Обсуждение

Привет и добро пожаловать. Ваш вопрос требует более подробной информации и может быть закрыт. Пожалуйста, прочитайте [спросите] и [Как задать хороший вопрос для Arduino Stack Exchange](https://arduino.meta.stackexchange.com/q/2523/19409), @sa_leinad

Итак, вы выводите шаги для мониторинга, но как вы управляете своими шаговыми двигателями? какие контроллеры вы используете? какая у тебя схема?, @Martynas


2 ответа


0

Я не совсем понимаю, чего вы хотите, но, может быть, вы хотите управлять двумя сервоприводами одновременно. Для этого после того, как вы определите угол сервоприводов, вы можете управлять ими без задержки между их командами.

Как вы использовали выше, вы не можете управлять ими одновременно, есть циклы, и они должны быть завершены до запуска следующей инструкции, чтобы ваши сервоприводы ждали друг друга.

Вот вам хороший пример кода:

#include <Servo.h>

Servo myservo1;  // создаем сервообъект для управления сервоприводом
Servo myservo2;  // создаем сервообъект для управления сервоприводом

float angle[5][3]={{360,360,3},{7,8,9},{11,12,13},{14,15,16},{17,18,19}};

void setup() {
  myservo1.attach(9);  // присоединяем сервопривод к контакту 9 к объекту сервопривода
  myservo2.attach(10);  // подключаем сервопривод на выводе 10 к объекту сервопривода
}

void loop() {
  for(k = 0; k<=4; k++){
    pos = (1600*angle[k][0])/360; //Рассчитать угол, который вы хотите

    //Самая важная часть, между ними не должно быть задержки
    myservo1.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    myservo2.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'

    delay(1000);                       // ждем 1000 мс, пока сервопривод не достигнет позиции
  }
}
,

Спасибо, сэр, за ваш ответ, но я хочу повернуть двигатель 1 для этого цикла. pos = (1600*угол[k][0])/360; и двигатель 2 для этого контура pos = (1600*angle[k][1])/360;, @Akshay Dalvi

Затем добавьте pos2= (1600*angle[k][1])/360 ниже pos = (1600*angle[k][0])/360. И измените команду myservo2 на myservo2.write(pos2). Таким образом, ваш первый двигатель вращается на x градусов, а второй двигатель вращается на y градусов без какой-либо задержки., @Faruk ÜNAL


4

(Пол года назад, но какого черта...)

Ваши motor1() и motor2() в настоящее время записываются как:

do until done:
  take a step
  wait
end

так что да, одно заканчивается до того, как начнется следующее.

Каждая двигательная функция должна выполнять:

if motor's current-position is not the final position,
   if it is time to take a step,
      take a step
      calc when to take another step
      calc motor's new current-position
   end
end

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

Это неблокирующее программирование — программирование таким образом, что ничто не контролирует ситуацию, ожидая, пока что-то произойдет (в данном случае тикают часы), оно просто что-то делает или ничего не делает, прямо сейчас, если есть или нет что-то сделать прямо сейчас, но освобождает процессор (функция возвращается немедленно), независимо от того, сделал он что-то или нет.

Я называю эти функции "возможно-сделать":

  • возможно включить двигатель (если и только если прошел определенный интервал, включить двигатель);

  • возможно, зажечь светодиод (если и только если кнопка нажата, а она не была нажата в последний раз, когда мы смотрели, включить светодиод;

  • может быть, прочитать клавиатуру терминала (если в буфере последовательного ввода есть хотя бы один символ, собрать символ).

Тогда ваша функция loop() должна ничего не делать, кроме как последовательно вызывать все возможные функции, как можно быстрее. И из вышесказанного следует, что ваши функции типа «может быть» должны выполняться как можно быстрее и делать не больше, чем необходимо для (1) принятия решения о том, следует ли действовать, и если да, то (2) выполнения своего действия, и ( 3) в любом случае немедленно вернуться.


И — Бах-бум! - тут же есть полусеместровый курс по безблочному программированию без прерываний!

,

Это ценный справочный ответ, который может быть полезен для очень многих вопросов., @Edgar Bonet