ESP32-CAMのST7789
最近、著者は、OV2640カメラに付属しているAnxinkeのESP32-CAM開発ボードの使用法を学んでいます。
公式ルーチンはWIFI経由でカメラビデオをWebページに送信できます。手元に240x240ピクセルの画面があるので、この画面にカメラ画像を表示したいと思います。
これは、esp32-camera \ sensor.hヘッダーファイルにあります。
#define OV9650_PID (0x96)
#define OV2640_PID (0x26)
#define OV7725_PID (0x77)
#define OV3660_PID (0x36)
画像の解像度
typedef enum {
FRAMESIZE_QQVGA, // 160x120
FRAMESIZE_QQVGA2, // 128x160
FRAMESIZE_QCIF, // 176x144
FRAMESIZE_HQVGA, // 240x176
FRAMESIZE_QVGA, // 320x240
FRAMESIZE_CIF, // 400x296
FRAMESIZE_VGA, // 640x480
FRAMESIZE_SVGA, // 800x600
FRAMESIZE_XGA, // 1024x768
FRAMESIZE_SXGA, // 1280x1024
FRAMESIZE_UXGA, // 1600x1200
FRAMESIZE_QXGA, // 2048*1536
FRAMESIZE_INVALID
} framesize_t;
画像形式
typedef enum {
PIXFORMAT_RGB565, // 2BPP/RGB565
PIXFORMAT_YUV422, // 2BPP/YUV422
PIXFORMAT_GRAYSCALE, // 1BPP/GRAYSCALE
PIXFORMAT_JPEG, // JPEG/COMPRESSED
PIXFORMAT_RGB888, // 3BPP/RGB888
PIXFORMAT_RAW, // RAW
PIXFORMAT_RGB444, // 3BP2P/RGB444
PIXFORMAT_RGB555, // 3BP2P/RGB555
} pixformat_t;
ESP32ライブラリのArduinoコアは4種類のカメラをサポートしていることがわかります。ESP32-CAM開発ボードにはOV2640が搭載されており、IPS画面のピクセルは240x240なので、FRAMESIZE_HQVGA(240x176)形式を選択してください。
<Arduino_ST7789.h>ライブラリファイルを表示する
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
void Arduino_ST7789::drawPixel(int16_t x, int16_t y, uint16_t color) {
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
setAddrWindow(x,y,x+1,y+1);
SPI_BEGIN_TRANSACTION();
DC_HIGH();
CS_LOW();
spiwrite(color >> 8);
spiwrite(color);
CS_HIGH();
SPI_END_TRANSACTION();
}
ドライバライブラリは、
RED = 0xF800 = 11111_000000_00000、
GREEN = 0x07E0 = 00000_111111_00000、BLUE = 0x001F = 00000_000000_11111などのRGB色空間を使用しているため、各ピクセルは16ビットデータ、つまりRGB565形式であることがわかります。
次の関数を使用して、OV2640画像形式をRGB565に設定し、解像度を240x176に設定します。
.pixel_format = PIXFORMAT_RGB565,
.frame_size = FRAMESIZE_HQVGA,
次の関数を使用して、シリアルポートを介して単一フレームの画像データをシリアルポートデバッグアシスタントに出力します。
Serial.write(fb->buf, fb->len);
受信データを下図に示します。RGB565形式の画像データの1フレームは84480バイトで、240 x 176 x 2とまったく同じです。この画像データのフレームには、JPEG画像出力データのようなヘッダー形式のバイトはありません。そのため、作成者が行う場合画像データがメモリカードに保存されている場合、画像をコンピュータで開くことができないと表示されます。
下の写真は、JPEG形式の画像データの
単一フレームです。この単一フレームのデータ量は少し問題があり、受信データは毎回同じではないため、送信プロセスでエラーが発生する可能性があります。
ただし、データの前にあるFF DB FFE0は正しいJPEG形式です。
さらに、フレームあたりのデータ量はRGB565形式よりもはるかに少ないので、後で画像形式を検討する時間があります。
大丈夫。上記の内容により、プログラムを作成することができます。
ESP32の公式カメラルーチンに従って直接変更します。
主な機能は次のとおりです。
各ピクセルデータは、RGB565シングルフレームデータの2バイトごとに構成されます。
void camera_show(void)
{
unsigned long i=0;
camera_fb_t *fb = esp_camera_fb_get();
//单帧图像数据输出
// delay(2000);
// delay(2000);
// delay(2000);
// Serial.write(fb->buf, fb->len);
// delay(2000);
// delay(2000);
// delay(2000);
for(uint8_t y = 0; y <SCREEN_HEIGHT; y ++)
{
for(uint8_t x = 0; x <SCREEN_WIDTH; x ++)
{
//RGB565格式 240X176
tft.drawPixel(x,60+y,((fb->buf[2*i])<<8)|(fb->buf[2*i+1]));
i++;
}
}
esp_camera_fb_return(fb);
}
画像表示効果:
この画面の通常の表示効果は誰にでも明らかですが、テスト表示効果は明確ではありません。より明確な効果を得るには、OV2640のいくつかのパラメータを設定する必要がある場合があります。次に、作成者はの左上隅にフレームレートを表示します。画面には、フレームあたり平均2秒が表示されます(本当に十分に遅い)。arduinoによって開発されているため、速度を変更するのは簡単ではありません。後で、速度を向上させるためにライブラリファイルにゆっくりと飛び込む時間があります。