ILI9341ドライバ TFT 液晶を使ってみた ~ とりあえずRaspberry Pi Picoで

前回、1.8インチでST7735sドライバを使うTFT液晶とRaspberry Pi Picoを接続して使ってみましたが、今回は2.8インチで320×240ドットの解像度があるILI9341ドライバTFT液晶を使ってみました。まずは、Raspberry Pi Picoで使いますが、前回とほとんど手順が変わりません。

1.TFT液晶とRaspberry Pi Picoとの接続

2.8インチTFT液晶とRaspberry Pi Picoの接続ですが、前回の接続に準拠します。しかしながら、今回の液晶はLCD電源を別に用意する必要があり、かつ、MISOも指定する必要があるようです。

そこで、以下のように接続してみました。左が2.8インチTFT液晶で、右がRaspberry Pi Picoです。

GND -> GND
VCC -> 5V OUT
SCL -> GP18
SDA -> GP19
RES -> GP27
DC -> GP26
CS -> GP17
LCD -> 3.3V OUT
MISO -> GP16

ちなみに、今回の2.8インチTFT液晶にはSDカードスロットが付いており、そのためのピンヘッダが付いていますが、今回は使いません。

2.プログラム

プラグラムも、ST7735sの場合のソースを流用します。ドライバの定義部分をILI9341用に書き換えます。

また、用意する画像も、240×320ドットのものを用意します。(※画像部分のソースは省略します)

#define LGFX_USE_V1
#include <LovyanGFX.hpp>

#define TFT_MISO 16
#define TFT_MOSI 19
#define TFT_SCLK 18
#define TFT_CS   17
#define TFT_DC   26
#define TFT_RST  27

#include <pgmspace.h>

const uint16_t imgWidth = 240;
const uint16_t imgHeight = 320;

// RGB565 Dump(little endian)
const unsigned short img[76800] PROGMEM = {

/* 画像コードは省略 */

};

// 「あろしーど」さん定義例使用
class LGFX : public lgfx::LGFX_Device
{
  lgfx::Panel_ILI9341 _panel_instance;
  lgfx::Bus_SPI _bus_instance;
public:
  LGFX(void)
  {
    {                                    // バス制御の設定を行います。
      auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。

      cfg.spi_host = 0;          // 使用するSPIを選択
      cfg.spi_mode = 0;          // SPI通信モードを設定 (0 ~ 3)
      cfg.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
      cfg.freq_read = 20000000;  // 受信時のSPIクロック

      cfg.pin_sclk = TFT_SCLK; // SPIのSCLKピン番号を設定
      cfg.pin_mosi = TFT_MOSI; // SPIのMOSIピン番号を設定
      cfg.pin_miso = TFT_MISO; // SPIのMISOピン番号を設定 (-1 = disable)
      cfg.pin_dc = TFT_DC;     // SPIのD/Cピン番号を設定  (-1 = disable)

      _bus_instance.config(cfg);              // 設定値をバスに反映します。
      _panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
    }
    {                                      // 表示パネル制御の設定を行います。
      auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
      cfg.pin_cs = TFT_CS;                 // CSが接続されているピン番号   (-1 = disable)
      cfg.pin_rst = TFT_RST;               // RSTが接続されているピン番号  (-1 = disable)
      cfg.pin_busy = -1;                   // BUSYが接続されているピン番号 (-1 = disable)

      // cfg.panel_width = 240;  // 実際に表示可能な幅
      // cfg.panel_height = 320; // 実際に表示可能な高さ
      // cfg.offset_x = 0;       // パネルのX方向オフセット量
      cfg.offset_y = 0;       // パネルのY方向オフセット量

      _panel_instance.config(cfg);
    }
    setPanel(&_panel_instance); // 使用するパネルをセットします。
  }
};

// LovyanGFX インスタンス作成
static LGFX lcd; 
static LGFX_Sprite canvas(&lcd); 

void setup() {
  // put your setup code here, to run once:
  lcd.init(); 
  canvas.createSprite(lcd.width(), lcd.height()); 

  canvas.fillScreen(TFT_BLACK); // 背景塗り潰し

  canvas.setBuffer((void*)img, imgWidth, imgHeight, 16);

  canvas.pushSprite(0, 0); 

}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);  // 1秒ごとに更新

}

3.動作結果

特に問題なく、画像を表示することができました。今回の2.8インチTFT液晶の方が視野率が大きくて、きれいです。やはり大画面になり、実用性が一気に高まりました。しかしながら、これだけ大画面になり、Raspberry Pi Picoで複雑な処理をさせると、メモリ不足が起きるようです。

そのため、今回の2.8インチTFT液晶を使う本命は、Raspberry Piの方です。今回のような単なる表示だけでなく、デスクトップの表示をさせてみようとか、いろいろ考えています。

4.ゲームについて

今回の2.8インチTFT液晶の解像度があれば、ゲームもターゲットになってきます。そして、実際にゲームが配布されています。私はゲームをほとんどしないのですが、インベーダーゲームとかパックマンなどがリリースされているので、試しにやってみようかとも考えています。これについては、いろいろな人が投稿されていますので、見てみてはいかがでしょうか。