2023年8月8日火曜日

秋月のI2C接続LCD(ACM1602NI)用MicroPythonモジュール(日本語カナ表示対応)

acm1602ni.md

秋月の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 件のコメント:

コメントを投稿