ラズベリーパイPico WでLCDキャラクターディスプレイを使ってみる


ラズベリーパイPico W(以後ラズピコ)でLCDキャラクターディスプレイモジュールを使ってみます。

LCDキャラクターディスプレイモジュールとは、文字を表示するための、板のような小さな画面(液晶画面)になります。

※キャラクターというのが文字を意味しています。


文字列は主に半角英数字と記号の一部になりまして、種類によってはカタカナも出力できるものがあるそうです。



今回の説明で使用するLCDキャラクターディスプレイモジュールはLCD1602になりまして、1行あたり16文字で行が2行の計32文字の文字を表示できるものになります。

Freenove I2C IIC LCD 1602 モジュール - Amazon




回路を組んでみます。


ラズピコ LCD1602
GND VSS(GND)
VSYS VDD(VCC)
GP0 SDA
GP1 SCK(SCL)

※ ラズピコ側のGPIOピンの配置は下記URLのPDFを参考にしてください。

https://datasheets.raspberrypi.com/picow/pico-2-w-pinout.pdf


MicroPythonのコード

※コードの作成と実行はThonnyで行ってください。

ラズベリーパイPico Wを使ってみる

import machine
import utime
import sys

class LCD1602:
    def __init__(self, i2c, addr=0x27):
        self.i2c = i2c
        self.addr = addr
        # バックライトONフラグ
        self.bl = 0x08
        utime.sleep_ms(50)
        
        # 4bitモードへの初期化シーケンス
        for val in [0x30, 0x30, 0x30, 0x20]:
            self._write_half(val)
            utime.sleep_ms(5)
            
        self.send_command(0x28) # 2行表示, 5x8ドット
        self.send_command(0x0C) # 画面ON, カーソルOFF
        self.send_command(0x06) # 文字入力後カーソルを右へ
        self.clear()

    def _write_half(self, data):
        # machine.I2Cでは writeto を使用
        buf = bytes([data | self.bl | 0x04])
        self.i2c.writeto(self.addr, buf)
        utime.sleep_us(500)
        buf = bytes([(data & ~0x04) | self.bl])
        self.i2c.writeto(self.addr, buf)
        utime.sleep_us(500)

    def send_command(self, cmd):
        self._write_half(cmd & 0xF0)
        self._write_half((cmd << 4) & 0xF0)

    def send_data(self, data):
        self._write_half((data & 0xF0) | 0x01)
        self._write_half(((data << 4) & 0xF0) | 0x01)

    def clear(self):
        self.send_command(0x01)
        utime.sleep_ms(2)

    def puts(self, s, x=0, y=0):
        addr = 0x80 + x + (0x40 if y else 0)
        self.send_command(addr)
        for char in s:
            self.send_data(ord(char))

# --- メイン処理 ---
# I2Cの初期化 (GP0=SDA, GP1=SCL)
i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)

# インスタンス作成
lcd = LCD1602(i2c, addr=0x27)

# 今回のコードであれば表示を繰り返す必要はないが、一応While Trueで処理しておく
while True:
    lcd.clear()
    lcd.puts("Python Version:", 0, 0)
    # sys.versionは長いので5文字以降は非表示
    lcd.puts(sys.version[:5], 0, 1)
    utime.sleep(2)
京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
大阪府高槻市でプログラミング教室を開設しています。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。