マイコン工作実験日記

Microcontroller を用いての工作、実験記録

DoomPlayer -- Music Player

2023-01-27 22:38:38 | DoomPlayer

Music Player部分は、昨年のNucleo版と同じようにLVGLのデモをベースとしていますが、次の点がNucleo版やデモとは異なります。

  • WADファイル内のMIDIデータを元に演奏している訳ではなく、SDカードに保存されているFLAC形式の音楽ファイルを再生している。
  • 44.1Kのデータを1/3に間引いたものをFFTしてスペクトラム表示を行っている。
  • FLACファイルに含まれるメタデータからタイトルとアーティスト情報を取り出して表示している。

FLACのデコーダとしては本家のデコーダが有名ですが、1ファイルだけで作られているdr_libsというデコーダ があったので、これを使ってみました。

DualSenseでのボタン操作もできます。入力操作対象のボタンをフォーカス表示したかったのですが、Image Button Widget を使った丸ボタンでは、outlineを描画してしまうと、ボタン周囲に四角で表示されてしまいます。丸ボタンの周囲を囲ったImageを新たに作成すれば良いのですが、デモ画像のデータには元データとして使えるPNG形式のようなファイルが用意されていないので、代わりに少し暗く表示することで操作対象ボタンを表示することにしました。上図の例では、PLAYボタンが暗めに表示されており、下図の例ではFFWボタンが暗めに表示されています。

そして、次の図ではホームボタンの周囲に枠線が引かれており操作対象であることを示しています。

また、タイトルやアーティスト名が長い場合には、次の2枚の画像に示すようにスクロール表示する機能を入れてあります。

 


DoomPlayer -- メニュー画面

2023-01-19 22:57:37 | DoomPlayer

起動画面でフラッシュのゲームを選択すると、続いてメニュー画面が表示されます。

昨年、Nucleoボード用に作った時と同様のメニュー画面ですが、DualSenseのデモ機能が用意されたので、そのためのボタンが追加されています。ただし、DualSenseがつながれていない場合には上図に示したように該当ボタンは無効になります。この状態で、DualSenseをつないでやると...

デモのボタンが有効になるとともに、オーディオ出力の選択ボタンも表示されます。DualSenseが接続されていない状態では、オーディオ出力はI2S経由でボード上のジャックが選択されます。DualSenseが接続されている場合には、USB経由でDualSenseのオーディオジャックからの出力を選択することもできます。

DualSenseのUSBオーディオ出力は、48KHzしかサポートしていません。そのため、SDカード上の44.1KHzでエンコードされた音楽データを再生する際にも、48KHzで出力しており再生速度がちょっと早くなります。44.1KHzから48KHzにレート変換をしてやればいいのですが、ソフトでこれを処理するのは、ちょっと負荷が重そうなので未実装です。効果音は、WADファイル上では11025Hz (44.1Kの1/4)で記録されているので、これを再生する際には補間してレートを4倍に変換してから、同じく48KHzで再生しています。

このようにUSB経由でのオーディオ出力は再生速度に難がありますが、振動をサポートできるのが魅力です。DoomPlayerでは、効果音データを使って振動を発生させることができます。具体的には効果音データをUSBオーディをのChannel #0, #1だけでなく、Channel #2, #3にも出力してやるだけのことですが。


DoomPlayer -- 起動画面

2023-01-15 10:08:33 | DoomPlayer

DiscoveryボードでのDoomPlayerでは、SDカードカード上にWADファイルやFLACフォーマットの音楽ファイルを置いておくことにしました。起動時には、まずこれらのファイルがSDカード上に用意されていることを確認します。

SDカード内容の確認ができたならば、次に正規のWADファイルがSPIフラッシュ上に書き込まれているかどうかを、CRCを計算することで確認します。フラッシュの読み出しと CRC計算には数秒かかります。

SPIフラッシュにWADファイルが書き込まれていれば、上図のように緑色ボタンでそのゲームタイトルが表示されます。下側のオレンジ色のボタンリストには、SDカード上に見つかったWADファイルのタイトルが表示されます。緑色ボタンの周囲には青い外枠線が描かれていますが、この外枠は入力フォーカスがあることを示します。DualSenseを使っての操作を可能にするために、Group を使っているのでこのように外枠が描画されます。

オレンジのゲームタイトルをタッチすることで、SPIフラッシュの書き換えを開始することができます。

選択したタイトルへの書き換えを開始することを確認して、Yesを押せば、、

まずは、必要な領域の消去を行なってから、設定ファイルやWADファイルのコピーが行われます。

消去やWADのコピーには時間がかかるので、進行状況表示を入れてあります。

コピーが完了するとリブートのプロンプトが表示されるので、ボタンを押すと再度SDカードの内容確認とSPIフラッシュの内容確認が実行され....

緑ボタンの示すゲームタイトルが変更されていることがわかります。もし、書き込みに失敗したり、まだSPIフラッシュへの書き込みが行われいなければ、

ゲームボタンの部分が無効を意味する灰色表示になり押せなくなります。

上記の画面表示は、すべてLCDのフレームバッファの内容をキャプチャしたものです。最初は、画面表示をカメラで撮影するつもりだったのですが、撮影場所の都合で照明の映り込みが発生する上に、STM32H7B3I-DKのLCDがTNパネルのため、ちょっと斜めから見ると発色が悪くなり、綺麗に画面撮影できないのが不満でした。そこで、フレームバッファの内容(RGB565)をSTM32H7のJPEGエンコーダを用いて、JPEGに変換してSDカードに保存する機能を実装しました。ボード上左側のUSERボタンを押すことで画面をキャプチャするようにしています。

JPEG圧縮する際には、解像度が落ちないように4:4:4でサブサンプリングしていますが、単純な画面構成なので、いずれの画像も20KB以下の大きさに収まっています。

2023/1/23 修正削除:フラッシュのCRC計算に時間がかかっていたのは、フラッシュへのアクセスがOctoモードではなくSPIモードで行われていたことが判明。これを修正して、1秒もかからずにチェックが終了するようになりました。


DualSenseをつなぐには -- その3

2023-01-08 15:01:50 | DoomPlayer
ずっと、STM32H7B3I-DKにDualSenseをつなげた際のエラー発生で悩んでいましたが、以前の記事に書いたようにFull Speedのモードで動かすことで、改善はできたもののまだまだ満足できるものではありませんでした。その後も試行錯誤を続けていたところ、LVGLの描画の際に使用するDRAMのメモリ領域を変更したりしてみたところ、さらにエラーの発生頻度を下げることができました。まだエラーが発生しなくなったわけではありませんが、まぁ我慢できないことはないという程度には改善しました。

エラーが発生する原因は、ノイズだと推測されますが、その発生原因はまだわかっていません。STM32H7B3I-DKではMCUコアの電源はSMPSモードで動作しています。これをLDOモードに変更すれば消費電流は増えるものの、ノイズが減少するかもしれないと考えていたのですが、現状では一通りの動作に支障がない程度までエラーが軽減できたので、このまま作業を続けることにしました。また、エラーが増えることがあれば、LDOモードへの変更を試してみようかと思います。

前記事では、DualSenseのボタンやスティクなどのHID動作を一通り確認してみました。DoomPlayerでは、当然ながららGameでのジョイスティック動作としてDualSenseを用いることができるようにしていますが、これに加えて LVGLの操作においても、タッチパネルだけでなく DualSenseのボタンを使っても主な操作ができるようにしています。昨年、Nucleo-H7A3を使った時と同じ機能をSTM32H7B3I-DKでも実現できるとことまできたので、次の記事からは機能のあらましを紹介していきたいと思います。