1/20のバルキリー音関係のギミックの組み込みはすでに終わっているのですが、忘れないために先にこの憂鬱だった1週間についての記事をw
何をやっていたかと言うとarduinoを用いて0.96インチの液晶に画像表示することを目指しました!
ちなみにこのブログで誰でも画像表示まで行けると思いますw!そのくらい失敗してますww
今回は液晶テストまで^^
コクピットはもう完成としていましたが、Vividさんがカラー液晶でコクピットのモニターの実験をされていました。こちらのページです。
この液晶、コンソールの形を変えない限りモニターの部分に入らないんですよね・・・・・
ですが、Vividさんの実験を見ていてある考えがピコ~~ンとww
もしかして、この方法なら使えるんじゃない?てな考えが浮かんだら、やってみなければ気が済まない性分w
うほwこれなら可能性有るじゃない!
要は、基板から液晶剥がしてこれを縦にして下から差し込む、コクピットのコンソール部分に合わせて液晶の一部だけ使う方法wうまくしたらサブモニターも使えるかもw
微妙に表示領域は以前の物よりも小さくなりますが、画像の解像度はこちらの方が上
以前の物は60×32に対してこの液晶は使える範囲は80×63とより細かなものが表示できます。
基板はどこかの誰かさんのように多少削れば行けそうです。
なんか可能性出てきた!!
あっちなみに、この液晶剥がした時に配線切断してしまいましたww
まっ、あるあるですよねw
てなことで予備のモニターでテスト。
それでは、液晶モニターなんて使ったことの無い人間が0から画像を表示するところまで行ってみましょうw!!(今回は液晶基板のテストまでw)
使う物はアマゾンではこちら
TFTカラー液晶(ST735)
SDカードモジュール(今回は使いません。)
(ちなみにSDカードはこちらでも動作確認しました。)
です。どちらもAliexpressではもっとお安くあります。
とりあえず何にしろ必要なライブラリー入れないとな。
まずはこちらのサイトに従ってライブラリーをarduinoに入れます。
なんかライブラリー入れる時に関連するライブラリーも入れますか?と聞いてきたので「喜んで~!」とついでに投入wまっ本当に必要なのかは知りませんが^^;
で、先ほどのサイトの<動作確認>の部分で無いやら書いてありますが、0の人間である私にはこの時点では意味わからないので放置^^;
まずはともかく、配線を繋がないといけません。
左の青い基板の物を使って行きます。赤の物はちょっと色々有りましてまた後でw
基板側 arduino
GND----------GND
VCC----------3V3
SCL----------D13
SDA----------D11
RES----------D5
DC ----------D7
CS----------D6
てな感じで配線しましょう。
次にプログラムですが、IDEのメニューバーの[ファイル]→[スケッチ例]→[Adafruit ST7735 and ST7789 Library]→[graphicstest]を選択してテストをするのですが、このままでは表示できません。少し設定をいじらないといけません。とりあえずネットの海にドボンw
色々調べて分かったので、テストプログラムを少し書き換え。あそこを直してここを直して説明するのもいいのですが、面倒なのでズバリこれでw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 |
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #define TFT_RST 5 // reset line #define TFT_CS 6 // chip select line #define TFT_DC 7 // data/command line Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //#define TFT_SDA 11 // Data out //#define TFT_SCLK 13 // Clock out float p = 3.1415926; void setup(void) { Serial.begin(9600); Serial.print(F("Hello! ST77xx TFT Test")); tft.initR(INITR_MINI160x80); // Init ST7735S mini display Serial.println(F("Initialized")); uint16_t time = millis(); tft.fillScreen(ST77XX_BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // large block of text tft.fillScreen(ST77XX_BLACK); testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE); delay(1000); // tft print function! tftPrintTest(); delay(4000); // a single pixel tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN); delay(500); // line draw test testlines(ST77XX_YELLOW); delay(500); // optimized lines testfastlines(ST77XX_RED, ST77XX_BLUE); delay(500); testdrawrects(ST77XX_GREEN); delay(500); testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA); delay(500); tft.fillScreen(ST77XX_BLACK); testfillcircles(10, ST77XX_BLUE); testdrawcircles(10, ST77XX_WHITE); delay(500); testroundrects(); delay(500); testtriangles(); delay(500); mediabuttons(); delay(500); Serial.println("done"); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } void testlines(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); delay(0); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST77XX_RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(ST77XX_GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(ST77XX_BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(ST77XX_GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(ST77XX_WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(ST77XX_MAGENTA); tft.print(millis() / 1000); tft.setTextColor(ST77XX_WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(ST77XX_BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN); } |
(1行目のコピーをミスらないように注意です)
元のスケッチと見比べてもらうとピンの設定とモニターのサイズの指定の辺がちょっと違うだけなのが分かると思います。これでこのように動きます。
これで動作確認できました~!
とりあえず有益な情報は載せておきましたが、0からの人間がこんなにすんなり出来るわけありませんw実はムチャ苦心してますww
ここからはあまり実りのあるお話ありませんwお忙しい方は読み飛ばしオッケーですw
実は最初はこの赤い基板の液晶でトライw
上記の青基板と同じ配線にしても反応せずwそもそも、スケッチ例が動かないってどういう事よww 0からの人間には無理じゃんかw
それによく見ると
SCK??SCLと違うの???それおいしいの???
そこからかよw!と思われるかもしれませんがそこからですww
Vividさんに連絡してSCL=SCKと確認。
さらにSDA=MOSIという事もわかりましたw
よし、一つ賢くなったw
さらに、arduinoではハードウエアーでのSPIはSCL→13、MISO→12、SDA(MOSI)→11、SS→10と決まっているようで、SSは今回の場合CSと書かれているもののようです。
ただ、RSET、DC、CSはプログラム上で指定してやれば変更可能なようです。
なるほど~だからテストプログラムの中にはSCL,SDAの記載がないのか~。私は忘れないようにコメントで書いておきましたがw
これでSPIの赤基板の配線はわかりました!でも動かないw
ここで、一旦青基板に切り替えて配線をすると上記のように動いてくれました。
で、この青の液晶で出来たら最初の赤の液晶も気になってきましたw
てなことで再度ネットにドボン!
あった!
この動画を見て、テストサンプルのあるリンクをたどってダウンロードしてarduinoに入れてみたところ、ボードエラー出まくりでコンパイルできません。エラーをよく見るとその前に入れていた
Adafruit_ST7735_and_ST7789_Libraryが競合しているみたいでうまくコンパイル出来ないようでした。そこで、このAdafruit_ST7735_and_ST7789_Libraryを他の場所に移してやるとコンパイル出来動きました。
なんか遅いwこれいらんw
てなことで、新たにこの液晶用に入れてたライブラリーは削除して元のAdafruit_ST7735_and_ST7789_Libraryを戻しておきましたw
なんでもVividさんによると、この赤基板はST7735Rというチップで、青基板はST7735Sというチップらしいです。チップって何のチップ?と思ったあなた!嫌いですw!そういうもんだと思いましょうw
とりあえずこれで液晶のテストは出来ましたが、次回は「画像の表示」に!
1週間苦しんだのでその分元を取らねばw
関連すると思われる記事:
- None Found
これぱ凄いねー!
死ぬほど苦労したのはわかりますよー。
僕も二つディスプレイ持ってますけど
お盆潰しましたからね。そんで映ってもないと。とっても素晴らしいコードサンプルスケッチで見てたら眠くなったのでおやすみなさいましー。ぐーっ。
てつのさん おはようございます!
やはり液晶表示とかの知識ゼ~ロ~の状態なので結構苦労しましたw
それでもこのテスト表示はまだ情報が豊富で、難度も高くないのでどうにか書き換えできました。
ちなみに、このプログラム長々と有りますが変更されているのは23行目までですww
実はこの後に色々あってESP32というものを使ったのですがこれが憂鬱の始まりでしたw
その辺はまた後日w
てつのさんなら配線してこのプログラムスケッチをコピペで多分10分かからない位で出来ちゃうと思いますw
こんばんは!
奮闘されてますね。基板(チップ)のバリエーションとか、流通してるものでもいろいろあるのですね。そういえばDFPlayerもいろいろ亜種がありそうでしたもんね。
この液晶眠らせてるので、また今度(6jiroさんの)コピペから始めてみます。
しかし、Vividさんはさすがですね。これをPICで動かしちゃうんだから(^^;
こんにちは
流石6jiroさん、仕事が速い!
しかもArduinoを完全に使いこなしていますね! 恨めしや~ いや、うらやましい~
しかし彼女は本当に簡単ですね。
当方は、赤LCDに同様なデモ画面を出すにも、PICのプログラムをいろいろいじって大変でした。
ESP32をちょっと調べてみました。
IDEをDLしてトライしてみようかと悩んでおります。
また、記事もよろしくお願いします!!
なおさん おはようございます!
ここまではほどほどの苦労でしたw
なんか赤色の方は私はうまく扱えませんでした^^;
まっ、青色が快調ですので良しとしていますw
なおさんならこの液晶テストまではすごく簡単にできると思いますw
これをPICでなんて私には百年たっても無理でしょうね^^;
Vividさん おはようございます!
arduinoはネットにある情報のままにコピペして実行するだけですから^^;
マイコンの知識より検索能力の方が重要ですねw
やはり、あの赤と青では結構違うんですね・・・・Adafruitのライブラリーでは赤の方は動きませんでした^^;
ESP32良いですよ~メモリーも多いしなんか色々付いていますしw
諦めかけていたJPEG表示も昨日らびあんさんという方にツイッターで教えて頂きました^^