MakePython ESP32 Color LCD で ESP32 ScreenShotReceiver を楽しむ
以前、ESP32_ScreenShotReceiverを用いてMakePython ESP32 Color LCD に動画をWiFiを介して転送を楽しみました。
MakePython ESP32 Color LCD で 動画をWiFi受信 ー ScreenShotReceiver ー
この度、開発者のらびやんさんよりESP32_ScreenShotReceiverの更新がアナウンスされましたので
変更点の確認をするとともに動画転送を楽しみました。
目次
ESP32_ScreenShotReceiver更新内容
以前はLCDのSPI設定をTFT_eSPIライブラリに依存していたとのことですが
らびやんさんのグラフィックライブラリ LovyanGFXで設定できるようになりました。
また前回は高速化のためにESP32の設定バイナリファイル改造など実施しましたが、TFT_eSPI依存からの開放によって無改造で高速表示(80MHz)が可能となったとのことです。
ESP32_ScreenShotReceiverの使用方法
前回同様にMakePython ESP32 Color LCD でESP32_ScreenShotReceiverを試してみます。
以下のArduinoコードをダウンロードしてMakePython ESP32 Color LCDに書き込みます。
https://github.com/lovyan03/ESP32_ScreenShotReceiver/tree/master/ScreenShotReceiver
グラフィックライブラリLovyanGFXも必要となりますので導入しておきます。
https://github.com/lovyan03/LovyanGFX/ (ver. 0.1.14)
LCDディスプレイSPI設定
LCDディスプレイの設定はLovyanGFXのコンフィグで設定いたします。
M5StackやM5StickC、TTGO T-Watchなどはコンフィグファイルが既に用意されておりArduino IDEのボードマネージャで指定することにより自動でSPI設定されます。
https://github.com/lovyan03/LovyanGFX/tree/master/src/config
MakePython ESP32 Color LCD用のコンフィグファイルはないので用意する必要があります。
ちなみにArduino IDEでのボードはESP32 Dev Moduleを指定しています。
LGFX_Config_Custom.hppをコピーしてESP32_ScreenShotReceiverスケッチ(ScreenShotReceiver.ino)のあるフォルダ内に保存してMakePython ESP32 Color LCD向けに編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
#ifndef LOVYANGFX_CONFIG_HPP_ #define LOVYANGFX_CONFIG_HPP_ namespace lgfx { // for ESP32 struct LGFX_Config { // 使用するSPIを VSPI_HOST または HSPI_HOST で設定します。 static constexpr spi_host_device_t spi_host = VSPI_HOST; // 使用するDMAチャンネルを 1か2で設定します。 // 使用しない場合は省略するか0を設定します。 static constexpr int dma_channel = 1; // SPIのSCLKのピン番号を設定します。 static constexpr int spi_sclk = 14; // SPIのMOSIのピン番号を設定します。 static constexpr int spi_mosi = 13; // SPIのMISOのピン番号を設定します。 // SDカード等と共通のSPIバスを使う場合はMISOも必ず設定してください。 // 使わない場合は省略するか-1を設定します。 static constexpr int spi_miso = 12; // SPI通信のデータ長を指定します。 // RaspberryPi用のLCD等を使用する場合に16を指定します。 // 省略時は 8 です。大抵のパネルは8ですので、基本的には省略してください。 static constexpr int spi_dlen = 8; }; } class LGFX : public lgfx::LGFX_SPI<lgfx::LGFX_Config> { // Panelクラスのインスタンスを作成します。使用するパネルにあったクラスをコメントアウトしてください。 // ★LCD一体型製品の対応機種の場合はこちらから選択できます。 // lgfx::Panel_DDUINO32_XS panel; // lgfx::Panel_LoLinD32 panel; // lgfx::Panel_M5Stack panel; // lgfx::Panel_M5StickC panel; // lgfx::Panel_ODROID_GO panel; // lgfx::Panel_TTGO_TS panel; // lgfx::Panel_TTGO_TWatch panel; // lgfx::Panel_WioTerminal panel; // ★対応機種以外の場合はこちらから選択できます。 // lgfx::Panel_HX8357B panel; // lgfx::Panel_HX8357D panel; // lgfx::Panel_ILI9163 panel; // lgfx::Panel_ILI9341 panel; // lgfx::Panel_ILI9342 panel; // lgfx::Panel_ILI9486 panel; // lgfx::Panel_ILI9488 panel; // lgfx::Panel_SSD1351 panel; lgfx::Panel_ST7789 panel; // lgfx::Panel_ST7735S panel; public: LGFX(void) : lgfx::LGFX_SPI<lgfx::LGFX_Config>() { // パネルクラスに各種設定値を代入していきます。 // (LCD一体型製品のパネルクラスを選択した場合は、 // 製品に合った初期値が設定されているので設定は不要です) // 通常動作時のSPIクロックを設定します。 // ESP32のSPIは80MHzを整数で割った値のみ使用可能です。 // 設定した値に一番近い設定可能な値が使用されます。 //panel.freq_write = 20000000; panel.freq_write = 80000000; // 単色の塗り潰し処理時のSPIクロックを設定します。 // 基本的にはfreq_writeと同じ値を設定しますが、 // より高い値を設定しても動作する場合があります。 //panel.freq_fill = 27000000; panel.freq_fill = 80000000; // LCDから画素データを読取る際のSPIクロックを設定します。 panel.freq_read = 16000000; // SPI通信モードを0~3から設定します。 panel.spi_mode = 0; // データ読み取り時のSPI通信モードを0~3から設定します。 panel.spi_mode_read = 0; // 画素読出し時のダミービット数を設定します。 // 画素読出しでビットずれが起きる場合に調整してください。 panel.len_dummy_read_pixel = 8; // データの読取りが可能なパネルの場合はtrueを、不可の場合はfalseを設定します。 // (例:CSピンのないST7789等は読出し不可のためfalseを設定します。) // 省略時はtrueになります。 panel.spi_read = true; // データの読取りMOSIピンで行うパネルの場合はtrueを設定します。 // (例:M5StackやT-Watchはtrue、ESP-WROVER-KITはfalseを設定します。) // 省略時はfalseになります。 panel.spi_3wire = false; // LCDのCSを接続したピン番号を設定します。 // 使わない場合は省略するか-1を設定します。 panel.spi_cs = 15; // LCDのDCを接続したピン番号を設定します。 panel.spi_dc = 22; // LCDのRSTを接続したピン番号を設定します。 // 使わない場合は省略するか-1を設定します。 panel.gpio_rst = 21; // LCDのバックライトを接続したピン番号を設定します。 // 使わない場合は省略するか-1を設定します。 panel.gpio_bl = 5; // バックライト使用時、輝度制御に使用するPWMチャンネル番号を設定します。 // PWM輝度制御を使わない場合は省略するか-1を設定します。 panel.pwm_ch_bl = -1; // バックライト点灯時の出力レベルがローかハイかを設定します。 // 省略時は true。true=HIGHで点灯 / false=LOWで点灯になります。 panel.backlight_level = true; // invertDisplayの初期値を設定します。trueを設定すると反転します。 // 省略時は false。画面の輝度が反転している場合は設定を変更してください。 panel.invert = true; // パネルの色順がを設定します。 RGB=true / BGR=false // 省略時はfalse。赤と青が入れ替わっている場合は設定を変更してください。 panel.rgb_order = false; // LCDコントローラのメモリ上のピクセル数(幅と高さ)を設定します。 // 設定が合っていない場合、setRotationを使用した際の座標がずれます。 // (例:ST7735は 132x162 / 128x160 / 132x132 の3通りが存在します) panel.memory_width = 240; panel.memory_height = 320; // パネルの実際に表示可能なピクセル数(幅と高さ)を設定します。 // 省略時はパネルクラスのデフォルト値が使用されます。 panel.panel_width = 240; panel.panel_height = 240; // パネルのオフセット量を設定します。 // 省略時はパネルクラスのデフォルト値が使用されます。 panel.offset_x = 0; panel.offset_y = 0; // setRotationの初期化直後の値を設定します。 panel.rotation = 0; // setRotationを使用した時の向きを変更したい場合、offset_rotationを設定します。 // setRotation(0)での向きを 1の時の向きにしたい場合、 1を設定します。 panel.offset_rotation = 0; // 最後に、用意したパネル設定をセットします。 setPanel(&panel); } }; #endif |
ScreenShotReceiver.inoで#include “LGFX_Config_Custom.hpp”追加で設定終了です。
動作
SmartConfigアプリでのESP32のWiFi設定や
Windows用 送信アプリScreenShotSenderの使用方法は前回記事を参照ください。
PCのyoutube動画画面 600×600を240×240にしてQuality60%で転送いたしました。
40fps以上達成できています。はやい!!
送信速度調査
ScreenShotSenderで送信元の画像サイズとQualityを変えて送信速度[fps]がどのように変化するか確認してみました。
送信元の画像サイズはYouTubeの画像サイズも変えておりますので送信先の画はほとんど変わらないようにしております。
元画\Quality | 1 % | 20 % | 40 % | 60 % | 80 % | 100 % |
300×300 | 55 fps | 50 fps | 45 fps | 40 fps | 30 fps | 15 fps |
600×600 | 55 fps | 50 fps | 45 fps | 40 fps | 30 fps | 15 fps |
1000×1000 | 55 fps | 50 fps | 45 fps | 40 fps | 30 fps | 15 fps |
送信元の画像サイズの影響は小さいようでした。
Quality = 1 %ですと画が荒いので 60 %以上にはしたほうがよさそうです。