akira.keiのアイコン画像
akira.kei 2025年03月24日作成 (2025年03月24日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 215
akira.kei 2025年03月24日作成 (2025年03月24日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 215

Raspberry Pi Pico+Micropython (その2) I2Cキャラクタディスプレイ

<前の記事 : 次の記事>

AQM1602XA-RN-GBW

別のシリーズ記事で「PIC16F18313」を使っているが、どうもI2C接続がうまくいかない。もしかして部品の方が壊れてる?という疑問を解消するために、いつもならArduinoを使う。この取扱説明書にも接続方法が書かれており、これで確認すればLCDが故障してないことは確認できる。

接続サンプル
ただ、やはりイマドキなら(Micro)Pythonだよね!と思うでしょう?
ということでMicroPythonでI2C接続キャラクタディスプレイをPicoに接続して使ってみた。
I2C接続LCD

https://youtube.com/shorts/3QHzexaaRyc?feature=share

なるべく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のアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
ログインしてコメントを投稿する