Наткнулся на проблему, когда я пытаюсь одновременно перемещать два или более сервоприводов, перебирая несколько массивов. Подумайте о драм-машине, где я могу захотеть одновременно ударить по малому барабану, басу и хай-хэту на некоторых битах. Не на других.
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);
}
}