Запуск нескольких двигателей одновременно
У меня есть этот код для двигателя постоянного тока (используя это библиотека)
#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 от запуска шаговых двигателей и наоборот с двигателем постоянного тока. Что можно сделать с этими кодами, чтобы обеспечить одновременную работу двигателя постоянного тока и шагового двигателя?
@xybrek, 👍1
Обсуждение1 ответ
Используйте библиотеку 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
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Почему Arduino сбрасывается во время управления двигателями?
- Переменная скорость разгона для двигателей, управляемых джойстиком
- Как заставить двигатели постоянного тока работать одновременно?
- Нужна помощь в создании кода, который перемещает двигатель постоянного тока CW или CCW с помощью двух разных кнопок
- Прерывание запуска двигателей
Строка
while ((endtime - starttime) < = duration) // ms
— это то, что вам нужно изменить, потому что она не дает циклу выполнять другие действия во время работы двигателя, поэтому она называется блокировкой. Библиотека AccelStepper, упомянутая @Visual Micro, использует неблокирующий подход, но вам нужно изменить свой подход. Используйте некоторую переменную для определения длительности и пусть код в цикле () постоянно проверяет ее каждый раз, вместо использования цикла while. Таким образом, каждый двигатель может получить необходимое ему внимание, а не по очереди., @Kelly S. French