2024年4月20日土曜日

ESP WROOM-02(ESP8266) I2SとDMA(4)

なぜか持ってたWROOM-02を動かしています.
ESP8266にはI2Sが載っているので、DACを接続してみようかと思って調べています.

I2Sを使うからには、サンプリング周波数に同期してdataを出してやらなくちゃいけません.いちいちI2S statusをpollingしていたら他の仕事が出来なくなってしまって困ります.なのでこんな願望があります.
 1)DMAとI2Sを組み合わせてhardwareの自動でdata出力してもらいたい
 2)DMAがbufferの半分ぐらいまで消化したら割り込みしてもらいたい

開発toolはArduinoIDEを使っています.
ArduinoIDEでESP8266を使うために「Generic ESP8266 module library」をimportします.
同libraryのI2S exampleを見るとI2S.hというのをincludeしていて、main loop()の中で、
 I2S.write(data);
を永久にやってます.CPUを喰うやり方でなんだかなぁです.ちょっと使えん.

I2S.hに宣言されている関数を調べましたら、使えそうなのが2つありました.
 I2S.write(&buffer, size);
これはbuffer一括で引き渡します.中でDMAを起動しています.→上記1を実現か?
 onTransmit(void(*)(void))
これはwrite用のcallback関数を登録します.→上記2を実現か?

期待できそうなので試してみます.

↓それじゃぁI2S portにDACをつけるかと、I2Sのpin assignを調べたらなんと、丸印のpinが別件で使用中です.IO15,IO2はreprogramming用、RX0はUART用、やる気失せたぜ.

ESP32が中華通販から届くのを待ちましょうかね?
ESP32には8bit DACが載っているらしい.

かしこ

21 件のコメント:

  1. 船便で一月待ちましょう
    締め切りと思えばあっという間です

    返信削除
    返信
    1. マテバ回路の日和あり(誤字)

      削除
    2. 攻殻機動隊でトグサが、
      「俺はマテバが好きなの」
      とこだわってました。
      マテバって実在するんですね。

      削除
  2. 私は、ESP8266 の I2Sの応用として、この辺の記事
    https://qiita.com/Nabeshin/items/2a49b59e2a0c3a37e8c5
    ESP-WROOM-02(ESP8266)でWebラジオ
    を、参考にしてました。
    ※本家のURLは、
    https://github.com/espressif/ESP8266_MP3_DECODER
    (↑の記事にも載ってる)です。一応、espressif提供なのですが、記事中にもある通り、「所々」間違ってます(笑)
    なお、マトモに動かすには、外付け「23LC1024」が必要なのですが、入手できなかったので、秋月に売ってた、「23LC512」
    https://akizukidenshi.com/catalog/g/g114062/
    で、試したところ(プログラムは、一部修正)何とか、音は出ました。
    ※音源ソースによると思われますが、ちょっと動きが不安定。「RAM容量の差」では無いと思います。バッファが足りない訳ではないみたいなので。

    返信削除
    返信
    1. 「RX0はUART用」で、DATAと兼用なのですが、音楽再生中には通信してるわけでは無いので、実際は問題なく動きます。(debug message は、TX0なので関係ない。同時に「書き込み」とかしなければ、問題ない。)

      削除
    2. 一応、内部では「DMA使って」バッファに転送してたハズ。
      内部的には、「FreeRTOS」を使っていて、「バックグラウンド処理で、IS2転送やってたハズ。結構参考になる(まぁ、メーカーリファレンスだしね。)

      削除
    3. そのページわたしも見ました。
      sramを要するとはbuffer深いですね。
      USBよりもIPはレートが不安定だから深いbufferを使うとかいう事情かしら??

      削除
    4. わたしもそろそろRTOSのセカイに羽ばたく時でしょうか

      削除
    5. と言うか、ESP系のArduino は、内部で、
      ・FreeRTOS
      使ってるんで、既に「使ってる」と言えば使ってます。
      ※実は、init(), setup(), loop() 以外にも、裏で「モニタプロセス」が、勝手に走ってます。
      なので、「長時間帰ってこない処理」があると、終了(再起動だったかな?)してしまいます。
      (それを防ぐには、定期的に yield() を呼べばいい。)

      削除
    6. あと、ご存じかもですが、このサイト
      http://nopnop2002.starfree.jp/
      も、結構いいです。
      ※ここは、ESP系以外もイロイロ載ってる。というか、個人で良くここまで調べたなーと思った。

      削除
    7. >IPはレートが不安定だから
      ホントのインターネットのストリームだと、「23LC1024」くらい無いと、ダメな時がるカモですが、自分は「ローカルネット」にサーバーを建てて試してたので、そういう意味では「バッファ不足」にはなってません。接続が切れても「数秒くらい」は、再生してます(笑)(容量の差と言っても、「5秒」が「10秒」に、なる位だし。)

      削除
    8. ※「ESP32」は、内蔵RAMが多い(あと、処理能力も高い)ので、同様のことは、
      ・外付けRAMは不要
      で、出来ます。(コレも試した。断然、ESP32のほうが安定して動く)

      削除
    9. >ESP系のArduino は、内部で、FreeRTOS使ってる

      それはいい.vendorの資料を読んでみます.

      そのわりに割り込みサービスが出たとこ勝負っぽいのが残念かなぁ.天下り的に提供しといてくれたらうれしいです.

      STM32CubeMXはそこはしっかりしてます.

      削除
    10. >Arduino は、内部で、FreeRTOS使ってる
      但し、ライセンスの関係なのか、結構「古いバージョン」らしいです。
      ※なので、あまり機能に期待しないほうがいいカモです。
      それとは別に、もっと新しいバージョンの「FreeRTOS」を移植してるところはあるみたいですが。

      削除
    11. ※個人的には、「FreeRTOS」みたいなのを使うなら、「ESP32」位じゃないとダメだと思う。↑にも書きましたが、ESP8266は、なーんか動きが不安定です。ちょっとマシンパワー不足感がある。
      espressifも、「新規設計には使うな」って言ってるし。

      削除
    12. わたしのESP32がどこかで滞留している気配でなんでか届きません.来なかったりして.

      削除
    13. ※秋葉原行ってたんだったら、秋月で売ってたのに・・・

      削除
    14. 実にそのとおりです.
      今日はアキバ全域が混んでいて、秋月も人が多くてメゲてしまいました.moduleどこにあるのかと探したんだけど、挫折.
      アメ横はもっとすごくて、インバウンド>日本人 だったと思います.
      ぐだぐだのぱー

      削除
    15. 配置が変わってからどこにあるかわからないから
      どこですか?とコミュ症なので聞いてます

      削除
    16. アメ横は早朝と閉店後以外は混んでいるから避けて通る

      削除
    17. 秋月の棚はいつも探すの大変です.

      削除