戻る

TFT ILI9341 ディスプレイデモ:Arduino でのグラフィックスとバウンドボール

はじめに

カラー TFT ディスプレイは、Arduino プロジェクトに豊かな視覚的フィードバックを追加する素晴らしい方法です。このチュートリアルでは、Adafruit ILI9341 ライブラリと Adafruit GFX ライブラリを使用して、240x320 の ILI9341 ベース TFT を駆動します。ディスプレイの配線方法、必要なライブラリのインストール方法、そして静的な UI 要素を描画し、バウンドするボールをアニメーションさせるコードの書き方を学びます。これらはすべて、Velxio シミュレーターを使えばブラウザ上で実行でき、ハードウェアは不要です!

回路の解説

まずは回路を見てみましょう。回路図はシンプルです。Arduino Uno が SPI(シリアル・ペリフェラル・インターフェース)を介して ILI9341 ディスプレイと通信します。

Velxio シミュレーターキャンバス上の TFT ディスプレイの回路図

以下が完全な配線リストです:

Arduino Uno ピンTFT ILI9341 ピン配線色
13 (SCK)SCKオレンジ
11 (MOSI)MOSIオレンジ
10 (CS)CS
9 (D/C)D/C
8 (RST)RST
7 (LED)LED
5VVCC(図示せず、想定)
GNDGND(図示せず、想定)

外部部品は不要です。ディスプレイは 5V ロジックで動作し(ほとんどの ILI9341 モジュールは 5V トレラント)、SPI ピンは直接接続されます。

コードの解説

それではコードを見ていきましょう。グラフィックプリミティブには Adafruit ILI9341 ライブラリと Adafruit GFX ライブラリを使用します。これらのライブラリはライブラリマネージャーからインストールする必要があります。

TFT ディスプレイで使用するライブラリを示すライブラリマネージャーモーダル

ライブラリマネージャー(ツール > ライブラリを管理)を開き、「Adafruit ILI9341」と「Adafruit GFX Library」を検索してインストールしてください。SPI ライブラリは自動的に含まれます。

以下が完全なコードです:

// TFT ILI9341 Display Demo (240x320)
// Library: Adafruit ILI9341 + Adafruit GFX
// Connect: CS=10, DC/RS=9, RST=8, LED=7, MOSI=11(SPI), SCK=13(SPI)

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>

#define TFT_CS   10
#define TFT_DC    9
#define TFT_RST   8
#define TFT_LED   7

Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);

// Background color: blue (visible on dark simulator canvas)
#define BG_COLOR 0x001F

// Ball state
int ballX = 120, ballY = 200;
int ballDX = 3, ballDY = 2;
const int BALL_R = 10;

// Play-field boundaries
const int FX = 5, FY = 110, FW = 230, FH = 200;

void drawStaticUI() {
  tft.fillScreen(BG_COLOR);

  // Title
  tft.setTextSize(3);
  tft.setTextColor(tft.color565(255, 220, 0));
  tft.setCursor(20, 10);
  tft.print("VELXIO TFT");

  // Subtitle
  tft.setTextSize(2);
  tft.setTextColor(tft.color565(180, 180, 255));
  tft.setCursor(30, 50);
  tft.print("ILI9341 Demo");

  // Color palette bars
  tft.fillRect(10, 82, 70, 18, tft.color565(220, 50, 50));
  tft.fillRect(85, 82, 70, 18, tft.color565(50, 200, 50));
  tft.fillRect(160, 82, 70, 18, tft.color565(50, 100, 240));

  // Play-field border
  tft.drawRect(FX, FY, FW, FH, tft.color565(80, 80, 130));
}

void setup() {
  pinMode(TFT_LED, OUTPUT);
  digitalWrite(TFT_LED, HIGH);

  tft.begin();
  drawStaticUI();
}

void loop() {
  // Erase old ball
  tft.fillCircle(ballX, ballY, BALL_R, BG_COLOR);

  // Update position
  ballX += ballDX;
  ballY += ballDY;

  // Bounce off field borders
  if (ballX < FX + BALL_R + 1 || ballX > FX + FW - BALL_R - 1) ballDX = -ballDX;
  if (ballY < FY + BALL_R + 1 || ballY > FY + FH - BALL_R - 1) ballDY = -ballDY;

  // Draw ball
  tft.fillCircle(ballX, ballY, BALL_R, tft.color565(255, 140, 0));

  delay(30);
}

コードの重要ポイント

学生向けの重要概念

  1. SPI 通信: ディスプレイは同期シリアルプロトコルである SPI を使用します。Arduino がマスター、ディスプレイがスレーブです。データには 3 本のワイヤ(SCK、MOSI、CS)のみが必要で、D/C と RST は追加の制御ラインです。
  2. グラフィックプリミティブ: Adafruit GFX ライブラリは、fillScreen()fillRect()drawRect()fillCircle()setCursor()print()setTextSize() などの関数を提供します。これらにより、図形やテキストを簡単に描画できます。
  3. ダブルバッファリング(概念): 新しいボールを描画する前に古いボールを消去します。これにより、残像を防ぎます。より高度なプロジェクトでは、フレームバッファを使用することもあります。
  4. 衝突検出: バウンドするボールのロジックは、ボールの中心が境界から BALL_R ピクセル以内にあるかどうかをチェックします。該当する場合、方向が反転します。
  5. 色深度: ILI9341 は 262K 色(18 ビット)をサポートしていますが、ライブラリは速度のために 16 ビット(65K 色)を使用します。color565() は RGB を 5-6-5 ビットにパックします。

よくある落とし穴とデバッグのヒント

推奨拡張機能

基本デモが動作したら、以下の拡張に挑戦してみてください:

実際に試してみよう!

実際に動作を確認してみませんか?Velxio でライブサンプルを開き、Run ボタンを押してください。

コンパイルと実行のコントロールがある Velxio エディターツールバー

また、キャンバスツールバーを使用して、シミュレーションのズーム、パン、検査も行えます。

シミュレーションビューポートの上にある Velxio キャンバスツールバー

これをゼロから構築したい場合は、コンポーネントピッカーを使用して Arduino Uno と ILI9341 ディスプレイを追加してください。

カテゴリ別に部品をブラウズする Velxio コンポーネントピッカーモーダル

以下のリンクをクリックしてサンプルを開き、実験を始めましょう:

Velxio で TFT ILI9341 ディスプレイデモを開く

楽しいコーディングを!


共有:
David Montero

執筆者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

関連記事


前の記事
ArduinoでLCD 20x4ディスプレイ:VelxioでHello World
次の記事
Arduinoでサイモンセイズ記憶ゲームをVelxioで作ろう