● 実験テーマ81

「PIC32MX_UL024TF_カラーBMP表示実験」
(SDに収録の100x100BMPファイルを読込み液晶に順次表示+BMPテーブルに用意した320x240のデータを表示する2つの実験です)

以下、この実験の顛末記です。

■ 2016.8.23
  ・次のテーマを決めないと・・・
   やりたい事はあるが、みな難しいものばかり・・・
   前から、カラーBMPファイルを読込んで、QVGA液晶に表示する実験をしてみたい
   と思っていた。
   UL024TFに、
カラーBMPイメージを表示する簡単な実験をしてみることにした。

   モノクロBMPイメージの表示実験は、実験テーマ58で経験済みである。
   なので、基本的なBMPファイルの構造等は理解しているつもりではあるが、
   今回は、カラーイメージなので、色彩をどう出しているのかの仕組みを理解する
   必要がある。大昔アナログRGBの映像信号の勉強はしたことあるが、今回は、
   デジタル信号での話である。


■ 2016.8.24
  ・カラーイメージの表示関数は、後閑さんが作成されているが、それは、単色指定の
   ものでそのままでは使えない。(132x132dot携帯用液晶用→ 実験テーマ23参照のこと)
   それを基に修正を加えていくことにした。

   ところで、今使っている液晶は、16bitカラーで表示される。
   今更だが、16bitカラーて何? この辺から入らないといけないかも・・・

   webの記事だと、必ず、そのデータフォーマット「RRRRRGGGGGGBBBBB」形式というのが
   出てくるが、最初これが何を意味しているのかが解らなかった。
   webでなく、トラ技(2009年7月号:CMOSイメージ・センサのしくみと応用)の記事の中に
   解り易い説明書きがあった。以下その辺、要約してみました。
   
   16bitカラー(16bitRGBまたは、ハイカラーと呼ばれる)
   2^16= 65536色を表示できる。
   このフォーマットは、RGB565フォーマットと言う。
   RGB565フォーマットは、2byteの中に、RGBのデータを埋め込んだもの。
   それぞれの、R・G・Bの、5bit, 6bit, 5bitデータ(計16bit)は、色の階調(色深度)を表す。

   この説明で、「RRRRRGGGGGGBBBBB」形式とは、そういうことだったのかと理解できた。
   そういえば後閑さん作成のヘッダファイルには、16bitカラーコードが定義されていたが、
   あれは、代表的な12色に限定してのものだったということも解った。

  ・実験に際しては、サンプル画像を用意しないといけないが、16bitカラーのサンプルは
   web上又は、手持ちに殆どないので、24bitないし、32bitカラーBMPからの減色処理
   が必要である。(その他にサイズ変更とかヘッダ部の切り取りが必要な場合もあり→今回はサイズと減色のみ行った。)
   この辺はこのサイトが非常に参考になった→ 「マイコンな日曜」

   要は無償の画像編集ソフト:GIMPを使って減色処理を行えばよい。(サイズ変更は使い慣れているjTrimを使いました。)
   そして、RGB565フォーマットで保存すればよい。(使い慣れているjTrimにはこの機能はない。)

   あと注意する点として、BMPデータ配列であるが、生データは、画像の下の方のから、上の方に
   向かって配列されているので、この順番で、液晶画面の原点(左上)からピクセル描画していくと
   上下逆さまになるという点である。
   生データの配列を変換する機能は、GIMPには無いようなので、
   (別のソフトにあったが、BMPファイルのサイズは固定だったので使えず。)
   この辺の変換はしないで、描画ソフトの方で対応(描画順を変更)することにした。

   またプログラムの方であるが、最初の仕様は次のようなものにした。
    @ SDカードに収録されている16bitカラーBMPファイル(128*128ドット)を読出し、UL024TF液晶に、
       そのイメージを順次表示する。
    A 最初は、手抜きだが、画像の向きは逆さになるが気にしないで試す。

   プログラムは思ったより簡素なものになり、コンパイル〜HEX書き込みまでOKになる。


■ 2016.8.26
  ・最初のデバッグ開始。以下のような症状が出た。
   BMPファイルを読んでいるが、表示NG。
   画像の上半分(下の方の画素描画)は、正常だが、下半分(上の方の画素描画)が、モザイク状になる。

  ・最初この原因がなかなか解らなかったが、結局は単純な勘違いだった。
   ImageBufferの配列の要素数が半分の、8192だった。
   これは倍の、16384必要。
   つまり、1ピクセル当たり2byteのRGB565フォーマットなので、128x128ワードの配列が必要になる。
   しかし、これを直したら、リンクエラーでコンパイルが通らなくなった。
   どうも、RAM不足らしい。
   使っているPICは、PIC32MXで、RAMは十分ありそうなのだが、調べてみたら、PIC32MX340F256H
   のRAMは、32KBしかない。
   16384ワード= 32768バイト必要なので、イメージデータだけで一杯になり、変数エリアが取れなくなり、
   リンクエラーになる。
   まあ最初に気が付くべきだったが・・・
   よって、SDから読み出す方法でバッファリングする為には、表示ドット数を落とすしかない。
   例えば、100x100dotにすれば、10000ワード= 20000バイトなので、変数エリアも含めてもメモリ不足
   にはならないだろうということで、そのように修正することにした。


■ 2016.8.27
  ・修正後の動作確認はOKになる。
   今度は、イメージ描画関数の方で、
   右上の画素(ptr=9999(ImageBufferの最終ポインタに右上側の画素データが格納されている), Xpos= 99, Ypos= 0)
   から下に向かって描画するように修正し、表示が逆さまにならないようにした。


■ 2016.8.28
  ・一応、100x100dotの小さいサイズの、16bitカラーBMPの表示は出来た。
   せっかくなので、QVGAサイズの表示も見てみたい。
   前にも書いたが、このサイズではPICのRAM不足のため、SDからのバッファリングが出来ない。
   そこで、ROM(プログラムメモリ:256KB)の方に、
定数データとして、QVGAサイズの
   BMPテーブルを用意して実験することにした。

   それには、BMPのバイナリデータを、C言語で扱える形式(0x・・・・)に全てのデータを変換しない
   といけない。
   数バイトなら手作業でもよいが、154KB近くあるので、とても出来ない。
   WEBには、ありがたいツールがアップされているもので、「レフトアームテクノロジー」さんのページに
   バイナリデータのC(C++)ソース化のアプリ「Binary File Extractor」がアップされています。
   (これも「マイコンな日曜」さんのページで知りました。)
   今回はこのツールを使って、テーブルを用意することにしました。

   以下にその表示例を示します。
   結構綺麗に発色していると思います。

  ・尚、今回の実験回路は、
   実験テーマ80にアップされている「PIC32MX_UL024TF_TP実験回路」(PIC32MXトレーニング基板使用)
   と同じなので、それを参照してください。


<最終ソース>
 ・こちらから、どうぞ→ @ 「PIC32MX_UL024TF_ImageDisp_TEST.c」 (100x100dot版:SDから読込む方式)

                   A 
「PIC32MX_UL024TF_ImageDisp_TEST_2.c」 (320x240dot版:データテーブルから読込む方式)


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ82へ →