Одновременное сервоуправление

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

byte bass[] = {1,0,1,0};
byte snare[] = {1,1,0,0};
byte hihat[] = {1,1,0,0};
for (int i = 0; i < sizeof(snare); i++)
{
   if (i == 1)
   {
      snare.write(45);
      delay(250);
      snare.write(0);
      dleay(250);
   }
   else if
   {
      snare.write(0);
      delay(500);
   }
}

И так для каждого массива, каждого инструмента.

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

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

Хотя мне любопытно, будет ли проще использовать плату сервопривода для выполнения того, что я собираюсь сделать, или это единственный путь для меня?

Обновить

Поработав какое-то время с millis(), я обнаружил, что слишком усложняю задачу и нашел «достаточно близкое» решение задачи, которую я имел в виду, пойдя по более простому пути.

#include <Servo.h>

Servo s1;
Servo s2;
Servo s3;
Servo s4;

byte bass[] = {45,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,45,0,45,0,0,0,0,0,0,0,0,0,45,0,0,0};
byte snare[] = {0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0};
byte hihat[] = {45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0};
byte cymb[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0};


void setup() {
  Serial.begin(9600);
  s1.attach(6);
  s2.attach(5);
  s3.attach(4);
  s4.attach(3);

  s1.write(0);
  s2.write(0);
  s3.write(0);
  s4.write(0);

}


void loop()
{
  drummer();
}


void drummer()
{
  for (int i = 0; i < sizeof(bass); i++)
  {
    s1.write(bass[i]);
    s2.write(snare[i]);
    s3.write(hihat[i]);
    s4.write(cymb[i]);
    delay(250);
  }
}

person user1764417    schedule 30.01.2018    source источник


Ответы (1)


Хотя мне любопытно, будет ли проще использовать плату сервопривода для выполнения того, что я собираюсь сделать, или это единственный путь для меня?

Миллис() будет работать. У меня нет платы сервопривода, поэтому я не могу сказать об этом, но я не думаю, что это поможет в одновременной работе сервоприводов.

Вот код, использующий millis(). Я просто написал это на основе вашего примера.

byte bass[] = {1,0,1,0};
byte snare[] = {1,1,0,0};
byte hihat[] = {1,1,0,0};
usigned long currentMillis = 0;
unsigned long previousMillis = 0;
const long interval = 250; 
const long longInterval = 500;

for (int i = 0; i < sizeof(snare); i++)
{
   if (i == 1)
   {
      snare.write(45);
      currentMillis = millis();
      if (currentMillis - previousMillis >= interval){
          snare.write(0);
      }
   }
   else if
   {
      if (currentMillis - previousMillis >= longInterval){
          snare.write(0);
      }
   }
}
person Hey24sheep    schedule 30.01.2018