LoginSignup
1
0

More than 5 years have passed since last update.

ESPr Developer 用反射型カラー液晶を MicroPython から使う

Last updated at Posted at 2017-01-29

発売早々に入手した「ESPr Developer 用反射型カラー液晶」(LPM013M126A)であるが、使い方がぜんぜん分からない...  ネット上にも大した情報が見当たらない。数少ない情報源であるデータシートと mbed 用の C サンプル見ながら試行錯誤した結果、だいたい使い方が分かってきたのでメモしておく。

利用するモジュール

直に利用するライブラリは machine.SPImachine.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()

結果は以下の写真のとおり。

IMG_3838.JPG

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0