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