2025年5月9日金曜日

Timer Camera X(ジャンク)で画像をLCDで表示

M5STACK ESP32 PSRAM Timer Camera Xのジャンク品を購入しました。ジャンク理由はWiFiに接続できたことが無いとなっていましたが、とりあえずカメラが使えればと購入しました

最初にカメラがちゃんと動作するかをテストします。と言っても液晶は付いていないんので、Groveコネクタ経由でLCD Unitに映像を表示させることにしました。なお、JEPEGモード、320x240で撮影し、それをLCD Unitに表示する簡単な記述になります。

#include <M5TimerCAM.h>
#include <M5GFX.h>
#include <MUnitLCD.h>

// M5UnitLCD display;                 // default setting
M5UnitLCD display(4, 13, 400000);  // SDA, SCL, FREQ

void setup() {
  TimerCAM.begin();
  display.begin();

  // display setting
  display.setRotation(0);
  display.clear(TFT_BLACK);

  if (!TimerCAM.Camera.begin()) {
    Serial.println("Camera Init Fail");
    return;
  }
  Serial.println("Camera Init Success");

  // Cammera setting
  TimerCAM.Camera.sensor->set_pixformat(TimerCAM.Camera.sensor, PIXFORMAT_JPEG);  // 画像フォーマット
  TimerCAM.Camera.sensor->set_framesize(TimerCAM.Camera.sensor, FRAMESIZE_QVGA);  // 画像サイズ:320x240

  TimerCAM.Camera.sensor->set_vflip(TimerCAM.Camera.sensor, 1);    //上下反転 0無効 1有効
  TimerCAM.Camera.sensor->set_hmirror(TimerCAM.Camera.sensor, 0);  //左右反転 0無効 1有効
}

void loop() {
  while(true) {
    if (TimerCAM.Camera.get()) {
      TimerCAM.Power.setLed(255);  // LED点灯
      Serial.printf("pic size: %d\n", TimerCAM.Camera.fb->len);

      int32_t data_size = TimerCAM.Camera.fb->len;
      uint8_t* sata_buf = TimerCAM.Camera.fb->buf;

      if (data_size != 0) {
        display.drawJpg(sata_buf, data_size, 0, 0, 320, 240);
        data_size = 0;
      }

      TimerCAM.Camera.free();
      TimerCAM.Power.setLed(0);
    }
  }
  TimerCAM.Camera.free();
  TimerCAM.Power.setLed(0);
  TimerCAM.Power.setLed(0);
}

簡単な記述なので、サクッと動作しました

カメラの詳細設定に関しては、今後いろいろと試したいと思います。

記述してから気が付きましたが、動作チェックが目的であればcameraToolsを使用すれば、もっと簡単にできました。やはり、ドキュメントは見ないといけませんね

0 件のコメント:

コメントを投稿