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と記載します)
接続例
AQM0802の電源は5Vにしました。(3.3Vで動かなかったので)そのため3.3V<>5.0Vのレベルコンバータ介してRaspberry Pi Picoと接続しました。I2C通信にはI2C1のSDA(GP10)SCL(GP11)を使いました。
接続出来たら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’で連続です。
※AQM0802A-RN-GBWのデータシートより抜粋
初期設定
以下の図は初期設定例です。
[0x38,0x39,0x14,0x70,0x56,0x6C,0x38,0x0C,0x01](data byteの値)を順次送信して行きます。
※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にも表示されます。
>>> %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)
まとめ
Raspberry Pi PicoでAQM0802A-RN-GBWモジュールを使ってLCDに文字表示ができました。