MicroPythonのST7735ドライバにスクロール機能追加


当ブログに何度か登場している、128×160ピクセルの小型カラー液晶モジュールですが、そのコントローラST7735には「7735, 7735B, 7735R, 7735S」というバリエーションがあり、このうち7735Rと7735Sには縦スクロールの機能があります。
MicroPython用のST7735ドライバモジュールに、この機能を追加実装してみました。
コードは以下のGitHubリポジトリにアップロードしてあります。

boochow/MicroPython-ST7735: ST7735 TFT LCD driver for MicroPython

この機能については、このリポジトリのIssuesに「ST7735ドライバをMicroPythonのFrameBufコンパチブルにしてはどうか」というコメントがあり、そこで教えていただきました。

詳細については、以下のリンク先が参考になります。

Differences in ST7735 Versions ?

ST7735 TFT Vertical Scrolling example with CCS C Compiler

スクロール機能の概要は以下の図のようになります。この図はST7735SのマニュアルのP70に掲載されているものです。

2つのパラメータTFA(Top Fixed Area)とBFA(Bottom Fixed Area)で、画面上端からTFAピクセル分、画面下端からBFAピクセル分を「スクロールしない範囲」として指定します。
それらに挟まれた部分(VSA=Vertical Scrolling Area)はループ状(両端がつながった状態)でスクロールします。

ST7735を使った液晶の画素数は通常128×160ピクセルですが、TFA+VSA+BFA = 162となっており、2ピクセルの非表示部分があります。
非表示部分は可視部分の上と下にそれぞれ1ピクセルずつです。

スクロール値は絶対値で指定します。
このとき、スクロールによって液晶コントローラ内のフレームバッファ上のデータは更新されません。
その代わり、下図のように液晶へ表示する際のフレームバッファの読み出し開始位置が変化します。

図の左がフレームバッファの構成で、縦162ピクセルあり、上からTFAまでが非スクロール領域です。

スクロール値にADDRを指定したとします(ADDR > TFAです)。すると、表示は図の右のように、TFA領域のあとにADDR位置~BFA直前までのフレームバッファの内容が表示され、そのあとにTFA~ADDRのフレームバッファの内容が表示されます。
また、フレームバッファの先頭と末尾1ピクセル分は表示されません。(この非表示領域の設定は、コマンド0x2Bで行うことができます。このドライバでは、初期化の際に設定しています。)

TFAとBFAの指定はコマンド0x33、ADDRの指定はコマンド0x37で行います。
それぞれTFTクラスのメソッド

setvscroll(self, tfa, bfa)
_vscrolladdr(self, addr)

として定義しました。

スクロールを指定するときに、上の図のADDRの値を直接指定すると、常にTFAの値を意識する必要があるため直感的ではありません。
そこで、スクロール用のメソッド

vscroll(self, value)

は別に用意しました。
valueが0のときスクロール無しになり、valueが正なら上、負なら下へスクロールします(FrameBufferクラスのスクロール指定とはvalueの正負が逆になっています)。

最後にESP32でのサンプルコードと結線を載せておきます。

コメント