LGT8F328P(Nano互換)でWAVファイル再生やってみた(改)

　久しぶりに「DFPlayer Mini」を取り出したところ壊れたのか動かなかったので、再度Arduinoの「TMRpcm Library」でWAVファイルの再生をやってみようと。ネットには新しい情報がほとんどなく廃れたのかなと思います。だとすれば、余計やってみたくなりました。

(PS)投稿後ずっとこれで音楽のループ再生を聞きながら、音量を変えられないかと考えてました。”MsTimer2”が使えましたので少し変更します。「switch case」では「int」しか使えないので「1」で音量増、「0」で音量減です。ついでに、ポーズ/再開(p,70)と停止機能(s,73)も付けました。ただし、ポーズと停止をしてもdelay時間が終わったら、次の曲が再生されます。
(PPS)1回目の改良後、このような場合、タクトスイッチによる"attachInterrupt"が使えることを思い出し、更に改良して再アップしました。やはりチャタリングはあるので何か対策をと思いますが、まあこれが一応の完成形ということで。
![KIMG0428.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/8384fe61-a3f0-1fb8-4e13-58fc2f76086f.jpeg)
　100均スピーカーでも結構大きく聞こえます。なお、スピーカー真ん中部分が凹んでいるのは孫が指でへこませるからです:sweat_smile:
　次の写真はちゃんとしたアンプに繋いだ場合です。
![waveplayer2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/1ec07008-fcca-5107-01f4-9c7a24ba95c6.jpeg)
１．まず、Arduinoで再生可能なレベルにWAVファイルを整形します。
    https://www.audacityteam.org/
から「Audacity」をダウンロード、インストール(マイクロソフトストアからでもできます)。用意した適当なWAVファイルを開きます。左下「プロジェクトファイルのサンプリング周波数」を22050Hz以下に落とします。次にメニューの「トラック→ミックス→ステレオからモノラルへ」を選択。最後に「ファイル→書き出し→WAVとして書き出す」。
![audacity3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/b7bcb1a7-afc4-eda8-4c37-fbcdd78a2bd5.jpeg)
２．変換したそのWAVファイルをmicroSDに保存しボードにSPI接続したスロットに挿入します。
３．以下のinoファイルをArduino互換ボード(ATmega168／328)に書き込みます。
```Wav_Player.ino
#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だと結構よい音に私には聞こえます:smiley:。