MicroPythonを入れたESP32でモノクロ反射型TFTメモリ液晶LS027B4DH01を表示してみる(GPIOで制御)

Share on:

ESP32でグラフィック液晶を扱ってみるためにLS027B4DH01に表示するプログラムをMicroPythonで書いてみました。とりあえず表示してみるだけなので、ESP32のSPI通信機能ではなく、GPIOをON/OFFするだけで表示してみました。

LS027B4DH01の電気的特性

特性は下記の通りで、電源は5V、入力信号は2.7V~電源電圧までとなっています。入力のHiは3V付近が推奨みたいなので、マイコンは3.3Vで動作させて液晶の電源は5Vに昇圧した電源を用意するのが良さそうです。

項目 Min Typ Max
アナログ電源 4.8 5 5.5
ロジック電源 4.8 5 5.5
Hi 2.7 3 ロジック電源
Low VSS VSS VSS+0.15

LS027B4DH01のピンアサイン

液晶を裏から見たときに左から1番ピンのようです。

ピンに対する機能は下記の通りです。

端子 記号 I/O 機能
1 SCLK INPUT シリアルクロック信号
2 SI INPUT シリアル入力信号
3 SCS INPUT チップセレクト信号
4 EXTCOMIN INPUT 外部COM反転信号入力(H:有効)
5 DISP INPUT ディスプレイON/OFF信号
6 VDDA POWER アナログ電源
7 VDD POWER デジタル電源
8 EXTMODE INPUT COM反転モード切替端子です。
9 VSS POWER ロジックGND
10 VSSA POWER アナログGND

ESP32とLS027B4DH01の接続

下記のように接続しました。今回はESP32のSPI通信機能は使わないのですが、次回はSPI通信機能を使って表示してみたいと思うのでSPIのデフォルトピンに接続することにしました。

初期化

初期化のフローは下記の通りです。

DISPオフ → SIオフ → SCLKオフ → SCSオフ → Clear all → DISPオン

コードにすると下記のような感じです。

1def initialize(self):
2    self.disp.off()
3    utime.sleep_us(500)
4    self.si.off()
5    self.sclk.off()
6    self.scs.off()
7    self.clear_all()
8    utime.sleep_ms(5)
9    self.disp.on()

データの更新

LS027B4DH01にはデータの更新モードが2種類あり、1ライン更新するモードと複数ライン更新するモードがあるようです。今回は1ライン更新するモードでプログラムを作成してみました。このモードでは以下の手順でデータを送信します。

SCSピンオン → データ送信 → SCSピンオフ

データの送信内容は下記の通りです。

モード選択 アドレス選択 データ書き込み ダミーデータ転送
8ビット 8ビット 400ビット 16ビット

1ラインのデータ更新モードのコードは下記の通りです。関数の引数のlineがライン番号で、data_arrayが1ライン分のデータの50バイトの配列としました。

 1def update_one_line(self, line, data_array):
 2    self.scs.on()
 3    # send mode
 4    self.send_one_byte(0b00000001)
 5    # send gate line address
 6    self.send_one_byte(line)
 7    # send data
 8    for data in data_array:
 9        self.send_one_byte(data)
10    # dummy data
11    self.send_one_byte(0)
12    self.send_one_byte(0)
13    self.scs.off()

動作イメージ

5の倍数のラインを黒く塗る動作をしてみました。

ソースコード

 1import utime
 2from machine import Pin, PWM
 3
 4class LS027B4DH01():
 5    def __init__(self):
 6        self.data = None
 7        self.array = bytearray(12000)
 8        self.sclk, self.si, self.scs = None, None, None
 9        self.extcomin, self.disp = None, None
10
11    def send_one_byte(self, buffer):
12        for i in range(8):
13            self.si.value( buffer & 0x01 )
14            buffer = buffer >> 1
15            self.sclk.on()
16            self.sclk.off()
17        self.si.off()
18
19    def update_one_line(self, line, data_array):
20        self.scs.on()
21        # send mode
22        self.send_one_byte(0b00000001)
23        # send gate line address
24        self.send_one_byte(line)
25        # send data
26        for data in data_array:
27            self.send_one_byte(data)
28        # dummy data
29        self.send_one_byte(0)
30        self.send_one_byte(0)
31        self.scs.off()
32
33    def clear_all(self):
34        self.disp.off()
35        self.scs.on()
36        utime.sleep_us(3)
37        self.send_one_byte(0x04)
38        self.send_one_byte(0x00)
39        utime.sleep_us(3)
40        self.scs.off()
41        utime.sleep_us(5)
42        self.disp.on()
43
44    def initialize(self):
45        self.disp.off()
46        utime.sleep_us(500)
47        self.si.off()
48        self.sclk.off()
49        self.scs.off()
50        self.clear_all()
51        utime.sleep_ms(5)
52        self.disp.on()
53
54def main():
55    
56    print('hello')
57
58    lcd = LS027B4DH01()
59    lcd.sclk     = Pin(18, Pin.OUT)
60    lcd.si       = Pin(23, Pin.OUT)
61    lcd.scs      = Pin(32, Pin.OUT)
62    lcd.extcomin = Pin(33, Pin.OUT)
63    lcd.disp     = Pin(25, Pin.OUT)
64    lcd.initialize()
65    lcd.disp.on()
66
67    print('initialized')
68
69    white_line = [0xFF] * 50
70    black_line = [0] * 50
71
72    while True:
73
74        print('update array')
75        for y in range(240):
76            if int( (y / 10) % 2 ) == 1:
77                lcd.update_one_line(y, white_line)
78            else:
79                lcd.update_one_line(y, black_line)
80
81        print('clear all')
82        lcd.clear_all()
83
84        print('update array')
85        for y in range(240):
86            if int( (y / 10) % 2 ) == 0:
87                lcd.update_one_line(y, white_line)
88            else:
89                lcd.update_one_line(y, black_line)
90
91        print('clear all')
92        lcd.clear_all()
93
94if __name__ == "__main__":
95    main()

関連記事