Digital Video Shieldの応用編その2を紹介します。
Digital Video Shieldで使用しているビデオエンジンBT816はCo-Processorエンジンを搭載しており、LOADIMAGEコマンドを使用することでJPGやPNGの画像をデコードしてビットマップに展開する処理をBT816内で行うことができます。
BT816でデコードできるため、Arduino等の小規模のマイコンでもJPG、PNG画像を表示させることができます。
また、Digital Video ShieldにはmicroSDスロットがあるため、他の配線なしでSDカードに入った画像を読み込んで表示することができます。
JPG、PNG画像をBT816に読み込む方法はいくつかあります。
@SDカードデータ→BT816内のRAMに展開→BT816内のRAMからビデオ出力
ASDカードデータ→BT816内のRAMに展開→Digital Video ShieldのFlashへ書き込み→FlashからRAMへ展開→BT816内のRAMからビデオ出力
B@の方法でSDカードの代わりにコード内にバイナリデータを実装
CAの方法でSDカードの代わりにコード内にバイナリデータを実装
なお、BT816でデコードせずにそのままBitmapを表示させる方法はありますが、専用ツールで前処理(専用のファイル形式への変換)が必要で手間と汎用性に欠けるため、今回はこの方法は使用しません。
B、Cはマイコンに十分なROM領域がないと実現できないため、汎用性を考え、@の方法を紹介します。
Aの方法はDigital Video ShieldのFlashを活用する意味では魅力的ですが、BT816に接続されたFlashは読み込み時はそのまま読み込むことはできず、必ずRAMに展開する操作が必要となります。また、Flashのメモリは16MBでSDカードと比べると小さく、SDカードの方が汎用性が高いため、機会があれば別途紹介したいと思います。
全体手順
1. microSDに800x480の画像データをPCから保存
2. main while内、もしくはloop内にEveDemo3関数呼び出しコードを記述
3. Digital Video ShieldのSDスロットにメモリを挿入
4. マイコンに上記コードを書き込み
5. ディスプレイを接続して電源を投入する
6. JPG/PNGが表示されます
JPG/PNGのデコード、表示処理を行うEveDemo3関数の内部処理を簡単に紹介します。EveLoadJpgFile内でメモリから読み込み、デコード、表示処理を行います。
1. SDカード内の該当する画像ファイルを開く
2. CMD_LOADIMAGE命令を実行し、BT816内の汎用RAM領域RAM_Gにデータ展開する
※RAM_G展開したデータはCMD_LOADIMAGE命令で自動でデコードされます
3. デコードされたビットマップデータをEveCmdSetBitmapで設定します
※ここで高さ、幅は読み込んだファイルのそのままのピクセルサイズを設定します
4. 位置を変更する場合はVERTEX2II(x,y,...)で必要に応じて変換処理を行います
※今回は紹介しませんが、大きさ変更や回転させる場合はCMD_SCALE、CMD_TRANSLATEといったコマンドがあります
5. DISPLAY、DLSWAPで表示処理を行うことでディスプレイに表示されます
SDカードから800x480ピクセルサイズのJPG/PNGをBT816のRAMに読み込ませて800x480のディスプレイに表示させてみました。JPG/PNGのファイルをそのまま前処理(専用のファイル形式への変換)なしで表示できるのは非常に魅力的だと思いました。
ArduinoUNOでコンパイルした結果は 使用率ROM45%、RAM58%でまだまだ余裕があります。ArduinoUNOを使用してSDカードのファイルシステム、JPG/PNGのデコード、画像表示までできることが確認できました。ArduinoUNOといったマイコン側にRAM容量がなくともビデオエンジンBT816の大容量RAMによりこのような処理を実現することができました。BT816のRAMサイズは1MBあるため、JPG/PNGをデコードしたビットマップで1MB以下の画像であれば表示できると思います。
今回のサンプルはArduinoUNO及びSTM32F401 Nucleoで実装しています。Githubに上がっているコードをアップデートし、JPG/PNG読み込み例(EveDemo3)を追加しました。
Digital Video ShieldとArduinoUNOで自作フォトフレームといったことも簡単に実現できそうです。