マイクロビット(e_09)LCD AQM0802 小型液晶
AQM0802
I2C接続可能な小型8文字×2行液晶のLCD ST7032のAQM0802A-RN-GBWモジュールを使ってみようと思います。以下は外観写真です。
接続例
ST7032のデータシートやAQM0802Aモジュールの説明書をみると3.3Vでも動作するようなのですが、実際にmicro:bitと接続すると動作しませんでした。スクリプトに間違いがあるのかと四苦八苦しましたが、外部電源5Vに変更して3.3V<>5.0Vのレベルコンバータ介してAQM0802Aを接続したら動きました。(以後はLCDやST7032と記載します)
LCD ST7032はI2C接続で使えます。接続は以下の図のようにしました。micro:bitのクロック信号SCL(Pin19)、データ信号SDA(Pin20)をレベルコンバータを介してLCD ST7032モジュールのSCL、SDAと接続します。
以下は実体接続の写真です。
初期設定
LCD ST70のモジュールAQM0802Aの取扱説明書に初期設定例が以下のように記載されていました。詳しくはデータシートを参照してください。この初期設定をそのまま使います。初期設定のコマンドデータを以下にしました。※display 0x0cだと何も表示されないので 0x0e に変更してカーソルを表示しました。
#OSC>Contrast>Icon>follower>..display on>clear
d1=[0x38,0x39,0x14,0x70,0x56,0x6C,0x38,0x0e,0x01]
スクリプトは以下のようにしました。※thonny-microbitのMicroPythonを使っています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# LCD syoki settei
from microbit import *
# device slave address
adr_lcd=0x3e
#print(adr_lcd)
def lcd_cmd(buf):
i2c.write(adr_lcd,buf)
sleep(100)
d=[0x38,0x39,0x14,0x70,0x56,0x6C,0x38,0x0e,0x01]
for s in d:
buf=bytearray(2)
# Co(0)RS(0) >> 0x00
buf[0]=0x00
buf[1]=s
print(buf, hex(buf[0]), hex(buf[1])) # データの確認表示
lcd_cmd(buf)
実行結果です。(ThonnyのShell表示)
>>> %Run 1116_i2c_lcd1_ini.py
bytearray(b'\x008') 0x0 0x38 #データの確認表示
bytearray(b'\x009') 0x0 0x39
bytearray(b'\x00\x14') 0x0 0x14
bytearray(b'\x00p') 0x0 0x70
bytearray(b'\x00V') 0x0 0x56
bytearray(b'\x00l') 0x0 0x6c
bytearray(b'\x008') 0x0 0x38
bytearray(b'\x00\x0e') 0x0 0xe
bytearray(b'\x00\x01') 0x0 0x1
以下の写真が初期化したLCDの表示の状態です。
英数文字を表示
次に英数文字を表示させます。「みんなのAruduino」の本を参考にMicroPython に書き換えました。※CO、RSの詳細はデータシートを参照ください。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# LCD
from microbit import *
adr_lcd=0x3e
#print(adr_lcd)
#***** I2C_LCDへの書込み
def lcd_cmd(value):
#CO = 0 終,RS = 0 コマンド >> 0b_0000_0000(0x00)
buf = bytearray(2)
buf[0]=0x00
buf[1]=value
print(buf,hex(buf[0]),hex(buf[1]))
i2c.write(adr_lcd, buf)
sleep(100)
#***** I2C_LCDの初期化
def lcd_init():
# 設定 contrast (OSC 0x14) follower control
d=[0x38,0x39,0x14,0x70,0x56,0x6C,0x38,0x0e,0x01]
for i in d:
lcd_cmd(i)
sleep(100)
#---------------------個別の関数
#***** 画面クリア 関数
def lcd_clear():
lcd_cmd(0x01)
#***** 画面表示Off 関数
def lcd_DisplayOff():
lcd_cmd(0x08)
#***** 画面表示On 関数
def lcd_DisplayOn():
lcd_cmd(0x0C)
#===== 続き文字表示 補助
def lcd_contdata(byte_x):
# CO = 1 続 , RS = 1 データ >> 0b_1100_0000(0xC0)
buf = bytearray(2)
buf[0]=0xC0
buf[1]=byte_x
i2c.write(adr_lcd, buf)
#===== 最後文字表示 補助
def lcd_lastdata(byte_x):
#CO = 0 終, RS = 1 データ >> 0b_0100_0000(0x40)
buf = bytearray(2)
buf[0]=0x40
buf[1]=byte_x
i2c.write(adr_lcd, buf)
#***** カーソル位置
def lcd_setCursor(byte_x, byte_y):
a=(0x80 | (byte_y * 0x40 + byte_x))
lcd_cmd(a)
#***** lcd に文字を表示
def lcd_printStr(pr):
n=len(pr)
#print(n)
for i in range(n-1):
print(pr[i])
lcd_contdata(ord(pr[i])) # 後続のある文字
lcd_lastdata(ord(pr[n-1])) # 最後の文字
print(pr[n-1]) # 送信データの表示確認
LCDの初期化をします。
>>> %Run 1116_i2c_lcd2_def.py
>>> lcd_init()
bytearray(b'\x008') 0x0 0x38
bytearray(b'\x009') 0x0 0x39
bytearray(b'\x00\x14') 0x0 0x14
bytearray(b'\x00p') 0x0 0x70
bytearray(b'\x00V') 0x0 0x56
bytearray(b'\x00l') 0x0 0x6c
bytearray(b'\x008') 0x0 0x38
bytearray(b'\x00\x0f') 0x0 0xf
bytearray(b'\x00\x01') 0x0 0x1
スクリプトを実行したので、以下の関数が使えます。(ThonnyのShell内)
lcd_clear() 画面クリア lcd_DisplayOff() 画面表示Off lcd_DisplayOn() 画面表示On lcd_setCursor(x,y) カーソル位置セット lcd_printStr(String) 文字表示
lcd_printStrで”** Count”の文字を表示させてみます。ThonnyのShell内で動作させます。
>>> lcd_printStr("** Count")
* # ひとつづつ送られている
*
C
o
u
n
t
以下の写真が表示の結果です。文字が表示できるようになりました。
まとめ
micro:bitでLCD ST7032モジュールAQM0802Aを使ってみました。3.3Vでも動作するはずなのですが外部電源5Vが必要でした。そのためレベルコンバータを介して接続しました。初期設定から文字表示までできました。I2Cデバイスの使い方の練習にもなったと思います。
※「みんなのAruduino」の本にあったセンサー類の使用例はここで終わりです。