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