なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduinoで遊ぼう - LinkSprite JPEGカメラモジュール「LS-Y201」

Posted by arms22 on 2010年12月06日 35  0

IMGP0211

スイッチサイエンスで発売されている新しいJPEGカメラモジュール「LS-Y201」を試してみたよ。LS-Y201は以前このブログでも紹介したJPEGカメラモジュール「C328」と似た機能をもつモジュールで、JPEG圧縮されたカラー静止画をシリアルで出力する。C328の販売が終了して、代わりのカメラモジュールをずっと探していたので、LS-Y201の発売はうれしいかぎり。

LS-Y201の仕様

  • 解像度: 640x480(VGA)/320x480(QVGA)/160x120
  • ボーレート: 38400 bps
  • 電源電圧: 3.3V または 5V
  • サイズ: 32x32 mm
  • 消費電流: 80~100mA
今回、C328の使い方を紹介した時と同じやり方で、LS-Y201で撮影した画像をPCの画面に表示する方法を紹介しよう。

LinkSprite JPEG Color Camera Sample Image LinkSprite JPEG Color Camera Sample Image

LS-Y201で撮影した画像。鮮やかさに欠けるけど画質はそこそこ。ピント調節はネジ式のレンズをぐりぐり回さないといけないので難しい。


Arduinoと接続する

5V      <--> VCC(LS-Y201)
2番(RX) <--- TX(LS-Y201)
3番(TX) ---> RX(LS-Y201)
GND <--> GND(LS-Y201)
LS-Y201の動作電圧は 3.3V か 5V なので、5V動作のArduino(UNOやDuemilanove、MEGAなど)直結できる。LS-Y201の電源(VCCとGND)とシリアルポート(TXとRX)をArduinoの端子につなげるだけでOKだ。


JPEGCameraライブラリ


Arduino用ライブラリはSparkFunが提供している「JPEGCamera」ライブラリが使える。けどこのライブラリはNewSoftSerialを使うことを前提に設計されていて、HardwareSerialが使えないようになっている。それだとちょっと不便だと思ったので、ちょっと修正してHardwareSerialでも使えるようにしておいた。ついでに撮影サイズを変更する為の処理も追加した。僕が改造したJPEGCameraライブラリは次のURLからダウンロードできる。

JPEGCamera-001.zip
http://code.google.com/p/arms22/downloads/detail?name=JPEGCamera-001.zip

上記、JPEGCameraの変更と合わせてNewSoftSerialの継承元クラスをPrintクラスからStreamクラスに変更した。こうする事でJPEGCameraはStreamクラスから派生したクラスすべてに対応することができた。

NewSoftSerial-001.zip
http://code.google.com/p/arms22/downloads/detail?name=NewSoftSerial-001.zip


サンプルスケッチ(Arduino)


Arduino側のスケッチ。PCから何らかのデータを受信したら、撮影を開始しJPEG画像をPCに送信する。工場出荷時にJPEGカメラのボーレートは38400 bps、撮影サイズは320 x 240に設定されている。撮影サイズを変更したい場合は、setup()のcamera.imageSizeの行を有効にする。撮影サイズはJPEGカメラのEEPROMに書き込まれるので、一度設定した後はcamera.imageSizeの行を無効に戻す。

#include <JPEGCamera.h>
#include <NewSoftSerial.h>

//NewSoftSerialインスタンスを作成
NewSoftSerial mySerial(2,3);

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

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

void setup()
{
  //シリアルポートセットアップ
  //JPEGカメラ-Arduino 38400 bps
  //Arduino-PC 115 kbps
  mySerial.begin(38400);
  Serial.begin(115200);

  //撮影サイズ設定(640x480,320x240,160x120)
  //指定した撮影サイズはEEPROMに書き込まれるので1度実行したらコメントアウトしておく
  // if( camera.imageSize(JPEGCamera::IMG_SZ_640x480) == false ){
  // Serial.println("imageSize failed");
  // }

  //JPEGカメラをリセット
  if( camera.reset() == false ){
    Serial.println("reset failed");
  }
  //4秒程まってから撮影を開始する
  delay(4000);
}

void loop()
{
  //PCからの撮影トリガを待つ
  if( Serial.available() ){
    //受信データ破棄
    Serial.flush();

    //撮影する
    if( camera.takePicture() == false ){
      Serial.println("takePicture failed");
    }

    //撮影した画像データのサイズを取得する
    if( camera.getSize(&size) == false ){
      Serial.println("getSize failed");
    }

    //開始アドレスを0に、size分読み込むまで繰り返す
    address = 0;
    while(address < size)
    {
      //32byte読み込む
      count = camera.readData(response, 32, address);
      if( count ){
        //PCに送信する
        Serial.write(response, count);

        //受信したデータサイズ分、アドレスを更新する
        address += count;
      }
      else{
        Serial.println("readData failed");
      }
    }
    //撮影停止(一旦止めないと新しい画像は撮影されない)
    camera.stopPictures();
    //少し待つ
    delay(100);
  }
}



サンプルスケッチ(Processing)


Processing側のスケッチ。何らかのキー入力を受けると、Arduinoに1バイトデータを送信し、ArduinoからJPEG画像を受信する。受信の終わりはコンソールのメッセージが止まったことを目視で確認する。もう1度何かのキーを押すと、受信したJPEG画像が画面に表示される。受信したJPEG画像はスケッチのあるフォルダにphoto数字.jpgという名前で保存される。
import processing.serial.*;

Serial myPort;
String filename = "photo.jpg";
byte count = 0;
byte[] photo = {
};
Boolean readData = false;
PImage captureImage;

void setup()
{
  size(640,480);
  println( Serial.list() );
  //Serial.list()[3]は環境に合わせて変更すること。
  myPort = new Serial( this, Serial.list()[1], 115200 );
}

void draw()
{
  byte[] buffer = new byte[64];
  if( readData )
  {
    while( myPort.available() > 0 )
    {
      int readBytes = myPort.readBytes( buffer );
      print( "Read " );
      print( readBytes );
      println( " bytes ..." );
      for( int i = 0; i < readBytes; i++ )
      {
        photo = append( photo, buffer[i] );
      }
    }
  }
  else
  {
    while( myPort.available() > 0 )
    {
      print( "COM Data: " );
      println( myPort.readString() );
    }
  }
}

void keyPressed()
{
  if( photo.length > 0 ) {
    readData = false;
    print( "Writing to disk " );
    print( photo.length );
    println( " bytes ..." );
    filename = "photo" + count + ".jpg";
    saveBytes( filename, photo );
    println( "DONE!" );
    photo = new byte[0];
    captureImage = loadImage(filename);
    image(captureImage, 0, 0);
    count++;
  }
  else {
    readData = true;
    myPort.write(0);
    println( "Waiting for data ..." );
  }
}


参考URL


mbedを使ったLinkSprite JPEG Color Camera LS-Y201からの画像取得
http://shinta-main-jp.blogspot.com/2010/11/mbedlinksprite-jpeg-color-camera-ls.html

LinkSpriteシリアル接続JPEGカラーカメラ
http://www.switch-science.com/products/detail.php?product_id=453

LinkSprite UART出力JPEGカラーカメラ(640x480)
http://strawberry-linux.com/catalog/items?code=18143

LinkSpriteシリアル接続JPEGカラーカメラ
http://www.wakamatsu.ne.jp/cgi-bin/shop/shop.cgi?&id=41049

LinkSprite JPEG Color Camera TTL Interface
http://www.sparkfun.com/products/10061

Arduinoで遊ぼう - JPEGカメラモジュールで写真を撮る
http://arms22.blog91.fc2.com/blog-entry-261.html


Arduino Uno SMD
Arduino Uno SMD
posted with amazlet at 11.02.02
スイッチサイエンス
売り上げランキング: 23827



Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ
小林 茂
オライリージャパン
売り上げランキング: 6565



Ads by Google

35 Comments

says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2010.12.21 11:24 | | # [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2011.03.09 22:19 | | # [edit]
arms22 says..."Re: もう少し細かく教えてください"
どのヘンがうまくいって、
どのヘンがうまくいっていないか、
もう少し具体的に説明してもらえると助かります。

2011.03.09 23:44 | URL | #- [edit]
中村 優太 says..."No title"
ご返答ありがとうございます。
お恥ずかしい所ですがよろしくお願いします。

ブログに掲載されていた
スケッチをそのままコピー
して貼り付けしました。

変更されたライブラリを解凍して
arduino-0022>libraries
に収納しました。

スケッチが記載されていた色と違って
#include<色付きの文字JPEGCamera色付きの文字>

色付きの文字JPEGCamera色付きの文字camera(mySerial);
が違いました。

コンパイルしたところ
cannot declare variable 'mySerial' to be of abstract type 'NewSoftSerial'
と出ました。

下の黒い部分には

camera_demo:5: error: cannot declare variable 'mySerial' to be of abstract type 'NewSoftSerial'
C:\ardiuno\arduino-0022\libraries\NewSoftSerial/NewSoftSerial.h:45: note: because the following virtual functions are pure within 'NewSoftSerial':
C:\ardiuno\arduino-0022\hardware\arduino\cores\arduino/Stream.h:31: note:
virtual int Stream::peek()

と書いてあってココはエラーの詳細だと思うのですがよく解かりません

すみませんが詳しくお願い致します。
2011.03.11 13:09 | URL | #- [edit]
arms22 says..."Re: No title"
あーpeek関数ですね。
0022からStreamクラスに追加された関数です。
それがNewSoftSerial-001に実装されていなくてエラーになっているようです。

取り急ぎここから新しいversionをダウンロードして使ってください。

http://code.google.com/p/arms22/source/browse/#svn%2Ftrunk%2FNewSoftSerial
2011.03.11 13:20 | URL | #- [edit]
中村 優太 says..."ありがとうございました。"
ありがとうございました。

新しいライブラリーを製作していただいた
おかげでコンパイルが無事に通りました。

ありがとうございました。

一つ気になった事があったのですが
よろしいでしょうか

カメラ裏側の大きい半導体
おそらくカメラ側のCPU
だと思います。

動作中CPUが少しあたたかかったのですが
大丈夫でしょうか?
2011.03.12 16:06 | URL | #- [edit]
arms22 says..."Re: ありがとうございました。"
ほんのり温かい程度なら大丈夫だと思いますよ。
2011.03.13 11:45 | URL | #- [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2011.05.31 20:04 | | # [edit]
arms22 says..."Re: aruduino単体についての質問"
繰り返しになりますが、こちらを参照してください。

> http://arms22.blog91.fc2.com/blog-entry-320.html
2011.05.31 22:16 | URL | #- [edit]
shogo says..."No title"
はじめまして。
arduinoを触るとき、とてもわかりやすいのでいつも参考にさせてもらっています。

突然の質問で申し訳ないのですが、
ライブラリ(JPEGCamera,NewSoftSerial)をarduinoのライブラリ入れ、
このページにて公開されているコードをそのまま貼りつけてコンパイルしたところ、
以下のようなエラーがでました。
no matching function for call to'JPEGCamera(NewSofSerial&)'

cameraCheck:8: error: no matching function for call to 'JPEGCamera::JPEGCamera(NewSoftSerial&)'
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:15: note: candidates are: JPEGCamera::JPEGCamera()
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:13: note: JPEGCamera::JPEGCamera(const JPEGCamera&)
cameraCheck.cpp: In function 'void setup()':
cameraCheck:34: error: no matching function for call to 'JPEGCamera::reset()'
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:17: note: candidates are: int JPEGCamera::reset(char*)
cameraCheck.cpp: In function 'void loop()':
cameraCheck:49: error: no matching function for call to 'JPEGCamera::takePicture()'
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:19: note: candidates are: int JPEGCamera::takePicture(char*)
cameraCheck:54: error: no matching function for call to 'JPEGCamera::getSize(unsigned int*)'
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:18: note: candidates are: int JPEGCamera::getSize(char*, int*)
cameraCheck:63: error: no matching function for call to 'JPEGCamera::readData(unsigned char [32], int, unsigned int&)'
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:21: note: candidates are: int JPEGCamera::readData(char*, int)
cameraCheck:76: error: no matching function for call to 'JPEGCamera::stopPictures()'
/Users/shogo/Documents/Arduino/libraries/JPEGCamera/JPEGCamera.h:20: note: candidates are: int JPEGCamera::stopPictures(char*)


エラー部分を
JPEGCamera camera;

というように変更してコンパイルすると今度は他のJPEGCamera関連のところでエラーが出てしまいました。
どのように解決すればよいか全くわかりません。
解決方法をご指摘いただいてもよろしいでしょうか?
よろしく御願します。
2011.06.11 21:27 | URL | #4HA1OoI6 [edit]
shogo says..."No title"
すいません。先ほどコメントしたものです。
解決できました。
JPEGCameraライブラリがちゃんとはいっていないだけでした・・・
失礼しました。
2011.06.12 02:02 | URL | #4HA1OoI6 [edit]
arms22 says..."Re: No title"
こんにちは。
このカメラちょっと癖?があるみたいで、
ボーレートを変更すると内蔵EEPROMが壊れることがあるようです。
詳しい手順はわかりませんが。。
お気をつけください。
2011.06.13 17:37 | URL | #- [edit]
shogo says..."No title"
こんにちは、先日質問したものです。
また質問させてください。

今自分のサーバにLS-Y201で撮った画像をPOSTでアップロードしようとしているのですが、
Content-Lengthの値の計算でつまづいています。
twitpicに投稿するライブラリをのぞかせてもらったところある一定のアルゴリズムで計算されているようですが、
どのように計算されているか教えていただけないでしょうか?

よろしくお願いします。
2011.06.18 21:30 | URL | #4HA1OoI6 [edit]
arms22 says..."Re: No title"
Content-LengthにはPOSTするデータのサイズが入ります。
具体的にはHTTP Header以降の以下の部分のデータ量計算しています。

// Post Parameter
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: form-data; name=\"key\"") );
println();
println_P( twitpic_api_key );

// Post Parameter
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: form-data; name=\"consumer_token\"") );
println();
println_P( consumer_key );

// Post Parameter
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: form-data; name=\"consumer_secret\"") );
println();
println_P( consumer_secret );

// Post Parameter
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: form-data; name=\"oauth_token\"") );
println();
println_P( access_token );

// Post Parameter
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: form-data; name=\"oauth_secret\"") );
println();
println_P( access_token_secret );

// Post Parameter
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: form-data; name=\"message\"") );
println();
println(message);

// Image Data
if(imageTransfer){
println_P( PSTR(HEADER) );
println_P( PSTR("Content-Disposition: file; name=\"media\"; filename=\"img0000.jpg\"") );
println_P( PSTR("Content-Type: image/jpeg") );
println_P( PSTR("Content-Transfer-Encoding: binary") );
println();
imageTransfer(&client);
println();
}

// Footer
println_P( PSTR(FOOTER) );
println();


2011.06.19 08:58 | URL | #- [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2012.06.14 21:47 | | # [edit]
arms22 says..."Re: コンパイルエラー"
ここで Arduino 1.0 に対応したライブラリが公開されているので、
こちらのライブラリを使ってみてください。

https://github.com/adafruit/Adafruit-VC0706-Serial-Camera-Library
2012.06.15 10:14 | URL | #- [edit]
かめ says..."撮影に失敗"
このサイトを参考にカメラ+Arduinoでの撮影を試みているのですがうまくいきません。

プログラムはほとんど変更していません。
変更している点は
・NewSoftSerialが使えないためSoftwareSerialを使用
・Processing側のスケッチの「size(640,480);」を「size(320,240);」へ
以上の2点です。

Processingの実行を押してから、何らかのキーを押すと撮影が開始されます。
実行画面には「Read 32 bytes ...」などのように表示され順調に読み込まれていると思っていたのですが、いつまで経っても読み込みが終了しません。
約5分程経つと「Read 64 bytes ...」がずっと流れ始め、キーを押しても撮影が終了されなくなってしまいます。
3分程読み込んだ後にキーを押してみると約350KBの画像が、4分程読み込んだ後にキーを押してみると約420KBの画像が表示されており、完全に撮影できていないというわけではなさそうです。

随分前の記事ですが、ご返答よろしくお願いします。
2013.11.21 16:42 | URL | #8NwDI8VQ [edit]
arms22 says..."No title"
こちらのライブラリを試してみてください。

https://github.com/adafruit/Adafruit-VC0706-Serial-Camera-Library
2013.11.22 10:40 | URL | #j7sy4omY [edit]
かめ says..."No title"
お返事ありがとうございます。

URL先からAdafruit_VC0706をダウンロードし、これをC:\Program Files\Arduino\librariesに置きました。
Arduinoのスケッチには「#include <Adafruit_VC0706.h>」を追加しました。
作業としてはこれで間違いないでしょうか?

これで実行してみたのですが、依然として「Read 64Bytes ...」が無限ループしてしまいます。
2013.11.22 13:55 | URL | #8NwDI8VQ [edit]
arms22 says..."No title"
Arduino側のスケッチはアップロードされましたか?
AdafruitのライブラリとはAPIが違ったと思います。
その辺は修正されましたか?
2013.11.25 09:12 | URL | #j7sy4omY [edit]
かめ says..."No title"
ttp://floclo.blog20.fc2.com/blog-date-201212.html
こちらのサイトも参考にしてみたところ画像撮影に成功しました。
しかし、データ量が13KBと低くなってしましました。(撮影速度は速くなりました)
arms22さんが載せてくださったプログラムをまともに実行できていないので何ともいえないのですが、こちらのプログラムで撮影した際も13KBほどのデータ量になるのでしょうか?
画質を向上させる手段があれば試してみたいと考えています。
2013.11.26 10:42 | URL | #8NwDI8VQ [edit]
arms22 says..."No title"
画像サイズが320 x 240だったらそんなもんじゃないかなぁ。
画質を上げるコマンドがあればそれを送ってみたらいいんじゃないかな?
詳しくはデーターシートを見てください。

解像度上げるコマンドあったと思うけど、
そのコマンド使うと2度と撮影できなくなるような、
不具合が昔あったような。。

2013.11.26 11:46 | URL | #j7sy4omY [edit]
says..."管理人のみ閲覧できます"
このコメントは管理人のみ閲覧できます
2014.10.05 21:18 | | # [edit]
arms22 says..."Re: 無線化"
カメラのボーレートをXBeeに合わせてXBeeをブリッジ替わりにしたらうまくいくかも。ボーレートかえれたっけ。。
2014.10.05 23:32 | URL | #- [edit]
ase says..."無線化"
ご返答ありがとうございます。
他のサイトも参考にしているのですが、ボーレートを変えるコマンドを送ると、ROMを書き直さないと復活できない場合があるようです。
とりあえず、ボーレートの変更をやってみたいと思います。
ありがとうございました。
2014.10.06 11:36 | URL | #DoBUsw.s [edit]
mySerial says..."No title"
Arduino側のスケッチでサイトの通りにスケッチしたのですがmySerialでエラーがでてしまいます。ちなみにライブラリの中にはJPAGとNewsoftSerialは入っています
2014.10.06 23:23 | URL | #fbMedLf. [edit]
mySerial says..."No title"
つづけて質問です。新しいversionのNewsoftSerialはどうやってダウンロードすればいいのですが?以前貼っていたURLにとんでもどうやってダウンロードすればいいのかわかりませんでした。どれが新しいversionなのかもわかりません
2014.10.07 01:58 | URL | #fbMedLf. [edit]
arms22 says..."No title"
こちらのライブラリを試してみてください。

https://github.com/adafruit/Adafruit-VC0706-Serial-Camera-Library
2014.10.07 09:06 | URL | #dGOlqOBo [edit]
まーくん says..."No title"
コンパイルしたときに conflicting return type specified for 'virtual void NewSoftSerial::write(uint8_t)'とエラーがでたのですがこれはどうすればかいけつできますか?
2014.10.16 13:38 | URL | #xcpGVaJU [edit]
arms22 says..."No title"
NewSoftSerialの変わりにArduino標準のSoftwareSerialを使ってください。
2014.10.16 17:36 | URL | #j7sy4omY [edit]
まーくん says..."No title"
返信ありがとうぎざいます。
Arduino側のスケッチは通ったのですが、Processing側のスケッチでArray Index Out of bounds exceptionとでてきてしまいます
2014.10.21 16:27 | URL | #- [edit]
arms22 says..."No title"
indexの値が配列のサイズを超えているようです。indexの値を確認し、配列のサイズを超えないようにしてください。
2014.10.22 09:40 | URL | #j7sy4omY [edit]
夕もや says..."カメラモジュールの生産終了について"
いつもわからないことがあるとこちらのサイトのスケッチや、ライブラリなどを使わせってもらっていて、とても助かります。

「LS-Y201」の生産が終了してしまい、代わりとなるカメラモジュールを探していますがなかなか見つかりません。(赤外線付きのはありますが、、)何か代わりとなるカメラモジュールはありますか?。
2014.11.17 16:35 | URL | #- [edit]
arms22 says..."No title"
高解像度版がでてるみたいだね。スイッチサイエンスさんにお願いしたら取り寄せてくれるかも。

LinkSprite JPEG Color Camera TTL Interface - 2MP
https://www.sparkfun.com/products/12804
2014.11.17 17:58 | URL | #edOuFdAE [edit]
夕もや says..."No title"
ありがとうございます。
早速おねだりしますw
2014.11.17 21:40 | URL | #- [edit]

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。