akira.kei が 2025年03月24日00時54分16秒 に編集
コメント無し
本文の変更
[<前の記事](https://elchika.com/article/034ee03d-6f0e-474e-a313-7823f7c6b587/) : [次の記事>](url)
## [AQM1602XA-RN-GBW](https://akizukidenshi.com/catalog/g/g108896/) [別のシリーズ記事](https://elchika.com/article/255eb8fa-f3fd-4546-89e2-786402b65667/)で「PIC16F18313」を使っているが、どうもI2C接続がうまくいかない。もしかして部品の方が壊れてる?という疑問を解消するために、いつもならArduinoを使う。[取扱説明書](https://akizukidenshi.com/goodsaffix/AQM1602_rev2.pdf)にも接続方法が書かれており、これで確認すれば部品が故障してないことは確認できる。
## AQM1602XA-RN-GBW [別のシリーズ記事](https://elchika.com/article/255eb8fa-f3fd-4546-89e2-786402b65667/)で「PIC16F18313」を使っているが、どうも[I2C接続](https://akizukidenshi.com/catalog/g/g108896/)がうまくいかない。もしかして部品の方が壊れてる?という疑問を解消するために、いつもならArduinoを使う。[この取扱説明書](https://akizukidenshi.com/goodsaffix/AQM1602_rev2.pdf)にも接続方法が書かれており、これで確認すればLCDが故障してないことは確認できる。

ただ、やはりイマドキなら(Micro)Pythonだよね!と思うでしょう。ということでMicroPythonでI2C接続キャラクタディスプレイを使ってみた。
ただ、やはりイマドキなら(Micro)Pythonだよね!と思うでしょう? ということでMicroPythonでI2C接続キャラクタディスプレイをPicoに接続して使ってみた。
 > https://youtube.com/shorts/3QHzexaaRyc?feature=share ## なるべくPythonらしく 冒頭はimportではなくfromにしたのは前の記事に書いた通り「machine.Pin」と書くのが長すぎるからだ。 ```Python: from machine import I2C,Pin from time import sleep_ms,sleep ``` このLCDは書き込みしか出来ないし、アドレスがわかっているなら「1バイトコマンド書き込み」と「1バイトデータ書き込み」は以下のようになる。I 2C.writetoはバイトバッファしか受け付けないようだし、コマンドとデータの区別をつける1バイトを付け加える必要がある。コマンド書き込み後のsleep_ms(10)はもうちょっと小さくできる可能性がある。 ```Python: 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言語に慣れた身だといちいち調べないとわからん。 ```Python: 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を指定する必要がある。[公式マニュアル](https://micropython-docs-ja.readthedocs.io/ja/latest/library/machine.I2C.html)にはバス番号の指定は書かれていないが、[Pico特有情報](https://micropython-docs-ja.readthedocs.io/ja/latest/rp2/quickref.html#hardware-i2c-bus)の方に書かれている。そしてfreqに書かれた「100_000」とは何なのか。「100000」ではダメなのか。 ```Python: 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に入るのは文字なのか整数値なのか。まぁ動いているのでヨシとしておく。 ```Python: moji=bytearray(b'AQM1602XA-RN-GBW') for i in moji: write1DAT(i2c,adr,i) sleep(3) ``` あとは無限ループで次々に文字データを書き込むようにしてみた。 ```Python: cnt0=ord(' ') cnt=cnt0 while True: write1DAT(i2c,adr,cnt) cnt=cnt+1 if(cnt>255): cnt=cnt0 ``` 将来的には[ArduinoのLyquidCrystal](https://github.com/arduino-libraries/LiquidCrystal)と同じようにライブラリ化して整理したい。