2020年5月23日土曜日

microSDの画像を超小型カラー液晶パネルに表示

ちょっと苦労しましたが、seeeduino XIAOを使ってmicroSDに入れたBMP画像を超小型カラー液晶パネルに表示できました。microSDのソケットは秋月のDIP化キットを使っています。こんな感じで160x80のBMP画像(24bit)を表示できました。


Adafruit ImageReader Library (V2.3.5) というライブラリが、SDカードの読み込みと表示をサポートしていたので、安直にこれを使いました。160x80の液晶もサポートしています。スケッチのサンプルは以下にあり、これを流用してみました。

ファイル > スケッチ例 > Adafruit ImageReader Library > breakoutST7735-160x80

しかし、当初は下記写真のように変なネガのような色の表示となってしまい、BMPファイルフォーマットの違いか、作り方が悪いのか昨夜、3時間程悩みました。RGBカラーのRedとBlueが逆転しているようです。


ライブラリの初期化のときに下記のように "INITR_MINI160x80" というオプションを使うのですが、試しに元々このライブラリが作られたときの "INITR_GREENTAB" というオプションらしきものを指定したら、色が正しく表示されました。ただ、液晶サイズが異なるので斜め、かつ欠けて表示されます。

     tft.initR(INITR_MINI160x80); // Initialize screen

しかし、これでBMPファイルの作り方の問題ではなかったことが分かったので、ライブラリの中身(Adafruit_ST7735.cpp)を見てみることに。 GREENTAB と MINI160x80 で何が変わるのか見てみると tabcolorなるものの値が変わることが分かりました。そこでこのtabcolor値をGREENTAB と同じにしたら、無事に色問題が解決しました。

以下、反転している箇所が追加したソースです。この修正方法が妥当なのか分かりませんが、結果オーライとします(もっと正しい修正方法があるかも。あるいはライブラリの使い方の問題かも)。


seeeduino XIAO , microSD, ColorLCD の接続は以下です。前回のグラフィック表示のときと変えています。microSDアクセスは、SPI通信用ピンが固定のようなので。



スケッチ内でのピンアサイン定義は以下のみで済みました。

#define SD_CS    7 // SD card chip select
#define TFT_CS   4 // TFT select pin
#define TFT_DC   6 // TFT data/command pin
#define TFT_RST  5 // Or set to -1 and connect TFT RST to Arduino reset pin

使ったmicroSDカードは以下です。FAT32でフォーマット(してあった)、ルートディレクトリ直下にBMPファイルを置きました。


以下、動画です。動画前半は、microSDから読んで表示、というのを繰り返しています。まずまずの速さで表示が書き換えられています。後半は1画像表示したら2秒待って、次の画像を読み・表示を繰り返しています。


メモリ内に複数の画像を読み込んでから、切り替えようとしてみましたがうまく行きません。1枚だけならできました。XIAOはSRAMが32KBで、160x80のBMPサイズは単純計算で160x80x3(24bit)=38KBなのでメモリ不足だと思う。その割には1枚がちゃんと処理できたのはすごいな。


0 件のコメント:

コメントを投稿