ST7735にarduinoで液晶知識0からの画像表示 SDカードの画像を表示してみる!

前回で0.96液晶(ST7735)とarduinoの接続とテストが終わりましたので、これで次の段階に進めます。

いよいよSDカードからのBMPファイルの表示を行います。

今回も色々と苦心していますw

今回参考にするのはこのサイトです。

TFT液晶の配線は前回のままです。
(実はこの時の配線用にarduinoの元のスケッチ例の配線とは変えてありました^^;)
SDカードの配線は
SDカードモジュール    arduino
GND------------GND
VCC------------5V(製品によっては3.3Vの時も有ります)
MISO-----------D12
MOSI-----------D11
SCK------------D13
CS------------D10です。
SCKとMOSIはTFT液晶の配線と被ります。
VCCについはこのSDカードモジュールは5Vでの駆動です。
はじめ3v3に接続していてSDカードモジュールが機能していなく、どうやっても画像が表示できなくて1日くらい悩みましたww別途購入したSDカードモジュールは3.3Vでも動きました^^

で、上記サイトの配線図見ると液晶との間に抵抗が入っていますが、今回の場合は無くても駆動しました^^

次にSDカードに画像を用意します。
条件は
①BMPファイル 「aaa.bmp」とか書いてあるファイルですね。
②ファイル名は日本語禁止 「画像.BMP」とかは使えません。
ファイル名の長さはこのプログラムでは関係ないようです。
ただ、画像サイズが大きすぎると確認が難しくなりますので(例えば風景画の空の一部だけ表示されて画面全体が青とかw)液晶をrotation(0)の時つまり長軸を縦として使った場合の画像を作ります。
使うのは超高級ソフト!ペイントwウインドウズのアクセサリーの中にあるペイントですねw

画像を開いた後、左上のサイズの変更で、ピクセルを選び水平方向に80と入力してOKボタンを押してください。この液晶は縦160、横80の液晶となります。このサイズを超えた場合は超えた範囲が描画されないだけで特に問題は有りませんが、先ほど書いたような理由である程度の大きさにしておいてください。
このような画像を何枚かSDカードに保存してください。

後は、上記サイトの「Full Arduino code:」と書いてあるプログラムをコピペします。
あとスイッチとしてD2をGNDにつなげると画像がドンドン表示されます。
するとこんな感じになります。

あれwなんか色が変ですし、画像の位置もおかしいですよね?
ちょっとコピペしたプログラムの方を見てください。

35行目に   tft.fillScreen(ST77XX_BLUE);

と有りますよね。これ画面を青で塗りつぶす命令なのですが、赤で塗りつぶされていますよね
実はこれこそ、前回ライブラリーの導入でご紹介したこちらのサイトの分からないから飛ばした<動作確認>の所の記述が関係してきてるんです。

はいwここの修正が分かるまで丸1日かかりましたww

では修正していきましょう。

//—————-追記———————————————–

色がおかしくない場合は、

33行目の tft.initR(INITR_BLACKTAB);

tft.initR(INITR_MINI160x80);

で終了です。

//———————————————————————-
このずれはそもそも

33行目の tft.initR(INITR_BLACKTAB);

これが関係しています。
初期化にBLACKTABとか変な名前付いていますよね~。でもよく思い出してください、

単なる保護用のシートと思いましたが、ここにグリーンのタブ付いていますよね。
実はこれの事を言っているんです。
この初期化のコマンドで、このTABを選択することによって色の表示がRGBかBGRにかわるんです。つまりこのコマンド部分を黒のタブでなくグリーンのタブを指定してやります。

33行目 tft.initR(INITR_BLACKTAB); →   tft.initR(INITR_GREENTAB);

に変更すると色は通常の表示になります。(コピペの場合は最後の「;」マークを忘れないように、それと前後の空白を含まないようにしてください
でもそれだけだとまだ位置のずれが治っていないんですよね~。
ここを直すにはもうひと踏ん張り必要です。

ちょっとだけ難しくなりますよ~w
まずはPC内のドキュメントのArduino\libraries\Adafruit_ST7735_and_ST7789_Libraryというフォルダを表示してみてください。ここにある

Adafruit_ST7735.cpp

を編集します。
念のためコピぺで元ファイルをどこか別の場所に保存しておいてください。
このファイルをテキストエディーターもしくはメモ帳で開いて編集していきます。
私の物はAtmel Studoiなので色付きですがその辺は気にせずにw
中を見ていくと後半くらいにこんな記述の部分が有ります。

ちゃんと160x80用の初期化コマンドも有るんです。
この赤線の下に書いてある「 }else 」までのプログラム達が画面の開始位置の設定をしています。
ですから、

_height = ST7735_TFTWIDTH_80;
_width = ST7735_TFTHEIGHT_160;
displayInit(Rcmd2green160x80);
_colstart = 24;
_rowstart = 0;

これを黄色線の下の 「}else if((option・・・・・・・」までの{}の中身部分を消してコピペしてもいいのですが、今後他のグリーンタブの液晶を使うことを考えるとちょっとな^^;てなことでINITR_MINI160x80が使えるようにします。
実はこのINITR_MINI160x80を使うと位置表示は問題なくなるのですが、色が以前の赤と青が入れ替わった表示となってしまいますw

そこでちょっと改修が必要です。

まずは先ほどの画像で表示されて居た部分の少し下に行くと

(赤色の線が先ほどの画像の赤線部分です)

青色線部分

if ((options == INITR_BLACKTAB) || (options == INITR_MINI160x80)) {

と有りますが、この下のコマンドでわざわざ色の表示方法を変えてあるんですねwなんちゅう邪魔なことをしてくれてるんだw

if ((options == INITR_BLACKTAB) || (options == INITR_MINI160x80)) {

if (options == INITR_BLACKTAB) {

と書き換えてINITR_MINI160x80を外してやります。
さらにそこからさらに下のこの部分

とさらに下のこの部分

の赤矢印部分3か所

if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) {

if (tabcolor == INITR_BLACKTAB) {

に変更します。
これで、保存して終了です。

この後、先ほどのあのサイトからコピペしたプログラムの33行目(一回GREENTABに書き換えていますから)

tft.initR(INITR_GREENTAB);  →  tft.initR(INITR_MINI160x80);

に修正して下さい。

これで

色も表示位置も修正されたと思います。

さて、これでSDカード内の画像の表示が出来ましたが、今このままだと内部の画像を次々に表示されるので色々やるにはちょっと困るw
指定の画像が表示できるようになりたい!
てな方用のプログラムはこちら

要は、あのスイッチとなる部分のプログラムを削って、

bmpDraw(“MISA40.bmp”, 0, 0);

とファイル名を指定してやっただけですw
ちなみに、ファイル名の部分にはかならず「”」のマークを前後に付けてください。
その後ろの「0,0」はその画像の左上の始まる位置で、これによって画像の表示位置を変えることが出来ます。この辺は色々と数字を変えて試してみてください。

ちなみにこのライブラリーでは描画は上書きなので、画像を表示した後前回のグラフィックテストに載っていたコマンドでラインや文字を書き込むことも出来ます。つまりプログラムに書かれた順番が後の方が上に描画されるという事です。

それと色ですが、簡単な物でこの位あります。

ST77XX_BLUEと書かなくても0x001Fと書いてもいいようです。
ちなみにここに書いてあるようにBLUEと書くとエラー出ますw
ST77XX_YELLOWてな感じで「ST77XX_」が必要なようです。

なお画像の表示が一部おかしくなる時もたまにあります。そんな時はブレッドボードの接触不良がほとんどです。

これでこの液晶でのお約束の画像表示完了です!!

 

ただ、arduinoのコンパイル終了画面見てくださいw

ちょw

フラッシュメモリを71%も使ってますwこれじゃ他のプログラム書いていくとやばいかも・・・・

他の画面表示のプログラム追加すると

やっぱり、やばかったww!!
どうするよσ(゚∀゚ )オレw??     続くw!

 

関連すると思われる記事:

6 comments

  1. うむ。お疲れ様ですw

    「何かをしたい!」ってエネルギーは大事ですね。
    画面を横にして端っこにだけ任意の画像を表示したいっつう
    よこしまなパワーがここまで勉強をさせるという。

    Arduinoユーザーでよかった。
    歩く前に、こんなに道を整備してくれる人たちがいるからw

    Vividさんはこれをpicでほぼイチからやろうとしているわけでしょ?
    もう神レベル変人ですねww

  2. gyoさん こんにちは!
    よこしまパワー全開ですw
    gyoさん曰くの、とりあえず敵陣に突っ込んで行ってわけもわからず武器を振り回す感じですねw
    多分ね、前回の記事とココの記事でBMP画像の表示は問題なくすんなり出来ると思いますよ。
    ぜひ試してみる時にはこの記事の事思い出してやってくださいw

    そうなんですよ~arduinoですからこの位で済んでいますが、これをPICで一からとかもう変人レベル通り越して神ですよねw
    なんでもSDカードのデーターの読み出しに成功したとの報告も貰いましたw
    もうホント凄すぎますw

  3. ふたたびこんばんは!
    いや、もうなんとも6jiroさんもすごすぎます。Vividさんはさらに宇宙の果ての領域だし(^^;
    ここまできたら、どういう演出が飛び出すのか?この描画速度をどこまで改善して自然に見せてくれるのか?などさらに期待が膨らみます。ESP32も使いこなしちゃえば、SDカードモジュール持たなくてもWifiで外部からデータダウンロードしながら、とかもできちゃいそうでw

  4. こんばんは!
    変人です(笑)!
    ほんと、6jiroさんのパワー凄いですね。これ、Arduinoに対する「愛」でしょうか?(笑)
    当方は、PICのライブラリが見つかって、紆余曲折の末何とかTEXTファイルの読み書きができるようになりましたが、BMPファイルは、ヘッダーの解析などかなり敷居が高くて苦労しています。
    あっ、そうそう、ちゃんと動作しているので良いのでしょうが、SDカードの信号線(電源以外)を5Vに10KΩ位でプルアップする必要があるみたいです。
    私の場合、SDカードのイニシャライズコマンド(フォーマットではなく)の途中で、コマンドが通らず、ずーっと悩んで、色々調べたらプルアップが必要だとありました。
    これをしたらすぐにOKになって、TEXTファイルのR/Wまで行けました。

  5. なおさん 再びおはようございます!
    なんか、色々と頑張っちゃいましたが、arduinoの限界も感じちゃいましたw
    そもそもメモリーがこんなに少ないと液晶での表現には使えませんwポイッw
    ここまで来ましたが、arduinoでのプログラミングは無理です。
    次の選定としてESP32、ESP8266となるのですが、この辺でまたひと悶着有りますのでまた後日。
    wifiやBluetoothとか使いたいんですけど送信側の問題なんですよね~。スマホのソフト開発なんて出来ないですもん^^;

  6. 変人Vividさん 再びおはようございます!
    とにかく何とかしたいという意地みたいなものですw
    それに色々とネットに情報がありますからね^^
    なるほど!SDカードの時はプルアップ必要ですか~。実はその辺もESP32の時は試してみたのですが・・・・・。確かにarduinoでは動きましたが、プルアップした方が良いかもですね。
    それにしてもSDカードのデーターのやり取り迄進まれましたか!
    ホント出来ないことはありませんねw!やはり神ですw!

Leave a Reply

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

wp-puzzle.com logo