CircuitPython 10行プログラミング Step9 (4) SPIとグラフィック・ディスプレイ <その1>

 ここでは、マイコン・ボードESP32-S3-DevKitC-1-N8のSPIバスを使います。CircuitPython は8.0.0-beta.4です。

ピン番号

 ピン配置図にはSPIバスの信号らしきものは見られますが、MOSIなどの一般的な名称は見つかりません。

 データの中に、次のピン番号を見つけました。

TFTディスプレイ

  グラフィック三昧 ② ST7789とMKR WiFi 1010

で用いた172×320 TFTディスプレイをつなぎます。インターフェースはSPIで、コントローラはST7789です。

 接続です。

ST7789TFTディスプレイ ESP32-S3
V+   Vin 3.3V
3V  3V  -
G  Gnd GND
CK  SCK 12
SO  MISO  -
SI  MOSI 11
TC  TFTCS 10
RT  RST 9
DC  DC 46
CC  SDCS  -
BL Lite  -

 CK  SCKのクロック12番ピンを13番に変更しましたが、問題なく動きました。14番に変更しましたが、問題なく動きました。

サンプルを動かす

 ダウンロードしたexamplesの中にあるst7789_170x320_1.9_simpletest.pyを読み込んで、ピンの名称を修正します。


# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

"""
This test will initialize the display using displayio and draw a solid green
background, a smaller purple rectangle, and some yellow text.
"""
import board
import terminalio
import displayio
from busio import SPI
from adafruit_display_text import label
from adafruit_st7789 import ST7789

BORDER_WIDTH = 20
TEXT_SCALE = 3

# Release any resources currently in use for the displays
displayio.release_displays()

spi = SPI(clock=board.IO12, MOSI=board.IO11)
tft_cs = board.IO10
tft_dc = board.IO46
tft_rst = board.IO9

display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)

display = ST7789(display_bus, width=320, height=170, colstart=35, rotation=90)

# Make the display context
splash = displayio.Group()
display.show(splash)

color_bitmap = displayio.Bitmap(display.width, display.height, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0x00FF00  # Bright Green
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
splash.append(bg_sprite)

# Draw a smaller inner rectangle
inner_bitmap = displayio.Bitmap(
    display.width - (BORDER_WIDTH * 2), display.height - (BORDER_WIDTH * 2), 1
)
inner_palette = displayio.Palette(1)
inner_palette[0] = 0xAA0088  # Purple
inner_sprite = displayio.TileGrid(
    inner_bitmap, pixel_shader=inner_palette, x=BORDER_WIDTH, y=BORDER_WIDTH
)
splash.append(inner_sprite)

# Draw a label
text_area = label.Label(
    terminalio.FONT,
    text="Hello World!",
    color=0xFFFF00,
    scale=TEXT_SCALE,
    anchor_point=(0.5, 0.5),
    anchored_position=(display.width // 2, display.height // 2),
)
splash.append(text_area)

while True:
    pass

 実行例です。

メモ

◆テキスト関連のコマンド

  • fill(0) 黒色で塗りつぶす
  • text('World', 0, 10) 文字列を、x,y座標から描画する。四つ目の「1=白色」は省略可
  • invert(True) 白黒を反転する。Falseで戻す
  • show() 表示

◆図形関連のコマンド

  • pixel(0, 0, 1) x,y座標(左上が原点)と色(1は白色)でドットを描く
  • rect(0,0,120,60,1) 左上の座標x,y、右下の座標x,y、色で四角形を描画する
  • fill_rect() 塗りつぶす
  • line(100,40,110,50,1) xの始点、yの始点、xの終点、yの終点、色で直線を描画する
  • circle(24,40,20,1) 中心点のx、y、半径、色で円を描画する

>>> import adafruit_display_text

>>> dir(adafruit_display_text)
['__class__', '__name__', '__file__', '__path__', '__version__', 'Group', 'Palette', '__repo__', 'wrap_text_to_pixels', 'wrap_text_to_lines', 'LabelBase']

>>> from adafruit_display_text import *

>>> dir(Group)

['__class__', '__name__', 'append', 'index', 'insert', 'pop', 'remove', 'sort', '__bases__', '__dict__', 'hidden', 'scale', 'x', 'y']

>>> dir(Palette)

['__class__', '__name__', '__bases__', '__dict__', 'is_transparent', 'make_opaque', 'make_transparent']

>>> dir(wrap_text_to_pixels)

['__class__']

>>> dir(wrap_text_to_pixels)

['__class__']

>>> dir(LabelBase)

['__class__', '__init__', '__module__', '__name__', '__qualname__', 'append', 'index', 'insert', 'pop', 'remove', 'sort', '__bases__', '__dict__', 'color', 'font', 'height', 'hidden', 'scale', 'width', 'x', 'y', 'text', '_get_ascent_descent', '_set_font', 'background_color', '_set_background_color', 'anchor_point', 'anchored_position', '_set_text', 'bounding_box', 'line_spacing', '_set_line_spacing', 'label_direction', '_set_label_direction', '_get_valid_label_directions', '_replace_tabs']

>>> from adafruit_display_text import label
>>> dir(label)
['__class__', '__name__', '__file__', '__version__', 'Bitmap', 'Palette', 'TileGrid', '__repo__', 'LabelBase', 'Label']