ESP32-CAMのST7789画像表示

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によって開発されているため、速度を変更するのは簡単ではありません。後で、速度を向上させるためにライブラリファイルにゆっくりと飛び込む時間があります。

完全なプログラムと関連するドライバーライブラリのリンク

おすすめ

転載: blog.csdn.net/weixin_44625313/article/details/109340382