その1の方法だと再生が終わるまで帰ってきてくれないので、音が出ている最中に止めたり他の音に変更することができません。そのヘン改良したのがこちらです。
なおこちらはKickstarter製品で使ったコードの一部です。
setupではI2S関連の初期化と音を出力するためのタスクsound_loopを準備しています。
loopでは割り込み要素として加速度計を使っていて、3軸合成加速度が平均値(ほぼ重力)を一定以上越えたら音を出力するフラグsoundOnを立てます。
sound_loopではループをぐるぐる回って、大きな加速度を検知してsoundOnがonになったら音源番号iSoundを変更して再生位置iを初期化し、内側のループでi2s_push_sampleを使って1音ずつバッファにプッシュし、音を出力します。再生が終わるか、音源番号が変わったらループを抜けます。
内側のループにはウエイトを入れていないですが、DMAバッファがいっぱいになるとi2s_push_sampleで止まるので、大丈夫っぽいです(ポイかよ)。
まぁこんな感じで…。
2018年3月19日月曜日
2017年9月1日金曜日
ESP32でI2Sから音を出す
![]() |
| Kickstarterプロジェクトで使ったI2Sに関するメモ |
■内蔵DAC, PDM, 外付けI2S■
esp-idfのexample/peripheral/i2sにサンプル入ってますけど、これ動きました?DAC, PDM, I2S、いずれも苦労しました。DACとI2Sは符号付き整数、PDMだけ符号なし整数でデータの塊を作ってi2s_write_bytesに渡しますが、i2s_driver_installへのパラメータが試行錯誤の山でした。
PDMはやたら音が歪んでしまい、パラメータをいじりまくったのですが改善しないのでギブアップしました。正弦波を出して第二高周波が-10dBも出ているのは辛いです。DACは素直に入れた通りの波形が出てきます(あたりまえですが)。
で、I2Sに関しては、MAX98357Aを接続し、最終的に以下のコードで動きました。なお、MAX98357Aはモノラルなので、データは符号付き16ビット整数をみっちり詰め込んで渡します。
■(追記)続編です■
再生の途中で中断したい場合の処理を追加しました。2017年5月4日木曜日
ESP32とI2SアンプをつないでWebRadioを受信
■ESP8266のWebRadio未だ成功せず■
以前ESP-WROOM-02で試した時はうんともすんともだったのですが、今回ESP32-DevKitC ESP-WROOM-32開発ボードとMAX98357A(I2S 3W D級アンプ)という組み合わせであっさり成功しました。■ESP32のI2Sはあっさり動いた■
接続はGPIO22とDIN、GPIO25とLRC、GPIO26とBCLK、あとは3v3とVin、Gnd-Gndを接続するだけです。このブレッドボードだと1列しか外に出ないので、IO22, IO25, IO26はモジュール下から直接硬いジャンパーワイヤーで接続しました。赤黒2本のジャンパーはアンプの出力をヘッドホンジャックにつなぐためのものです。ESP-IDFは事前にインストール済(ESP32開発ボードをMacで)だったので、上記をzipでダウンロードして解凍、一番上のディレクトリでmake menuconfig、Serial flasher configでシリアル関連の情報(/dev/tty.SLAB_USBtoUART、速度921600、detect flash size when flashing bootloader, make monitor boud rateを921600)、Wifi ConfigurationでSSIDとPassword、AudioでGeneric I2Sを選択し、保存します。
make flashであとはコンパイル&ビルド&書き込み。プリセットされた局から明るい音楽が流れてきます…と思ったらバッファーアンダーランでガチャガチャになりますw
main/include/playconfig.hに局がいくつか設定されていますが、#define PLAY_URL "http://ice1.somafm.com/illstreet-128-mp3"は’それよりだいぶ聞きやすいようです。
いやー。MAX98357AはちっこいのにI2S入力でD級3W出力。すげー音量ですし鳴らしっぱなしでも温まりもしません。最近のD級アンプはすごいなや。
とりあえずESP32 + I2Sが動作するということは確認できたので、Kickstarterのお手伝いプロジェクトは次に進みます;-)
2016年10月6日木曜日
ESP-WROOM-02でI2S DACを動か…せない
I2S WebStreamingのために買ったES9023ボードですが、今のところまだ成功しておりません。
せっかく(というほどの値段ではなかったですが)ES9023のDACを買ったのに使わないのはもったいないなぁと思いつつオクラにしてました。
が、こんなのを見つけました。ヒャッハー!
ともかく、esp-open-rtosごと落とします。なお、open-rtosのビルドについてはこの手順でどぞ。macの場合、case sensitive volumeなどが必要なのでちょっと一手間必要です。
ESPのFlashに入るような手頃なサイズの音源がなかったので、GarageBandとiTunesを使ってWAV作りました。もしかしてできるかな?と思ってググったら出てくるからインターネッツはすばらしい。ありがとうございます。
なお、iTunesの仕様が変わってしまって、記事の通り「曲」を右クリックをしてもWAVファイル作成のメニューは出てきません。ファイルメニューから、変換>WAVバージョンを作成 で作れます。
かくして、ピアノの鍵盤を3回押しただけのsample.wavが出来上がりましたw examples/i2s-audio/の下に files ディレクトリを作り、その中に入れます。
で、ビルド…しようと思ったら、久しぶりすぎてrtos sdkの想定しているesptool.pyとパラメータが異なりエラー。
ということでesptoolをアップデート
$pip install -I esptoolで、今度こそビルド&インストール!
make flash -j4 -C examples/i2s_audio ESPPORT=/dev/tty.usbserial-DN01J0KN通った! で、ES9023をつなぐまえにwktkしながらオシロをつないでみました。出力はGPIO2 = LRCK, GPIO03 = DATA, GPIO15 = BCLKとのこと。
結果。
GPIO2にクロックみたいなものは出ているのですが、不規則。DATAとBCLKは出てませんでした。
…はい、また失敗です。うーん。
2016年6月4日土曜日
ESP8266:I2S MP3 webradio streaming example(give up)
ESP-WROOM-02でI2Sを動かせないかと思ってググっていたら、上記記事がヒットしました。
Web StreamingがESP8266で出来る!
なお、記事をよくみるとSPI RAMはSD_D0など見慣れないピンにつながっています。これ32pinのESPじゃないとダメですね。幸いなことにDACもSPI RAMもなしで動く、と書いてありますので、SPI RAMなしで行きます。ES9023も微妙に高かったので、同じように動作するはずのPCM5102ってのを買いました。ebayで1000円ぐらいでした。
上記リンクの通り配線しますが、ES9023ボードはライン出力なので別にアンプを用意する必要があります。
- PCM5102(ES9023)ボード用電源(とりあえずUSBから取ります)
- ブレッド‐ボードなど配線材料
数日間チャレンジしたのですが、動かすことができませんでした。最終的な原因はシリアルのコンフリクトだと思います。私は一旦ギブアップしますが、引き継いでくださる方のために記録を残しておきます。
■ダウンロード&ビルド■
このサンプルはfree-rtosで書かれています。ので、まだfree-rtosの環境がなければ、こちらをご参考にどぞ。各種設定は mp3/user/playconfig.h で行うことができます。上から順番に見ていきます。
接続先のWIFI SSIDとパスワードをAP_NAMEとAP_PASSに設定します。
MP3_DECODERをダウンロードしたままの状態だとローカルのサーバからMP3をダウンロードする設定になっていますが、面倒なのでやめます。リストされているうちでは icecast.omroep.nl ってところだといい感じに接続できました。そのすぐ上の #if 0 を #if 1 に書き換えます。そして #if 1になっている 192.168.33.128 のところを #if 0 に書き換えます。ご自宅にラズパイなどでストリーミングサーバを立てている場合には、それを活かしてみましょう(動作を確認した後で)。
I2Sをつないでいるので DELTA_SIGMA_HACK をコメントアウトします。 PWM_HACK はそのままコメントアウトですね。
上記の通りSPI RAMは使わないのでFAKE_SPI_BUFFの行のコメントを外します。
ビルドはgithubに書いてあるとおり、コマンドラインで当該ディレクトリに移動してからmakeです。たぶん問題ないと思います。ツールが見つからない旨のエラーが出る場合にはパスを設定していあるか確認してください。make対象がないというエラーはディレクトリが違います。
make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=80 SPI_MODE=QIO SPI_SIZE=1024エラーがでなければ、ESP-WROOM-02にダウンロードします。なお、元記事にも書いてありますが、コンパイル後に出る eagle.irom0text.bin---->0x40000 は間違っています。下記のように0XA0000から書き込みをしてください。USBシリアルとESP-WROOM-02をつないでPROGとRESETを一緒にGNDに落とし、RESETを先に離してからPROGを離し、ダウンロードモードにしておきます。Board1の場合には白ボタンと赤ボタンを一緒に押して先に赤ボタンを離してから白ボタンを離します。コマンドラインで
cd mp3
esptool.py --port /dev/tty.usbserial-AH016T8K --baud 115200 \
write_flash 0x00000 ../bin/eagle.flash.bin 0xA0000 ../bin/eagle.irom0text.bin
これでConnecting...以下の表示が出ればOKです。
Connecting...動作はあまり安定しておらず、起動してすぐにexception、数秒走ってはexceptionが出る…を繰り返して、Rxのランプが点灯しっぱなしになったらGPIO15とRxをオシロで見てみます。数MHzのパルスが出ていればひとまず動いてます。
Erasing flash...
Writing at 0x00009c00... (100 %)
Erasing flash...
Writing at 0x000df800... (100 %)
Leaving...
…ここまでplayconfig.hを試行錯誤して数時間かかりました。
ただ、LR切り替え信号が出てません。この信号がDATAのスタート信号になっているので、これがでないとDAC動いてくれません。
ソースを見ると、Tx / RxをI2Sの信号に使っているのにSerialにprintfでメッセージを出しているのですが…これ問題ないのでしょうか? UART_SetBaudrateをコメントアウトして動作に影響しないようにprintfをコメントアウトしてみましたが、ダメでした。
うーん、あと一歩だと思うのですが…ここまで動かしてギブアップするのは残念です。ただ、I2Sの使い方についてはいい勉強になりました。Tx/RxはDMAでバッファを使えるんですね。当面使う見込みないけどもw
以上お目汚し、失礼しました。
登録:
投稿 (Atom)

