首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步伺服控制

同步伺服控制
EN

Stack Overflow用户
提问于 2018-01-30 05:41:00
回答 1查看 627关注 0票数 0

在迭代多个数组时,我试图同时移动两个或多个伺服系统,这让我步履蹒跚。想想一台鼓机,在那里,我可能想同时敲击一个圈套,低音和高帽,在一些节拍上。而不是对其他人。

代码语言:javascript
复制
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()是我的唯一途径?

更新

在对millis()进行了一段时间的修改后,我发现自己把任务搞得太复杂了,并且通过走一条更简单的路线,找到了一个“足够接近”的任务。

代码语言:javascript
复制
#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);
  }
}
EN

回答 1

Stack Overflow用户

发布于 2018-01-30 07:45:44

所以,我很好奇,使用伺服驱动板是否更容易完成我要做的事情,还是millis()是我的唯一途径?

米利斯会起作用的。我没有伺服驱动板,所以我不能说,但我不认为这将有助于运行伺服系统同时。

下面是使用millis()的代码。我只是根据你的例子写的。

代码语言:javascript
复制
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);
      }
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48514595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档