MicroPython的午睡(22) ラズパイPico、AQM1602 LCDパネル接続

Joseph Halfmoon

このところ Raspberry Pi Picoに各種デバイスを接続し、MicroPythonで操作してきております。が、定番のデバイス、どうせ接続できるでしょ、ということでやってませんでした。しかし、やっておかないと何が起きるかわからない。念のためということで今回は、秋月電子製LCDモジュールキット、AE-AQM1602Aであります。

※「MicroPython的午睡」投稿順 Indexはこちら

(末尾に今回使用のテストプログラム全文あります。)

以下にURLを貼り付けておきますが、秋月電子のAE-AQM1602Aという「キット」は、小規模なキャラクタ表示装置をマイコンに取り付けたいときの定番ではないかと思います。LCDモジュール本体は、ちと扱いずらい1.27mmピンピッチですが、加えてブレッドボードに刺さる2.54mmピンに変換してくれる変換基板がキットになっています。ついでに変換基板上には必要なコンデンサとハンダジャンパで接続できるプルアップ抵抗もついているので使いやすい一品であります。

I2C接続小型キャラクタLCDモジュール(16×2行・3.3V/5V)ピッチ変換キット

アスキーキャラクタに加え、カタカナ含む文字パターンを搭載、16文字2行表示です。5Vでも3.3Vでも動作可能(電源電圧でコントラストが変わるのでコマンドで調整するのが良いです。)

当方相当前からお世話になっており、プルアップジャンパに半田を盛ったのと、盛っていないのと2台を所持しており、接続先に応じて使い分けております。

開発環境によってはこのようなディスプレイの有無で効率が全然違いますが、ラズパイPicoのMicroPythonでの開発ではあまり必要性を認めませなんだ。なにせ、Thonny IDEからラズパイPicoに接続すれば、「見えないものはない」という感じだからです。しかし、ホスト機からラズパイPicoを切り離すとなると状況変わります。LEDの数個だと心もとない。高々合計32文字といえど、文字が表示できるディスプレイの有難さであります。

ラズパイPicoとAQM1602の接続

今回ラズパイPicoとAQM1602の接続には I2C0 を使いました。先ごろまでLED4個を接続しておりましたが、色違いでLED2個あれば十分だろ~ということで、GP16とGP17に接続していたLED2個を撤去し、その「跡地」への接続であります。電源は3.3V。AQM1602内蔵のプルアップを利用しています。よって結線は以下のように非常にシンプルであります。

AQM1602CIR秋月殿発行のこのキットの「データシート」には、Arduino用のサンプルコードが掲載されており、Arduino系の場合それを使えば簡単に表示を行うことができます。

MicroPythonで表示を行う場合、Arduino用のサンプルコード(CPP)を、淡々とPythonに置き換えていけば動作します(末尾のソースをご覧ください。)

初期化後、表示位置はDDRAMアドレスというもので指定できます。引き続き8ビットの文字コードを送り出せば、指定位置から順に書き込まれ表示されるという塩梅です。なお1行目のDDRAMアドレスは0x00から開始、2行目のDDRAMアドレスは0x40から開始です。DDRAMアドレス指定時には、最上位ビットを立てないとならないので、1行目は0x80, 2行目は0xC0を送れば行頭から表示されます。

動作の様子はアイキャッチ画像に。

MicroPython的午睡(21) ラズパイPico、M5AtomLiteとUART通信 に戻る

MicroPython的午睡(23) ラズパイPico、Passive Buzzer接続 に進む

AQM1602XA-RN-GBWサンプル文字列表示
import time
from machine import Pin, I2C

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=100000)
adrAQM1602 = 0x3E
datAQM1602 = 0x40
comAQM1602 = 0x00

def writeDatAQM1602(dat):
    i2c.writeto_mem(adrAQM1602, datAQM1602, bytes([dat & 0xFF]), addrsize=8)
    time.sleep_ms(1)    

def writeComAQM1602(com):
    i2c.writeto_mem(adrAQM1602, comAQM1602, bytes([com & 0xFF]), addrsize=8)
    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(0x73)
    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 writeLineAQM1602(nL, lin):
    buf = bytearray(lin)
    if len(buf) <= 0:
        return False
    if len(buf) > 16:
        buf = buf[0, 16]
    if nL == 0:
        writeComAQM1602(0x80)
    else:
        writeComAQM1602(0xC0)
    for idx in range(0, len(buf)):
        writeDatAQM1602(buf[idx])
        
initAQM1602()
writeLineAQM1602(0, "Hello, World!")
writeLineAQM1602(1, "1234567890ABCDEF")