同步伺服控制

时间:2018-01-30 05:41:01

标签: arduino servo

通过一个问题磕磕绊绊,我试图在迭代多个阵列的同时移动两个或更多个伺服器。想想鼓机,我可能想要在一些节拍上同时击中小军鼓,低音和高帽。不在其他人身上。

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()而不是使用delay()来解决这个问题。

我很好奇,如果使用伺服驱动板更容易完成我要做的事情,或者毫无意识(毫米)是我唯一的途径?

更新

在修补了millis()一段时间之后,我发现自己的任务过于复杂,并且发现了足够近的&#39;通过简单的路线我想到的任务。

#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);
  }
}

1 个答案:

答案 0 :(得分:0)

  

如果使用伺服驱动板更容易,我很好奇   完成我要做的事情,或者millis()是我唯一的途径?

Millis()会奏效。我没有伺服驱动板,所以我不能说它,但我认为这不会有助于同时运行伺服系统。

这是使用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);
      }
   }
}