概要
GR-LYCHEEに付属されているカメラの使い方をご紹介します。WindowsとMacで利用可能です。
準備
ハードウェア
GR-LYCHEE、USBケーブル(マイクロBタイプ)を準備します。カメラの取り付け方は「カメラや付属品、LCDの取り付け方」を参照してください。
SDカードがあれば、後半に写真を保存するサンプルもお試しできます。
ソフトウェア
DisplayAppをダウンロードして解凍してください。PCでカメラの画像を確認するためのアプリケーションです。
カメラの画像を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ケーブルを接続してください。
シリアルポートが表示されます。Windowsの場合はCOMxx、Macの場合は/dev/xxxがポート名として表示されますので、それをクリックしてください。
カメラの画像がDisplayAppに表示されます。
カメラの画像データについて
カメラの画像はYCbCr形式でメモリに格納されます。実際の格納イメージは以下の通りで、Y0, Cb, Y1, Crの順に格納されます。1ピクセル当たり、2バイトになりますので、例えばVGA(640x480)では、640x480x2=614,400バイトのメモリが使用されます。
格納アドレスはcamera.getImageAdr()で取得できます。
次の図はY、Cb、Crの値で表現されるカラーを示したものです。1ピクセル目はY=0x30, Cb=0x87, Cr=0x73ですので、かなり暗いダークブルーになってます。
SDカードに保存する
次に写真をSDカードに保存してみます。以下にサンプルプログラムを示します。タイムスタンプをNTPで取得するプログラムになっているため、Wi-Fiが使用できる場合はWIFI_SSIDとWIFI_PWを適当に変更してください。Wi-Fiが使用できない場合でも実行できますが、接続をスキップするまで20秒程度かかります。
サンプルの実行にはMbed用NTP Clientライブラリが必要になりますので、以下のzipをWebコンパイラ、またはIDE for GRにインポートしてください。
- NTP Client Library File (ZIP)
#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に保存されます。