1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ProMicroで圧電スピーカー+タクトスイッチでドレミを演奏する

Posted at

圧電スピーカーとは

 パッシブスピーカーとも呼ぶらしいですが、電流を流すことで金属板を振動させ、音を鳴らすスピーカーのことです。
 一般的なスピーカーと同じ原理で動いているはずなので、十分な出力が得られればスピーカーに接続することもできますし、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に設定しています。

配線イメージ

写真 2018-07-08 22 34 34.jpg

 大分煩雑になってきました。
 ドレミから順番に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);
    }
}

動作イメージ

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?