LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-29

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

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

0
0
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
0
0