как запустить 2 различных сервопривода (непрерывное вращение и обычный сервопривод) параллельно, а не один за другим?

Мне нужно управлять 2 сервоприводами параллельно, тогда как один имеет непрерывное вращение, а другой-регулярное управление позиционированием (углом) на arduino IDE. Я пытался, но это работает один за другим, а не параллельно. Как я могу это сделать, пожалуйста, предложите. Спасибо.

, 👍2

Обсуждение

Пожалуйста, опубликуйте код, который работает не так, как ожидалось, в минимальном примере. Тогда я смогу попытаться помочь., @Kerbolosh

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


3 ответа


2

Ангел двух сервомоторов должен быть одинаковым ? Если да, попробуйте сделать это при 180 градусах. Servos : Вы можете подключить сигнальный вывод сервопривода ech к определенному ШИМ-выводу Arduino, например к контакту номер " 9 " в этом примере Это просто для проверки но вы можете изменить это так как хотите

Я надеюсь, что это сработает у вас, удачи

#include <Servo.h> 

Servo myservo;

int PWMpin = 9;  // измените это значение для вашей конфигурации схемы

int a = 0;

void setup() {
  myservo.attach(9);
  myservo.write(0);  // установите сервопривод в среднюю точку
}
void loop() {
  for (int i = 0; i < 180; i++) {
   myservo.write(i);
    delay(10);
  If (i == 180) {
    analogWrite(PWMpin, a);
    }
  }
}
,

Пожалуйста, не размещайте код в виде изображения., @Python Schlange

Спасибо @Hamid 'Smith' Салехи за ваш ответ. ну, сервоприводы, которые я использую, не одинаковы, я имею в виду, что один из них имеет непрерывное вращение, а другой-регулярный, поэтому я хочу, чтобы он был похож на сервоприводы непрерывного вращения, которые должны вращаться с помощью обычного сервопривода, который должен работать параллельно между 0~180°. и они подключены к контактам 9 и 10 соответственно., @Emlinux

Единственное отличие сервомоторов-это ограничения на их вращение? Оба они работают по стандартной ШИМ ?, @Hamid 'Smith' Salehi


4

Я предлагаю один ответ

https://wokwi.com/arduino/projects/297646292038844936

Здесь мы не используем функцию задержки. Мы используем millis() Основываясь на вашем фактическом применении, вы можете управлять индивидуальным сервоприводом соответственно.

Вот моделирование Arduino: https://wokwi.com/arduino/projects/297646292038844936

/* Sweep
  by BARRAGAN <http://barraganstudio.com>
  This example code is in the public domain.

  modified 8 Nov 2013
  by Scott Fitzgerald
  http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

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

// двенадцать сервообъектов могут быть созданы на большинстве плат
unsigned long previousMillis = 0;        // будет храниться последний раз, когда светодиод 
const long interval = 15;           // интервал мигания (миллисекунды)

int pos = 0;    // переменная для хранения положения сервопривода
int pos2 = 0;    // переменная для хранения положения сервопривода

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

}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;


    myservo.write(pos);              // скажите серво перейти в позицию в переменной 'pos'
    pos = pos + 1;
    if (pos > 180) {
      pos = 0;
    }                      // ждет 15 мс, пока сервопривод достигнет нужного положения

    myservo2.write(pos2);              // скажите серво перейти в позицию в переменной 'pos'
    pos2 = pos2 + 1;
    if (pos2 > 90) {
      pos2 = 0;
    } 



  }


}
,

2

Как я знаю, нет никакого способа для одного arduino или любого другого микроконтроллера управлять контактами в одно и то же время, и это из-за природы микроконтроллеров. Когда вы должны командовать 2 выходами Микроконтроллер будет действовать следующим образом :

Команда 1 .... К контакту № 9 Команда 2 .... К контакту № 10

и, например, если ваш микроконтроллер, например arduino или другие, выполняет каждую команду за один полный такт, а ваша тактовая частота будет составлять 16 МГц, то период времени каждого цикла составляет 62,5 нано-секунды.

Таким образом, ваш микроконтроллер будет выполнять вашу команду в первом такте и выполнять вторую команду в следующем такте, Другими словами, команда 2 будет делать 62,5 нано-секунды после команды one (если каждая из этих команд занимает всего один такт), но в обычных платах arduino 16 МГц требуется гораздо больше времени для выполнения таких команд, и это был просто пример, чтобы понять ее принцип, и по этой причине я предлагаю вам подключить оба сервомотора к одному выходному ШИМ-контакту, если вы используете два стандартных сервомотора.; Но главная проблема заключается в различных угловых ограничениях ваших сервомоторов, и невозможно управлять ими, когда вы хотите, чтобы один из них вращался на 360 градусов. а другой должен вращаться на 180 градусов. . Если вы подключаете эти сигнальные контакты к одному и тому же выходу, у вас есть два варианта с двумя issuse. Во-первых, если вы прикажете выходному штифту повернуть на 360 град. , все будет хорошо , но когда ваша команда выходного штифта для углов больше 180 град., маленький сервопривод остановится. Во-вторых, если вы ограничите свое вращение до 180 градусов, Вы не сможете вращаться на 360 градусов. Твой большой сервомотор.

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

,