Python3を使ってRaspberry Pi 3でサインスマート 1.8″ LCDに描画

Python3を使ってRaspberry Pi 3でサインスマート 1.8″ LCDに描画します。すでに、サインスマート 1.8″ LCDに描画への表示は、「Pythonを使ってRaspberry PI 3でサインスマート 1.8″ LCDに円形の表示」で行いましたが、今回は、Adafruit Python ILI9341を元にライブラリ化した「Python ST7735」を使用します。なお、Raspberry Pi 3とサインスマート 1.8″ LCDの接続については、「Raspberry PI 3でサインスマート 1.8″ LCDの表示」を参照してください。

LCDライブラリ「Python ST7735」のインストール

実行するために必要なライブラリを次のようにインストールします。

$ sudo apt-get install build-essential python-dev python-smbus python-pip python-imaging python-numpy

RPi.GPIOとAdafruit GPIOライブラリを次のようにインストールします。

$ sudo pip install RPi.GPIO
$ sudo pip install Adafruit_GPIO

LCDライブラリ「Python ST7735」提供サイト(前述)からZIPファイルでダウンロードして解凍し、Python3で実行できるように次のようにインストールします。

$ cd Python_ST7735-master
$ sudo python3 setup.py install

次のようにサンプルプログラムを実行します。

$ cd examples
$ python3 shapes.py

楕円と長方形がLCDに表示されれば、正常にセットアップできました。

LCDプログラムの作成

LCDプログラム「lcd.py」は、Python の画像処理ライブラリ「Pillow (PIL) 」を使用って作成します。1.8″ LCDには、テキストと長方形を表示させます。Pillowで提供されている関数は「Pillow Doc」を参照してください。

  • Image.new関数により描画するキャンパスを作成します。ここにテキストと長方形を書くために、ImageDraw.Draw関数を使用します。
  • テキストはtext関数、長方形はline関数を使用して描画します。
  • 表示の初期化はTFT.ST7735.begin関数、表示の開始はTFT.ST7735.display関数を使用します。
  • lcd.py

    </ul>
    from PIL import Image
    from PIL import ImageFont, ImageDraw
    
    import time
    import ST7735 as TFT
    import Adafruit_GPIO as GPIO
    import Adafruit_GPIO.SPI as SPI
    
    WIDTH = 128
    HEIGHT = 160
    SPEED_HZ = 4000000
    
    # Raspberry Pi configuration.
    DC = 24
    RST = 25
    SPI_PORT = 0
    SPI_DEVICE = 0
     
    # Create TFT LCD display class.
    disp = TFT.ST7735(
        DC,
        rst=RST,
        spi=SPI.SpiDev(
            SPI_PORT,
            SPI_DEVICE,
            max_speed_hz=SPEED_HZ))
    
    # Initialize display.
    disp.begin()
     
    str_test = "Hello,723456 "
    
    image = Image.new('RGB', (128, 50), (255,255,255))
    draw1 = ImageDraw.Draw(image)
    draw1.text((30, 25), str_test, (0,0, 255))
    
    draw1.line((5, 0, 5, 40), fill=(255, 255, 0), width=10)
    
    disp.display(image)
    

    次に複数行のテキストとjpg画像を表示させます。

    • multiline_text関数で複数行のテキストを表示させます。各行は「\n」で分割し、行間は「spacing」パラメータで指定します。
    • open関数でjpg画像をイメージとして読み込み、paste関数により指定した位置から読み込んだイメージを貼り付けます。
    • 画像のRGBがBRGになっているため、split関数で各色を分割し、merge関数で組み直して、BRGからRGBにイメージを変換します。

    lcd1.py

    from PIL import Image
    from PIL import ImageFont, ImageDraw
    
    import time
    import ST7735 as TFT
    import Adafruit_GPIO as GPIO
    import Adafruit_GPIO.SPI as SPI
    
    WIDTH = 128
    HEIGHT = 160
    SPEED_HZ = 4000000
    
    # Raspberry Pi configuration.
    DC = 24
    RST = 25
    SPI_PORT = 0
    SPI_DEVICE = 0
    
    # Create TFT LCD display class.
    disp = TFT.ST7735(
        DC,
        rst=RST,
        spi=SPI.SpiDev(
            SPI_PORT,
            SPI_DEVICE,
            max_speed_hz=SPEED_HZ))
    
    # Initialize display.
    disp.begin()
     
    str_test = "1 xxx\n2 yyy\n3 zzz"
    
    image = Image.new('RGB', (128, 160), (255,255,255))
    draw1 = ImageDraw.Draw(image)
    draw1.multiline_text((40, 25), str_test, (0,0, 0),spacing=0)
     
    
    draw2 = Image.open('logo.jpg')
    image.paste(draw2, (5, 80))
    
    b, g, r = image.split()
    image = Image.merge("RGB", (r, g, b))
    disp.display(image)
    

    LCDプログラムの実行

    次のコマンドで作成したLCDプログラムを実行します。

    $ python3 lcd.py

    次のように、サインスマート 1.8″ LCDにテキストと長方形が描画されます。

    LCDプログラムの実行

    次のコマンドで作成したLCDプログラムを実行します。

    $ python3 lcd1.py

    次のように、サインスマート 1.8″ LCDに複数行のテキストとJpg画像が描画されます。

    LCD1プログラムの実行