秋月のI2C接続LCD(ACM1602NI)用MicroPythonモジュール(日本語カナ表示対応)
秋月売っているACM1602NI-FLW-FBW-M01をMicroPythonがインストールされたESP32で使用した。
Pythonでmainにべた書きのLCD制御コードは転がっていたが、モジュール化されたこのLCD用のライブラリが見つからなかった。
後で使いやすいように自分でモジュール化した。(文字列表示、画面クリア、カーソル移動の最低限の動作のみ実装)
インスタンス時にI2Cを渡してやるだけなのでラズピコ(Raspberry Pi Pico、wなど)でも使えるはず。
環境
使用ボード:ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB
LCD:I2C接続キャラクタLCDモジュール 16×2行 白色バックライト付(ACM1602NI-FLW-FBW-M01)
PC:Windows10
IDE:Thonny
LCDモジュール
acm1602ni.py
from time import sleep
ACM1602NI_ADDR = 0x50
CHAR_TABLE = {
u'!': 0x21,
u'"': 0x22,
u'#': 0x23,
u'$': 0x24,
u'%': 0x25,
u'&': 0x26,
u"'": 0x27,
u'(': 0x28,
u')': 0x29,
u'*': 0x2a,
u'+': 0x2b,
u',': 0x2c,
u'-': 0x2d,
u'.': 0x2e,
u'/': 0x2f,
u'0': 0x30,
u'1': 0x31,
u'2': 0x32,
u'3': 0x33,
u'4': 0x34,
u'5': 0x35,
u'6': 0x36,
u'7': 0x37,
u'8': 0x38,
u'9': 0x39,
u':': 0x3a,
u';': 0x3b,
u'<': 0x3c,
u'=': 0x3d,
u'>': 0x3e,
u'?': 0x3f,
u'@': 0x40,
u'A': 0x41,
u'B': 0x42,
u'C': 0x43,
u'D': 0x44,
u'E': 0x45,
u'F': 0x46,
u'G': 0x47,
u'H': 0x48,
u'I': 0x49,
u'J': 0x4a,
u'K': 0x4b,
u'L': 0x4c,
u'M': 0x4d,
u'N': 0x4e,
u'O': 0x4f,
u'P': 0x50,
u'Q': 0x51,
u'R': 0x52,
u'S': 0x53,
u'T': 0x54,
u'U': 0x55,
u'V': 0x56,
u'W': 0x57,
u'X': 0x58,
u'Y': 0x59,
u'Z': 0x5a,
u'[': 0x5b,
u'¥': 0x5c,
u']': 0x5d,
u'^': 0x5e,
u'_': 0x5f,
u'`': 0x60,
u'a': 0x61,
u'b': 0x62,
u'c': 0x63,
u'd': 0x64,
u'e': 0x65,
u'f': 0x66,
u'g': 0x67,
u'h': 0x68,
u'i': 0x69,
u'j': 0x6a,
u'k': 0x6b,
u'l': 0x6c,
u'm': 0x6d,
u'n': 0x6e,
u'o': 0x6f,
u'p': 0x70,
u'q': 0x71,
u'r': 0x72,
u's': 0x73,
u't': 0x74,
u'u': 0x75,
u'v': 0x76,
u'w': 0x77,
u'x': 0x78,
u'y': 0x79,
u'z': 0x7a,
u'(': 0x7b,
u'|': 0x7c,
u')': 0x7d,
u'→': 0x7e,
u'←': 0x7f,
u'。': 0xa1,
u'「': 0xa2,
u'」': 0xa3,
u'、': 0xa4,
u'・': 0xa5,
u'ヲ': 0xa6,
u"ァ": 0xa7,
u'ィ': 0xa8,
u'ゥ': 0xa9,
u'ェ': 0xaa,
u'ォ': 0xab,
u'ャ': 0xac,
u'ュ': 0xad,
u'ョ': 0xae,
u'ッ': 0xaf,
u'ー': 0xb0,
u'ア': 0xb1,
u'イ': 0xb2,
u'ウ': 0xb3,
u'エ': 0xb4,
u'オ': 0xb5,
u'カ': 0xb6,
u'キ': 0xb7,
u'ク': 0xb8,
u'ケ': 0xb9,
u'コ': 0xba,
u'サ': 0xbb,
u'シ': 0xbc,
u'ス': 0xbd,
u'セ': 0xbe,
u'ソ': 0xbf,
u'タ': 0xc0,
u'チ': 0xc1,
u'ツ': 0xc2,
u'テ': 0xc3,
u'ト': 0xc4,
u'ナ': 0xc5,
u'ニ': 0xc6,
u'ヌ': 0xc7,
u'ネ': 0xc8,
u'ノ': 0xc9,
u'ハ': 0xca,
u'ヒ': 0xcb,
u'フ': 0xcc,
u'ヘ': 0xcd,
u'ホ': 0xce,
u'マ': 0xcf,
u'ミ': 0xd0,
u'ム': 0xd1,
u'メ': 0xd2,
u'モ': 0xd3,
u'ヤ': 0xd4,
u'ユ': 0xd5,
u'ヨ': 0xd6,
u'ラ': 0xd7,
u'リ': 0xd8,
u'ル': 0xd9,
u'レ': 0xda,
u'ロ': 0xdb,
u'ワ': 0xdc,
u'ン': 0xdd,
u'゛': 0xde,
u'゜': 0xdf,
u'α': 0xe0,
u'β': 0xe2,
u'ε': 0xe3,
u'μ': 0xe4,
u'δ': 0xe5,
u'ρ': 0xe6,
u'√': 0xe8,
u'∞': 0xf3,
u'Ω': 0xf4,
u'Σ': 0xf6,
u'π': 0xf7,
u'千': 0xfa,
u'万': 0xfb,
u'円': 0xfc,
u'÷': 0xfd,
u' ': 0xfe,
u' ': 0xfe,
u'■': 0xff
}
class ACM1602NI:
def __init__(self, i2c=None, address=ACM1602NI_ADDR):
self.address = address
if i2c is None:
raise ValueError('An I2C object is required.')
self.i2c = i2c
self.clear()
def __cmd(self, control, data, msec = 0):
buff = bytearray(2)
buff[0] = control
buff[1] = data
self.i2c.writeto(self.address, buff)
if msec > 0:
sleep(msec / 1000)
def send_text(self, text):
for ch in text:
self.__cmd(0x80, CHAR_TABLE[ch])
def clear(self):
self.__cmd(0x00, 0x01, 20)
self.__cmd(0x00, 0x38, 10)
self.__cmd(0x00, 0x0c, 10)
self.__cmd(0x00, 0x06, 10)
def move_cur(self, col, row):
if row > 0:
col = col + 0x40
col = 0x80 | col
self.__cmd(0x00, col, 20)
テストコード、使い方
テストコード
main.py
from time import sleep
from machine import Pin,SoftI2C
import acm1602ni
if __name__ == '__main__':
i2c = SoftI2C(scl = Pin(21),sda = Pin(22),freq = 100000)
lcd = acm1602ni.ACM1602NI(i2c)
lcd.move_cur(0, 0)
lcd.send_text("ハ゜イソンde")
lcd.move_cur(0, 1)
lcd.send_text("Hello world!!")
sleep(5)
lcd.clear()
LCDの1行目に「ハ゜イソンde」、2行目に「Hello world!」と表示されたあと、5秒後に画面がクリアされる。
使い方説明
ACM1602NIのSDA、SCLピンへのプルアップ忘れに注意。
インスタンス→カーソルを表示開始位置に移動→文字列表示の流れで使う。
ACM1602NIインスタンス時に引数でi2cオブジェクトを指定してやる。
move_cur(col, row)でカーソル移動。本LCDは16文字×2行なのでcolは0~15、rowは0~1。
send_text(text)でテキストを表示する。textは英数字記号のほかカナ等にも対応。
表示できる文字は秋月のデータシートのSTANDARD CHARACTER PATTERNSに書いてあるものに対応。゛(濁点)、゜(半濁点)はそれだけで1文字分となる。
clear()で画面表示がオールクリアされる。
0 件のコメント:
コメントを投稿