JPEGカメラ LS-Y201用ライブラリ+サンプル

がじぇるね岡宮です。

残念ながらディスコンになった(後継品あり)、LinkSprite社のJPEGカメラLS-Y201用ライブラリとサンプルプログラムをアップします。

静止画(320x 240)を撮り、SDに保存するまでです。

 

すみませんが、GR-KURUMI用です。SAKURAではまだ試してません(多分使えますがサンプルは若干変更要ります。Serialのハンドルを渡すところで)。

なぜディスコンに関わらずアップしたか、、それはルネナイ4の賞品+色々な事情のためです。(キリッ

Arduino用のライブラリがSparkfunにも掲載されていますが、ソフトウェアシリアルを使っている+謎の挙動があったので、改造してアップしています。

宜しければお使いください。Webコンパイラの場合、プロジェクトルートでzipファイルインポート後、Arduino.hのコメントをはずすことで使えます。

IDE for GRの場合は、ライブラリのインポートを行ってください。

 

サンプルプログラムは以下です。(相変わらずタブがクリアされて見にくいですが、コピペで使えます)

ハードの接続や、手順はブログに書きたいと思います。

/*
  This sample is modified version based on below. 
  http://arms22.blog91.fc2.com/blog-entry-502.html
  http://arms22.blog91.fc2.com/blog-entry-391.html
*/

//#include <Arduino.h> // remove comment in case of web compiler
#include <SD.h>
#include "JPEGCamera.h"

//JPEGCameraインスタンスを作成
//コンストラクタにStreamクラスの派生クラスを指定する
JPEGCamera camera(Serial1);

void dateTime(uint16_t* date, uint16_t* time);

//受信バッファ
unsigned char response[32];
//受信データサイズ
unsigned int count=0;
//撮影したJPGE画像サイズ
uint16_t size=0;
//次に読み込むJPEG画像のアドレス
unsigned int address=0;

void setup()

Serial1.begin(38400); // to JPEG camera
Serial.begin(115200); // to USB serial

if( camera.reset() == false ){
Serial.println("reset failed");
}
Serial.print(F("Initializing SD card..."));

if (!SD.begin(4)) {
Serial.println(F("Card failed, or not present"));
// 失敗、何もしない
while(1);
}
Serial.println(F("SD ok."));

// 日付と時刻を返す関数を登録
SdFile::dateTimeCallback( &dateTime );

//4秒程まってから撮影を開始する
delay(4000);
}

void loop()
{
Serial.println("Hit Any Key");
//PCからの撮影トリガを待つ
while(!(Serial.available())){
}
Serial.read();

Serial.println("taking picture...");
if( camera.takePicture() == false ){
Serial.println("fail to take picture");
}
Serial.println("ok.");

Serial.println("taking size...");
if( camera.getSize(&size) == false ){
Serial.println("getSize failed");
}
Serial.print(size);
Serial.println();

char filename[12] = "pic0.jpg";
unsigned int count = 0;
while(SD.exists(filename)){
count++;
sprintf(filename, "pic%d.jpg", count);
}
File dataFile = SD.open(filename, FILE_WRITE);
Serial.print("filename is ");
Serial.println(filename);

//開始アドレスを0に、size分読み込むまで繰り返す
address = 0;
while(address < size)
{
//32byte読み込む
count = camera.readData(response, 32, address);
if( count ){
//SDに書き込む
for (int i =0 ; i< 32;i+=2){
dataFile.write(response[i]);
dataFile.write(response[i+1]);
if((response[i] == 0xFF) && (response[i+1] == 0xD9)){//JPGの終わりを検出
break;
}
}

//受信したデータサイズ分、アドレスを更新する
address += count;
} else {
Serial.println("readData failed");
}
delay(1); //これがないとread failする
}
//撮影停止(一旦止めないと新しい画像は撮影されない)
camera.stopPictures();
dataFile.close();
Serial.println("Success to save picture");
}

void dateTime(uint16_t* date, uint16_t* time)
{
uint16_t year = 2014; // Set time for saving files
uint8_t month = 4, day = 16, hour = 11, minute = 0, second = 0;
*date = FAT_DATE(year, month, day);
*time = FAT_TIME(hour, minute, second);
}

  • 後継品でもこのライブラリは使えるのでしょうか?

    KURUMI と SAKURA でソースは共通で内部で判断できる仕組みみたいのがあるといいですね。

    #if defined(GRSAKURA)

    #elif defined(GRKURUMI)

    #endif

    みたいな感じで。いまんとこ __RX600__ や __RL78__ で判別は可能だが RX600 == GR-SAKURA というわけではないし、RL78 にしても同様。プラットホーム固有のシンボルが欲しい。KURUMI で -DARDUINO=100 されてるのも気に入らない。

  • 後継品は、ちょっと買ってからのお楽しみですかね。コマンドが一緒、デフォルトボーレートも38400で一緒ということでおそらくはそのまま使えるというのが所感です。ライブラリ部分はちょっと考えたいところです。そもそもArduino互換ということで、同じライブラリでいきたいところではありまして、サンプル内で品種依存、例えばMEGAとかUNOとかに限らずそれぞれ切り分けられればと思うところです。MEGAだったらソフトウェアシリアルとか使わない方がいいと思いますし。んー、同じサンプルのコピペで動く方がよいという見解もあるかと思いますが、、

  • ライブラリの非互換については、例えば今回の例では NewSoftSerial クラスが問題なのであれば、SAKURA や KURUMI にそれを実装するのがスジだと思います。それ以外のオプションとして、シリアルポートが複数使える機種ではそれも対応、というのが望ましい気がしますね。

  • そうですね。一番最初のsparkfunのサイトに掲載されていたライブラリはソフトウェアシリアルで2,3ピンを使うようにしかできていなかったため、ちょっといまいちと思い改造しましたが、ソフトウェアシリアル自身の対応をすることが筋とは思いました。

  • ライブラリありがとうございます。

    早速使わせていただきました。

    XBeeからのリモートで撮影が出来ました。SDへの保存だからあんまり意味ないかな?

    KURUMIがSerial2とSPIの同時使用が出来ないと失念しててちょっと嵌りましたが…

    ここコメントに画像が貼れないんですね。