久しぶりに「DFPlayer Mini」を取り出したところ壊れたのか動かなかったので、再度Arduinoの「TMRpcm Library」でWAVファイルの再生をやってみようと。ネットには新しい情報がほとんどなく廃れたのかなと思います。だとすれば、余計やってみたくなりました。
(PS)投稿後ずっとこれで音楽のループ再生を聞きながら、音量を変えられないかと考えてました。”MsTimer2”が使えましたので少し変更します。「switch case」では「int」しか使えないので「1」で音量増、「0」で音量減です。ついでに、ポーズ/再開(p,70)と停止機能(s,73)も付けました。ただし、ポーズと停止をしてもdelay時間が終わったら、次の曲が再生されます。
(PPS)1回目の改良後、このような場合、タクトスイッチによる"attachInterrupt"が使えることを思い出し、更に改良して再アップしました。やはりチャタリングはあるので何か対策をと思いますが、まあこれが一応の完成形ということで。
100均スピーカーでも結構大きく聞こえます。なお、スピーカー真ん中部分が凹んでいるのは孫が指でへこませるからです
次の写真はちゃんとしたアンプに繋いだ場合です。
1.まず、Arduinoで再生可能なレベルにWAVファイルを整形します。
https://www.audacityteam.org/
から「Audacity」をダウンロード、インストール(マイクロソフトストアからでもできます)。用意した適当なWAVファイルを開きます。左下「プロジェクトファイルのサンプリング周波数」を22050Hz以下に落とします。次にメニューの「トラック→ミックス→ステレオからモノラルへ」を選択。最後に「ファイル→書き出し→WAVとして書き出す」。
2.変換したそのWAVファイルをmicroSDに保存しボードにSPI接続したスロットに挿入します。
3.以下のinoファイルをArduino互換ボード(ATmega168/328)に書き込みます。
#include <SPI.h>
#include <SD.h>
#include <TMRpcm.h>
#include <avr/power.h>
#include <MsTimer2.h> // 新規追加。Javier Valencia版。もう一つの方はInstallできても認識せず。
//SD
const int CS = 5; // 4から5に変更してみた。13->CLK, 12->MISO, 11->MOSI
//Play *.wav
TMRpcm audio;
const int SpPin = 9; // doesn't on 3
void changeSta() { // 新規追加。割り込み関数。
if (Serial.available()) { //Send commands over serial to play
switch (Serial.read()) { // 読み取ったcharは数値として扱われている。
case '1': audio.volume(1); break; // (31) Increase volume by 1
case '0': audio.volume(0); break; // (30) Decrease volume by 1
case 'p': audio.pause(); break; // (70) Pause or Continue playback
case 's': audio.stopPlayback(); break; // (73) Stop all playback
}
}
}
void volP(){ audio.volume(1); } // 割り込み用に新規作成
void volM(){ audio.volume(0); } // 割り込み用に新規作成
void setup() {
clock_prescale_set(clock_div_1); // 32MHz動作させられるらしいが効果は不明
audio.CSPin=10; // 10ピンからも音が出せる。ただし、STEREOではない。
Serial.begin(9600);
audio.speakerPin = SpPin;
if (!SD.begin(CS)) { // CS=5
Serial.println("SD failed");
return;
}
audio.setVolume(6); // ボリュームの初期設定。
Serial.print("xxx0.wav"); // sampling Max 22050HZ (no BigFile!)
Serial.println(" time 03:07");
audio.play("xxx0.wav");
MsTimer2::set(200, changeSta); // 新規割り込み関数の登録
MsTimer2::start(); // そのスタート
pinMode(2, INPUT_PULLUP); // 新規割り込み用に準備
pinMode(3, INPUT_PULLUP); // 新規割り込み用に準備
// デフォルトではピン割り込みに使えるのはD2,D3だけらしいので。
attachInterrupt(digitalPinToInterrupt(2),volP,FALLING); // CHANGE No!
attachInterrupt(digitalPinToInterrupt(3),volM,FALLING); // CHANGE No!
delay(190000); // 演奏時間+3秒ほど
}
void loop(void) {
Serial.print("xxx1.wav");//sampling Max 22050HZ (no BigFile!)
Serial.println(" time 02:18");
audio.play("xxx1.wav");
delay(141000);
Serial.print("xxx2.wav");//sampling Max 22050HZ (no BigFile!)
Serial.println(" time 03:36");
audio.play("xxx2.wav");
delay(239000);
Serial.print("xxx3.wav");//sampling Max 22050HZ (no BigFile!)
Serial.println(" time 03:59");
audio.play("xxx3.wav");
delay(242000);
Serial.print("xxx4.wav");//sampling Max 22050HZ (no BigFile!)
Serial.println(" time 03:03");
audio.play("xxx4.wav");
delay(186000);
Serial.print("xxx5.wav");//sampling Max 22050HZ (no BigFile!)
Serial.println(" time 03:43");
audio.play("xxx5.wav");
delay(226000);
}
以前作った時には、setupに記述したので1回のみの再生でしたが、今回はloop中にも記述し、まさにループ再生させてみました。delayさせないと音楽終了後延々とノイズが流れるので、演奏時間+3秒ほどdelayさせてます。さらに今回、10Pinからも音が出せると知りやってみました。疑似的にSTEREO感が出ます。
ちゃんとしたアンプにも繋いでみましたが、サンプリング周波数が22050Hzだと結構よい音に私には聞こえます。