アリエクで売ってる半透過ディスプレイの仕様について調べたのでメモ。
基本仕様
- 解像度: 480x360
- Transreflective(半透過)ディスプレイ
- ドライバIC: ST7365
- 静電容量式タッチパネル(I2C)
- 商品ページ: https://viewedisplay.com/product/3-5-inch-320x480-sunlight-readable-transflective-with-super-low-power-tft-lcd-module/
ディスプレイ接続方式
SPI,MIPI,8080方式に対応しており、方式はIM0-2ピンの値を使って切り替えることができる。自分はMIPIが搭載されていないRaspberry Pi Zeroを使うのでSPI方式を検討する。
SPI
SPIでも、3-wireと4-wireの両方に対応している。ややこしいが、ここで言う3-wireとは、一般的な4-wireと等しい普通のSPIになっている。
4-wireでは、D/CXもしくはSPI_RSというピンを追加で使うため、実質5-wireとなる。
4-wireでは、D/CXもしくはSPI_RSというピンを追加で使うため、実質5-wireとなる。
D/CXとはそのデータがコマンドかデータかを選択するピンで、これを使わない場合にはSPI経由で1ビット余分に送信する必要があるということ。
ラズパイ
ラズパイがどちらの方式に対応しているのかがわからないので調べた。そもそもST7365はILI9488というもののクローン(?)のようで、そのILI9488を動かすためのドライバが
LCD-show/usr/fbcp-ili9341/ili9488.cpp at bbd0a9c539f16ba058fb19dda1e71c65c620f81f · goodtft/LCD-show
2.4" 2.8"3.2" 3.5" 5.0" 7.0" TFT LCD driver for the Raspberry PI 3B+/A/A+/B/B+/PI2/ PI3/ZERO/ZERO W - goodtft/LCD-show
github.com
にある。ILI9341と起動シーケンスが違うだけで似てるからかILI9341にまとめられている。そしてそのフォルダには結構詳しいREADMEファイルがあり、
LCD-show/usr/fbcp-ili9341/README.md at bbd0a9c539f16ba058fb19dda1e71c65c620f81f · goodtft/LCD-show
2.4" 2.8"3.2" 3.5" 5.0" 7.0" TFT LCD driver for the Raspberry PI 3B+/A/A+/B/B+/PI2/ PI3/ZERO/ZERO W - goodtft/LCD-show
github.com
この中に
-DGPIO_TFT_DATA_CONTROL=number: Specifies/overrides which GPIO pin to use for the Data/Control (DC) line on the 4-wire SPI communication. This pin number is specified in BCM pin numbers. If you have a 3-wire SPI display that does not have a Data/Control line, set this value to -1, i.e.-DGPIO_TFT_DATA_CONTROL=-1to tell fbcp-ili9341 to target 3-wire ("9-bit") SPI communication.
という記述を見つけた。つまりは3-wireと4-wireどちらも使えるようだ。4-wireのほうが高速になりそうなので4-wireにしてみる。
Pinout
- Pin 9, SPI_CS: チップセレクト
- Pin 10, SPI_SCL: SPIクロック
- Pin 11, SPI_RS: 多分ST7365でD/CXと呼ばれているもの
- Pin 13, SPI_SDA: SDAという名前はST7365に無いのだが、SDOがOutputである以上これがInput、つまりMOSIだと思う。ST7365だとSDIと呼ばれている?
- Pin 14, SPI_SDO: MISO。ST7365でもSDOと呼ばれている。必要ないかも?
他のピンについて
SPI有効時は、
- IM1-3: 3-wireなら101, 4-wireなら111
- DB0-15: GNDに落とす
- RESET: どっかのGPIOに繋ぐ
- MCU_RD: 多分ST7365のRDXピン。Low-activeなのでHigh?
- TE: フロート
のようにする。
↓他のよく分からないピン
バックライト
バックライトも搭載されており、
Backlight off in Reflective mode @ Surrounding illumination > 1500 cd/m²
Backlight on in Transmissive mode @ Surrounding illumination ≤ 1500 cd/m²
と記載されている。のでこれに従いバックライトをオンオフすれば良さそう。また、先程のILI9341ディスプレイドライバでバックライトピンを指定できそうな感じだったのでそれを使うといいかもしれない。
明るさ制御
バックライトは6個の並列LEDで駆動される。
5.2節によると、
5.2節によると、
- 順方向電圧: 2.9V
- 順方向電流: 120mA
が典型値となっているが、この電流は「モジュール全体」の値とされている。つまり1つのLEDあたり20mAが典型値となる。
そしてこの典型値は寿命を計算するのに用いられており、これを超えて電流を流すと寿命が縮まるということらしい。
ちなみにLED一つあたりの絶対定格電流は120mA
タッチパネル
Pin 1-4がタッチパネル関係のピンなのだが、CTPとRTPの場合で役割が分かれている。しかしながらこのディスプレイの仕様としてCTPなのでRTPになることが無さそうだが他のバリアントがあるのかもしれない。
今回はCTPなので普通にI2Cを繋げばよさそう
今回はCTPなので普通にI2Cを繋げばよさそう
実際に動かしてみた
↑まではデータシートを読んで考えた話。ここからは実際にこのディスプレイを動かしてみた際のメモ。
分かったこと
- ST7365は確かにILI9488と互換性がありそう
- このディスプレイに使われているタッチパネルコントローラは「CHSC6540」というもの
- デスクトップを表示するのは難しそう
デスクトップの表示(今のところできていない)
まず、上に書いたfbcp-ili9341はどうやら32bit環境でないと使用できないので今回はパスすることにした。
次の策として、どうやら最近はmipi-dbi-spiというものが使えるみたい。
Raspberry PiでSPIディスプレイに画面を表示させる (64bit対応)
Raspberry PiでSPIディスプレイに画面を表示させる (64bit対応)
niccol.li
これを使うと、各ドライバで微妙に違う初期化コードさえ提供できれば様々なSPIディスプレイを画面として使えるというもののようだ。
つまり、ILI9488用の初期化コードを入手する必要がある。
つまり、ILI9488用の初期化コードを入手する必要がある。
GitHub - notro/panel-mipi-dbi
Contribute to notro/panel-mipi-dbi development by creating an account on GitHub.
github.com
このリポジトリでは、テキストからこのドライバで使うバイナリを生成するためのツールが提供されており、その中にこんなissueがあった。
Can mipi-dbi-spi work with ili9488? · Issue #2 · notro/panel-mipi-dbi
I tried to run 3.5 inch LCD with driver ili9488 in 4-line SPI mode on fbtft overlay, but this driver (ili9488) does not support RGB565 mode in 4 line SPI. If driver init with RGB666, then i`m take ...
github.com
このissue内にあるコメントの初期化コードを使用してみたところ、Linuxブートっぽい画面が出たものの白黒で、表示もなんだかおかしかった。
この辺の内容をよく調べればもっとうまくできるかもしれない
Pythonコードで表示
デスクトップは無理でも、PythonのLuma.lcdというライブラリでILI9488を使えるという情報を見かけた。これはspidevを使ってPythonで直接描画できる。
ということで色々と調べて、公式Exampleにある
bounce.pyを動かすことができた。これはボールがたくさん跳ねているアニメーションを表示するプログラムになっており、このコードで約35fpsを達成できた。更新量は少ないとは言え、30fps出せることが分かってよかった。
コツは、
- SPIバス作成時に
bus_speed_hz=52000000を指定して速度を速くすること(これぐらい速くても割といけるみたい) device.command(0x21)で色反転を切り替えること(これをしないと色がおかしい)
タッチパネル
タッチコントローラICについてデータシートにも記載がなかったのでi2cdetectを実行すると0x2eが検出されたが、これだけではICが何か見つけられなかった。
ということで実物のICっぽい部分を見ると普通に「CHSC6540」と書いてあった。
ということで実物のICっぽい部分を見ると普通に「CHSC6540」と書いてあった。
そんなにメジャーなICではないのかドライバは無かったが、Githubサーフィンをしたところそんなに複雑な仕様ではないので自分で読み取れば良さそう。
CircuitPython_XiaoRoundDisplay/CircuitPython_XiaoRoundDisplay.py at d20e4ce24f5ca6ec52e71d40b3a4770aed107854 · STEAM-Tokyo/CircuitPython_XiaoRoundDisplay
Contribute to STEAM-Tokyo/CircuitPython_XiaoRoundDisplay development by creating an account on GitHub.
github.com
AIに書かせた。