Spresenseのカメラで取得した画像を、接続された2.4 inch Full Color LCDに表示します。

Spresenseと2.4 inch Full Color LCDの接続

2.4 inch Full Color LCDは、SPIインタフェースを持ち、コントローラ「ST7789V」を使って描画します。2.4 inch Full Color LCDの仕様については「RapberryPi Zero Wで2.4 inch Full Color LCDに表示」を参照してください。

Spresense拡張ボードのピン配置を次に示します。

Spresense拡張ボードと2.4 inch Full Color LCDを次のように接続します。ジャンパーピン「JP1」を3.3Vに接続します。3.3Vにレベルシフトされます。

拡張ボード LCD
AREF LED
D13 (SCK) SCK
D12 (CIPO) SDO(MISO)
D11 (COPI) SDI(MOSI)
D10 (SS) CS
D9 RESET
D8 DC
3.3V Power VCC
Ground GND

LCDサンプルスケッチによる動作確認

コントローラ「ST7789V」のLCDライブラリとGFXライブラリをダウンロードします。LCDサンプルスケッチ「graphicstest_st7789.ino」を用いた動作を確認します。

  1. メニュー「ツール」→「ライブラリを管理」を選択します。
  2. 表示されたライブラリマネージャで「ST7789」を検索して、「Adafruit xxxxx ST7789 Library」「GFX Library for Arduino」をインストールします。
  3. メニュー「ファイル」→「スケッチ例」→「Adafruit xxxxx ST7789 Library」→「graphicstest_st7789」を選択します。
  4. サンプルスケッチ「graphicstest_st7789.ino」のコメントを次のように外し、LCDの解像度に合わせます。
  5.   // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
      tft.init(240, 320);           // Init ST7789 320x240
    
  6. 修正したサンプルスケッチ「graphicstest_st7789.ino」をSpresenseに書き込み実行します。次のようにLCDに表示されます。

Spresenseとカメラの接続

カメラボードのフラットケーブルを次のようにメインボードのカメラ専用コネクタ(CN5)に奥までしっかりと挿し込みます。

カメラアプリの作成

Camera プレビュー画像を LCD に表示する」に従って、サンプルスケッチ「camera」からカメラアプリ「cameralcd.ino」を作成します。

メニュー「ファイル」 → 「スケッチ例 」→「Spresense用のスケッチ例 Camera」 → 「camera 」を選択してサンプルスケッチを開きます。

取得したサンプルスケッチ「camera 」を、ファイル名「cameralcd.ino」にしてカメラアプリとして保存し、次のように処理を追加します。

  • 12-14行目でLCDのインクルードファイルを記述します。
  • 16-18行目でLCDのピン番号を定義します。
  • 20行目でST7789クラスをインスタンス化します。
  • 47行目取得した画像をLCDに表示します。
  • 93行目でLCDを初期化し、94行目で画像を回転させます。

cameralcd.ino

・・・

    This is a test app for the camera library.
    This library can only be used on the Spresense with the FCBGA chip package.
*/

#include <SDHCI.h>
#include <stdio.h>  /* for sprintf */

#include <Camera.h>

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

#define TFT_CS        10
#define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         8

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
float p = 3.1415926;


#define BAUDRATE                (115200)
#define TOTAL_PICTURE_COUNT     (10)

SDClass  theSD;
int take_picture_count = 0;

・・・

/**
   Callback from Camera library when video frame is captured.
*/

void CamCB(CamImage img)
{

  /* Check the img instance is available or not. */

  if (img.isAvailable())
  {

    /* If you want RGB565 data, convert image data format to RGB565 */

    img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565);
    tft.drawRGBBitmap(0, 0, (uint16_t *)img.getImgBuff(), 320, 240);
    /* You can use image data directly by using getImgSize() and getImgBuff().
       for displaying image to a display, etc. */

    Serial.print("Image data size = ");
    Serial.print(img.getImgSize(), DEC);
    Serial.print(" , ");

    Serial.print("buff addr = ");
    Serial.print((unsigned long)img.getImgBuff(), HEX);
    Serial.println("");
  }
  else
  {
    Serial.println("Failed to get video stream image");
  }
}

/**
   @brief Initialize camera
*/
void setup()
{
  CamErr err;

  /* Open serial communications and wait for port to open */

  Serial.begin(BAUDRATE);
  while (!Serial)
  {
    ; /* wait for serial port to connect. Needed for native USB port only */
  }

・・・

  Serial.println("Set still picture format");
  err = theCamera.setStillPictureImageFormat(
          CAM_IMGSIZE_QUADVGA_H,
          CAM_IMGSIZE_QUADVGA_V,
          CAM_IMAGE_PIX_FMT_JPG);
  if (err != CAM_ERR_SUCCESS)
  {
    printError(err);
  }

  // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
  tft.init(240, 320);           // Init ST7789 320x240
  tft.setRotation(3);   // 1 or 3
}

/**
   @brief Take picture with format JPEG per second
*/

void loop()
{
  sleep(1); /* wait for one second to take still picture. */

  /* You can change the format of still picture at here also, if you want. */

・・・

カメラアプリの実行

カメラアプリ「cameralcd.ino」を実行すると次のようにカメラからの画像がLCDに表示されます。なおSDカードを挿入してシリアルモニタで接続する必要があります。

今回使用しているLCDは画像データが反転して表示されます。このため青っぽい画像となります。これを修正するには画像データ自身を反転する必要があります。

シリアルモニタに表示されるメッセージを次に示します。

Prepare camera
Start streaming
Set Auto white balance parameter
Set still picture format
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
call takePicture()
Save taken picture as PICT000.JPG
Image data size = 153600 , buff addr = D040B00

・・・

Save taken picture as PICT008.JPG
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
call takePicture()
Save taken picture as PICT009.JPG
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
Image data size = 153600 , buff addr = D040B00
End.

次のように、SDカードにはキャプチャした10枚のJpegファイルが保存されます。 

USB MSCによるSDカードのアクセス

SDカードをアクセスするために、USB MSC(USBマスストレージクラス) 機能を実装します。Spresense 拡張ボードの SD カードが PC 上のドライブとしてマウントされ、PC から SD カードに直接アクセスすることができます。Spresense 拡張ボードのUSBコネクタに接続します。サンプルスケッチ「UsbMsc」を使って実装します。

  1. メニュー「ファイル」 → 「スケッチ例 」→「Spresense用のスケッチ例 SDHCI」 → 「UsbMsc」を選択してサンプルスケッチを開きます。
  2. 次のスケッチが取得できます。
  3. UsbMsc.ino

    #include <SDHCI.h>
    SDClass SD;
    
    void setup() {
      Serial.begin(115200);
    
      /* Initialize SD */
      while (!SD.begin()) {
        ; /* wait until SD card is mounted. */
      }
    
      /* Start USB MSC */
      if (SD.beginUsbMsc()) {
        Serial.println("USB MSC Failure!");
      } else {
        Serial.println("*** USB MSC Prepared! ***");
        Serial.println("Insert SD and Connect Extension Board USB to PC.");
      }
    }
    
    void loop() {
    }
    
  4. 実行すると次のメッセージがシリアルモニタに表示されます。
  5. PCからは次のようにSDカードの内容が表示され、ファイルの取得や転送などが可能になります。

新規にSDカードにファイルを作成して、PCから表示させようとしても表示されません。表示するには一旦「endUsbMsc」で閉じて、再度「beginUsbMsc」する必要があります。