LILYGO T-RGB unboxing

# はじめに

以前から円形ディスプレイが欲しかったのと、ESP32-S3だったこと、たまたま見ていたアリエクで送料無料でちょっとだけ安かったので、ついポッチってしまった。
<img width="300" alt="aliex.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6a0d77bc-d079-6055-8607-8377ab2bfa0e.png" />

3タイプある[**LILYGO® T-RGB**](https://www.lilygo.cc/products/t-rgb)のうち、今回購入したのは、[**2.1インチ Full Circle**](https://www.lilygo.cc/products/t-rgb?variant=42503165673653) （2.1インチ完全円タイプ）。

[LILYGO](https://www.lilygo.cc/collections/all)は、ESP32チップを搭載した色々なタイプの独自ボードを販売している、ちょっとユニークな会社です。



# Delivering

「10日お届け·納期保証」と謳われているが、果たしていつ受け取れるのか。

- 注文確定　2023.8.17 21:40 (JST)
- 発送完了　2023.8.19 12:20 (JST)
- 受取完了　2023.8.25 10:50 (JST)

注文してから受け取りまで8日間。2日早い、いいね。
<img width="300" alt="delivering.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/66807bc2-0ac8-03f0-709d-da422df3978a.png" />

↓国内配送業者の追跡情報。関空に来たのが分かります。
<img width="300" alt="deli.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6e7ba2c3-840d-e730-b392-8fd37d9f9cfd.png" />
午前11時前には（対面で）受け取ったのだが、配達完了がなぜか15:22。この時刻がアリエクに連携されている。


# Unboxing

いつものシルバー裏黒のビニール袋ではなく、エアークッション付きの厚手のビニールで配送されてきた。（↓開封後に撮った写真）

<img width="300" alt="IMG_2269.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/085edfb4-25f7-2eb5-8fee-606e13480688.png" />


中身は、さらにプチプチ（エアークッション）に5重ぐらい巻かれて、衝撃には大丈夫そうな梱包だった。

中を取り出すと、四角いプラスチックケースと紙カードが一枚。

<img width="300" alt="IMG_2258.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/54ec804d-6a62-d78d-64ed-9327fa827a7e.png" />

蓋を開けると、真っ黒な丸い円盤。
（画面の写り込みが半端ない。鏡のようだ）
<img width="300" alt="IMG_2259.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/9845672e-fbfb-bc4c-088a-af04dca948dd.png" />

本体を取り出すと、円形LCDと基板はフレキでつながっている。蹄鉄形のアクリルプレートに貼られた両面テープで、自分で固定するらしい。
<img width="300" alt="IMG_2260.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/317d0bfc-b17b-9537-97f8-038a619e305e.png" />

貼り合わせ後の裏面（V1.2基板だ）
<img width="300" alt="IMG_2264.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6b0393d9-e50c-3751-992a-550c44fd6c9d.png" />

ESP32-S3R8を搭載
<img width="300" alt="esp32s3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/97b7c6a0-76ee-eb73-3f26-9bdb4d67244e.png" />


# 電源投入

USB-Cで電源をつなぐと、（9秒ほど長い）間があいて、綺麗な風景写真が出てきた。
<img width="300" alt="IMG_2265.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/10f4f2f8-54aa-af47-8a8a-7577a6a036f5.png" />

LCDを正面に向けると、USBのコネクタは右斜め下の方向になる。角度を測ってみると、0時基準で110度（3時半ちょっと過ぎの位置）。

円形LCDの直径は53ミリ（2.1インチ＝53.34ミリ）、外周円は直径75ミリで、ベゼルは11ミリ幅とちょっと太めだ。LCDをつなぐフレキが出っ張っているので、「完全円」とするためにこの太さになったのだろう。

途中の写真を撮り損ねたが、画面をタップすると全部で3枚の写真が出てくる。
<img width="300" alt="IMG_2266.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7d8adc9a-2dbe-d950-0c1c-e159b8a90f83.png" />


その後、タッチに反応するUI画面に変わる。

<img width="300" alt="IMG_2268.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4ca0e4b8-e8c5-7e09-69a1-4f52f46ec737.png" />



# esptool.py で確認

フラッシュメモリは16MB（ESP32-S3-WROOM-N16R8と同等スペック）

```sh
% esptool.py --chip auto --port /dev/cu.usbmodem1201 chip_id
esptool.py v4.6.2
Serial port /dev/cu.usbmodem1201
Connecting...
Detecting chip type... ESP32-S3
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: xx:xx:xx:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Warning: ESP32-S3 has no Chip ID. Reading MAC instead.
MAC: xx:xx:xx:xx:xx:xx
Hard resetting via RTS pin...

% esptool.py --chip esp32s3 --port /dev/cu.usbmodem1201 flash_id
esptool.py v4.6.2
Serial port /dev/cu.usbmodem1201
Connecting...
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: xx:xx:xx:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Manufacturer: ef
Device: 4018
Detected flash size: 16MB
Flash type set in eFuse: quad (4 data lines)
Hard resetting via RTS pin...
%
```

初期のファームウェアは抜き出して保存しておきます。

```sh
% esptool.py --chip esp32s3 --port /dev/cu.usbmodem1201 -b 460800 read_flash 0 0x1000000 t-tgb-init.bin
esptool.py v4.6.2
Serial port /dev/cu.usbmodem1201
Connecting...
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: xx:xx:xx:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
16777216 (100 %)
Read 16777216 bytes at 0x00000000 in 1875.4 seconds (71.6 kbit/s)...
Hard resetting via RTS pin...
%
```

_16MB抜き出すため、そこそこ時間がかかった。_


# exampleを動かしてみる

https://github.com/Xinyuan-LilyGO/T-RGB

↑関連情報はGitHubに公開されている。
その中の、`examples/factory`は、Arduino IDE環境で使うプロジェクトになっている。Arduino IDEで`examples/factory/factory.ino`を開いて、ビルドしてみた。

## コンパイルエラー多発

使用しているライブラリが見つからずエラーとなるが、必要なライブラリは一式提供されているので心配はない。

### 1) OneButtonが無い

対処法：`lib/OneButton`をArduino IDEの`libraries`にフォルダごとコピーするだけ。

### 2) lvglが無い

対処法：`lib/lvgl`をArduino IDEの`libraries`にフォルダごとコピーする。
また、`lib/lv_conf.h`をコピーしたフォルダの`libraries/lvgl/src/lv_conf.h`にコピーする。

### 3) TouchLibが無い

対処法：`lib/TouchLib`をArduino IDEの`libraries`にフォルダごとコピーするが、`library.properties`が無いので作る必要がある。他の`library.properties`を参考に、ライブラリ名とバージョンを書き換え、他は適当で大丈夫。

### 4) タッチスクリーンのタイプを選択する

```
factory.ino:38:2: error: #error "Please define the size of the screen and open the macro definition at the top of the sketch"
```

`factory.ino`の18行目前後にある、3つのどれか`#define`のコメントを外す必要がある。

```c:factory.ino
#define USING_2_1_INC_CST820     1           //  Full circle 2.1 inches using CST820 touch screen
// #define USING_2_8_INC_GT911      1           //  Full circle 2.8 inches using GT911 touch screen
// #define USING_2_1_INC_FT3267     1           //  Half circle 2.1 inches use FT3267 touch screen
```

今回購入したのは`2.1インチCST820`タイプのため、一番上のコメントを外した。


## スケッチが大き過ぎる??

![big_sketch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b12c4384-5c56-9f16-2c6b-507e9b2b3186.png)
メーカー情報によると、Arduino IDEのボード設定で`"Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)"`を指定するようになっているが、1.2MBを超えてしまっているので、T-RGBへの書き込み（アップロード）ができない。

<img width="300" alt="setting.png" src="https://raw.githubusercontent.com/Xinyuan-LilyGO/T-RGB/main/assets/image/setting.png" />

そこで、`Partition Scheme`を`"8MB with spiffs (3MB APP/1.5MB SPIFFS)"`に変更する。

**以上でビルドが通り、T-RGBへのアップロードも無事にできた。**

## シリアル出力内容

上記のサンプルプログラムを起動したときのシリアル出力の結果は以下の通り。画面が出るまでに9秒ほど待たされる要因を調べられるかも。

```console
10:28:33.059 -> [   476][I][esp32-hal-i2c.c:75] i2cInit(): Initialising I2C Master: sda=8 scl=48 freq=100000
10:28:33.059 -> Found xl9535
10:28:33.059 -> Chip: ESP32-S3
10:28:33.059 -> ChipRevision: 0
10:28:33.059 -> Psram size: 8189KB
10:28:33.092 -> Flash size: 16384KB
10:28:33.092 -> CPU frequency: 240MHz
10:28:33.092 -> E (45) sdmmc_common: sdmmc_init_ocr: send_op_cond (1) returned 0x107
10:28:33.092 -> E (46) vfs_fat_sdmmc: sdmmc_card_init failed (0x107).
10:28:33.124 -> [   508][E][SD_MMC.cpp:138] begin(): Failed to initialize the card (0x107). Make sure SD card lines have pull-up resistors in place.
10:28:33.124 -> Card Mount Failed
10:28:33.818 -> Scanning for I2C devices ...
10:28:34.810 -> Error 5 at address 0x02
10:28:34.810 -> I2C device found at address 0x20
10:28:34.842 -> [  2237][I][TouchLibCommon.tpp:312] begin(): SDA:8 SCL:48 RST:-1
10:28:34.842 -> [  2237][W][Wire.cpp:301] begin(): Bus already started in Master Mode.
10:28:41.650 -> Register setup complete
10:28:41.650 -> Register display driver to LVGL
以下、画面タップ後
10:28:41.683 -> waitInterruptReady ...
10:29:38.038 -> waitInterruptReady ...
10:29:41.040 -> waitInterruptReady ...
10:29:47.027 -> waitInterruptReady ...
```

接続されているタッチ制御ICを調べるため、`Scanning for I2C devices ...`の箇所で、0x1〜0x7fまでのスレーブアドレスを全部確かめる処理になっている。defineでタッチ制御ICを選択する構造になっているのに、この処理が何故必要なのか不明だ。
しかも、`I2C device found at address 0x20`が出ているが、今回のデバイスのタッチ制御ICは、`CST820`であり処理コードでは、アドレス0x15で判定しているため、`"Find CST820 touch device!"`のメッセージが出ていない。
それでも、ちゃんとタッチ操作ができているのが不思議である。謎が多いコードだ。
（<i>初期Firmwareに戻して、シリアル出力の内容を確認した方がいいかも？</i>）

時間を要している一番は、LCD(TFT)の初期化箇所で、7秒ほどかかっている。多くの初期化コマンドを送りつけているようだが、後日、コードを追って要因を深掘りしてみる。

# ロゴを表示

せっかくなので、商品ページで見たLILYGOのロゴを表示させてみた。
LOGOファイルは`examples/esp-idf-example/T-RGB/main/logo.c`をコピー。

<img width="300" alt="liligo_logo2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/902cfeef-9a5c-7b73-b366-51d30ec82c30.png" />

そのままだと、円をはみ出てしまったので、約80%に縮小した。

```c
lv_img_set_src(img, &logo);
lv_img_set_zoom(img, 204); //80% (204÷256＝0.797)
```

`lv_img_set_zoom`は`256`で等倍、それ以下は縮小。それ以上は拡大する関数のようだ。

# Serialはどのに？

ESPで普通にUART0として使うTXD/RXDのピンは、LCDのデータ線で使われてしまっている。T-RGBでユーザに開放されているピンは、GPIO8とGPIO48だけ。このピンにUART0を割り当てる方法を探す必要がある。

_搭載しているUSBを、USBデバイスとして利用した場合、USB経由でのシリアルは使えなくなるので。_

Micropythonを入れたら試してみよう。

```python
from machine import UART
uart0 = UART(0, baudrate=115200, tx=8, rx=48)
uart0.write('hello')
print('hello hello')
```

:::note warn
訂正
4pコネクタに接続されているので、ユーザに開放されているとして、GPIO8とGPIO48を挙げたが、タッチパネルの制御IC`CST820`でも使われていた。よって、もし、ユーザがこのピンを使用する場合は、タッチインタフェースは使えない、ということ。
そもそも、LCDの信号ピンがバカ喰いで、さらに、タッチ制御、SDカードと盛りだくさんの仕様のため、ESP32-S3のピンだけでは足りず、外付けで`XL9535`I/Oエクスパンダまで使っている。
:::

# 3Dプリンタでケースを作成

今後作成して、後日アップデートします。


# おわりに

今回初めて[`LVGL`](https://docs.lvgl.io/8.3/index.html)に触れたが、多彩なGUI画面が開発できる強力なライブラリのようだ。だが、使いこなすには相当な慣れが必要だ。
Python版APIもあるので、MicroPythonでプログラムを作ろうかと思う。

なお、このデバイスは**技適マーク**がないので、WiFi, Bluetooth は使わないでおく。

<hr> 

以下のインタフェースを作ったので、次の記事にします。

https://youtube.com/shorts/sbX7t6eGKIc

**以上**