稼働中

Raspberry Pi Pico(d_14)AQM0802 LCD

AQM0802 ST7032  (I2C)

8文字2行のLCD ST7032のAQM0802A-RN-GBWを使ってみようと思います。
AQM0802A-RN-GBWモジュールはLCDドライバーST70328の文字2行の小型LCDです。I2C通信で制御します。
Raspberry Pi PicoでAQM0802A-RN-GBWを使ってみました。
※micro:bitの記事e_09からRaspberry Pi Picoで使えるように追記、修正等をしました。

外観

AQM0802A-RN-GBWモジュールの外観写真です。(以後はAQM0802と記載します)
AQM0802A-RN-GBW

接続例

AQM0802の電源は5Vにしました。(3.3Vで動かなかったので)そのため3.3V<>5.0Vのレベルコンバータ介してRaspberry Pi Picoと接続しました。I2C通信にはI2C1のSDA(GP10)SCL(GP11)を使いました。
AQM0802 接続例
接続出来たらI2Cデバイスのスレーブアドレスを調べてみます。
ThonnyのShellで確認しました。
AQM0802のスレーブアドレスは以下のように62(0x3e)でした。


>>> from machine import I2C,Pin
>>> i2c=I2C(1, scl=Pin(11), sda=Pin(10), freq=100_000)
>>> i2c.scan()
[62]                #'0x3e'
>>> 

AQM0802の説明

データシートから抜粋してAQM0802の説明します。
(!!印は下方のスクリプトで対応する部分です。)

writeモード
下図のようになります。少し分かり難いです。
control byte |Co|RS|0|0|0|0|0|0|のCo、RSの値でコマンド送信、データ送信の区別を単送信、連続送信かを設定できます。

RSの値で次のdata byteの値がコマンドかデータを設定します。
RS=’0’でコマンド、RS=’1’でデータです。

Coは単発か連続かを設定します。
Co=’0’で単発、Co=’1’で連続です。
AQM0802 write
※AQM0802A-RN-GBWのデータシートより抜粋

初期設定
以下の図は初期設定例です。
[0x38,0x39,0x14,0x70,0x56,0x6C,0x38,0x0C,0x01](data byteの値)を順次送信して行きます。
AQM0802 初期設定
※AQM0802A-RN-GBWのデータシートより

例えば、0x38(Function Set)を送信(write)するにはcontrol byteは0x00になります。
コマンドを単発送信するのでCo=’0’、RS=’0’にします。
|Co|RS|0|0|0|0|0|0|=|0|0|0|0|0|0|0|0|=0x00

buf = bytearray(2) #!! def lcd_contdata(byte_x)
buf[0]=0x00 #control byte
buf[1]=0x38 #data byte (instruction)
i2c.writeto(adr, buf) #adrはAQM0802のアドレスです。

文字列を送る場合には #!! def lcd_contdata(byte_x)
データを連続送信するのでCo=’1’、RS=’1’にします。
|Co|RS|0|0|0|0|0|0|=|1|1|0|0|0|0|0|0|=0xC0(control byte)

最後の文字データ時には  #!! def lcd_lastdata(byte_x)
データを連続送信するのでCo=’1’、RS=’0’にします。
|Co|RS|0|0|0|0|0|0|=|0|1|0|0|0|0|0|0|=0x40(control byte)

命令コードなど詳細はAQM0802A-RN-GBWの説明書やST7032のデータシートを参照ください。

スクリプト

AQM0802のスクリプトは以下のようにしました。
文字列”AQM0802A”を表示します。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。


pico_aqm0802_01b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#AQM0802A-RN-GBW  LCD-Driver ST70328
from machine import I2C,Pin
import time
adr_lcd=0x3e  #62
i2c=I2C(1, scl=Pin(11), sda=Pin(10), freq=100_000)
#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.writeto(adr_lcd, buf)
    time.sleep_ms(100)
#***** I2C_LCDの初期化
def lcd_init():  
    d1=[0x38,0x39,0x14,0x70,0x56,0x6C] #(OSC 0x14,contrast 0x70)..follower control
    d2=[0x38,0x0f,0x01]  # disp on cursor=on,position=on
    #d2=[0x38,0x0C,0x01] # disp on cursor=off 
    for i in d1:
        lcd_cmd(i)
    for i in d2:
        lcd_cmd(i)
    time.sleep_ms(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.writeto(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.writeto(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])

## main 
#AQM0802 LCD 初期化
lcd_init()
time.sleep(1)

#Cursor pos
#1行目のタイトル文字 (0,1) 2行目に表示
lcd_setCursor(0,0)
lcd_printStr("AQM0802A")
time.sleep(1)

部分説明

■lcd_init()
AQM0802 LCDを初期化します。
■lcd_clear()
画面をクリアします。
■lcd_DisplayOn()
ディスプレイをオンします。
■lcd_DisplayOff()
ディスプレイをオフします。
■lcd_setCursor(byte_x, byte_y)
カーソル位置を設定します
■lcd_printStr(pr)
英数文字列(pr)を表示します。

実行結果

文字列”AQM0802A”を表示します。
結果は以下のようになりました。※Thonnyのshellにも表示されます。
AQM0802 文字表示


>>> %Run -c $EDITOR_CONTENT
A
Q
M
0
8
0
2
A
>>> 

スクリプトを実行した後にThonnyのshellで下記を実行しました。


>>> lcd_clear()
>>> lcd_setCursor(0, 0)
>>> ss='01234567'
>>> lcd_printStr(ss)
>>> ss='!"#$%&()'
>>> lcd_setCursor(0, 1)
>>> lcd_printStr(ss)

以下のように表示されました。
AQM0802 文字表示2

まとめ

Raspberry Pi PicoでAQM0802A-RN-GBWモジュールを使ってLCDに文字表示ができました。