稼働中

マイクロビット(e_09)LCD AQM0802 小型液晶

AQM0802

I2C接続可能な小型8文字×2行液晶のLCD ST7032のAQM0802A-RN-GBWモジュールを使ってみようと思います。以下は外観写真です。
ST7032

接続例

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の表示の状態です。

初期化した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」の本にあったセンサー類の使用例はここで終わりです。