AQM1602XA-RN-GBW
別のシリーズ記事で「PIC16F18313」を使っているが、どうもI2C接続がうまくいかない。もしかして部品の方が壊れてる?という疑問を解消するために、いつもならArduinoを使う。この取扱説明書にも接続方法が書かれており、これで確認すればLCDが故障してないことは確認できる。
ただ、やはりイマドキなら(Micro)Pythonだよね!と思うでしょう?
ということでMicroPythonでI2C接続キャラクタディスプレイをPicoに接続して使ってみた。
なるべくPythonらしく
冒頭はimportではなくfromにしたのは前の記事に書いた通り「machine.Pin」と書くのが長すぎるからだ。
from machine import I2C,Pin
from time import sleep_ms,sleep
このLCDは書き込みしか出来ないし、アドレスがわかっているなら「1バイトコマンド書き込み」と「1バイトデータ書き込み」は以下のようになる。I 2C.writetoはバイトバッファしか受け付けないようだし、コマンドとデータの区別をつける1バイトを付け加える必要がある。コマンド書き込み後のsleep_ms(10)はもうちょっと小さくできる可能性がある。
def write1CMD(i2c,adr,c):
cmd=bytearray([0,c])
i2c.writeto(adr,cmd)
sleep_ms(10)
def write1DAT(i2c,adr,d):
dat=bytearray([0x40,d])
i2c.writeto(adr,dat)
sleep_ms(1)
LCD初期化のためのバイト列はデータシートのArduino向けの例に従った。Python特有のバイト配列、リスト、for文などC言語に慣れた身だといちいち調べないとわからん。
def init(i2c,adr):
inits=bytearray([0x38,0x39,0x14,0x73,0x52,0x6c,0x38,0x01,0x0c])
for i in inits:
write1CMD(i2c,adr,i)
接続したLCDのアドレスはscanして得た。複数台を繋ぐとこの方法は使えない。接続ピンはPin(1)とPin(0)だが、Picoは2系統のI2Cバスを持つので、I2C(0)とバスIDを指定する必要がある。公式マニュアルにはバス番号の指定は書かれていないが、Pico特有情報の方に書かれている。そしてfreqに書かれた「100_000」とは何なのか。「100000」ではダメなのか。
i2c=I2C(0,scl=Pin(1),sda=Pin(0),freq=100_000)
devs=i2c.scan()
adr=devs[0]
init(i2c,adr)
文字列をバイト配列に格納するには「b'AQM.....'」と書く必要があるなんて、ちょっと調べただけではわからない。そして「for i in moji」で変数iに入るのは文字なのか整数値なのか。まぁ動いているのでヨシとしておく。
moji=bytearray(b'AQM1602XA-RN-GBW')
for i in moji:
write1DAT(i2c,adr,i)
sleep(3)
あとは無限ループで次々に文字データを書き込むようにしてみた。
cnt0=ord(' ')
cnt=cnt0
while True:
write1DAT(i2c,adr,cnt)
cnt=cnt+1
if(cnt>255):
cnt=cnt0
将来的にはArduinoのLyquidCrystalと同じようにライブラリ化して整理したい。
投稿者の人気記事
-
akira.kei
さんが
前の月曜日の0:45
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の月曜日の0:54
に
編集
をしました。
ログインしてコメントを投稿する