CircuitPython displayioライブラリの使い方 (3/5)

AdafruitのLearning Guideの非公式日本語訳です。
英語独特の言い回しを可能な限り日本語的な表現に直していますが、不自然に感じる部分も残っていますことを何卒ご容赦ください。

ディスプレイとディスプレイバス

それでは、実際のディスプレイを設定して表示してみましょう。Displayと呼ばれるディスプレイ自体と、FourWireやParallelBusのような “ディスプレイバス “を介してホストコントローラに接続する方法です。

まず、FourWireやパラレルバスなど、あなたのプロジェクトに合ったディスプレイバスを設定します。次に、ディスプレイをセットアップするときに、これを渡して使用できるようにします。

FourWire (SPI接続)

FourWire クラスは、SPI に関連する典型的な 4 つのピン(SCK、MOSI、MISO、CS)を使用して、spi_busを介してディスプレイと通信するために使用されます(別名、chip_select)。ディスプレイに必要な追加のピンは、バスを介して送信される情報が “データ”(画像情報)か “コマンド”(ディスプレイ制御)かを示すピンです。これは command パラメータで指定した D/C ピンで行います。

FourWire バスを設定するには、まず通常の方法で spi_bus オブジェクトを作成します。次に、使用するcommandchip_selectピンの仕様と一緒に、それを渡します。

以下にハードウェア SPI の基本的な使用例を示します。

display_bus = displayio.FourWire(board.SPI(),
                                 command=board.D10,
                                 chip_select=board.D9)

パラレルバス

パラレルバスは高速ですが、多くのピンを必要とします。メインデータのために8つのピンが必要になりますが、それらはマイクロコントローラのポートの1つに連続した順番である必要があり、最初のピンはポート番号0、7、15、23のいずれかになければなりません(だから1回のDMAコマンドでバイトを書き込むことができます)。そして、最初のピンをdata0に指定し、残り(他の7つ)は推測されます。それから、commandchip_selectwritereadに使えるデジタルピンがさらに4つ必要になるので合計12ピンです。

最大の問題は、これらすべてのピンを持ち、かつ同じポートに8つの連続したピンを持つマイクロコントローラを見つけることです。「ポート」とは何を意味するのでしょうか?それは、一般的には気にすることのない低レベルのものを指します。ポート全体を操作するコマンドを介して、まとめて素早く操作できるピンのグループと考えてください。

8つの連続したポートのピンを見つけるにはどうすればいいのでしょうか?ゼロから始めるのであれば、少し調査に時間がかかるでしょう。ここに一例を紹介します。Metro M4 Expressの回路図を見てください。ピンD13が示されているエリアを見てください。

例えば、D13は内部的にいくつかの機能を持つ物理ピン35に配線されています。重要なのはPA16です。これはポートAの16のデジタルI/Oを指します。D13の下のピンはPA16からPA23へと連続していることに注意してください。ポートAには8本のピンが使用できます。

Metro M4 Expressの場合、D13、D12、D10、D11、D9、D8、D1、D0を8つのデータピンとして使用できます。その後、他の4つのピンを選択してください。

display_bus = displayio.ParallelBus(data0=board.D13,
                                    command=board.D7,
                                    chip_select=board.D6,
                                    write=board.D5,
                                    read=board.D4)

ディスプレイ

ディスプレイをセットアップするには、4つのものが必要です。

  • 実際にディスプレイと通信するためのディスプレイバス(display_bus)。
  • 初期化シーケンス (init_sequence) は、最初に使用するためにディスプレイをセットアップするために使用されます。
  • ディスプレイの幅(width)と…
  • ディスプレイの高さ(height)をピクセル単位で指定します。

あなたが作業しているディスプレイが何であれ、そのディスプレイの幅(width)と高さ(height)をご存知だとおもいます。display_busは、上で説明したようにセットアップ可能なディスプレイバスの一つです。init_sequenceは少し手間がかかります。一般的にはデータシートや他のソースを読むことで得られます。これについては以下で詳しく説明します。今のところ、INIT_SEQUENCEという名前で作成されていると仮定してください。

基本的なDisplayの設定は以下のようになります。

display = displayio.Display(display_bus,
                            INIT_SEQUENCE,
                            width=320,
                            height=240)

ディスプレイドライバ

init シーケンス (init_sequence) は、少し分かりにくく複雑です。Adafruitではいくつかのディスプレイのためにinit_sequenceを設定済みの軽量なドライバを作成しました。
ゼロから Display オブジェクトを作成する代わりに、これらのドライバを使うことができます。

ILI9341 – カラー TFT
SSD1331 – カラー有機EL
ST7789 – ワイドアングルカラーTFT
HX8357 – カラーTFT
ST7735R – カラーTFT
そうすると、このようにディスプレイを作成することになります。

display = adafruit_ili9341.ILI9341(display_bus,
                                   width=320,
                                   height=240)

基本的にはDisplayを使うのと同じで、init_sequenceがないことに注意してください。

ディスプレイ搭載ボードの場合

HalloWingやPyPortalのようなボードにディスプレイが接続されている場合、ディスプレイバスの設定とディスプレイ自体の設定はすべて完了しています。これらのボード用のCircuitPythonのファームウェアビルドでディスプレイの準備ができています。これはボードモジュールのDISPLAYオブジェクトから利用できます。必要なことは以下の通りです。

import board
display = board.DISPLAY

ディスプレイを使う

Displayを設定したら、showを使用して、画面上にアイテムを表示するために使用するGroupを指定します。グループと関連するTileGrid(複数可)、Bitmap(複数可)、Palette(複数可)の作成については、以前にこのガイドで説明しました。グループを設定して準備ができたら、あとは呼び出すだけです。

display.show(group)

原文:https://learn.adafruit.com/circuitpython-display-support-using-displayio/display-and-display-bus

Follow me on Twitter