2019/04/27

1.8inch SPI TFT液晶をESP32に接続する

Amazonで購入した、1.8Inch SPI接続のTFT液晶をESP32につないで表示させたい。
商品名は、KMR-1.8 SPI ?  乗ってるチップはST7735Rらしい。

Amazonでの商品名:

HiLetgo 1.8インチ ドライバ IC ST7735R SPIインタフェース 解像度128*160 TFT液晶ディスプレイモジュール 


基板にはSPI用の接続端子が出ているのだが、、A0をどう使うのかちと分からず。
さらに調べると、SPIの仕様としてはMOSI/MISO/CLK/CSの4本であるが、A0はData/Commandの識別信号のようであった。7735Rの仕様書によると、A0を使わない接続の場合は、SPIで送信するデータの先頭ビットをData/Commandの識別ビットとして使うようである(ST7735Rの仕様書,P34あたり)。さらに、HiLetgoの液晶基板の接続端子はMOSI/CLK/Reset/CS/A0(DC)であり、MISOが無いので、ST7735Rからの出力は受け取れない。ということは、、ST7735Rのレジスタが読めないのでデバッグができない。なんという仕様だろうか。。自分でドライバを書くのはやめて(そもそも自作だと品質も怪しいが)、先人の作ってくれたのをそのまま使うことにする。

https://www.rockbox.org/wiki/pub/Main/SonyNWZE370/ILI9163.pdf
https://cdn-shop.adafruit.com/datasheets/ST7735R_V0.2.pdf
https://s3-ap-northeast-1.amazonaws.com/sain-amzn/20/20-011-920/TFT18.rar

https://buildmedia.readthedocs.org/media/pdf/adafruit-circuitpython-rgb-display/latest/adafruit-circuitpython-rgb-display.pdf
AdafruitRGB DisplayLibraryDocumentation

https://github.com/adafruit/Adafruit_CircuitPython_ST7735

まずは、、Adafruitが提供してくれている、ST7735用ドライバを使ってEPS32上のMicroPythonで動作できるかを試してみる。

Adafruitが提供してくれているST7735用ドライバを使って、ESP32+TFT液晶の表示が行えた。使ったクラスは、ST7735Rではなく、ST7735の方。ただ、、白い線が入っていてどうも初期不良のようである。他のドライバでも試してみるつもりだが。

白線の件は一旦おいといて、、
シリアルカメラ(4D Systemの uCAM-IIIを買いなおした)で取得したRAWイメージを表示させるとどうも色合いがおかしい。シリアルカメラはRGB565という形式で、R:5+G:6+B:5の並びで16ビット表現になっているのだが、調べてみると、買った液晶は、B:5+G:6+R:5と、RとBが逆転して表示されている。
 lcd.fill(0xF800)ー>R:11111なので、赤色に塗りつぶされるべきだが液晶は青になる
 lcd.fill(0x001F)ー>B:11111なので、青色に塗りつぶされるべきだが液晶は赤になる
これは液晶のせいというより、ドライバの設定がそうなっているためと思われる。先人の記事でも色が入れ替わっているという指摘を目にすることがあり。。ドライバに手パッチを当てるとなんとかなりそうだが。

https://cycle.eek.jp/mbed/aitendo-18TFT  サイクルきゃあ様より引用
ST7735のレジスタにMADCTL(36h)という(Mode Controlの略だろう)のがあり、そこのbit3にRGBビットがあることを発見。RGBにするか、BGRにするかの選択し、ここがBGRのほうに設定されているので、そこをな直したら、全部正常になった。Color指定でBlueと書いてるのにRedになったり、それもなくなった。
 上記を参考に手パッチを当てたらなんとかなるかも。

ST7735R_V0.2.pdf の仕様書中、
P113 に以下の章があり、D3がRGB/BGRの切り替えフラグのようである。
10.1.27 MADCTL (36h): Memory Data Access Control

Adafruit_CircuitPython_ST7735 のソースを再確認すると、以下の記述があり、bottom to top refreshしたければ、D4を変えるべきで、(0x10)、0x08を指定するとRGB反転させている。。。ドライバが間違ってると思われる。。(このソースはもうメンテされていないし)
file:st7735.py  75行目:
        (_MADCTL, b'\x08'), # bottom to top refresh  ー>0x10 とすべきでは

st7735.pyのMADCTLを0x10に修正すると液晶のRGB表示も正しくなった。。はぁーー
サイクルきゃあ様に感謝。。 下の写真が白線が入った液晶。買ってからしばらく使ってなかったのだが。。やっとつないでみたら白線が入っていて、画面クリアさせても消えない。電源Off/Onしても同じ所に出てくる。さらに、、本数が増えた。

No comments:

Post a Comment