Raspberry pi zero 2Wに3.2インチのLCDを接続

Raspberry pi zero 2Wを入手したので備忘録として書きます。

 

1. 3.2インチLCDの接続

3.2インチのLCD(SPI接続)を購入したので、Raspberry pi zeroに接続して表示させてみました。

今回購入したのは、3.2インチのLCDとブレッドボード用のジャンパワイヤです。

購入したのはこちらになります。

開封してみました。

LCDはSPIインタフェースで、タッチパネルのドライバも載っています。

LCDのドライバはILI9341で、タッチパネルはMSP3218になります。

SDカードのスロットもついているようです。

 

では、Raspberry pi zeroとLCDを接続してみましょう。

 

LCDと配線の接続

下記にLCDの端子とRaspberry pi zeroの端子の接続表を示します。

SIP信号は、制御時にチップイネーブル信号(CE1とCE0)で選択しますので、LCDとタッチパネルは、同じSPI信号を使用することにします。

よって今回は、LCD側の端子でT_DOとSDI(MOSI)、T_CLKとSCKを接続しました。

LCDパネル側からの送信はありませんので、SDO(MISO)は接続しませんでした。

実際に接続した写真は下記です。

 

2.準備

SPI有効の設定

LCDとSPI通信を行うためにはSPI信号を有効にしなければなりません。

以下のコマンドを入力し、「3 Interface Options」→「14 SPI」でSPIを有効にします。

sudo raspi-config

 

Pythonライブラリーのインストール

以下のコマンドを入力してLCDのドライバをインストールします。

sudo apt-get install python3-rpi.gpio python3-spidev python3-pip python3-pil python3-numpy

 

pip3 install adafruit-circuitpython-rgb-display

 

(依存ライブラリをaptでインストールして、最後にpip3でこのライブラリをインストールします。) 

 

LCDのLEDの点灯

では、実際に動かしてみます。

最初にLCDのLEDを点灯させます。

下記のように「プログラミング」→「Thonny」を選択して、Thonnyを起動します。

起動したらプラスマーク(new)を選択して新しいファイルを作成します。

次に下記のプログラムをコピーして貼り付けてください。

#------------------------------------------------------------------------------------------

#GPIO set
import RPi.GPIO as GPIO
import time

def LCD_led(gpio,on):
    # GPIOのピン番号指定を「BCM」に設定します
    GPIO.setmode(GPIO.BCM)

    # 設定を確認します
    mode = GPIO.getmode()

    # BCMの場合は「11」が返ります
    #print(mode)

    # GPIO番号に名前をつけます
    LED    = gpio

    # LED用のピンを「Out」に設定します
    GPIO.setup(LED,GPIO.OUT)

    if on == False:
        # LEDを消します
        GPIO.output( LED,False )
    else:
        # LEDを点けます
        GPIO.output( LED,True )
        
def main():
    LCD_led(23,1)
    
if __name__ == '__main__':
    main() 

 

#---------------------------------------------------------------------------------

「Run」で実行すると下記のようにLCDのLEDが点灯しました。

このプログラムは、後で使用するので、libというディレクトリを作成してその下にLCD_led.pyという名前で保存しておきましょう。

私は下記のような場所にpythonプログラムを格納するようにしました。

/home/tomtomst/Documents/python/lib

 

3.表示確認

LCD表示テスト

次に同じように下記のプログラムを実行してください。

from adafruit_rgb_display.rgb import color565
from adafruit_rgb_display.ili9341 import ILI9341

from busio import SPI
from digitalio import DigitalInOut
import board

# Pin Configuration
cs_pin = DigitalInOut(board.D8)
dc_pin = DigitalInOut(board.D25)
rst_pin = DigitalInOut(board.D24)

# Set up SPI bus
spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# Create the ILI9341 display:
display = ILI9341(
    spi,
    cs=cs_pin, dc=dc_pin, rst=rst_pin,
    width=240, height=320,
    rotation=90,
    baudrate=24000000
)

# Define color
COLOR_ORANGE = color565*1

# Fill display with one color
display.fill(COLOR_ORANGE)

このプログラム実行すると、画面一面オレンジ色になります。

文字の表示確認

次に文字を表示してみましょう。

文字を表示するにはフォントをダウンロードしておく必要があります。

下記のコマンドでダウンロードしてください。

sudo apt install fonts-noto-cjk fonts-roboto

 

プログラムは下記です。

from adafruit_rgb_display.rgb import color565
from adafruit_rgb_display.ili9341 import ILI9341

from busio import SPI
from digitalio import DigitalInOut
import board

from PIL import Image, ImageDraw, ImageFont

# Pin Configuration
cs_pin = DigitalInOut(board.D8)
dc_pin = DigitalInOut(board.D25)
rst_pin = DigitalInOut(board.D24)

# Set up SPI bus
spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# Create the ILI9341 display:
disp = ILI9341(
    spi,
    cs=cs_pin, dc=dc_pin, rst=rst_pin,
    width=240, height=320,
    rotation=90,
    baudrate=24000000
)

# Define image size (320x240, rotated)
IMAGE_SIZE = (disp.height, disp.width)

# Define fonts
FONT_ROBOTO = ImageFont.truetype("Roboto-Medium.ttf", 12)
FONT_NOTO = ImageFont.truetype("NotoSansCJK-Regular.ttc", 18)
FONT_NOTO_SMALL = ImageFont.truetype("NotoSansCJK-Regular.ttc", 12)

# Define colors
COLOR_WHITE = (236, 239, 241)
COLOR_PURPLE = (239, 154, 154)

# Create an image with black background
image = Image.new("RGB", IMAGE_SIZE, (0, 0, 0))

# Draw some text
draw = ImageDraw.Draw(image)
text = """\
あいうえおかきくけこ
サシスセソタチツテト
ABCDEFGHIJK
abcdefghijklmnopqrstuvwxyz
東京都神奈川県千葉県埼玉県
ちゃんと表示していますか?
今日の天気は晴れ後曇りです
"""
for i, line in enumerate(text.split("\n")):
    draw.text((0, 24*i), line, font=FONT_NOTO, fill=COLOR_WHITE)

draw.text((200, 185), "2024/03/16に作成", font=FONT_NOTO_SMALL, fill=COLOR_WHITE)
draw.text((40, 200), "tomtomst【電子工作DIY】ブログ", font=FONT_NOTO, fill=COLOR_PURPLE)
draw.text((100, 222), "tomtomst.hatenablog.com", font=FONT_ROBOTO, fill=COLOR_PURPLE)

# Show it on display
disp.image(image)

 

下記のように表示しました。

今日はここまでです。

次はタッチパネルを動かしたいと思います。

 

*1:245, 124, 0