Arduinoでダース・ベイダーのテーマを鳴らす

arduinoと圧電スピーカー Arduino
arduinoと圧電スピーカー

今回は、1回目としてArduinoと圧電スピーカー(パッシブブザー)を使ってダース・ベイダーのテーマを鳴らそうと思います。

スポンサーリンク

ドレミファソラシドを鳴らそう

最初に練習として、スイッチを1回押すとドレミファソラシドの音階が流れるコードを書いていきましょう。

使用した部品

  • Arduino本体
  • ブレッドボード
  • 圧電スピーカー(パッシブブザー)
  • スイッチ
  • 抵抗

スイッチや抵抗はAmazon等でセットで買うとお得です。

音階と周波数

音階と周波数の関係です。

周波数が倍になると、1オクターブ高くなります

oct C C# D D# E F F# G G# A A# B
3 131 139 147 156 165 175 185 196 208 220 233 247
4 262 277 294 311 330 349 370 392 415 440 466 494
5 523 554 587 622 659 698 740 784 831 880 932 988

今回は、ドレミファソラシドを鳴らすので、C4~C5の音を使います。

音階周波数は下記サイトを参考に表を作ってみました。

音階周波数
音階周波数

サンプル1 配線図

下図のように、圧電スピーカーの「+極」を9番ポート、「-極」をGNDに接続し、
スイッチに2番ポートを接続させます。
抵抗は自分は10kΩを使用しました。

Arduinoで音階を鳴らす回路図

サンプルコード1(ドレミファソラシド)

Arduinoでスイッチを1回押すとドレミファソラシドが鳴るコードです。

//***************************************/
// スイッチを押すと音階を鳴らすプログラム
//***************************************/
#define Bt 200 //音を出している時間(msec)

const int Switch = 2; //スイッチの接続するピン
const int Speaker = 9; //スピーカーの接続するピン

void setup() {
  pinMode(Switch, INPUT); //スイッチは入力用に設定
}

void loop() {
  while (digitalRead(Switch) == LOW) {
  //スイッチを押さない(LOW)時は何も処理しない
  }
  //スイッチを押す(HIGH)とwhile文を抜け出して音を鳴らす。
  tone(9, 262, Bt); //ド
  delay(Bt);
  tone(9, 294, Bt); //レ
  delay(Bt);
  tone(9, 330, Bt); //ミ
  delay(Bt);
  tone(9, 349, Bt); //ファ
  delay(Bt);
  tone(9, 392, Bt); //ソ
  delay(Bt);
  tone(9, 440, Bt); //ラ
  delay(Bt);
  tone(9, 494, Bt); //シ
  delay(Bt);
  tone(9, 523, Bt); //ド
  delay(Bt);
}

コードの説明

tone(pin, frequency, duration)
pin:出力ピン番号(ここでは9番ピン)
frequency:周波数(Hz)
duration:出力する時間をミリ秒で指定
このサンプルでは200msを#defineでBtとして定義した。

delay(value)
指定した時間だけ一時停止する。
ここではBt=200msだけ一時停止させます

while(digitalRead(Switch) == LOW)
スイッチを押さない(LOW)時は、何も処理しないをせず、
スイッチを押す(HIGH)とwhile文を抜け出して音が鳴るようになります。

次はダース・ベイダーのテーマを鳴らしましょう。

ダース・ベイダーのテーマを奏でよう

ダース・ベイダーのテーマの楽譜

ダース・ベイダーのテーマのメロディは上図のようになります。
これをArduinoで鳴らしましょう。

回路図は先程のサンプル1と同じです。

音符を長さ(ミリ秒)を指定する

音符の長さの計算は

60000(msec) ÷ BPM = 4分音符の長さ(msec)

となります。

今回はBPMを100としたので、4分音符の長さは600となるのですが、最初のG4の音をスタッカート気味にしたほうがいい感じだったので500に設定しました。

BPMから音符の長さを計算する入力フォームは以下の記事に書いてみました。

では、実際にサンプルを見てみましょう。

サンプルコード2 ダース・ベイダーのテーマを鳴らす

//***************************************/
// ダース・ベイダーのテーマを鳴らすプログラム
//***************************************/
//音の長さ(msec)を定義する(BPM=100)
#define Bt2 1200 //2分音符
#define Bt4 500 //4分音符、スタッカート気味
#define Bt8f 450 //付点8分音符
#define Bt8 300 //8分音符
#define Bt16 150 //16分音符

//音符に対してのDelay Time(msec)を設定
#define Dt2 1100 
#define Dt4 500 
#define Dt8f 350
#define Dt8 200
#define Dt16 50

//音程を定義する
#define G4 392 //ソ
#define Ds4 311 //レ#
#define As4 466 //ラ#
#define D5 587 //レ
#define Ds5 622 //レ#
#define Fs4 370 //ファ#
#define G5 784 //ソ
#define Fs5 740 //ファ#
#define F5 698 //ファ
#define E5 659 //ミ
#define Gs4 415 //ソ#
#define Cs5 554 //ド#
#define C5 523 //ド
#define B4 494 //シ
#define A4 440 //ラ

const int Switch = 2; //スイッチの接続するピン
const int Speaker = 9; //スピーカーの接続するピン

void setup() {
  pinMode(Switch, INPUT); //スイッチは入力用に設定
}

void loop() {
  while (digitalRead(Switch) == LOW) {
  //スイッチを押さない(LOW)時は何も処理しない
  }
  //スイッチを押す(HIGH)とwhile文を抜け出して音を鳴らす。
  //1~2小節
  tone(9, G4, Bt4);
  delay(Dt4);
  tone(9, G4, Bt4);
  delay(Dt4);
  tone(9, G4, Bt4);
  delay(Dt4);
  tone(9, Ds4, Bt8f);
  delay(Dt8f);
  tone(9, As4, Bt8);
  delay(Dt8);
  tone(9, G4, Bt4);
  delay(Dt4);
  tone(9, Ds4, Bt8f);
  delay(Dt8f);
  tone(9, As4, Bt8);
  delay(Dt8);
  tone(9, G4, Bt2);
  delay(Dt2);

  //3~4小節
  tone(9, D5, Bt4);
  delay(Dt4);
  tone(9, D5, Bt4);
  delay(Dt4);
  tone(9, D5, Bt4);
  delay(Dt4);
  tone(9, Ds5, Bt8f);
  delay(Bt8f);
  tone(9, As4, Bt16);
  delay(Dt16);
  tone(9, Fs4, Bt4);
  delay(Dt4);
  tone(9, Ds4, Bt8f);
  delay(Dt8f);
  tone(9, As4, Bt16);
  delay(Dt16);
  tone(9, G4, Bt2);
  delay(Dt2);
  
  //5~6小節
  tone(9, G5, Bt4);
  delay(Dt4);
  tone(9, G4, Bt8f);
  delay(Dt8f+50);
  tone(9, G4, Bt16);
  delay(Dt16);
  tone(9, G5, Bt4);
  delay(Dt4);
  tone(9, Fs5, Bt8f);
  delay(Dt8f);
  tone(9, F5, Bt16);
  delay(Dt16+100);
  tone(9, E5, Bt16);
  delay(Dt16+100);
  tone(9, Ds5, Bt8);
  delay(Dt8);
  delay(Bt8-50);
  tone(9, Gs4, Bt8);
  delay(Dt8);
  tone(9, Cs5, Bt4);
  delay(Dt4);
  tone(9, C5, Bt8f);
  delay(Dt8f);
  tone(9, B4, Bt16);
  delay(Bt16);
  
  //7~8小節
  tone(9, As4, Bt16);
  delay(Dt16+100);
  tone(9, A4, Bt16);
  delay(Dt16+100);
  tone(9, Gs4, Bt8);
  delay(Dt8);
  delay(Bt8-50);
  tone(9, Ds4, Bt8);
  delay(Dt8);
  tone(9, Fs4, Bt4);
  delay(Dt4);
  tone(9, Ds4, Bt8f);
  delay(Dt8f);
  tone(9, As4, Bt16);
  delay(Dt16);
  tone(9, G4, Bt4);
  delay(Dt4);
  tone(9, Ds4, Bt8f);
  delay(Dt8f);
  tone(9, As4, Bt16);
  delay(Dt16);
  tone(9, G4, Bt2);
  delay(Dt2);
}

うまくメロディが流れるようにするために、Delay Time(Dt)の調整が難しかったです。

Dtの定義では、音符の長さから100を引いた数を定義させたのですが、5〜8小節は上手くいかなかったので適宜、足したり引いたりして調整しました。

動作確認

Youtubeに実際にやってみた動画を投稿してみました。
スイッチを押したらダースベイダーのテーマが流れるのがわかると思います。

まとめ

今回は、1回目としてArduinoで音を出してみました。メロディがちゃんと流れるように調整するのが難しかったですね。
分かりやすくするためにコードが長くなってしまったので、次回は短く曲を流すやり方を学んで書いていけたらと思います。

Arduinoのおすすめ本はこちら↓

電子工作のおすすめ本はこちら↓

コメント

  1. 小林 より:

    大学の課題のため、ブログを参考にさせていただいています。レポート提出時に一部出典で転載したく存じますが差し支えないでしょうか。公開するものではなくあくまで学内に提出するために使うものとなります。よろしくお願いいたします。

    • かめのの より:

      返信おそくなりましてすみません。参考にして頂きありがとうございます。
      出典で転載しても大丈夫ですよ!よろしくお願いします。

  2. 竹内 より:

    大学の学園祭でテスラコイルの演奏をするのですが、今回のダースベイダーのプログラムを使用してもよろしいでしょうか。

タイトルとURLをコピーしました