小型液晶表示AQM1602は、ピッチを変換する基板付きで秋月電子通商から、780円で販売されていて、i2c接続で手軽に使えます。
今回はそのAQM1602をマイクロ パイソンを使って、文字(カタカナ含む)を表示させてみました。
AQM1602の細かい仕様はよくわかりませんので、仕様の説明は省きますが、秋月さんの仕様書通りにプログラムすれば大丈夫でした。また前回の(投稿有機LEDSO1602)と使い方はあまり変わりませんので、そちらも参考にしてください。
これにより マイクロ Python が使えるコンピューター 、例えばラズベリーパイ ピコ、Seeed XIAOなどなどでAQM1602が使えます。
i2c設定
まずi2cの設定をします。
マイクロパイソンのi2c仕様はこちらのサイトに詳しく書いてあります、参考にしてください。
ラズベリーパイの時
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
今回sclはピン1番、sdaはピン0、freqは200khにしました。
プルアップ抵抗は必要ありません。

Seeed Studio XIAO の時
from machine import Pin, I2C
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)
sclはピン7番、sdaはピン6、freqは200khにしました。

各種設定
設定値
adrAQM1602 = 0x3E #スレーブアドレス(デフォルト)
datAQM1602 = 0x40 #データ書き込み定数
comAQM1602 = 0x00 #コマンド書き込み定数
データ書き込み
コマンド書き込み
def writeDatAQM1602(dat): #データ書き込み関数
i2c.writeto_mem(adrAQM1602, datAQM1602, bytes([dat & 0xFF]))
def writeComAQM1602(com): #コマンド書き込み関数
i2c.writeto_mem(adrAQM1602, comAQM1602, bytes([com & 0xFF]))
プログラム
秋月電子のアルディーノのプログラムを参考にプログラムしてみました。
表示は半角英数字、全角カタカナを入力すると、LCDに数字とアルファベットとカタカナが表示されます。
import time
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
adrAQM1602 = 0x3E
datAQM1602 = 0x40
comAQM1602 = 0x00
kana={"ア":177,"イ":178,"ウ":179,"エ":180,"オ":181,
"カ":182,"キ":183,"ク":184,"ケ":185,"コ":186,
"サ":187,"シ":188,"ス":189,"セ":190,"ソ":191,
"タ":192,"チ":193,"ツ":194,"テ":195,"ト":196,
"ナ":197,"二":198,"ヌ":199,"ネ":200,"ノ":201,
"ハ":202,"ヒ":203,"フ":204,"ヘ":205,"ホ":206,
"マ":207,"ミ":208,"ム":209,"メ":210,"モ":211,
"ヤ":212,"ユ":213,"ヨ":214,"ラ":215,"リ":216,
"ル":217,"レ":218,"ロ":219,"ワ":230,"ン":221,
"゜":242,"゛":241," ":32,"”":241,"“":241,
}
def writeDataAQM1602(dat):
i2c.writeto_mem(adrAQM1602, datAQM1602, bytes([dat & 0xFF]))
time.sleep_ms(1)
def writeComAQM1602(com):
i2c.writeto_mem(adrAQM1602, comAQM1602, bytes([com & 0xFF]))
time.sleep_ms(1)
def initAQM1602():
time.sleep_ms(100)
writeComAQM1602(0x38)
time.sleep_ms(20)
writeComAQM1602(0x39)
time.sleep_ms(20)
writeComAQM1602(0x14)
time.sleep_ms(20)
writeComAQM1602(0x70)
time.sleep_ms(20)
writeComAQM1602(0x56)
time.sleep_ms(20)
writeComAQM1602(0x6C)
time.sleep_ms(20)
writeComAQM1602(0x38)
time.sleep_ms(20)
writeComAQM1602(0x01)
time.sleep_ms(20)
writeComAQM1602(0x0C)
time.sleep_ms(20)
def clearAQM():
writeComAQM1602(0x38)
time.sleep_ms(20)
writeComAQM1602(0x01)
time.sleep_ms(20)
def clear_line(LL):
if LL == 0:
writeComAQM1602(0x80)
else:
writeComAQM1602(0xC0)
for i in range(16):
writeDataAQM1602(0x20)
def print_AQM1602(L,da):
if type(da) is int :
da=str(da)
ab=len(da)
for i in range(16-ab):
da+=" "
if L == 0:
writeComAQM1602(0X80)
else:
writeComAQM1602(0Xc0)
for i in da:
if ord(i) >= 8221:
writeDataAQM1602(kana[i])
else:
writeDataAQM1602(ord(i))
initAQM1602()
print_AQM1602(0,123456789)
print_AQM1602(1,"アイウエオ ラス゛ヒ゜コ"+"1234")
簡単にプログラムを解説します。
def initAQM1602(): AQM1602をイニシャライズする関数です、初めに必ず実行してください。
def clearAQM(): 画面をクリアーしますが、イニシャライズすればいいので必要ないかもしれません。
def clear_line(LL): 行を指定して画面クリアーしますが、今回の書き込み関数は、ラインごとにすべての文字がクリアーされて書き込まれるので、必要ないかもしれません。
def print_AQM1602(L,da): パラメータが2つあります。
Lの部分は行を指定します、0で1行目、それ以外は2行目になります、例えば3を入れても2行目になります。
daのパラメータは数字、または文字列になります。
文字列は半角英数、全角カタカナになります、全角スペースも受け付けます。
カタカナの濁音と破裂音
カナ辞書データを増やせばもっと簡単に表示できますが、面倒でしたので、簡易的に表示させました。
例えば濁音、ダ、の表示の場合カタカナの タ + ゛2文字で表します。
濁点の ゛部分は漢字入力モードで、シフトキーと数字の2を押して、次にシフトキー押したままスペースキーを押して、全角記号゛を選びます。
破裂音の場合も パ の表示 パ + ゜2文字で表します゜の部分は漢字入力モードで、シフトキーと数字の7を押して、次にシフトキー押したままスペースキーを押して、全角記号゜を選びます。
この部分は厳密にチェックしていないのでエラーが出るかもしれません。
結果です

色々改良する部分があると思いますが、動きました。
これはラズパイPicoで動かしましたので、Seeed Studio XIAOの時は
i2c設定の部分を変更してください。
プログラム自体難しくないと思います。
皆さんも、もっと良いプログラム方法があると思いますので、使いやすく改良してみてください。
改良プログラム(2024 10月)
前回作ったプログラムは少し使い勝手が良くありませんでしたので、少し改善してみました。
print_AQM1602()の関数は引数は一つにして、文字列、intタイプ、floatタイプ、の3種類で、floatは小数点第2桁までの表示です。
set_line(2)関数は引数で1で一列目に、2で2列目に表示する設定です。
例えば下記のようになります
ccc=345.765
print_AQM1602(ccc)
set_line(2)
print_AQM1602(“アイウエオ ラス゛ヒ゜コ”+”1234”)
下記が実際に変更改良したプログラムです。
import time
from machine import Pin, I2C
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)
adrAQM1602 = 0x3E
datAQM1602 = 0x40
comAQM1602 = 0x00
kana={"ア":177,"イ":178,"ウ":179,"エ":180,"オ":181,
"カ":182,"キ":183,"ク":184,"ケ":185,"コ":186,
"サ":187,"シ":188,"ス":189,"セ":190,"ソ":191,
"タ":192,"チ":193,"ツ":194,"テ":195,"ト":196,
"ナ":197,"二":198,"ヌ":199,"ネ":200,"ノ":201,
"ハ":202,"ヒ":203,"フ":204,"ヘ":205,"ホ":206,
"マ":207,"ミ":208,"ム":209,"メ":210,"モ":211,
"ヤ":212,"ユ":213,"ヨ":214,"ラ":215,"リ":216,
"ル":217,"レ":218,"ロ":219,"ワ":230,"ン":221,
"゜":242,"゛":241," ":32,"”":241,"“":241,"ー":45
}
def writeDataAQM1602(dat):
i2c.writeto_mem(adrAQM1602, datAQM1602, bytes([dat & 0xFF]))
time.sleep_ms(1)
def writeComAQM1602(com):
i2c.writeto_mem(adrAQM1602, comAQM1602, bytes([com & 0xFF]))
time.sleep_ms(1)
def initAQM1602():
time.sleep_ms(100)
writeComAQM1602(0x38)
time.sleep_ms(20)
writeComAQM1602(0x39)
time.sleep_ms(20)
writeComAQM1602(0x14)
time.sleep_ms(20)
writeComAQM1602(0x70)
time.sleep_ms(20)
writeComAQM1602(0x56)
time.sleep_ms(20)
writeComAQM1602(0x6C)
time.sleep_ms(20)
writeComAQM1602(0x38)
time.sleep_ms(20)
writeComAQM1602(0x01)
time.sleep_ms(20)
writeComAQM1602(0x0C)
time.sleep_ms(20)
def clearAQM():
writeComAQM1602(0x38)
time.sleep_ms(20)
writeComAQM1602(0x01)
time.sleep_ms(20)
def set_line(ll):
if ll == 1:
writeComAQM1602(0xC0)
else:
writeComAQM1602(0x80)
def print_AQM1602(da):
if type(da) is int:
da=str(da)
for i in da:
writeDataAQM1602(ord(i))
elif type(da) is float:
da2=int(da)
da3=int(int((da*100)%100))
da2=str(da2)
da3=str(da3)
for i in da2:
writeDataAQM1602(ord(i))
writeDataAQM1602(ord("."))
for i in da3:
writeDataAQM1602(ord(i))
else :
for i in da:
da4=ord(i)
if da4 >= 8221:
writeDataAQM1602(kana[i])
else:
writeDataAQM1602(ord(i))
initAQM1602()
ccc=7345.765
print_AQM1602(ccc)
print_AQM1602(" ")
print_AQM1602(1234)
set_line(2)
print_AQM1602("アイウエオ ラス゛ヒ゜コ"+"1234")
実際の表示は下記の画面です。

改良プログラム(2025 2月)
今回はクラスを使ってライブラリーを編集してもっと使いやすくするようにしてみました。
また以前プログラムにもバフがありましたので一部修正しておきました。
前回と使いかたほぼ同じですが clear_line()を追加しました。
clear_line(1) 引数は1で 1行目をクリアー 2で2行目です。
intAQM()
clearAQM()
set_line(0) カーソルセット 0で1行目先頭 1で2行目先頭
print_AQM() 引数は整数、フロートタイプ、文字列 です。
import time
from machine import Pin, I2C
class Aqm1602:
adrAQM1602 = 0x3E
datAQM1602 = 0x40
comAQM1602 = 0x00
kana={"ア":177,"イ":178,"ウ":179,"エ":180,"オ":181,
"カ":182,"キ":183,"ク":184,"ケ":185,"コ":186,
"サ":187,"シ":188,"ス":189,"セ":190,"ソ":191,
"タ":192,"チ":193,"ツ":194,"テ":195,"ト":196,
"ナ":197,"二":198,"ヌ":199,"ネ":200,"ノ":201,
"ハ":202,"ヒ":203,"フ":204,"ヘ":205,"ホ":206,
"マ":207,"ミ":208,"ム":209,"メ":210,"モ":211,
"ヤ":212,"ユ":213,"ヨ":214,"ラ":215,"リ":216,
"ル":217,"レ":218,"ロ":219,"ワ":230,"ン":221,
"゜":242,"゛":241," ":32,"”":241,"“":241,
}
def __init__(self, id1=0,scl_pin = 1,sda_pin = 0):
self.i2c = I2C(id1,scl=Pin(scl_pin),sda=Pin(sda_pin),freq=200000)
def writeDataAQM1602(self,dat):
self.i2c.writeto_mem(self.adrAQM1602, self.datAQM1602, bytes([dat & 0xFF]))
time.sleep_ms(1)
def writeComAQM1602(self,com):
self.i2c.writeto_mem(self.adrAQM1602, self.comAQM1602, bytes([com & 0xFF]))
time.sleep_ms(1)
def initAQM(self):
time.sleep_ms(100)
self.writeComAQM1602(0x38)
time.sleep_ms(20)
self.writeComAQM1602(0x39)
time.sleep_ms(20)
self.writeComAQM1602(0x14)
time.sleep_ms(20)
self.writeComAQM1602(0x70)
time.sleep_ms(20)
self.writeComAQM1602(0x56)
time.sleep_ms(20)
self.writeComAQM1602(0x6C)
time.sleep_ms(20)
self.writeComAQM1602(0x38)
time.sleep_ms(20)
self.writeComAQM1602(0x01)
time.sleep_ms(20)
self.writeComAQM1602(0x0C)
time.sleep_ms(20)
def clearAQM(self):
self.writeComAQM1602(0x38)
time.sleep_ms(20)
self.writeComAQM1602(0x01)
time.sleep_ms(20)
def clear_line(self,LL):
if LL == 0:
self.writeComAQM1602(0x80)
else:
self.writeComAQM1602(0xC0)
for i in range(16):
self.writeDataAQM1602(0x20)
def set_line(self,ll):
if ll == 1:
self.writeComAQM1602(0xC0)
else:
self.writeComAQM1602(0x80)
def print_AQM(self,da):
if type(da) is int:
da=str(da)
for i in da:
self.writeDataAQM1602(ord(i))
elif type(da) is float:
da2=int(da)
da3=int(int((da*100)%100))
da2=str(da2)
da3=str(da3)
for i in da2:
self.writeDataAQM1602(ord(i))
self.writeDataAQM1602(ord("."))
for i in da3:
self.writeDataAQM1602(ord(i))
else :
for i in da:
da4=ord(i)
if da4 >= 8221:
self.writeDataAQM1602(self.kana[i])
else:
self.writeDataAQM1602(ord(i))
使いかた
たとえば次のように呼び出して使います。
from aqm1602_3 import Aqm1602 as AQ #ライブラリーを呼び出します
import time
Aq = AQ(1,7,6) #シードシャオ用のI2Cでinstancesを生成します
Aq.initAQM() # クリアー
Aq.print_AQM("アイン ")
Aq.print_AQM(234.5)
Aq.set_line(1)
Aq.print_AQM("abcdef")
time.sleep(2)
Aq.clear_line(1)
このように表示されます。
