09.picoでモニタ表示 Arduino編


09.picoでモニタ表示 Arduino編

Arduinoのスケッチでモニタ表示します。そのモニタは、"02.picoでTouch displayデモ C言語"で使用したモニタで、メーカーにはArduino用のライブラリは無いようです。今回は、セットアップと英数字の表示までで、日本語表示、輝度調整、タッチ動作、SD動作確認は、今後にします。

Pico-ResTouch-LCD-3.5 (Waveshare)
https://www.waveshare.com/wiki/Pico-ResTouch-LCD-3.5
・3.5インチ 480x320
・モニタドライバーIC ILI9488
・タッチIC XPT2046 抵抗膜方式
・micro SDのCN付

TFT_eSPI

以下の内容を参考にしました。
TFT_eSPI:Pico-ResTouch-LCD-3.5を搭載したRaspberryPiPicoが機能しない(2021/09)
https://forum.arduino.cc/t/tft-espi-raspberry-pi-pico-with-pico-restouch-lcd-3-5-not-working/904102

Waveshare ILI9488+RP2040(Pico-ResTouch-LCD-3.5) $1551の質問サポート
https://github.com/Bodmer/TFT_eSPI/issues/1551

TFT_eSPIライブラリを使用して、そのUser_Setup.hファイルを修正する事によりpicoで動作しているようです。

TFT_eSPI をインクルード

TFT_eSPI by Bodmer Ver 2.4.61 をインクルードします。
https://github.com/Bodmer/TFT_eSPI

Arduino-IDE > スケッチ > ライブラリをインクルード > ライブラリを管理... > 検索欄に TFT_eSPI を入力し、表示された中から上記を選びます。

インクルード後、ファイルを見ると、
C:\Users\〇〇〇\Documents\Arduino\libraries\TFT_eSPI 内にcとhファイルは、
・TFT_config.h
・TFT_eSPI.h / TFT_eSPI.cpp
・User_Setup.h (ほとんど注釈行)
・User_Setup_Select.h (includeで User_Setup.h と User_Setups/Setup*_***.hを組込んでいます)
があります。
まず、今までのUser_Setup.hのファイル名を修正して保存しておきます。
次に、"Waveshare ILI9488+RP2040(Pico-ResTouch-LCD-3.5) #1551の質問サポート" にある Setup000_RP2040_ILI9488.h を User_Setup.h とし、入れ替えます。

User_Setup.h


// Setup000_RP2040_ILI9488.h
// Waveshare Pico-ResTouch-LCD-3.5用 (SKU:19907)
//https://forum.arduino.cc/t/tft-espi-raspberry-pi-pico-with-pico-restouch-lcd-3-5-not-working/904102/5 のpost#5より
#define RPI_DISPLAY_TYPE // 16ビットコマンドが必要なため
#define ILI9488_DRIVER   //他がSPIを共有している場合は、ILI9488ディスプレイSDOをMISOに接続しない(CSがHの場合、TFT SDOはトライステートになりません)
#define TFT_MISO  12  // MISO GP12 SPI MISO
#define TFT_MOSI  11  // MOSI GP11 SPI MOSI
#define TFT_SCLK  10  // LCD_CLK GP10 LCD CLK
#define TFT_CS     9  // LCD_CS GP9 LCD チップセレクト(ローアクティブ)
#define TFT_DC     8  // LCD_DC GP8 データ(H)/コマンド(L)
#define TFT_RST   15  // LCD_RST GP15 LCDリセット(ローアクティブ) (could connect to Arduino RESET pin)
#define TFT_BL    13  // LCD_BL	 GP13	LCD バックライト制御
#define TOUCH_CS  -1     // Chip select pin (T_CS) of touch screen
//#define TOUCH_CS 16     // Chip select pin (T_CS) of touch screen
#define LOAD_GLCD   // Font1.元のAdafruit8ピクセル FLASHでmax1820byte
#define LOAD_FONT2  // Font2.16ピクセル高さ        FLASHでmax3534btye 96文字
#define LOAD_FONT4  // Font4.26ピクセル高さ        FLASHでmax5848byte 96文字
#define LOAD_FONT6  // Font6.48ピクセル            FLASHでmax2666byte "1234567890:-apm"
#define LOAD_FONT7  // Font7.7セグメント48ピクセル FLASHでmax2438byte "1234567890:-"
#define LOAD_FONT8  // Font8.75ピクセル            FLASHでmax3256byte "1234567890:-"
//#define LOAD_FONT8N //Font8N.上記の代わりに、わずかに狭いため3桁で160ピクセルのTFTに適合
#define LOAD_GFXFF //自由フォント 48のAdafruit_GFXフリーフォントFF1からFF48およびカスタムフォントへのアクセスを含める
#define SMOOTH_FONT  // スムーズなフォント
#define TFT_SPI_PORT 1 // SPI0ピンを使用する場合は0に、spi1は1
//#define SPI_FREQUENCY  32000000 // 32M 機能する場合がある
#define SPI_FREQUENCY  20000000 // 20M SPIクロックレートを制限する必要がある場合があります。
#define SPI_READ_FREQUENCY  20000000// 20M TFTを読取るための低減されたSPI周波数
//#define SPI_TOUCH_FREQUENCY  2500000 // 2.5M XPT2046は2.5MHzのSPIクロックレートを必要

確認用スケッチ

print文でLCD画面に表示するだけのデモスケッチです。
Arduino-IDE > ファイル > スケッチ例 > (カスタムライブラリのスケッチ例の)TFT_eSPI > 480x320 > TFT_Print_Test.ino を修正しました。
主な修正内容は、Font1,6,8も追加して、ほぼFont順に並べ替えました。
電池基板も使用しました。

Fontの種類

* 数値の単位はpxで文字の高さを表します。16px以下は小さくてを見づらいです。8は元のAdafruitです。

・元のAdafruitか96文字は、8(Font1),16(Font2),26(Font4)
・数字+αは、48(Font6),48(7セグメント Font7),75(Font8)
の6種類あります。

TFT_eSPIライブラリの解説

TFT_eSPIに問題が5つあり、その1つがライブラリのドキュメントが無い事です。よって、数多いサンプルファイルの注釈から見ていくしかありません。
TFT_eSPIライブラリのドキュメント #415
https://github.com/Bodmer/TFT_eSPI/issues/415

以下には説明が少し出ています。
M5StickC非公式日本語リファレンス
https://lang-ship.com/reference/unofficial/M5StickC/Class/M5Display/

Arduino development TFT_eSPI Library Learning
https://programmer.ink/think/arduino-development-tft_espi-library-learning.html

スケッチ

testTFT_Print.ino

// tft.print()をテスト
// 全フォント使用 左端の文字にスペースが無い
// Font1 H= 8px FLASHで1820byte 元のAdafruit 小さすぎ
// Font2 H=16px FLASHで3534btye 96文字 小さい
// Font4 H=26px FLASHで5848byte 96文字
// Font6 H=48px FLASHで2666byte "1234567890:-apm"
// Font7 H=48px FLASHで2438byte "1234567890:-" 7セグメント
// Font8 H=75px FLASHで3256byte "1234567890:-"

#include <SPI.h>           // SPI通信LCD使用
#include <TFT_eSPI.h>      // ハードウェア固有のライブラリ
TFT_eSPI tft = TFT_eSPI(); // カスタムライブラリを呼出す
#define TFT_GREY 0x5AEB    // TFT_eSPI.hの24色に新色追加

void setup(void) {
  tft.init();         // TFT_eSPIライブラリを初期化
  tft.setRotation(0); // 描画方向(0-3)
}

void loop() {
  tft.fillScreen(random(0xFFFF));         // 画面をランダムな色で塗りつぶす、
  tft.setCursor(0, 0, 2);                 // (x,y,font)フォント2(16px 96文字)
  tft.setTextColor(TFT_WHITE, TFT_BLACK); // 白字 黒地
  tft.setTextSize(1);                     // 文字サイズ1
  tft.println("Hello World!");            // LCDに表示

  tft.setTextFont(2);                          // フォント2(16px 96文字)
  tft.println(F("my foonting turlingdromes."));//文字列をFLASHに保存してRAM節約
  tft.println("And hooptiously drangle me");   // LCDに表示
  tft.println("with crinkly bindlewurdles,");  // LCDに表示
  tft.println("Or I will rend thee in the gobberwarts with my blurglecruncheon, see if I don't!");//自動折返し

  tft.setTextColor(TFT_RED, TFT_BLACK); // 赤字 黒地
  tft.setTextFont(4);                   // フォント4(26px 96文字)
  tft.println((long)3735928559, HEX);   // 16進のDEADBEEFを表示

  tft.setTextColor(TFT_GREEN, TFT_BLACK); // 緑字 黒地
  tft.setTextFont(4);                     // フォント4(26px 96文字)
  tft.println("Groop");                   // LCDに表示
  tft.println("I implore thee,");         // LCDに表示

  float fnumber = 123.45;                                     // 浮動小数点変数
  tft.setTextColor(TFT_BLUE);                                 // 青字 背景色無し
  tft.setTextFont(4);                                     // フォント4(26px 96文字)
  tft.print("Float = "); tft.println(fnumber);                // 浮動小数点数で表示
  tft.print("Binary = "); tft.println((int)fnumber, BIN);     // 整数を2進で表示
  tft.print("Hexadecimal = "); tft.println((int)fnumber, HEX);// 整数を16進で表示

  tft.setTextFont(6);      // フォント6(48px 15文字)
  tft.println("pm11:46");  // LCDに表示

  tft.setTextColor(TFT_YELLOW); // 黄字 背景色無し
  tft.setTextFont(7);           // フォント7(48px 7セグメント)
  tft.println(1234.56);         // LCDに数値表示

  tft.setTextFont(8);  // フォント8(75px 12文字)
  tft.println(12345);  // LCDに数値表示

  tft.setTextFont(1);                                            // フォント1(8px)
  tft.println("Font1 Font1 Font1 Font1 Font1 Font1 Font1 Font1");// LCDに表示

  delay(10000);  // 10秒待つ
}
* フラッシュメモリ(max2Mバイト)のうち、スケッチが4%使用。
* RAM(max262kバイト)のうち、グローバル変数が3%使用、ローカル変数で254kバイト使用可能。