bbz

arduinoで圧電スピーカーを複数同時に鳴らす

_
previous | next
1: Wed Dec 18 05:21:29 2019
toneという関数があって、これを使うと指定したピンに接続した圧電スピーカーで任意の周波数の音を出せる。

https://www.arduino.cc/reference/jp/language/functions/advanced-io/tone/


これを複数のピンに対して同時に実行したら和音が出せるのではないかと考えたが、
残念ながらtone関数は複数の音を同時には出せない。
2: Wed Dec 18 05:29:06 2019
検索してみると、tone関数ではなくdigitalwriteを使い、和音を出す方法がソースまで含めて公開されていたのだが、複雑すぎて理解できない。

が、やっぱりこれを理解するしかないので、後でじっくり見てみようとは思う。


3: Wed Dec 18 05:51:57 2019
そもそもdegitalwriteとはどんなものか。

https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

指定できるのはpinとvalueのみで、valueはHIGHかLOWのみである。
つまりどこかのピンをon/offするだけのものだ。

LEDを点灯・消灯したりする例がよく紹介されている。

しかし、圧電スピーカーに対して高速にon/offを繰り返すと音として聴こえる。



4: Wed Dec 18 05:54:31 2019
LEDをon/offするときに使ったスケッチを圧電スピーカーを使って実行すると、
プチ、プチ、という音しか聞こえない。

これは1秒とかの間隔でon/offしている。



/*
Blink
*/

int led = 13;

// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(led, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
5: Wed Dec 18 05:58:42 2019
以下のようにdelayMicrosecondsを使い
high/lowを繰り返す間隔を短くすると、

ピー という音として聴こえる。


int interval = 1000;

void setup() {
pinMode(13, OUTPUT);
}

void loop(){
digitalWrite(13,HIGH);
delayMicroseconds(interval);
digitalWrite(13,LOW);
delayMicroseconds(interval);
}
6: Wed Dec 18 06:21:38 2019
degitalwriteは複数のpinに対して実行できる。
以下のようにすれば、12,13のpinに接続したLEDを交互に点灯できる。

同時に点灯・消灯することもできる。


void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
delay(1000);
}
7: Wed Dec 18 06:26:18 2019
圧電スピーカーの場合も同様なのだが、
圧電スピーカーはon,offがある間隔で繰り返されて初めて音として成立するので、
LEDのように単純に制御できない。
8: Wed Dec 18 06:27:53 2019
loopを二つ作って独立に動かすような方法が必要である。

同じloop内で二つのpinに対してon/offをするのでは、
それぞれの間隔を個別に設定できない。
9: Wed Dec 18 06:35:55 2019
そんなことを考えていたら、
そもそもコンピューターのマルチタスクというのは疑似的なものだった、ということを思い出した。
CPUはひとつしかないが、短時間に複数のタスクを切り替えて実行していくことにより、
並行に処理されているように見える、ということだった。

今はCPUが複数コアを持つのが当たり前になって、
疑似的にではなく本当に並列処理するようになった。

しかし、各コア内では、いまだに疑似マルチタスクが行われている(よね?)。
10: Wed Dec 18 06:58:17 2019
和音を鳴らしたければほかにいくらでも方法があるのはわかっている。

ただ、チープな材料でチープな方法でこんなこともできる、ということなのだ。


でも、今は、arduinoを3つ用意してそれぞれにブザーをつなげて、
tone関数を使って和音を出すのでもいいかな、と思えてきた。

というかラズベリーパイが3、4台あるからそれを使えばいい...

でも複数ある場合同期をとる必要がある...

でも和音を出すだけなら同期をとるほどのこともない....
11: Wed Dec 18 07:22:58 2019
とりあえず以下のようにして、
二つのスピーカーから違う音が出せた。

狙った音をだせていないので、きれいな和音にはなっていないが、
あとはインターバルをチューニングすれば和音になるはず。


int c1 = 0;
int c2 = 0;

int i1 = 600;
int i2 = 100;

void setup() {
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() {
if (c1>i1) {
digitalWrite(12, LOW);
c1=0;
}else{
digitalWrite(12, HIGH);
}
if (c2>i2) {
digitalWrite(13, LOW);
c2=0;
}else{
digitalWrite(13, HIGH);
}

delayMicroseconds(5);
c1++;
c2++;
}
12: Thu Dec 19 08:02:16 2019
スケッチサンプルに、3つのスピーカーを鳴らす例があった。

やってみると3つを順番にならしていた。

こうじゃないんだけど、と思ったが、

高速にならせばほぼ和音になるかな。

あとでやってみよう。


^
previous | next



log