エントリー

タグ「ESP32」の検索結果は以下のとおりです。

ページ移動

  • ページ
  • 1
  • 2

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 ← コメントアウト

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

(再生)

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

ESP32-C3 0.42 OLED

YouTubeで紹介されていた「ESP32-C3 0.42 OLED」が面白そうだったのでAliexpressで購入

IMG_20251101_091425.jpg

購入トラブル

送料無料(¥1,500以上)にするため3個注文したところ2個しか送ってこなかったため連絡板でクレームを出したが,どうやら現在のクレーム方法でなかったようで,解決までひと月も掛かってしまった

現在では返品を要求するとAliexpressから(日本語で)提案がきて発送元の業者間と調整することになるようだ(交渉は返品ボタンから開始となる)

今回は1個分の返金ということで終了

やはり中華は要注意ではあるが,Aliexpressも今では1W以内で送ってくるし問題があれば返品も可能なのでAmazon経由の中華送付(数か月掛かる)より良くなった

商品

袋を開けるとケースには本体とピンが入っている

IMG_20251109_101503.jpg

0.42インチのOLEDはかなり小さいが,これってコンシューマ向けで購入できるディスプレイ付きコンピュータとしては最小サイズなのかも

IMG_20251109_101540.jpg

Type-Cから電源を印加すると確認用だと思われるプログラムが動作した

IMG_20251109_101838.jpg

仕様

IMG_20251109_101604.jpgIMG_20251109_101549.jpg

参考:https://emalliab.wordpress.com/2025/02/12/esp32-c3-0-42-oled/

動作確認用スケッチ:https://spotpear.com/index/study/detail/id/973.html

 

少し動作させてみただけで,何に利用できるか考え中

ATS-25を作製する

ATS-25はタッチパネルカラー液晶で見栄えは良いが¥10k弱~¥30kと高価

またDSPがSI4732なので同じDSPのATS-20を所有してることもあり特に欲しいとは思わなかったのだけどソフトウェアが改良され機能と液晶表示に魅力を感じるようになってきた

オープンハード・ソフトウェア(ソフトウェアは一部ライセンスが必要な物もある)なので,これはもう作製するしかないと2024年の初頭に思い立ち部品調達を開始(ちなみに自作されてる方は多い・・・ので安心)

部品調達

国内で価格面や手に入り難いのもありAliexpressで購入したのだが,少々問題もあり再購入を繰り返し何とか春節前に揃った(実はまだ1件闘争中)

価格は税と送料込みで記載

  • SI4732:¥619/個
  • SOP16表面実装基板:¥27/個(¥277/10個)

IMG_20240212_130534.jpgIMG_20240212_130629.jpg

  • 32.768kHz(水晶発振子):¥22/個(¥220/10個)

手持ちもあるが発振不良もあるので念のため購入

  • ESP32開発ボード:¥503 もう1つは¥642(Type-C)
  • ESP32開発ボードアダプタ:¥370/個

IMG_20240212_125946.jpgIMG_20240212_125857.jpg

コンパクトな30pin版,L1なので安価なのか

アダプタの方は間違えて購入してしまったのだけど結果は役に立った

  • TFTタッチパネル(2.8インチ):¥1,440

IMG_20240212_130350.jpg

  • ロータリエンコードモジュール:¥61.5(¥615/10個)

IMG_20240212_125803.jpg

SWのプルアップは(この製品の場合)基板裏にショートパターンがある

  • バッテリ:¥550

IMG_20240213_150643.jpgIMG_20240213_151621.jpg

何年か前に購入した100均の¥500モバイルバッテリで3.7V4000mAhのリポ

充電回路はそのまま利用(ノイズ対策が必要か),出力はリポから直接三端子レギュレーターで3.3Vに降圧して使う

※)主回路はデジタルだが入力はアナログなのでノイズ元となるDCDCは極力使用しないようにする方針

  • その他:もろもろあるが後で再計算予定

ここまでで約¥3k(一台分)

ブレッドボードに組む

回路は「IU4ALH」さんの「SI4732_Radio as at PI4RAZ」から,変更もあるので回路図を作ろうとしたけど面倒だったのでイメージで修正

(最終版)

pict20240215_01.png

SI4732を実装基板に載せる

IMG_20240212_133747.jpg

注)半田付けを,左)気にしないでブリッジさせて吸取線使用,右)ブリッジさせないようピン毎に慎重に付けた,ので結果が異なる

TFTタッチパネルを3.3V用にする

IMG_20240213_173212.jpg

本来は各部品のチェックすべきだけど問題あったらやればいいやと思い組んでみた

IMG_20240215_173236.jpg

一発目:ソフトウェア「SI4735-Radio-ESP32-Touchscreen-Arduino-master.zip」を転送して電源ON・・・駄目でした(甘くない)

配線を再確認したが問題なし

TFTタッチパネルの確認

うんともすんともいわない液晶画面がまず怪しいので確認

サンプルプログラムで確認するがまったく反応しない,SPIのピン指定ミスとかだと思うのだけど解決しない

こちらの記事でやってることに間違いはないことを確認したが動作しないので不良品かと思っていたところ,もしかして「SI4735-Radio-ESP32-Touchscreen-Arduino-master.zip」をコンパイルするにあたりReadme通り編集した「TFT_eSPI」に問題があるのでは・・・と

結果「TFT_eSPI」を再インストールしたらサンプルプログラムは動作

IMG_20240215_153858.jpg

これでTFTタッチパネルは正常であることが確認できた

でも本筋は動作しない

SI4732の確認

画面表示までいかないので「SI4732」の問題かと考え2個目に付け替えてみたが同じ

液晶は関係ないので「PU2CLR」ライブラリの「SI4732」サンプルプログラムを導入してチップの動作確認する

何でも良さそうなのだけど「AM_FM_TOUCH_SERIAL_MONITOR」を使用したところヘルプ画面が出ただけで止まる

前後にdebug printを挿入して確認したところ「SI4732」の初期化で止まっていることが判明しI2Cアドレスが取得できていないことが判った

チップ周りに水晶以外の追加は無いので,水晶を交換したり電源のパスコンを調整したりしたが駄目

どうしようもなく更にAitendoの「SI4732モジュール」の回路図を参考にして元回路になくI2Cに関係のあるRST部分にパーツを追加したが駄目

・・・

大嵌りしていたところ10ピンSENBの配線に気付く

Aitendoの「SI4732モジュール」ではGNDに接続されてる!!

pict20240215_02.png

GNDに接続し直しても破壊されることはないのでやってみると動作しましたよ!

「SI4732」の版数で異なる?のか?(上の回路図は修正済 )

注)SENBはI2Cアドレス指定でH or L接続にて2つ選択できる,拙者の個体ではGnd接続でのみ動作したがライブラリでアドレスを自動判定していないのか?

サンプルプログラムで受信確認もできたので「SI4732」も良し(2個とも正常)

ソフトウェア

ようやくこれで動作するかと思いきや結局「SI4735-Radio-ESP32-Touchscreen-Arduino-master.zip」は動作せず「SI4735_2.8_TFT_SI5351_V.5.2b_Dark.zip」を試す

どうやら「TFT_eSPI」がキーらしく対応するバージョンでないと正常に動作しないようだ

YouTube「jashiチャンネル」さんの情報で「SI4735_2.8_TFT_SI5351_V.5.2b_Dark.zip」について対応する「TFT_eSPI」の情報がある

コンパイルエラーは最新の物でも発生しない(warningは出る)が動作はしない

ダウンロードした「TFT_eSPI_2.8inch.zip」は,ライブラリを削除(ライブラリのTFT_eSPIフォルダーの削除でも良い)した後,IDEでZIP登録(メニュ「スケッチ」>「ライブラリをインクルード」>「ZIP形式のライブラリをインストール...」を実行)しなければコンパイルエラーとなるので注意

IMG_20240216_150740.jpg

とりあえず,ようやく動作したのでAM,FMの受信確認

IMG_20240216_163403.jpg

なぜかATS-20より音が良好に感じるのは気のせいか

暫くFM受信で聴いていたら

IMG_20240216_162745.jpg

ディスプレイセーバーモードに移行するのね,素晴らしい!

明日から基板化とケース作りとなる

 

ESP32-CAMの利用方法を模索

ESP32-CAMを動作させたのだけど,3セット(Amazon)もあるので利用できないか考えるため調べてみた

IMG_20230731_115244.jpg

ハードウェア
  • 既にモジュール化されているので大きな変更はできない
  • 接続I/Oはカメラ,microSDスロット,高輝度LEDである
  • CPUはESP32SでEPS32と同じと考えてよく,おそらくI2CとSPIには不具合があるかと思われる
  • GPIOはあるが全て使用済なので利用は困難でSPIに接続されている4ピンをSPI未使用にする(microSDは不可となる)ことでOUTPUTピンとして利用できそう
  • モジュールから高輝度LED以外は取り外すことは困難
ソフトウェア

モジュール構成からカメラ機能を主とした利用形態しかなく追加できるI/Oもかなり限定されそうだ

カメラ機能が主なので元となるスケッチはサンプルのCameraWebServerが優秀で良いためプログラムを調べてみるとHTML(camera_index.h)がgzip形式になっていることが判る

HTMLソースが編集できないと画面の変更追加ができないのでネットで情報を得てみると最終的にgzip形式に変換する方法は判った

しかしわざわざgzip形式にすることもないのでそのまま編集できるように改造

①まずはサンプルを動作させてブラウザでHTMLソースを退避しヘッダーファイル(index_ov2640.h等,以下のように)にする

const uint8_t index_ov2640_html[] = R"=====(<!doctype html>
<html>
<head>
<meta charset="utf-8">


(省略)

</body>
</html>)=====";

size_t index_ov2640_html_len = sizeof(index_ov2640_html)-1;

橙色部分が前後に追加したテキスト

index_ov2640なのはスケッチで使用されているESP32-CAMのカメラタイプ名だから

②app_httpd.cppのcamera_index.hを外しindex_ov2640.hを使用

③同じくapp_httpd.cppのesp_err_t index_handler()を編集

(旧)
static esp_err_t index_handler(httpd_req_t *req)
{
httpd_resp_set_type(req, "text/html");
httpd_resp_set_hdr(req, "Content-Encoding", "gzip");
sensor_t *s = esp_camera_sensor_get();
if (s != NULL) {
if (s->id.PID == OV3660_PID) {
return httpd_resp_send(req, (const char *)index_ov3660_html_gz, index_ov3660_html_gz_len);
} else if (s->id.PID == OV5640_PID) {
return httpd_resp_send(req, (const char *)index_ov5640_html_gz, index_ov5640_html_gz_len);
} else {
return httpd_resp_send(req, (const char *)index_ov2640_html_gz, index_ov2640_html_gz_len);
}
} else {
log_e("Camera sensor not found");
return httpd_resp_send_500(req);
}
}

(新)
static esp_err_t index_handler(httpd_req_t *req)
{
httpd_resp_set_type(req, "text/html");
httpd_resp_set_hdr(req, "Content-Encoding", "identity");
sensor_t *s = esp_camera_sensor_get();
if (s != NULL && s->id.PID == OV2640_PID) {
return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len);
}
log_e("Camera sensor not found");
return httpd_resp_send_500(req);
}

汎用ではないのでESP32-CAMのindex_ov2640_htmlだけとなる

まずはUI部の対策のみ施した

ページ移動

  • ページ
  • 1
  • 2

ユーティリティ

検索

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

新着コメント

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