suzukiplan / tohovgs-pico

東方VGS実機版
GNU General Public License v3.0
0 stars 0 forks source link

LCDドライバ変更(抵抗膜式タッチパネル→静電容量式タッチパネル) #12

Closed suzukiplan closed 9 months ago

suzukiplan commented 9 months ago

静電容量式のお手頃価格のLCDを見つけた。

https://ja.aliexpress.com/item/1005005878590372.html

※上記のタッチパネル付きの "2.8, "3.2, "3.5 のモデルを手配中

上記のタッチパネルの LCD ドライバは ST7796U なので実装変更が必要になるので実機が到着したら仕様変更する。 現状対応している LCD ドライバ(ILI9341)のタッチパネルは抵抗膜方式しかないように見受けられるので廃止で良いと思われる。(オマケで残しても良いかもしれないが)

suzukiplan commented 9 months ago

ブツが届いた https://twitter.com/suzukiplan/status/1708367329749524955

suzukiplan commented 9 months ago

一応3.5インチも買っておいたが解像度が 320x480 なのでやや悩ましい。 性能的にはその解像度向けに作れないこともないが RAM の専有容量が既にいっぱいいっぱい(SongListViewの描画サイズを大きくするにはRAMが必要)なので 3.2 インチ(240x320)の方で対応しておく。

suzukiplan commented 9 months ago

ピンの並びを比較

旧(ILI9341) 新(ST7796U)
image image
suzukiplan commented 9 months ago

右から順番に比較(まずは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 は同じらしい。

suzukiplan commented 9 months ago

とりあえず LCD のケーブルのみ配線して vgssdk-pico の example を動かしてみたところ色がおかしいが正常に表示された。

配線 表示
image image

色がおかしいので TFT_eSPI に指定するドライバを適切に変更すれば治るものと思われる。

suzukiplan commented 9 months ago

タッチパネルのドライバ(FT6206Uとのこと)の実装は多分TFT_eSPIに入っていないと思われるので以下のライブラリあたりを使えば大丈夫かも

https://github.com/adafruit/Adafruit_FT6206_Library

suzukiplan commented 9 months ago

platformio.ini で ILI9341_DRIVERST7796_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 の場合は別名のドライバかもしれない。

suzukiplan commented 9 months ago

TFT_eSPIのTFT_Driversで 320240 を定義している 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
suzukiplan commented 9 months ago

という感じだった。

ただし、ST7789_2 は ILI9341 は両方とも色はおかしいが、

    vgs.gfx.clear(0x001F);

を実行した時の結果が

という違いになっていた。

ST7789_2 の結果は恐らく RGB をフリップさせれば正しくなりそうなので、ST7789_2 の方が挙動として正しそうに見える。

suzukiplan commented 9 months ago

ILI9488_DRIVER にしたら色が正常になったっぽい。

suzukiplan commented 9 months ago

やはりILI9341っぽい(ST7796 は 3.5 インチの方) そしてタッチドライバは Ft6336 商品SKUは MSP3223

http://www.lcdwiki.com/3.2inch_IPS_SPI_Module_ILI9341 https://ja.aliexpress.com/item/1005005818608542.html

suzukiplan commented 9 months ago

タッチドライバはコッチか https://github.com/aselectroworks/Arduino-FT6336U

suzukiplan commented 9 months ago

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()
{
}

image

suzukiplan commented 9 months ago

RGB565 形式の濃淡 (R = 5bits, G = 6bits, B = 5bits) は適切のように見えるが、

となっている。

ビット反転 をすると適切になりそう。

suzukiplan commented 9 months ago

TFT_eSPI::init 後に TFT_eSPI::invertDisplay(bool)true で呼び出すと正常な色になった。

suzukiplan commented 9 months ago

コチラ の タッチパネル関連のピンを眺め中。

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 でレジスタを読んだり書いたりすれば良さそうな気がする。

suzukiplan commented 9 months ago

ドライバは自前で作成済み

https://gist.github.com/suzukiplan/952359f840c6afc4b5ce08df0888e28d