2025年8月12日火曜日

I2C接続のLCD「AM1602」に文字を表示

 今回は、Raspberry Pi Pico W を使って、**「AM1602」**という小型のI2C接続LCDディスプレイに文字を表示する方法をご紹介します。

AM1602は、「16文字 × 2行」のテキストを表示できる液晶ディスプレイです。I2C通信に対応しているモデルを使えば、配線が少なくて済み、初心者でも扱いやすいのが特長です。

このガイドでは、MicroPythonというシンプルでわかりやすいプログラミング言語を使って、「Hello, World!」などのメッセージをLCDに表示します。MicroPythonでI2C通信の仕組みを学ぶことが目的なので、あえてライブラリは使わず、自分でプログラムを組んでいきます(※専用ライブラリの有無は未確認です)。

MicroPythonでのI2C設定について

MicroPythonでは、I2Cは次のようにして初期化します:

from machine import I2C, Pin

i2c = I2C(id, freq=400_000, scl=Pin(...), sda=Pin(...))

idを指定するだけでも使えますが、その場合は以下のようなデフォルト設定になります:

  • id = 0 → SCL = GP9、SDA = GP8(周波数 400kHz)

  • id = 1 → SCL = GP7、SDA = GP6(周波数 400kHz)

また、Raspberry Pi Pico Wでは、以下の12通りのピンの組み合わせでI2C通信が可能です:

idSDAピンSCLピン
0GPIO0GPIO1
1GPIO2GPIO3
0GPIO4GPIO5
1GPIO6GPIO7 ※デフォルト
0GPIO8GPIO9 ※デフォルト
1GPIO10GPIO11
0GPIO12GPIO13
1GPIO14GPIO15
0GPIO16GPIO17
1GPIO18GPIO19
0GPIO20GPIO21
1GPIO22GPIO23
この中から、自分の回路に合わせて都合のよいピンを選んで使えます。


配線図

ソースコード

# Raspberry Pi Pico W + AQM1602 I2C LCD
# SDA: GP16, SCL: GP17, I2C0 使用

from machine import Pin, I2C
import time

# I2C設定
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=100000)

# LCD I2C アドレス
LCD_ADDR = 0x3E

# 送信用バッファ
buf = bytearray(2)

# -----------------------------------------------------
# LCDにコマンド送信
# -----------------------------------------------------
def lcd_write_cmd(cmd):
    buf[0] = 0x00   # Control byte: CO=0, RS=0
    buf[1] = cmd
    try:
        i2c.writeto(LCD_ADDR, buf)
    except OSError as e:
        print("I2C Write Error (cmd):", e)

# -----------------------------------------------------
# LCDにデータ送信(1文字)
# -----------------------------------------------------
def lcd_write_data(data):
    buf[0] = 0x40   # Control byte: CO=0, RS=1
    buf[1] = data
    try:
        i2c.writeto(LCD_ADDR, buf)
    except OSError as e:
        print("I2C Write Error (data):", e)

# -----------------------------------------------------
# LCD初期化
# -----------------------------------------------------
def lcd_init():
    init_cmds = [0x38, 0x39, 0x14, 0x73, 0x56, 0x6C, 0x38, 0x0C, 0x01]
    time.sleep_ms(40)
    for cmd in init_cmds:
        lcd_write_cmd(cmd)
        time.sleep_ms(1)
    time.sleep_ms(2)

# -----------------------------------------------------
# カーソル位置設定 (x:0-15, y:0-1)
# -----------------------------------------------------
def lcd_set_cursor(x, y):
    addr = 0x80 + x if y == 0 else 0xC0 + x
    lcd_write_cmd(addr)

# -----------------------------------------------------
# 表示クリア
# -----------------------------------------------------
def lcd_clear():
    lcd_write_cmd(0x01)
    time.sleep_ms(2)

# -----------------------------------------------------
# カーソルをホームに戻す
# -----------------------------------------------------
def lcd_home():
    lcd_write_cmd(0x02)
    time.sleep_ms(2)

# -----------------------------------------------------
# 文字列を表示
# -----------------------------------------------------
def lcd_print(text):
    for c in text:
        lcd_write_data(ord(c))

# -----------------------------------------------------
# メイン処理
# -----------------------------------------------------
try:
    # 接続されている I2C デバイスの一覧を表示(デバッグ用)
    devices = i2c.scan()
    if LCD_ADDR not in devices:
        print("ERROR: LCD (0x3E) not found on I2C bus.")
    else:
        lcd_init()
        lcd_clear()
        lcd_home()
        lcd_print("Hello World!")
        lcd_set_cursor(0, 1)
        lcd_print("RaspberryPiPicoW")
except Exception as e:
    print("Unexpected error:", e)



処理の流れ

🐍 ライブラリ読み込み
machine から Pin / I2C、および time を import して準備。

🔌 I²C バス初期化
I2C(0, scl=GP17, sda=GP16, freq=100 kHz) でバスをオープン。

💾 送信用バッファ確保
2 バイトの bytearray を用意し、コマンド/データを詰めて送信。

📮 コマンド送信関数 lcd_write_cmd()
制御バイト 0x00 とコマンドを送信し、送信エラーを捕捉。

🖋️ データ送信関数 lcd_write_data()
制御バイト 0x40 と 1 文字データを送信し、エラー時はログ出力。

⚙️ LCD 初期化 lcd_init()
データシート推奨 9 コマンドを順に発行して LCD を動作モードへ。

📍 カーソル位置設定 lcd_set_cursor()
行に応じて 0x80(1 行目)または 0xC0(2 行目)に列オフセットを加算し送信。

🧹 画面クリア lcd_clear()
コマンド 0x01 で表示内容を消去し、待ち時間 2 ms。

🏠 ホーム復帰 lcd_home()
コマンド 0x02 でカーソルを (0, 0) に戻し、待ち時間 2 ms。

🖨️ 文字列表示 lcd_print()
文字列をループし、lcd_write_data() で 1 文字ずつ LCD へ出力。

🔍 I²C デバイススキャン
i2c.scan() でバス上のアドレスを列挙し、LCD (0x3E) の有無を確認。

🚀 メインフロー実行
① 初期化 → ② クリア → ③ ホーム → ④ 1 行目に “Hello World!”
→ ⑤ 2 行目にカーソル移動 → ⑥ “RaspberryPiPicoW” を表示。

🛑 例外ハンドリング
try‑except で予期しないエラーを捕捉し、内容をコンソールに出力。

0 件のコメント:

コメントを投稿

Google Spread Sheetの利用

  以前に ESP32 で作っていたものを、Raspberry Pi Pico W + MicroPythonで再現してみました。 1.Googleスプレッドシートの設定 1.Google Drive → 右クリック → Google スプレッドシート 2.作成して共有をクリック