発売早々に入手した「ESPr Developer 用反射型カラー液晶」(LPM013M126A)であるが、使い方がぜんぜん分からない... ネット上にも大した情報が見当たらない。数少ない情報源であるデータシートと mbed 用の C サンプル見ながら試行錯誤した結果、だいたい使い方が分かってきたのでメモしておく。
利用するモジュール
直に利用するライブラリは machine.SPI
と machine.Pin
。タイミング調整用に utime.sleep_us
もインポートしておく。
from machine import SPI, Pin
from utime import sleep_us
結線
LPM013M126A へのデータ送信には SPI を使うことになっている。スイッチサイエンスのサイトによれば、ESPr Developer の GPIO と LPM013M126A は以下のように結線されている。
GPIO | 方向 | コネクタピン番号 | 接続先 | 信号の説明 |
---|---|---|---|---|
IO15 | O | JP1 - 5 | SCS(液晶コネクタ) | 液晶のチップセレクト |
IO14 | O | JP1 - 8 | SCLK(液晶コネクタ) | 液晶のクロック |
IO13 | O | JP1 - 6 | SI(液晶コネクタ) | 液晶のデータ |
IO0 | O | JP1 - 3 | DISP(液晶コネクタ) | 液晶のon/off信号.”H”で液晶表示 |
IO2 | O | JP1 - 4 | open | “SJ2” をショートするとEXTCOMIN(液晶コネクタ)に接続されます |
IO5 | O | JP2 - 6 | LEDパッド(K) | 照明用LED(オプション)の出力 |
IO4 | I | JP2 - 3 | スイッチ(SW1) | 汎用のプッシュスイッチ |
この情報にしたがえば、以下のように Pin を使うことになる。
disp = Pin(0, Pin.OUT)
scs = Pin(15, Pin.OUT)
spi = SPI(-1, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
SPI のデータ受信は無いので miso は使わないのだが、指定しないと SPI
クラスのコンストラクタに怒られるので空いてるのを適当に指定しておく。
(2017/01/30 追記)
しかし、どうやらハードウェア SPI が使えるように結線してあるようだ。なので、以下のとおり修正。
disp = Pin(0, Pin.OUT)
scs = Pin(15, Pin.OUT)
spi = SPI(1, baudrate=6000000)
液晶の ON/OFF
液晶の ON/OFF は簡単である。15ピンを H にすれば表示、L にすれば非表示である。
disp.high() # 表示
disp.low() # 非表示
液晶のクリア
電源を繋いだ直後はゴミが表示されるので、まず始めには液晶の表示をすべて消去したほうがよい。このためには ALL CLEAR MODE を使う。
scs.high()
sleep_us(6)
spi.write(b'\x20\x00') # ALL CLEAR MODE
sleep_us(6)
scs.low()
表示データの送信
さて、本来やりたいグラフィックの表示である。気の利いたコマンドなんぞは用意されておらず、愚直にピクセルのデータを送信する。
基本は、UPDATE モードで水平ラインの番号を指定して、R・G・B・dummy の4ビットの列を1ラインのピクセル分(176)送信する。要するに1ラインあたり88バイトである。dummyの無い3ビットのモードやマルチラインのモードも用意されているが、3ピットだとビット演算が面倒だし、組込みで転送用に大きなバッファ用意するのもなんなので、4ビットデータのシングルライン転送がよく使うものであろう。(ちなみに白黒であれば、もっと転送量を減らせるモードもある)
4ビットデータではピクセルの色を R・G・B・dummy の4ビットで表すので以下のようになる。
色 | 2進数値 | 16進数値 |
---|---|---|
黒 | 0b0000 | 0x0 |
青 | 0b0010 | 0x2 |
緑 | 0b0100 | 0x4 |
シアン | 0b0110 | 0x6 |
赤 | 0b1000 | 0x8 |
マゼンタ | 0b1010 | 0xa |
黄色 | 0b1100 | 0xc |
白 | 0b1110 | 0xe |
以下は先頭1ライン目に黄色の線をひくコード。
cmd_buf = bytearray(92)
cmd_buf[0] = 0x90 # SINGLE LINE UPDATE MODE (4BIT-DATA MODE)
cmd_buf[1] = 1 # 水平ライン指定は1オリジン
for i in range(88): # 1ラインのピクセル数分
cmd_buf[i+2] = 0xcc # 1バイトの上位4ビットと下位4ビットで2ピクセル分
cmd_buf[90] = 0
cmd_buf[91] = 0
scs.high()
sleep_us(6)
spi.write(cmd_buf)
sleep_us(6)
scs.low()
結果は以下の写真のとおり。