« MicroPython(Nucleo)にElecFreaks-Alphanumeric-Display(i2c)を接続する | トップページ | CircuitPython/MicroPythonに温度センサーTMP102(i2c)を接続する »

2020年3月24日 (火)

CircuitPython/MicroPythonにi2c-LCD(AE-AQM0802)を接続する

2020/2/24

CircuitPython AE-AQM0802(i2c)

CircuitPython AE-AQM0802(i2c)

概要

CircuitPython/MicroPythonに以下のi2c-LCD(AE-AQM0802)を接続する。
(ホストPCとしてはubuntuを想定している)

I2C接続小型キャラクタLCDモジュール(8×2行)完成品

接続

以下のように接続する。

Wiring:

AE-AQM0802 Teensy4.0(CircuitPython)
SCL D19(SCL0)
SDA D18(SDA0)
VCC 3.3V
GND GND

該当モジュールのインストール

Module Install:

# 以下のリンクからダウンロードする wget https://beta-notes.way-nifty.com/blog/files/st7032i.py # rename mv st7032i.py ST7032i.py # copy related modules cp ST7032i.py CIRCUTPY/lib/

ST7032.pyの内容

# ST7032i.py # this module is forked from the following souces: # https://gist.github.com/boochow/6ffd0c939abbcc1a9c62bf6ab6b60cef#file-st7032i-py # https://qiita.com/f_nishio/items/b1b99b4763993a9239c6 # 2020/3/23 patch for contrast from micropython import const #from machine import Pin, I2C import time CLEAR_DISPLAY = const(0x01) RETURN_HOME = const(0x02) SET_ENTRY_MODE = const(0x04) DISPLAY_ON = const(0x0C) FUNCTION_SET = const(0x20) OSC_FREQUENCY = const(0x10) POW_ICON_CONTRAST = const(0x50) FOLLOWER = const(0x60) SET_CONTRAST = const(0x70) class ST7032i(object): def __init__(self, i2c, addr=0x3e): self.i2c = i2c self.addr = addr self.buf = bytearray(2) self.init_display() def write_cmd(self, cmd): self.buf[0] = 0x00 self.buf[1] = cmd self.i2c.writeto(self.addr, self.buf) def write_data(self, char): self.buf[0] = 0x40 self.buf[1] = char self.i2c.writeto(self.addr, self.buf) def init_display(self): """ for cmd in ( # data is 8 bits | 2 lines mode FUNCTION_SET | 0x10 | 0x08, # select Instruction table 1 FUNCTION_SET | 0x10 | 0x08 | 0x01, # BS=1 (1/4 bias), OSC frequency=183Hz OSC_FREQUENCY | 0x08 | 0x04, # ICON on, Booster on, Contrast(upper 2bits) = 10 POW_ICON_CONTRAST | 0x08 | 0x04 | 0x02, # Contrast(lower 4bits) = 1000 SET_CONTRAST | 0x08, # Follower on, amplify ratio = 4/8 FOLLOWER | 0x08 | 0x04 ): self.write_cmd(cmd) time.sleep(0.2) for cmd in ( DISPLAY_ON, CLEAR_DISPLAY, # Left to right, no shift SET_ENTRY_MODE | 0x02 ): self.write_cmd(cmd) """ # 2020/3/23: patched init self.i2c.writeto(self.addr, b'\x00\x38') self.i2c.writeto(self.addr, b'\x00\x39') self.i2c.writeto(self.addr, b'\x00\x14') self.i2c.writeto(self.addr, b'\x00\x73') self.i2c.writeto(self.addr, b'\x00\x56') self.i2c.writeto(self.addr, b'\x00\x6c') self.i2c.writeto(self.addr, b'\x00\x38') self.i2c.writeto(self.addr, b'\x00\x0C') self.i2c.writeto(self.addr, b'\x00\x01') def clear(self): """ Clear display and return to home position. """ self.write_cmd(0x01) # clear display time.sleep(0.01) # wait time > 1.08 ms self.write_cmd(0x02) # return home time.sleep(0.01) # wait time > 1.08 ms def return_home(self): """ return to home """ self.write_cmd(0x02) # return home time.sleep(0.01) # wait time > 1.08 ms def set_contrast(self, contrast): """ Set contrast (0 - 15). """ if contrast < 0: contrast = 0 if contrast > 0x0f: contrast = 0x0f self.write_cmd(0x39) self.write_cmd(0x70 + contrast) def set_cursor(self, x, y): """ set cursor location (address counter).""" if x < 0: x = 0 if y < 0: y = 0 ddram_addr = y * 0x40 + x self.write_cmd(0x80 + ddram_addr) # set DDRAM address def set_entry_mode(self, increment, shift): mode = 0x04 if (increment): mode = mode + 2 if (shift): mode = mode + 1 self.write_cmd(mode) def print(self, str, wait = 0): for c in str: self.write_data(ord(c)) if (wait > 0): time.sleep(wait) if __name__ == '__main__': # MicroPython #from machine import Pin, I2C #i2c=I2C(1) # CircuitPython #import board #import busio # Create the I2C interface. #i2c = busio.I2C(board.SCL, board.SDA) #i2c.try_lock() import time from ST7032i import ST7032i lcd = ST7032i(i2c) lcd.set_entry_mode(False, False) lcd.set_contrast(1) lcd.clear() # show characters in 2 lines lcd.set_cursor(0, 0) lcd.print('1234') lcd.set_cursor(4, 1) lcd.print('5678') # LCD clear time.sleep(2) lcd.clear() # ticker lcd.set_entry_mode(True, True) lcd.set_cursor(8, 0) lcd.print('Hello, this is a ticker message.', 0.5)

CircuitPythonとMicroPythonに共通してあるi2c.writetoのみを使用しているので、両方に対応できている。。

Demo Script(動作確認)

import time import board import busio # Create the I2C interface. i2c = busio.I2C(board.SCL, board.SDA) i2c.try_lock() from ST7032i import ST7032i lcd = ST7032i(i2c) lcd.set_entry_mode(False, False) lcd.set_contrast(1) lcd.clear() # show characters in 2 lines lcd.set_cursor(0, 0) lcd.print('1234') lcd.set_cursor(4, 1) lcd.print('5678') # LCD clear time.sleep(2) lcd.clear() # ticker lcd.set_entry_mode(True, True) lcd.set_cursor(8, 0) lcd.print('Hello, this is a ticker message.', 0.5)

MicroPython(Nucleo)の場合

該当モジュールST7032i.pyが、CircuitPython/MicroPython両方に対応しているので そのまま/flashに書き込むだけでパッチなどは必要ない。

Module Install:

wget https://beta-notes.way-nifty.com/blog/files/st7032i.py mv st7032i.py ST7032i.py ampy put ST7032.py

Demo Script:

import time from machine import Pin, I2C # Create the I2C interface. i2c = I2C(1) from ST7032i import ST7032i lcd = ST7032i(i2c) lcd.set_entry_mode(False, False) lcd.set_contrast(1) lcd.clear() # show characters in 2 lines lcd.set_cursor(0, 0) lcd.print('1234') lcd.set_cursor(4, 1) lcd.print('5678') # LCD clear time.sleep(2) lcd.clear() # ticker lcd.set_entry_mode(True, True) lcd.set_cursor(8, 0) lcd.print('Hello, this is a ticker message.', 0.5)

デバイスなどの初期化以外はCircuitPythonのものと全く同じ。

参照情報

I2C接続小型キャラクタLCDモジュール(8×2行)完成品
I2C接続小型キャラクタLCDモジュール(8×2行)の質問と回答

ESP32 + MicroPythonでLCDモジュールに文字を表示させてみた
WiringPi-Pythonを使ってAQM0802A / ST7032i LCD表示
MicroPythonでAE-AQM0802を使ってみる。
"MicroPythonでAE-AQM0802を使ってみる"の続き

Turtorial Examples for CircuitPython(Teensy4.0)
Teensy4.0にCircuitPythonをインストールする

Turtorial Examples for Nucleo-MicroPytho
NUCLEO-F446REにMicropythonをインストールする(v2)

以上

|

« MicroPython(Nucleo)にElecFreaks-Alphanumeric-Display(i2c)を接続する | トップページ | CircuitPython/MicroPythonに温度センサーTMP102(i2c)を接続する »

MicroPython」カテゴリの記事

Nucleo」カテゴリの記事

CircuitPython」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« MicroPython(Nucleo)にElecFreaks-Alphanumeric-Display(i2c)を接続する | トップページ | CircuitPython/MicroPythonに温度センサーTMP102(i2c)を接続する »