概要

GR-LYCHEEに付属されているカメラの使い方をご紹介します。WindowsとMacで利用可能です。


準備

ハードウェア

GR-LYCHEE、USBケーブル(マイクロBタイプ)を準備します。カメラの取り付け方は「カメラや付属品、LCDの取り付け方」を参照してください。

SDカードがあれば、後半に写真を保存するサンプルもお試しできます。

ソフトウェア

DisplayAppをダウンロードして解凍してください。PCでカメラの画像を確認するためのアプリケーションです。

gr-lychee-board
usb-cablesd-card-2gb

カメラの画像をPCで表示する

以下のプログラムをGR-LYCHEEに書き込んでください。


#include <Arduino.h>
#include <Camera.h>
#include "DisplayApp.h"
Camera camera(640, 480);
static DisplayApp display_app;
void setup() {
    camera.begin();
}
 
void loop() {
    display_app.SendJpeg(camera.getJpegAdr(), (int)camera.createJpeg());
    delay(10);
}

次にDisplayAppを起動し、GR-LYCHEEのUSB0にUSBケーブルを接続してください。

sp-connect-usb

シリアルポートが表示されます。Windowsの場合はCOMxx、Macの場合は/dev/xxxがポート名として表示されますので、それをクリックしてください。

sp-display-com

カメラの画像がDisplayAppに表示されます。

sp-display-app

カメラの画像データについて

カメラの画像はYCbCr形式でメモリに格納されます。実際の格納イメージは以下の通りで、Y0, Cb, Y1, Crの順に格納されます。1ピクセル当たり、2バイトになりますので、例えばVGA(640x480)では、640x480x2=614,400バイトのメモリが使用されます。

格納アドレスはcamera.getImageAdr()で取得できます。

sp-memory-data

次の図はY、Cb、Crの値で表現されるカラーを示したものです。1ピクセル目はY=0x30, Cb=0x87, Cr=0x73ですので、かなり暗いダークブルーになってます。

sp-memory-color

SDカードに保存する

次に写真をSDカードに保存してみます。以下にサンプルプログラムを示します。タイムスタンプをNTPで取得するプログラムになっているため、Wi-Fiが使用できる場合はWIFI_SSIDとWIFI_PWを適当に変更してください。Wi-Fiが使用できない場合でも実行できますが、接続をスキップするまで20秒程度かかります。

サンプルの実行にはMbed用NTP Clientライブラリが必要になりますので、以下のzipをWebコンパイラ、またはIDE for GRにインポートしてください。


#include <Arduino.h>
#include <Camera.h>
#include <RTC.h>
#include <ESP32Interface.h>
#include <NTPClient.h>
#include <SdUsbConnect.h>
  
#define WIFI_SSID "elecom2g01-45ea1e"
#define WIFI_PW "renerene"
  
Camera camera(640, 480);
ESP32Interface wifi;
RTC rtc;
SdUsbConnect storage("storage");
  
void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED_RED, OUTPUT);
  pinMode(PIN_LED_GREEN, OUTPUT);
  pinMode(PIN_LED_YELLOW, OUTPUT);
  pinMode(PIN_SW0, INPUT);
  
  rtc.begin();
  Serial.print("Connecting Wi-Fi..");
  wifi.connect(WIFI_SSID, WIFI_PW, NSAPI_SECURITY_WPA_WPA2);
  Serial.println("done");  
  Serial.print("Accessing NTP..");
  NTPClient ntp(&wifi);
  time_t tstamp = ntp.get_timestamp();
  if(tstamp < 0){
    Serial.println("Cannot get time from NTP.");    
    rtc.setDateTime(2018, 4, 19, 16, 40, 0);
  } 
  else {
    Serial.println("done");  
    struct tm tim = *localtime(&tstamp);
    rtc.setDateTime(tim.tm_year+1900, tim.tm_mon+1, tim.tm_mday, tim.tm_hour, tim.tm_min, tim.tm_sec);
  }
  
  // Camera
  camera.begin();
  
  // SD & USB
  Serial.print("Finding strage..");
  storage.wait_connect();
  Serial.println("done");  
  Serial.println("Push UB0 to take a photo.");
}
  
void loop() {
  if(digitalRead(PIN_SW0) == LOW){
    digitalWrite(PIN_LED_YELLOW, HIGH);
    FILE * wp = fopen("/storage/lychee_camera.jpg", "w");
    if (wp != NULL) {
      size_t size = camera.createJpeg();
      fwrite(camera.getJpegAdr(), sizeof(char), (int) size, wp);
      fclose(wp);
    } else {
      Serial.print("Not found jpg");
      digitalWrite(PIN_LED_RED, HIGH);
      delay(1);
    }
    Serial.println("done to take a photo");
    while(digitalRead(PIN_SW0) == LOW);
    digitalWrite(PIN_LED_YELLOW, LOW);
  }
}

GR-LYCHEEにSDカードを差し込み、プログラムを実行してみましょう。シリアルモニターを表示し、「Push UB0 to take a photo.」まで実行されるのが確認できたらUB0を押してください。写真がSDに保存されます。

sp-camera-serial