Arduino系で480x320より広い画面表示を手に入れるにはどうするか?手頃な価格で800x480クラスのTFT LCD モジュールは手に入らないし...。次の記事を見つけました。
出来るかなと手持ちのESP32で試してみましたが、メモリ不足で満足な解像度は得られませんでした。そうこうするうちに、アマゾンでこのボードを見つけました。
ESP32-WROVER-KEY-R2 (ESP32-WROVER-E, 8MFlash, 8MPSRAM 開発ボード) USBインターフェース付き 技適取得済
MicroFan (Designed in Japan) 信頼の日本ブランド?
日本語の取説(pdf)がダウンロードできます。
このボードは8MBのフラッシュメモリ、8MBのPSRAM(使えるのはうち4MBのみ)を装備しているので余裕十分でした。
解像度 720x448
色深度 32ビット(?)
7インチディスプレイ(1024x600)なのでこのサイズが目一杯です。試していませんがもっと大きなテレビのようなものでしたら、より広い解像度が可能かも。
接続には、USBソケットと電源系統のみのUSBケーブルと黄色のAVケーブルを使用。
"Arduino IDE 2.2.1" でのToolsの設定とスケッチは以下になります。
ESP32Key_AVOut.ino
#include <Arduino.h>
#include <LovyanGFX.hpp>
class LGFX : public lgfx::LGFX_Device {
public:
lgfx::Panel_CVBS _panel_instance;
LGFX(void) {
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
cfg.memory_width = 1024;//520; // 出力解像度 幅
cfg.memory_height = 600;//420; // 出力解像度 高さ
cfg.panel_width = 720; // 実際に使用する幅 (memory_width と同値か小さい値を設定する)
cfg.panel_height = 448; // 実際に使用する高さ (memory_heightと同値か小さい値を設定する)
cfg.offset_x = 0; // 表示位置を右にずらす量 (初期値 0)
cfg.offset_y = 20; // 表示位置を下にずらす量 (初期値 0)
_panel_instance.config(cfg);
}
{
auto cfg = _panel_instance.config_detail();
// 出力信号の種類を設定;
// cfg.signal_type = cfg.signal_type_t::NTSC;
cfg.signal_type = cfg.signal_type_t::NTSC_J;
// cfg.signal_type = cfg.signal_type_t::PAL;
// cfg.signal_type = cfg.signal_type_t::PAL_M;
// cfg.signal_type = cfg.signal_type_t::PAL_N;
// 出力先のGPIO番号を設定;
cfg.pin_dac = 26; // DACを使用するため、 25 または 26 のみが選択できます;
// PSRAMメモリ割当の設定;
cfg.use_psram = 2; // 0=PSRAM不使用 / 1=PSRAMとSRAMを半々使用 / 2=全部PSRAM使用;
// 出力信号の振幅の強さを設定;
cfg.output_level = 128; // 初期値128
// ※ GPIOに保護抵抗が付いている等の理由で信号が減衰する場合は数値を上げる。;
// ※ M5StackCore2 はGPIOに保護抵抗が付いているため 200 を推奨。;
// 彩度信号の振幅の強さを設定;
cfg.chroma_level = 128; // 初期値128
// 数値を下げると彩度が下がり、0で白黒になります。数値を上げると彩度が上がります。;
_panel_instance.config_detail(cfg);
}
setPanel(&_panel_instance);
}
};
LGFX gfx;
void setup(void) {
gfx.setColorDepth(32);//出力できました
gfx.init();
for (int x = 0; x < gfx.width(); ++x) {
int v = x * 256 / gfx.width();
gfx.fillRect(x, 0 * gfx.height() >> 3, 7, gfx.height() >> 3, gfx.color888(v, v, v));
gfx.fillRect(x, 1 * gfx.height() >> 3, 7, gfx.height() >> 3, gfx.color888(v, 0 ,0));
gfx.fillRect(x, 2 * gfx.height() >> 3, 7, gfx.height() >> 3, gfx.color888(0, v, 0));
gfx.fillRect(x, 3 * gfx.height() >> 3, 7, gfx.height() >> 3, gfx.color888(0, 0, v));
}
delay(1000);
gfx.drawLine(0,0, gfx.width() - 1, gfx.height() - 1, TFT_GREEN);
gfx.drawRect(0,0, gfx.width(), gfx.height(), TFT_RED);
gfx.drawRect(1,1, gfx.width() - 2, gfx.height() - 2, TFT_GREEN);
gfx.drawRect(2,2, gfx.width() - 4, gfx.height() - 4, TFT_BLUE);
gfx.fillRect(gfx.width()/2, (gfx.height() >> 3) * 4, gfx.height() / 3, gfx.height() / 3, TFT_PURPLE);
gfx.setTextSize(0);
for(int i=0;i<28;i++){
gfx.setCursor(8, i*16);
gfx.print(i);
}
}
void loop(void) {
gfx.setCursor(20, (gfx.height() >> 3) * 4);
gfx.setTextSize(0);
gfx.println("Hello at " + String(millis()));
}
最後まで見て頂きありがとうございます。