在迭代多个数组时,我试图同时移动两个或多个伺服系统,这让我步履蹒跚。想想一台鼓机,在那里,我可能想同时敲击一个圈套,低音和高帽,在一些节拍上。而不是对其他人。
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()进行了一段时间的修改后,我发现自己把任务搞得太复杂了,并且通过走一条更简单的路线,找到了一个“足够接近”的任务。
#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);
}
}发布于 2018-01-30 07:45:44
所以,我很好奇,使用伺服驱动板是否更容易完成我要做的事情,还是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);
}
}
}https://stackoverflow.com/questions/48514595
复制相似问题