CircuitPython 10行プログラミング Step5 (10) Raspberry Pi PicoのSPI ① TFTディスプレイ
SPIバスは、I2Cバスに比べて転送速度が速いため、グラフィックの表示や表示面積の大きな表示器で使われます。マニュアルでは、board.SPI() → busio.SPIと書かれているので、busioモジュールのSPIを使います。
●TFTディスプレイST7789を利用
Adafruitから入手したSPI接続のTFTディスプレイを利用します。320×240ドットで、バックライトはデフォルトでONです。ここでは画面を縦で使っていますが、90度ローテートして横長でも使えます。
下の写真は、REPL(対話)モードが実行されている様子です。Muエディタでいえば、シリアル通信のモニタ内容です。
●接続
TFTボードの裏面にはSDメモリ・コネクタがついていますが、使いません。SPI以外にも接続するピンは多いです。
Picoからの出力だけなので、MISO信号は使いません。
ST7789ボードの端子 | Picoの端子(GPIO) | 名称 |
---|---|---|
BackLight | - | - |
SD CS | - | - |
D/C | GP7 | GP7 |
RESET | GP6 | GP6 |
LCD CS | GP5 | GP5 |
MOSI | GP3 | SPI0 TX |
MISO | - | - |
SCK | GP2 | SPI0 SCK |
GND | GND | GND |
3.3 | - | - |
Vin | 3.3V | 3V3(OUT) |
●プログラム
CPUの温度(microcontroller.cpu.temperature)を表示します。
display.show(splash)までは、ディスプレイのインスタンスを作って、基本となる単位のsplashというグループを定義します。
そのグループの中に、text_areaとtext_area2のサブグループを定義します。text_areaはTemp isのまま表示を変更しません。text_area2で定義された座標の部分だけが、text_area2.text =CPUの温度の新しい文字で書き換えられます。
ここでは変更していませんが、text_area2.x、text_area2.yで温度の文字を表示する座標も変えられます。
scale=2は、文字の拡大倍率です。1や4が使えます。
terminalioはフォントを用意するモジュールです。ヘルべチカなど.bdfファイルを利用できますが、フラッシュ・メモリの容量はそれほど大きくありません。
displayioは、画面をグループ単位で管理するモジュールです。グループには、複数のグループを含めたり、画像やテキストのグループを含めて利用ができます。どちらかというとスプライト領域を複数定義し、その中に画像やテキストを表示するという使いかたです。スプライトなので、定義後、座標を動かしたり、scaleを変更できます。
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
from board import *
import busio
import terminalio
import displayio
from adafruit_display_text import label
from adafruit_st7789 import ST7789
import microcontroller
import time
displayio.release_displays() # Release any resources
spi = busio.SPI(clock=GP2, MOSI=GP3) # SPI0BUS PIN
display_bus = displayio.FourWire(
spi, command=GP7, chip_select=GP5, reset=GP6) # other PIN
display = ST7789(display_bus, width=240, height=320)
splash = displayio.Group() # Make the display context
display.show(splash)
# Draw a label=text
text_group = displayio.Group(scale=2, x=5, y=10)
text = "Temp is"
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00)
text_group.append(text_area) # Subgroup for text
splash.append(text_group)
text_group = displayio.Group(scale=2, x=100, y=10)
text_area2 = label.Label(terminalio.FONT, text=text, color=0xFFFF00)
text_group.append(text_area2) # Subgroup for text
splash.append(text_group)
while True:
text_area2.text = str(round(microcontroller.cpu.temperature,1)) + 'C'
time.sleep(0.1)
実行中の様子です。