エントリー

カテゴリー「実験・研究」の検索結果は以下のとおりです。

ページ移動

  • ページ
  • 1
  • 2
  • 3
  • 4
  • 5

ESP32で音出しとMP3を再生したまとめ

ESP32ではメモリ不足で「ESP32-audioI2S」ライブラリは動作不可であったが「ESP8266Audio」というライブラリがありESP32でも使えることが判ったので音出しを実験

まずはネットで情報収集した結果ESP32で音出しする際の構成をまとめてみた

20260412_Fig01.png

ESP32の音出しには2つの方法がある(I2S

①内蔵DACを使って,I2SとDACドライバを経由で音を出力

②内蔵DACを使用しないで直接I2S信号をGPIOで出力させ外付けDACで音を出力

注)②の場合直接I2Sへデーターを送出する方法とライブラリを利用する方法がある

①の方法で出力

サイン波を生成して出力させるスケッチを試したが今一つだったので以下からスケッチを拝借

https://kghr.blog.fc2.com/blog-entry-126.html

I2S_1bit_output.png

注)直接SPを接続すると音量最大時が3.3Vとなるので大電流がGPIOに流れないよう注意

(再生)

②の方法で出力

(テスト用音源の準備)

②の方法で「ESP8266Audio」を使って音を再生するための音源データ(MP3)を準備

当初はWeb経由で行おうとして正常に動作しないので以下を参考にしてESP32のフラッシュに置いた

https://hatakekara.com/spiffs/(SPIFFS)

https://qiita.com/kumakumao/items/be51f174bfeb0e4a6a06 (LittleFS)

音源データが1MB少々でも1.5MBでは不足となるので「NO OTA(2MB APP/2MB SPIFFS)」で対応

■ 簡易的なモノラル出力

「ESP8266Audio」でDACがなくてもDOUTからPWMで再生する方法がある

サンプリング周波数は低いのだろうが,1bitのパルス波形の密度(ON/OFF)で表現するDSDってことかな

I2S_1bit_output.png

スケッチ(音源はSPIFFS)

#define NODAC 1

#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#ifdef NODAC
#include "AudioOutputI2SNoDAC.h"
#else
#include "AudioOutputI2S.h"
#endif

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
#ifdef NODAC
AudioOutputI2SNoDAC *out;
#else
AudioOutputI2S *out;
#endif

void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("MP3 Play Start\n");
SPIFFS.begin();
file = new AudioFileSourceSPIFFS("/hoshi45s.mp3");
#ifdef NODAC
out = new AudioOutputI2SNoDAC();
#else
out = new AudioOutputI2S();
#endif
out->SetPinout(26, 25, 22); //BCK=26, WCLK=25, DOUT=22
out->SetGain((float)30/100.0); //音量
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}

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

(再生)

■ MAX98357Aで出力

I2S_output.png

スケッチ(音源はSPIFFS)

//#define NODAC 1    ← コメントアウト

以下,上記のスケッチと同じ

(再生)

ESP32C3 super miniでMP3を再生

ESP32で音出しが出来たので,低価格でコンパクトなESP32C3 Super miniでのMP3再生を実験smc3-k2-pin-2.jpg

(相違や懸案点)

  • 使用したのは「ESP32 C3 Super Mini(K2)」((K1)以外はPIN互換だったかな)
  • ESP32C3 Super miniは内蔵DACが省かれているので出力は②の方法のみとなる
  • PIN数が異なるのでGPIOを1~5へ変更
  • SPIFFSを作成してファイルを設置できるのだが何故か読めないのでLittleFSを使用
  • arduinoIDE V1ではビルドできても動作が不安定で動作しないためV2でビルド
  • デバッグで利用するSerial出力がIDEの設定で出力PINが変わるので注意(USB CDC On Boot)
■ 簡易的なモノラル出力

IMG_20260412_164740.jpg

アンプ付きスピーカーとの接続はGPIO1

スケッチ(音源はLittleFS)

#define NODAC 1

#include <Arduino.h>
#include "AudioFileSourceLittleFS.h"
#include "AudioGeneratorMP3.h"
#ifdef NODAC
#include "AudioOutputI2SNoDAC.h"
#else
#include "AudioOutputI2S.h"
#endif

AudioGeneratorMP3 *mp3;
AudioFileSourceLittleFS *file;
#ifdef NODAC
AudioOutputI2SNoDAC *out;
#else
AudioOutputI2S *out;
#endif

void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("MP3 Play Start\n");
LittleFS.begin();
file = new AudioFileSourceLittleFS("/hoshi45s.mp3");
#ifdef NODAC
out = new AudioOutputI2SNoDAC();
#else
out = new AudioOutputI2S();
#endif
out->SetPinout(3, 2, 1); //BCK=3, WCLK=2, DOUT=1
out->SetGain((float)30/100.0); //音量
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}

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

(再生)

■ MAX98357Aで出力

esp32c3_output.png

スケッチ(音源はLittleFS)

//#define NODAC 1 ← コメントアウト

以下,上記のスケッチと同じ

(再生)

  • 電源の問題なのかフェージングが発生

クリスタルマーカーの作製

少し前にSGを作製したが,その前にアナログラジオ用のクリスタルマーカーを作製しようとしていてブレッドボートに展開していた

ブレッドボートのままだと忘れてしまうので基板に載せ替えたが動作が不安定なようだ

IMG_20250125_102505.jpg

調整はまたの機会に行うことにして記録を残しておく

回路はこちらを参考にした

発振回路

基準(元)となるクロックは,4MHzのクリスタルとインバータでフランクリン発振させた

ss20250125_01.png

変調音

残りのインバータを利用して「方形波CR発振回路」で600Hzの変調音を作る

ss20250125_02.png

インバータの電源部

ss20250125_03.png

マーカー周波数

4MHzを74HC390で分周して1MHzと200kHzを出力した

ss20250125_04.png

1MHzは1/2→1/2,200kHzは1/2→1/10を2回路2接点SWで切り替えている

変調

参考回路の簡易変調を利用

ss20250125_05.png

変調部を基板に載せたら元のマーカー信号や変調音の波形が崩れてしまった

おそらく絶縁が良くないのかと思われる

(追加:2025.01.26)

簡単に確認できそうなところとして,変調部の電源を切れるようにしてみたら正常になった

触ったところから推測すると,Q2への電源半田が不良だったのではないかと考えられる

・1MHz変調なし

IMG_20250126_115759.jpg

・1MHz変調あり

IMG_20250126_115449.jpg

・200kHz変調なし

IMG_20250126_115818.jpg

・200kHz変調あり

IMG_20250126_115500.jpg

これで必要になるまで置いておこうと思う

SG作製のための試行実験

SG(シグナルジェネレータ)を作製しようと購入していた「AD9834DDSモジュール」と「周波数カウンターキット」を使うために実験

AD9834.jpgDkit.jpg

AD9834DDSモジュール

arduinoでコントロールすることにしてUNOと接続し簡単に動作確認してみる

IMG_20241228_101327.jpg

UNOとの接続はSDI

CLK: ⑬SCK(H/W)

SDA:⑪MOSI(H/W)

FSY:CSは⑩ピンを使用(LOWで選択)

電源は+5(モジュール上で3.3Vにしている)

当初,アナログ出力をオシロスコープで計測できなかったため,ボードが異常かと思い基板上の半田をやり直してみたが変化なし

実は出力レベルが小さくてオシロスコープのAutoボタンでは検出できなかっただけで手動で電圧レベルを変更したら計測できたので問題なかったことが判る

IMG_20241216_144218.jpg

後で確認したところ10MHz時20mVしかない,更に周波数が上がると低下する

IMG_20241228_103403.jpg

周波数を操作するためロータリーエンコーダを接続しSDI接続のディスプレイを接続

IMG_20241216_170511.jpgIMG_20241228_094731.jpg

しかし,ディスプレイの表示がU8g2ライブラリでDDSモジュールのSDI制御と被ってしまい操作不能となったため断念

周波数カウンターキット

SGを作製するにあたり,懐かしきミズホ通信「DX-555」が欲しかったので見映えをマネしたいと思って7セグLED表示のキットを購入しておいた

キットを作製(2台)すると1台が動作不良で,調査したところ1つはスルーホールの接触不良,2つ目はPIC用のクロック調整であまり綺麗な発振でなかったがトリマーの操作で動作はするようになった

IMG_20241228_094625.jpg

IMG_20241228_094636.jpg

①電源ジャックの合う規格のアダプタがないため電源はピンから供給するが,ジャック挿入時にGNDラインが接続させるようになっているので結線

②ケース設置時ピンが前面では邪魔になるので裏に向けて接続(ブレッドボードでも扱いやすくなる)

③測定入力用のGNDピンは基板のパターンになく接続されてないので隣のパーツのGNDに接続

④外部入力時に影響するので水晶測定用のコンデンサを外す(ついでにソケットも外した)

このキットは安価であるが入力をPICに直入れているのでTTLレベル(5V)でないと測定できないため感度を上げるアンプが必要となる

2SC1815を使って1石で増幅させてみたのだけど・・・どうも上手く動作させれないため宮甚商店さんの回路を参考に測定できるようにした

Dkit_AMP.png

(注)デジタル計測にした時にOUT前のカップリングコンデンサを削除

1MHzまで出力できる簡易SGで入力を最低(約50mV)にして確認

IMG_20241225_101842.jpg

周波数アップに向けて改良

AD9834DDSモジュールと接続してみたところ12.4MHz位までは測定でき,水晶測定用のコンデンサを外すと14.6MHzまで可能になる

IMG_20241228_095720.jpg

できれば30MHz,少なくとも21MHz位までは測定できるようにならないかパーツを調整してみたり別回路も設計して試してみたが上手くいかない

アンプの電圧を上げればいけると思うのだけど,5Vに執着していて最終手段として9Vにすることも視野に入れるかと思っていた時,計測はデジタル出力を使えばいいじゃない

ってことに気付きAD9834DDSモジュール側のスケッチを調整

AD9834の日本語版説明書が判りにくく英語版を兼用してなんとか理解して実験してみる

10MHz出力

①CMD_OPBITEN=1でSIGN BIT OUTをイネーブルにしただけ

IMG_20241228_105604.jpg

これでデジタル出力がONになるが周波数が半分となる

②CMD_DIV2=1にして分周なしにする

IMG_20241228_105712.jpg

デフォルトだと分周されるので分周しないようにONにするとアナログ(サイン波)と同じ周波数での出力となった

③CMD_SIGNPIB=1を②に追加してコンパレータ使用

IMG_20241228_105907.jpg

説明ではコンパレータを通すことにより方形波になるとの事だが変化がないことが判る

出力はTTLレベルになるようなネットの情報もあったが,どうやらそうでもなくVpp340mVってところであった.

しかたないのでデジタル出力でもアンプを通して計測することにしたところ20~21MHzまで計測可能になったので良しとする

以下はデジタル出力を周波数カウンタ表示しながらアナログ出力をオシロスコープで計測している(10~20MHzへ100kHz単位でアップさせて確認したところ)

IMG_20241228_120053.jpg

尚,デジタル出力をONにするとアナログ出力も若干アップするようで見え難いがVpp84mV(DIV50mV)となっている

tinySA(スペクトラムアナライザ)で10MHz時の出力を確認

IMG_20241228_121939.jpg

最大が10MHzで低調波と高調波が確認できる

サイン波出力のみだが出力レベルの変更もできるようにしたいかな

現時点の確認用スケッチ(TAB4,SJIS)

温度センサーの確認

3Dプリンタの温度管理のため温度センサーの準備をしている

BMP280のI2Cアドレス

複数個所の温度を取得しようとした時,複数のセンサを繋がないとならないがBMP280なら2つのアドレスが使えるってことで確認

仕様ではSDO端子をVccにつなぐと0x77で、GNDに落とすと0x76になる

良い具合に気象観測用で不良で交換したBMP280がある(6個あって完全に使えないのが2個で1個は実験で破壊したから3個)

SDOピンにプルダウンされている10kΩのチップ抵抗を外して,隣のプルアップされているピンに接続

IMG_20230804_153329.jpg

3.3VロジックのArduino miniでI2Cで接続してアドレス確認と温度取得確認

IMG_20230804_153235.jpg

BMP280をSPI接続で使用

ESP32-CAMではI2Cが使えないのでSPIで接続できるようにする

10kΩのチップ抵抗を全て外せばSPIで接続可能

IMG_20230805_144647.jpg

結果はESP32-CAMではSPIのセレクトラインであるCSを割り当てられるピンがないため失敗

IMG_20230805_144925.jpg

SPIに改造したBMP280の動作は未確認

ESP32-CAMでDHT22(AM2302)を確認

SPIの4ピンはSPIで使用しないならI/Oピンで使用できるのではということでAM2302を接続してみる

IMG_20230805_175811.jpg

通信に1ピンしか使用しない(専用I/F)ので13ピンで温度・湿度・気圧が取得できることを確認(12ピンは使用不可のようで,接続しておくとスケッチ書き込みでエラーとなり,外して無理やり書き込んでもスケッチは動作しない)

IMG_20230805_175742.jpg

ページ移動

  • ページ
  • 1
  • 2
  • 3
  • 4
  • 5

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/16 from 権限がありません
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/15 from admin
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/14 from 権限がありません
Re:NOAA受信システム復旧
2025/06/11 from admin
Re:NOAA受信システム復旧
2025/06/11 from とおりすがり

過去ログ

Feed