Closed suzukiplan closed 9 months ago
一応3.5インチも買っておいたが解像度が 320x480 なのでやや悩ましい。 性能的にはその解像度向けに作れないこともないが RAM の専有容量が既にいっぱいいっぱい(SongListViewの描画サイズを大きくするにはRAMが必要)なので 3.2 インチ(240x320)の方で対応しておく。
ピンの並びを比較
旧(ILI9341) | 新(ST7796U) |
---|---|
右から順番に比較(まずはLCDのみ)
ILI9341 | ST7796U | memo |
---|---|---|
VCC | VCC | 電源(同じ) |
GND | GND | グランド(同じ) |
CS | LCD_CS | チップセレクタ(同じ) |
RESET | LCD_RST | リセット(同じ) |
DC | LCD_RS | ? |
SDI (MOSI) | SDI(MOSI) | RP2040→LCD方向のデータ |
SCK | SCK | クロック同期(同じ) |
LED | LED | バックライトON/OFF(同じ) |
SDO (MISO) | SDO (MISO) | LCD→P2040方向のデータ |
DC と LCD_RS 以外のピンの並びは全く同じっぽい。 こちらによると DC と RS は同じらしい。
とりあえず LCD のケーブルのみ配線して vgssdk-pico の example を動かしてみたところ色がおかしいが正常に表示された。
配線 | 表示 |
---|---|
色がおかしいので TFT_eSPI に指定するドライバを適切に変更すれば治るものと思われる。
タッチパネルのドライバ(FT6206Uとのこと)の実装は多分TFT_eSPIに入っていないと思われるので以下のライブラリあたりを使えば大丈夫かも
platformio.ini で ILI9341_DRIVER
→ ST7796_DRIVER
にしたところ、画面にノイズが走る(一応表示される)形になった。
index c4b608c..8d678b2 100644
--- a/pico/platformio.ini
+++ b/pico/platformio.ini
@@ -12,7 +12,7 @@ lib_deps = bodmer/TFT_eSPI
upload_protocol = mbed
build_flags =
-DUSER_SETUP_LOADED=1
- -DILI9341_DRIVER=1
+ -DST7796_DRIVER=1
-DTFT_BL=27
-DTFT_BACKLIGHT_ON=HIGH
-DTFT_CS=17
ST7796_DRIVER の定義を確認したところ、画面が 320x480 ピクセルの前提になっているようなので、240x320 の場合は別名のドライバかもしれない。
TFT_eSPIのTFT_Driversで 320
と240
を定義している LCD ドライバをチェックしてみたところ width/height or height/width で 230x320 を指定できるものは ILI9341 or ST7789 しか無いように見える。
$ grep -e 320 -e 240 .pio/libdeps/pico/TFT_eSPI/TFT_Drivers/*
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/GC9A01_Defines.h: #define TFT_WIDTH 240
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/GC9A01_Defines.h: #define TFT_HEIGHT 240
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/HX8357B_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/HX8357C_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/HX8357D_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h: #define TFT_WIDTH 240
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h: #define TFT_HEIGHT 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h: #define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h: #define TFT_HEIGHT 240
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9481_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9486_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ILI9488_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/R61581_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/RM68140_Defines.h:#define TFT_WIDTH 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h: #define TFT_WIDTH 240
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h: #define TFT_HEIGHT 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 135)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#if (TFT_HEIGHT == 280) && (TFT_WIDTH == 240)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:// 1.47" 172x320 Round Rectangle Color IPS TFT Display
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 172)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 170)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#if (TFT_HEIGHT == 300) && (TFT_WIDTH == 240)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#define ST7789_240x240_XSTART 0
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h:#define ST7789_240x240_YSTART 0
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h: #define TFT_WIDTH 240
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h: #define TFT_HEIGHT 320
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 135)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:#if (TFT_HEIGHT == 280) && (TFT_WIDTH == 240)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:// 1.47" 172x320 Round Rectangle Color IPS TFT Display
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 172)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 170)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Defines.h:#if (TFT_HEIGHT == 300) && (TFT_WIDTH == 240)
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Init.h: // JLX240 display datasheet
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Init.h: writedata(0x28); // JLX240 display datasheet
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7789_Init.h: writedata(0x28); // JLX240 display datasheet
.pio/libdeps/pico/TFT_eSPI/TFT_Drivers/ST7796_Defines.h:#define TFT_WIDTH 320
#define ST7789_DRIVER
... 画面が何も映らない#define ST7789_2_DRIVER
... ILI9341 と同じように色が少しおかしいという感じだった。
ただし、ST7789_2 は ILI9341 は両方とも色はおかしいが、
vgs.gfx.clear(0x001F);
を実行した時の結果が
という違いになっていた。
ST7789_2 の結果は恐らく RGB をフリップさせれば正しくなりそうなので、ST7789_2 の方が挙動として正しそうに見える。
ILI9488_DRIVER にしたら色が正常になったっぽい。
やはりILI9341っぽい(ST7796 は 3.5 インチの方) そしてタッチドライバは Ft6336 商品SKUは MSP3223
http://www.lcdwiki.com/3.2inch_IPS_SPI_Module_ILI9341 https://ja.aliexpress.com/item/1005005818608542.html
タッチドライバはコッチか https://github.com/aselectroworks/Arduino-FT6336U
ILI9341 でどんな感じの色になるか次のようなコードでテストしてみた
#include "vgssdk.h"
extern VGS vgs;
extern "C" void vgs_setup()
{
vgs.gfx.startWrite();
vgs.gfx.clear(0);
for (int i = 0; i < 0b100000; i++) {
vgs.gfx.boxf(i * 6, 0, 4, 4, i); // blue
vgs.gfx.boxf(i * 6, 6, 4, 4, (i << 6) | 1); // green
vgs.gfx.boxf(i * 6, 12, 4, 4, i << 11); // red
vgs.gfx.boxf(i * 6, 18, 4, 4, i | (i << 11)); // blue + red
vgs.gfx.boxf(i * 6, 24, 4, 4, i | (i << 6) | 1); // blue + green
vgs.gfx.boxf(i * 6, 30, 4, 4, (i << 11) | (i << 6) | 1); // red + green
vgs.gfx.boxf(i * 6, 36, 4, 4, i | (i << 11) | (i << 6) | 1); // white
}
vgs.gfx.endWrite();
}
extern "C" void vgs_loop()
{
}
RGB565 形式の濃淡 (R = 5bits, G = 6bits, B = 5bits) は適切のように見えるが、
となっている。
ビット反転 をすると適切になりそう。
TFT_eSPI::init
後に TFT_eSPI::invertDisplay(bool)
を true
で呼び出すと正常な色になった。
コチラ の タッチパネル関連のピンを眺め中。
XPT(抵抗膜) | FT(静電容量) | 用途 |
---|---|---|
T_IRQ | CTP_INT | 割り込み |
T_DO | CTP_SDA | Panel→Host方向のデータ送信(I2C) |
T_DIN | 該当ポートなし | Host→Panel方向のデータ送信(I2C) |
T_CS | 該当ポートなし | チップセレクタ(I2C) |
該当ポートなし | CTP_RST | リセット |
T_CLK | CTP_SCL | クロック同期(I2C) |
LCD のバス通信インタフェースは SPI で、従来(XPT)はタッチパネルもSPIだった(ので DO, DIN というポートがある)が、新しい方(FT)は SCL, SDA なのでこれは SPI 通信ではなく I2C 通信っぽい。
わざわざ外部ライブラリを使わなくても Wire でレジスタを読んだり書いたりすれば良さそうな気がする。
静電容量式のお手頃価格のLCDを見つけた。
https://ja.aliexpress.com/item/1005005878590372.html
※上記のタッチパネル付きの "2.8, "3.2, "3.5 のモデルを手配中
上記のタッチパネルの LCD ドライバは ST7796U なので実装変更が必要になるので実機が到着したら仕様変更する。 現状対応している LCD ドライバ(ILI9341)のタッチパネルは抵抗膜方式しかないように見受けられるので廃止で良いと思われる。(オマケで残しても良いかもしれないが)