Запуск нескольких двигателей одновременно

У меня есть этот код для двигателя постоянного тока (используя это библиотека)

#include <Arduino.h>
#include <Vnh2sp30.h>

// ENA AB PWM CS inv
Vnh2sp30  mtrL( A0, 7,  8,  5,    A2,   0);             

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

void loop() {
  if (Serial.available() > 0)   {
    String first  = Serial.readStringUntil(',');
    Serial.read(); 
    String second = Serial.readStringUntil(','); 
    Serial.read();
    String third = Serial.readStringUntil(','); 
    Serial.read();
    String echo = Serial.readString();
    Serial.println(echo);
       if(first == "start"){
                Serial.println("Starting DC motor");
                int duration = atoi(second.c_str());
                int power = atoi(third.c_str());
                int starttime = millis();
                int endtime = starttime;
                while ((endtime - starttime) <= duration) // мс
                {
                  endtime = millis();
                  mtrL.run(1023);
                }
                mtrL.stop();
                Serial.println("DONE");
       }
   }
}

Затем у меня есть этот код для управления несколькими шаговыми двигателями (с использованием этой библиотеки) :

#include "BasicStepperDriver.h"

int incomingByte = 0;   // для входящих последовательных данных
String readString = "";

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

void loop() {
    if (Serial.available() > 0) {
    String first  = Serial.readStringUntil(','); // начинать
    Serial.read(); 
    String second = Serial.readStringUntil(','); // номер двигателя
    Serial.read();
    String third = Serial.readStringUntil(','); // шаги двигателя
    Serial.read();
    String fourth = Serial.readStringUntil(','); // продолжительность (миллисекунды)
    Serial.read();
    String fifth = Serial.readStringUntil(','); // градус
                if(first == "start") {
                  if(second == "ALL") {
                    Serial.println("Starting stepper motor ALL");
                    int steps = atoi(third.c_str());
                    int duration = atoi(fourth.c_str());
                    int deg = atoi(fifth.c_str());

                    BasicStepperDriver stepper1(steps, DIR, STEP, ENBL);
                    stepper1.enable();
                    stepper1.setMicrostep(MICROSTEPS);
                    stepper1.setRPM(MAX_RPM);

                    BasicStepperDriver stepper2(steps, DIR_2, STEP_2, ENBL_2);
                    stepper2.enable();
                    stepper2.setMicrostep(MICROSTEPS);
                    stepper2.setRPM(MAX_RPM);

                    BasicStepperDriver stepper3(steps, DIR_3, STEP_3, ENBL_3);
                    stepper3.enable();
                    stepper3.setMicrostep(MICROSTEPS);
                    stepper3.setRPM(MAX_RPM);

                    BasicStepperDriver stepper4(steps, DIR_4, STEP_4, ENBL_4);
                    stepper4.enable();
                    stepper4.setMicrostep(MICROSTEPS);
                    stepper4.setRPM(MAX_RPM);

                    int starttime = millis();
                    int endtime = starttime;
                    while ((endtime - starttime) <= duration) // мс
                    {
                      stepper1.rotate(deg);  
                      stepper2.rotate(deg);  
                      stepper3.rotate(deg);
                      stepper4.rotate(deg);
                      endtime = millis();
                    }
                    stepper1.disable();
                    stepper2.disable();
                    stepper3.disable();
                    stepper4.disable();
                    Serial.println("DONE");
                  }
                }
        }
}

Моя цель состоит в том, чтобы объединить эти два кода вместе и по-прежнему иметь возможность одновременно запускать как двигатель постоянного тока, так и один (или все) шаговые двигатели. Первый код работает на Arduino UNO, а другой код работает на плате Arduino MEGA и был проверен на работоспособность. Цель состоит в том, чтобы перенести код с Arduino UNO на плату MEGA. Управление двигателем в течение определенного времени заблокирует Arduino от запуска шаговых двигателей и наоборот с двигателем постоянного тока. Что можно сделать с этими кодами, чтобы обеспечить одновременную работу двигателя постоянного тока и шагового двигателя?

, 👍1

Обсуждение

Строка while ((endtime - starttime) < = duration) // ms — это то, что вам нужно изменить, потому что она не дает циклу выполнять другие действия во время работы двигателя, поэтому она называется блокировкой. Библиотека AccelStepper, упомянутая @Visual Micro, использует неблокирующий подход, но вам нужно изменить свой подход. Используйте некоторую переменную для определения длительности и пусть код в цикле () постоянно проверяет ее каждый раз, вместо использования цикла while. Таким образом, каждый двигатель может получить необходимое ему внимание, а не по очереди., @Kelly S. French


1 ответ


2

Используйте библиотеку AccelStepper вместе с библиотекой Adafruit MotorShield

https://learn.adafruit.com/adafruit-motor-shield -v2-for-arduino/установить-программное обеспечение

,

Моторного щита adafruit у меня нет, только китайские., @xybrek

Библиотека стандартная. Вам не нужен щит. Прочтите руководство AccelStepper, в котором объясняется, как одновременно использовать двигатели и шаговые двигатели., @Visual Micro

Будет ли он работать с аппаратным драйвером ST Vnh2sp30? Не уверен, что распиновка совпадает., @xybrek

Мне удалось скомпилировать это для подключения шагового двигателя, проблема связана с подключением к VNH2SP30 и неблокирующим., @xybrek

Я думаю, что вы установили булавки, но смысл Accel в том, чтобы не блокировать., @Visual Micro