圧電スピーカーとは
パッシブスピーカーとも呼ぶらしいですが、電流を流すことで金属板を振動させ、音を鳴らすスピーカーのことです。
一般的なスピーカーと同じ原理で動いているはずなので、十分な出力が得られればスピーカーに接続することもできますし、TRS端子、もしくはTS端子を挟んで、イヤホンへの出力もできるはずです。(未検証)
Arduinoを使った圧電スピーカーへの出力
Arduinoで圧電スピーカーへ出力する場合は、tone関数という関数が用意されています。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2484
周波数を指定する必要があるのですが、こちらもArduinoの公式サイトで、どの周波数がどの音階に対応しているかの定義表を用意してくれてます。
https://www.arduino.cc/en/Tutorial/ToneMelody?from=Tutorial.Tone
タクトスイッチを使ってドレミの入力状態を得る
今回は「ド、レ、ミ、ファ、ソ、ラ、シ、ド」の8個の音を拾うので、8個のタクトスイッチを用意しました。
それに対応して、ProMicro側でも8本のGPIOをプルアップ抵抗の入力モードにしています。
また、スピーカー出力用に1本をOUTPUTに設定しています。
配線イメージ
大分煩雑になってきました。
ドレミから順番に2,3,4,5,6,7,8,9のピンから順番にタクトスイッチへつないでいます。
もう片方はGNDに接続しています。
スピーカーは15番のピンから圧電スピーカーへつないでいて、GNDとスピーカーの間に1kΩの提供を挟んでいます。
ソースコード
特に凝ったことはやらずに押されたボタンのtone関数を叩くようにしています。
同時に押された場合でも対応できるようにしていますが、そういう用途には向いてないようで、汚い和音が再生されます。
そういうのをやりたかったら、YMZ294などを使って再生するのが一般的みたいですね。(またチャレンジしてみたいです)
# include <Arduino.h>
# define SPEAKER 15
# define BUTTON_1 2
# define BUTTON_2 3
# define BUTTON_3 4
# define BUTTON_4 5
# define BUTTON_5 6
# define BUTTON_6 7
# define BUTTON_7 8
# define BUTTON_8 9
int melo = 200;
int doremi[] = {0, 131, 147, 165, 175, 196, 220, 247, 262};
void setup()
{
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT_PULLUP);
pinMode(BUTTON_3, INPUT_PULLUP);
pinMode(BUTTON_4, INPUT_PULLUP);
pinMode(BUTTON_5, INPUT_PULLUP);
pinMode(BUTTON_6, INPUT_PULLUP);
pinMode(BUTTON_7, INPUT_PULLUP);
pinMode(BUTTON_8, INPUT_PULLUP);
pinMode(SPEAKER, OUTPUT);
}
void loop()
{
int status = 0;
int b1_flag = digitalRead(BUTTON_1);
int b2_flag = digitalRead(BUTTON_2);
int b3_flag = digitalRead(BUTTON_3);
int b4_flag = digitalRead(BUTTON_4);
int b5_flag = digitalRead(BUTTON_5);
int b6_flag = digitalRead(BUTTON_6);
int b7_flag = digitalRead(BUTTON_7);
int b8_flag = digitalRead(BUTTON_8);
if (b1_flag == LOW)
{
tone(SPEAKER, doremi[1], melo);
}
if (b2_flag == LOW)
{
tone(SPEAKER, doremi[2], melo);
}
if (b3_flag == LOW)
{
tone(SPEAKER, doremi[3], melo);
}
if (b4_flag == LOW)
{
tone(SPEAKER, doremi[4], melo);
}
if (b5_flag == LOW)
{
tone(SPEAKER, doremi[5], melo);
}
if (b6_flag == LOW)
{
tone(SPEAKER, doremi[6], melo);
}
if (b7_flag == LOW)
{
tone(SPEAKER, doremi[7], melo);
}
if (b8_flag == LOW)
{
tone(SPEAKER, doremi[8], melo);
}
}
動作イメージ
圧電スピーカーとタクトスイッチ8個で、ドレミ再生してみた。 pic.twitter.com/iYxAleYPrO
— Toshio Maki (@Kirika_K2) 2018年7月8日