「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に表示されます。
