RaspberryPi에서 SPI 구동 1.8 "TFT 액정 (ST7735s)을 사용하여 이미지를 표시합니다.

RaspberryPi에서 1.8" TFT LCD 사용



이 기사에서는 1.8 "TFT LCD를 RaspberryPi의 Python3으로 구동합니다.
Arduino에서의 구동예는 다수 있어 라이브러리도 풍부합니다만, Python3에서의 구동예는 적었기 때문에 기재합니다.

사용하는 액정에 따라 표시상의 빨간색과 파란색이 바뀝니다(RGB→BGR)가 되는 경우가 있습니다.
내가 사용한 액정에서는이 증상이 발생했기 때문에 이미지의 빨간색과 파란색을 반전시켜 대응하고 있습니다.
해결책을 아시는 분이 있으면 댓글을 주시면 도움이 됩니다.

이 기사의 스크립트는 다음 페이지를 참조했습니다.

배선



스크립트



라이브러리 정보



다른 사이트 등에서 소개되고 있는, ST7735s·ST7735의 라이브러리를 이용한 구동 방법은, 내 환경에서는 잘 가지 않았습니다.



덧붙여 환경이나 사용하는 액정에 따라서는 이쪽에서도 동작할 가능성은 있다고 생각합니다.

사용 패키지 설치 및 설정



사용 패키지


  • pip3
  • adafruit-circuitpython-rgb-display
  • Pillow

  • 설치



    python3-pil은 아마 설치된 것 같습니다.
    sudo apt install python3-pip 
    sudo pip3 install adafruit-circuitpython-rgb-display
    sudo apt install python3-pil 
    

    설치 확인


    python3
    import PIL
    import adafruit_rgb_display
    

    위의 패키지를 가져올 수 있으면 설치가 성공적으로 완료된 것입니다.
    exit()로 python3을 종료하십시오.

    SPI 통신 활성화


    sudo raspi-config
    

    이와 관련하여 많은 정보가 있으므로 모르는 경우 검색해보십시오.

    배선



    사용하는 LCD에 따라 핀 이름이 다를 수 있습니다.


    액정측
    RaspberryPi 쪽


    GND
    GND

    VCC
    3.3v

    SCL
    GPIO11

    SDA
    GPIO10

    RST
    GPIO24

    DC
    GPIO25

    CS
    GPIO8

    BLK
    GPIO12


    코드



    이 기사에서는 1.8 "TFT LCD (ST7735s)의 경우 스크립트를 게시합니다.
    스크립트 자체는 앞서 언급한 참고 사이트의 코드를 단순화한 것입니다. 다른 LCD를 사용하는 경우 참고 사이트를 참조하여 대상 코드를 다시 작성하십시오.


    이 코드에서는 화면 크기와 같은 크기의 이미지(160x128의 액정이라면 160x128의 이미지)의 사용을 가정합니다.
    다른 이미지를 사용하는 경우 미리 자르거나 참조 사이트를 찾아 자동으로 자르는 스크립트를 추가하십시오.


    tft_display_cont.py
    # -*- coding: utf-8 -*-
    """
    This program is based on the sample program at Adafruit-Python-Usage.
    (https://learn.adafruit.com/1-8-tft-display/python-usage)
    
    2021/09/06 var1.0
    """
    
    import digitalio
    import board
    import RPi.GPIO as GPIO
    from PIL import Image, ImageDraw
    from time import sleep
    
    import adafruit_rgb_display.st7735 as st7735
    
    cs_pin = digitalio.DigitalInOut(board.CE0)
    dc_pin = digitalio.DigitalInOut(board.D25)
    reset_pin = digitalio.DigitalInOut(board.D24)
    
    BAUDRATE = 24000000
    
    # 使用する液晶が異なる場合、サイトを参考に以下を書き換えてください。
    # ----------ここから----------
    disp = st7735.ST7735R(
        board.SPI(),
        rotation=270,
        cs=cs_pin,
        dc=dc_pin,
        rst=reset_pin,
        baudrate=BAUDRATE,
    )
    # ----------ここまで----------
    
    backlight_pin = 12
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(backlight_pin, GPIO.OUT)
    
    
    class DisplayImage():
        def __init__(self, img):
            self.image = Image.open(img)
    
        def show(self):
            # 画像サイズと液晶サイズが異なると、上手く表示されない可能性があります
            disp.image(self.image) 
    
    class DisplayControl():
        def __init__(self):
            self.backlight = GPIO.PWM(backlight_pin, 100)
            self.backlight.start(0)
    
        def on(self):
            self.backlight.ChangeDutyCycle(100)
    
        def off(self):
            black = Image.new("RGB", (160, 128))
            draw = ImageDraw.Draw(black)
            draw.rectangle((0, 0, 160, 128), outline=0, fill=(0, 0, 0))
            disp.image(black)
            self.backlight.ChangeDutyCycle(0)
    
        def pwm(self, value):
            self.backlight.ChangeDutyCycle(value)
    
    if __name__ == "__main__":
        Image01 = DisplayImage("picture01.jpg")
        Image02 = DisplayImage("picture02.jpg")
        DisplayCont = DisplayControl()
    
        try:
            while True:
                Image01.show() #一枚目を表示
                DisplayCont.on()
                sleep(1)
    
                Image02.show() #二枚目を表示
                DisplayCont.pwm(50)
                sleep(1)
    
                DisplayCont.off() #表示を消す
                sleep(1)
    
        except KeyboardInterrupt:
            pass
    

    동작 및 설명



    위 스크립트를 tft_display_cont.py로 사용하여 동일한 디렉토리에 picture01.jpg 및 picture02.jpg를 저장합니다.
    아래의 이미지는 각각 160x128의 이미지이므로 동작 확인용으로 다운로드하여 사용하십시오.




    다음 명령을 실행하여 LCD에 표시되는지 확인합니다.
    python3 tft_display_cont.py
    

    라이브러리로 사용



    사용 예



    다음과 같이 라이브러리로 가져와서 사용할 수 있습니다.

    Import_test.py
    import tft_display_cont as tft
    from time import sleep
    
    Image01 = tft.DisplayImage("picture01.jpg") # 任意の画像ファイル
    Image02 = tft.DisplayImage("picture02.jpg") # 任意の画像ファイル
    DisplayCont = tft.DisplayControl()
    
    DisplayCont.on() # バックライト点灯
    
    while True:
        Image01.show() # 一枚目を表示
        sleep(1)
        Image02.show() # 二枚目を表示
        sleep(1)
    

    해설



    아래에서 인스턴스를 생성합니다.

    Import_test.py
    Image01 = tft.DisplayImage("picture01.jpg") # 任意の画像ファイル
    Image02 = tft.DisplayImage("picture02.jpg") # 任意の画像ファイル
    DisplayCont = tft.DisplayControl()
    

    Import_test.py
    Image01.show()          # 画像を表示します。
    Image02.show()          # 画像を表示します。
    DisplayCont.on()        # バックライトを点灯します。
    DisplayCont.off()       # バックライトを消灯します。
    DisplayCont.pwm(50)     # バックライトをPWM制御します。 0~100で指定します。
    

    문자 표시 정보



    참고 사이트에서는 문자를 표시하는 스크립트 예제도 소개합니다.
    관심이 있으시면 찾아보세요.

    마지막으로



    사용하는 액정에 따라 표시상의 빨간색과 파란색이 바뀝니다(RGB→BGR)가 되는 경우가 있습니다.
    내가 사용한 액정에서는이 증상이 발생했기 때문에 이미지의 빨간색과 파란색을 반전시켜 대응하고 있습니다.
    해결책을 아시는 분이 있으면 댓글을 주시면 도움이 됩니다.

    좋은 웹페이지 즐겨찾기