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バイト使用可能。