TOPに戻る

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)

 実行中の様子です。

連載 CircuitPython 10行プログラミング Step5

(1) Raspberry Pi Picoの準備と動作確認

(2) Raspberry Pi Picoのdigitalio

(3) Raspberry Pi Picoのmicrocontroller

(4) Raspberry Pi Picoのアナログ入力

(5) Raspberry Pi PicoのPWM出力

(6) Raspberry Pi PicoのI2S出力

(7) Raspberry Pi PicoのI2C ① OLEDディスプレイ

(8) Raspberry Pi PicoのI2C ② 温湿度センサ

(9) Raspberry Pi PicoのI2C ③ 気圧センサ

(10) Raspberry Pi PicoのSPI ① TFTディスプレイ


連載 CircuitPython 10行プログラミング Step4

(1) Adafruit Feather nRF52840 Senseの準備 (2) Lチカ (3) 搭載センサ (4) BLE①ペリフェラル (5) BLE②セントラル


連載 CircuitPython 10行プログラミング Step3

(1) Metro M4 Express AirLift (WiFi)の準備 (2) ロータリ・エンコーダ (3) eInk/ePaper (4) Wi-Fi その1 接続 (5) Wi-Fi その2 ソケット (6) Wi-Fi その3 電圧測定 (7) 気圧センサLPS25HB (8) サーミスタ


連載 CircuitPython 10行プログラミング Step2

(1) Grand Central M4 Expressの準備 (2) グラフィック・ディスプレイOLED (3) RTC DS3231 (4) モジュール/SDメモリ (5) 複合センサ BME680 (6) ロードセル+ADS1220 (7) サーボ・モータ① (8) サーボ・モータ② (9) I2S UDA1334A (10) D-Aコンバータ


連載 CircuitPython 10行プログラミング

(1) Trinket M0の準備 (2) ディジタルI/O (3) アナログ入出力 (4) I2C 温湿度センサSi7021 (5) SPI 熱電対+MAX31855 (6) UART 距離センサTFMini (7) 1-Wire 温度DS18B20 (8) ロータリ・エンコーダ (9) 7セグメントLED (10) FANコントロール (11) UART GPS (12) I2C Lチカ MCP23017