SSブログ

ESP32のDCCデコーダ [ds-DCCデコーダ]

 一応、ESP32 devkitCでNMRADCCライブラリとESP8266Audioライブラリを使って、モーター、ヘッドライト、テールライト、音(4音ぐらい、WAV:22kHz)ぐらいまでができました。
DSC02839.jpg

・真ん中のユニバーサル基板上に両極性でのヘッドライト、テールライトに当たるLEDを配置しています。
・実験基板には、モータードライバのBD6231Fを2回路付けており、回路1はモーター用、回路2はヘッド、テールライト用としています。
・実験基板には緑色のLEDを一つ付けており、F1をOn/Offすることで点灯と消灯をできるようにしています。現状はESP32からの3.3V駆動になっているので、12V用とするなら、トランジスタを付けないとです。
・音は22Khzの普通のWAVで、SPIFFSを使用しており、ArudinoIDEからファイルを転送して使っています。
・まだ、CV書き込み部分を入れていません。SPIFFSも使っているし、どうすればよいかしら?

動画です。電源入れて、まず、モーターを回して、止めて、F0(ヘッドライト、テールライト)を付け、次に室内灯を付けて、最後に、音のファンクションをF3からF7まで鳴らしています。音が悪いのとか、割れているとかいうのは置いておいて、一応、同時になっていることがわかるかと思います。


 スケッチはこちら
ESP32のArduino環境やSPIFFSのアップロード環境、ESP8266AudioやNMRADCCなどのライブラリをそろえる必要もありますが、環境構築は省略します・・・。

適当なAudioPlayというクラスを作ったのですが、そこを少し改造すればMp3が鳴るように変更はかのうです。両方ならすことはできるのかなあ?
本日は以上です。

コメント(5) 

コメント 5

Yaasan

素晴らしい実験、ありがとうございます!
4音同時再生は、確実に安定して行える感じでしょうか??
内蔵メモリは、確かESP32はいろいろあったと思いますが、今回のものだとどれくらいの時間の記録が可能か、気になるところです。
大きいので、HOかGゲージ向けになりそうな感じですが、上手くすれば海外のユーザーも欲しがるものになると思います。

ESP32も、マイナーバージョンアップの新型?があるようなので、期待しております。
by Yaasan (2019-07-21 17:52) 

あやのすけ

4音リアルタイム合成はすごいですね。
ライブラリ側でうまく合成処理ができているのかな。
(単に音重ねると音大きくなってしまう)
メモリは外付けspi FLASHを足して
by あやのすけ (2019-07-22 07:44) 

fujigaya2

コメントありがとうございます。
>4音同時再生は、確実に安定して行える感じでしょうか??
いじわるテストしていませんので、確実とは言い切れません。
>内蔵メモリ
現在、1.5MbyteのSPIFFSにしています。OTAなしなら3MByteまでできるようです。
1.5MByteなら、22kHz,16bit,monoで34秒ぐらい
128kのMp3なら93秒ぐらいかと思います。(Mp3で4音出せるかは微妙ですが)
>4音リアルタイム合成のライブラリ処理
多分、足しているだけだと思います。(一音一音は小さくしています)
by fujigaya2 (2019-08-03 13:29) 

murarduino

興味深いプロジェクトです。mp3を再生しようとしましたが、機能しませんでした。ここでMixerの目的がよくわかりません。出力としてAduioOutputI2Sを試しましたが、機能しませんでした(ESP8266Audioテストでは単一のMP3を再生できます)。 。
さらに、EPS32のサイズが小さくなり、Nスケールプロジェクトでより大きなFLASHを使用できるようになりました。モデル:PICO-V3-02、組み込み8Mフラッシュ、OTAなし、SPIFFSは約4〜5MBを達成できます。 音楽ファイルを保存するのに十分です。
by murarduino (2022-06-21 15:50) 

murarduino

SPIFFS + ID3 + I2SOUT + Mixerという自分のスケッチを書くことで、普通にサウンドを再生できるのはとても奇妙です。
ただし、AudioPlay.cppライブラリを変更しても、サウンドは再生されません。 どこに問題があるのか​​わからない。
都合がよければ、メールで提案をお願いします。私のメールアドレス:36594848@qq.com

私のスケッチ:
#include <Arduino.h>
#include <WiFi.h>
#include "SPIFFS.h"
#include "AudioFileSourceSPIFFS.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
#include "AudioOutputMixer.h"

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;
AudioOutputMixer *mixer;
AudioOutputMixerStub *stub;



void setup()
{
WiFi.mode(WIFI_OFF);
Serial.begin(115200);
delay(1000);
SPIFFS.begin();
Serial.printf("Sample MP3 playback begins...\n");

audioLogger = &Serial;
file = new AudioFileSourceSPIFFS("/201.mp3");
id3 = new AudioFileSourceID3(file);
out = new AudioOutputI2S();
out->SetOutputModeMono(true);
out->SetPinout(15,13,2);
out->stop();
// out->SetGain(0.8);
mixer = new AudioOutputMixer(32,out);
stub = mixer->NewInput();
stub->SetGain(0.95);
mp3 = new AudioGeneratorMP3();
mp3->begin(id3, stub);

}

void loop()
{
if (mp3->isRunning()) {
if (!mp3->loop()) mp3->stop();
} else {
Serial.printf("MP3 done\n");
delay(1000);
}
}

AudioPlay.cppセクションを変更します:
void AudioPlay::snd_init()
{
//Serial.println("AudioPlay_snd_init");
WiFi.mode(WIFI_OFF);
//delay(1000);
SPIFFS.begin();
//各種ポインタをNullにして、初期化
for(int i = 0; i < ALL_FILE_NUM;i++)
{
mp3[i]=nullptr;
// wav[i]=nullptr;
stub[i]=nullptr;
file[i]=nullptr;
}
//if(Sound_mode==2)
// return;
//out = new AudioOutputI2S(0, 1); // Output to builtInDAC
out = new AudioOutputI2S(); // Output to I2S
out->SetOutputModeMono(true);
out->SetPinout(15,13,2);
out->stop();
mixer = new AudioOutputMixer(32, out);
//delay(300);
}

void AudioPlay::snd_play(int nm,const char *filename,float v)
{
//Serial.println("AudioPlay_snd_play");
//if(Sound_mode==2)
// return;
// snd_stop(nm);
// if(file[nm]!=nullptr)
// delete file[nm];//2018/10/28修正 リークが蓄積すると落ちる
file[nm] = new AudioFileSourceSPIFFS(filename);
id3[nm] = new AudioFileSourceID3(file[nm]);
stub[nm] = mixer->NewInput();
stub[nm]->SetGain(v);
mp3[nm] = new AudioGeneratorMP3();
mp3[nm]->begin(id3[nm], stub[nm]);
Serial.println("playing mp3");
// wav[nm] = new AudioGeneratorWAV();
// wav[nm]->begin(file[nm], stub[nm]);
}
by murarduino (2022-06-22 15:23) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。