Raspberry PI 3でサインスマート 1.8″ LCDの表示」でRaspberry PI 3によりLCDへドットを表示できることは確認しました。今回は、Pythonを使って、Raspberry PI 3でサインスマート 1.8″ LCDに円形に塗りつぶした図形を表示します。

サインスマート 1.8″ LCDの円形表示プログラムの作成

次に、Raspberry Pi 3上で、サインスマート 1.8″ LCDへSPIを用いて円形の表示データを送信する「lcd.py」のコードを示します。fillcircleメソッドで円形の塗りつぶし図形を描画バッファ「BMPData 」に設定します。sendbufメソッドで、実際にLCDにSPIインタフェースで描画バッファ「BMPData 」の内容をLCDの描画エリアに転送します。

lcd.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
 
import RPi.GPIO as GPIO
import spidev           # sudo pip install spidev
import time
 
class ST7735:
    def __init__(self):
        self.BMPData = 0xf000*[0xfffff]
        
        self.spi = spidev.SpiDev()
        self.spi.open(0, 0)
        self.spi.max_speed_hz = 16000000
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(24, GPIO.OUT)
        GPIO.setup(25, GPIO.OUT)
        self.reset()
        self.write_cmd(0x11)
        time.sleep(0.12)
        # フレームレート設定
        self.write((0xB1, 0x01, 0x2C, 0x2D))
        self.write((0xB2, 0x01, 0x2C, 0x2D))
        self.write((0xB3, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D))
        # 液晶反転設定
        self.write((0xB4, 0x07))
        # 電源設定(PWCTR1~3)
        self.write((0xC0, 0xA2, 0x02, 0x84))
        self.write((0xC1, 0xC5))
        self.write((0xC2, 0x0A, 0x00))
        self.write((0xC3, 0x8A, 0x2A))
        self.write((0xC4, 0x8A, 0xEE))
        self.write((0xC5, 0x0E))
        self.write_cmd(0x20)
        # ガンマ設定
        self.write((0xE0, 0x0F,0x1A,0x0F,0x18,0x2F,0x28,0x20,0x22,0x1F,0x1B,0x23,0x37,0x00,0x07,0x02,0x10))
        self.write((0xE1, 0x0F,0x1B,0x0F,0x17,0x33,0x2C,0x29,0x2E,0x30,0x30,0x39,0x3F,0x00,0x07,0x03,0x10))
        self.write_cmd(0x29)
        self.write_cmd(0x13)
        
    def reset(self):
        GPIO.output(25, False)
        time.sleep(0.1)
        GPIO.output(25, True)
        time.sleep(0.1)
    def write_cmd(self, cmd):
        GPIO.output(24, False)  # RS=0
        self.spi.xfer2([cmd])
    def write_data(self, data):
        GPIO.output(24, True)   # RS=1
        self.spi.xfer2([data])
    def write(self, cmd):
        if len(cmd) == 0:
            return
        GPIO.output(24, False)  # RS=0
        self.spi.xfer2([cmd[0]])
        GPIO.output(24, True)   # RS=1
        self.spi.xfer2(list(cmd[1:]))
    def dot(self, x, y, color):
        pos = (x+(y*128))*3
        self.BMPData[pos] = (color & 0xff0000)>>16  
        self.BMPData[pos+1] = (color & 0xff00)>>8  
        self.BMPData[pos+2] = color & 0xff

    def fillcircle(self, x1, y1, r, color):
        for iy in range(160):
            for ix in range(128):
                x = ix - x1
                y = iy - y1
                
                if(x * x + y * y < r * r):
                    self.dot(ix, iy, color)
        
    def clearbuf(self, color): 
        for x in range(128):
            for y in range(160):
                self.dot(x, y, color)
                
    def sendbuf(self):
        for i in range(0xf000):
            self.write_data(self.BMPData[i])
            #print "{0:X}".format(self.BMPData[i]),
         
if __name__ == "__main__":
    lcd = ST7735()
    
    # 液晶描画方向設定 縦長 0x48 横長0x28
    lcd.write((0x36, 0xC0))
    # 描画エリア設定 0~BMPのサイズ
    lcd.write((0x2A, 0x00, 0x00, 0x00, 128))
    lcd.write((0x2B, 0x00, 0x00, 0x00, 160))
    lcd.write((0x3A, 0x06))
    # 表示RAM転送モードに設定 
    lcd.write_cmd(0x2C)
    
    try:
        lcd.clearbuf(0x0000FF)   # Fill Blue
        lcd.fillcircle(64, 80, 20, 0x00FF00) # Lime Circle
        lcd.sendbuf() 
    except KeyboardInterrupt:
        print '\nbreak'
    #GPIO.cleanup()

上記の作成したpythonコードを次のように実行します。

$ sudo python lcd.py

次のように、円形の図形がサインスマート 1.8″ LCDに表示されます。

サインスマート 1.8″ LCDに円形表示