諸々の記録

その時々 興味にある事について

Raspberry Pi Pico (RP2040-Zero)で LCD (AQM1602Y-RN-GBW)を表示してみる

ラズパイPico (RP2040-Zero) でFMラジオを鳴らすことができましたが、FM局は固定で設定だったので、選局と周波数の表示とかがしたくなりました。

ネットで検索してみると、周波数の表示はLCD使ったり、OLED使ったり色々作例がありますが、OLEDはノイズが出るらしいし、キャラクタが表示できれば良いのでいくつか作例が見つかった下記のLCD(AQM1602Y-RN-GBW)にしました。秋月電子で購入。

だが買ったはよいが接続方法が良く分からない・・付属の2つのコンデンサはどう続すればよいのか?
秋月の商品ページにマニュアルがあり Raspberry Pi 接続例 ってのもあるが、コンデンサ3つ使ってるし。
このLCDの接続例をネットで検索したら、GR-CITRUSでの接続例(下記)を見つけたのでこれを参考にした。

I²Cを使う (LCD表示編)|GR-CITRUS & WA-MIKANを使いこなす (2023年版)


上記情報をもとにブレッドボードでこのように接続。1番ピンは使わないので裏側に折りまげておいた。

コンデンサは、1つは 2番と5番ピンに接続、もう一つは 3番と4番ピンに接続。
9番ピンはマイコン側からリセット制御しないので、5番ピンに接続。

5番から8番ピンをそれぞれマイコン側の 3.3V、GND、SDA、SCL に接続する。

そして、RP2040-Zero と接続して、MicroPython のプログラムは下記サイトを参考にして実行したが、
 TypeError: string argument without an encoding
というエラーがでて動かない・・

MicroPython的午睡(22) ラズパイPico、AQM1602 LCDパネル接続 | デバイスビジネス開拓団


このエラーについてWeb検索すると文字エンコードのエラーで、どうも
 buf = bytearray(lin)
の部分を
 buf = bytearray(lin,"UTF-8")
として、文字エンコードUTF-8 と明示的に指定しないと最新の MicroPython (Python3系から?) ではエラーになってしまうとのこと。
この部分だけ修正したら無事エラーなく動作しました。

配線は下記のようにしています。ミニブレッドボードに納まりました。
写真では分かりずらいですが、RP2040-Zero の4番ピンの SDA、5番ピンの SCL をLCDと接続してます。


テストで動作させたプログラム main.py は下記。
(参考にさせてもらったサイトのプログラムを修正) 

import utime
from machine import Pin, I2C

i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=100000)
adrLCD = 0x3E
datLCD = 0x40
comLCD = 0x00

#データ書き込み
def writeDatLCD(dat):
    i2c.writeto_mem(adrLCD, datLCD, bytes([dat & 0xFF]), addrsize=8)
    utime.sleep_ms(1)    

#コマンド書込み
def writeComLCD(com):
    i2c.writeto_mem(adrLCD, comLCD, bytes([com & 0xFF]), addrsize=8)
    utime.sleep_ms(1)    

#LCD初期化
def initLCD():
    utime.sleep_ms(100)
    writeComLCD(0x38)
    writeComLCD(0x39)
    writeComLCD(0x14)
    writeComLCD(0x73)  #コントラスト 0x70から0x7A位が適当
    writeComLCD(0x56)
    writeComLCD(0x6C)
    utime.sleep_ms(100)
    writeComLCD(0x38)
    writeComLCD(0x01)
    writeComLCD(0x0C)
    utime.sleep_ms(20)

# nL行目にデータlinを表示
def writeLineLCD(nL, lin):
    buf = bytearray(lin,"UTF-8")
    if len(buf) <= 0:
        return False
    if len(buf) > 16:
        buf = buf[0, 16]
    if nL == 0:
        writeComLCD(0x80)
    else:
        writeComLCD(0xC0)
    for i in buf:
        writeDatLCD(i)

#ここからメインプログラム
#上で定義した関数を呼び出して初期化と文字表示
initLCD()
writeLineLCD(0, "Hello,LCD World!")
writeLineLCD(1, "1234567890ABCDEF")