Arduinoで遊ぼう - JPEGカメラで撮った写真をTwitPicにポストする
Posted by arms22 on 2010年01月09日

TwitPicに画像をポストするライブラリの応用編。JPEGカメラモジュールで撮った写真を直接TwitPicにポストしてみるよ。
接続する

今回、JPEGカメラモジュールとの通信にはソフトウェアシリアルを使わず、ハードウェアシリアルを使います。ArduinoのTX、RX端子にJPEGカメラモジュールを接続します。JPEGカメラモジュールが接続されているとスケッチのアップロードに失敗するので、スケッチをアップロードする時はJPEGカメラモジュールを外して下さい。
ハードウェアシリアルをJPEGカメラモジュールとの通信に利用した為、処理中のメッセージを表示することができなくなりました。処理中を表すLEDとエラーを表すLEDを追加します。処理中は青色LED(digital 6番)を点灯させ、エラーが発生した場合(ポストに失敗など)には赤色LED(digital 5番)を点灯させます。
シャッターボタンをdigital 4番に接続します。ditital 4番の内蔵プルアップ機能を有効にします。スイッチを押した時のLOWレベルを検知して写真を撮影し、TwitPicにポストします。
ライブラリのインストール
次のライブラリをダウンロードし、Arduinoのlibrariesフォルダにコピーしてください(~/Documents/Arduino/libraries)。
画像サイズを取得できるよう改造したカメラライブラリ(CameraC328R)
http://arms22.googlecode.com/files/CameraC328R_002.zip
TwitPic-003.zip
http://code.google.com/p/arms22/downloads/detail?name=TwitPic-003.zip
http://arms22.googlecode.com/files/TwitPic_002.zip
Arduiniana - NewSoftSerial
http://arduiniana.org/libraries/newsoftserial/
スケッチ
EthernetとSerialを初期化した後、シャッターボタンが押されるの待ちます。シャッターボタンのLOWレベルを検出したらJPEGカメラモジュールとの通信を開始し、スナップショットコマンドを送ります。
撮影に成功したら撮影した画像のサイズを取得し(camera.getJPEGPictureSize)、TwitPicへ画像のアップロードを開始します(twitpic.upload)。
upload関数に指定したc328rImageTransfer関数がコールされたら、撮影した画像の取得を開始します(camera.getJPEGPictureData)。撮影した1枚の画像はJPEGカメラモジュールから分割して送られてきます。分割された画像データが届く度にgetJPEGPicture_callbackがコールされるので、client->write関数を使ってTwitPicに分割された画像データを送信します。
#include <Ethernet.h>
#include <TwitPic.h>
#include <CameraC328R.h>
#include <NewSoftSerial.h>
#define SNAPSHOT 4
#define ERROR_LED 5
#define PROGRESS_LED 6
#define CAMERA_BAUD 57600
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
TwitPic twitpic("Yourname","Password");
CameraC328R camera;
uint16_t pictureSize = 0;
Client *targetClient;
/**
* This callback is called EVERY time a JPEG data packet is received.
*/
void getJPEGPicture_callback( uint16_t pictureSize, uint16_t packageSize, uint16_t packageCount, byte* package )
{
targetClient->write(package,packageSize);
}
uint32_t c328rImageTransfer(Client *client)
{
if(client){
targetClient = client;
camera.getJPEGPictureData( &getJPEGPicture_callback );
}
return pictureSize;
}
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin( CAMERA_BAUD );
pinMode( PROGRESS_LED, OUTPUT );
digitalWrite( PROGRESS_LED, HIGH );
pinMode( ERROR_LED, OUTPUT );
digitalWrite( ERROR_LED, HIGH );
pinMode( SNAPSHOT, INPUT );
digitalWrite( SNAPSHOT, HIGH ); // pull-up
delay(10000);
digitalWrite( PROGRESS_LED, LOW );
digitalWrite( ERROR_LED, LOW );
}
void loop()
{
do {
if( digitalRead(SNAPSHOT) == LOW ){
digitalWrite( PROGRESS_LED, HIGH );
digitalWrite( ERROR_LED, LOW );
if( !camera.sync() ){
goto camera_error;
}
if( !camera.initial( CameraC328R::CT_JPEG, CameraC328R::PR_160x120, CameraC328R::JR_640x480 ) ){
goto camera_error;
}
if( !camera.setPackageSize( 64 ) ){
goto camera_error;
}
if( !camera.setLightFrequency( CameraC328R::FT_50Hz ) ){
goto camera_error;
}
if( !camera.snapshot( CameraC328R::ST_COMPRESSED, 0 ) ){
goto camera_error;
}
pictureSize = 0;
if( !camera.getJPEGPictureSize( CameraC328R::PT_SNAPSHOT, PROCESS_DELAY, pictureSize) ){
goto camera_error;
}
if(twitpic.upload(&c328rImageTransfer) < 0){
goto camera_error;
}
camera.powerOff();
break;
camera_error:
digitalWrite( ERROR_LED, HIGH );
}
digitalWrite( PROGRESS_LED, LOW );
delay(100);
}
while(0);
}
Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ(OAuth対応)
http://arms22.blog91.fc2.com/blog-entry-354.html
http://arms22.blog91.fc2.com/blog-entry-287.html
Arduinoで遊ぼう - JPEGカメラモジュールで写真を撮る
http://arms22.blog91.fc2.com/blog-entry-261.html
Ads by Google
1 Comments
神!!試してみます。ありがとうございます!
Leave a reply
該当の記事は見つかりませんでした。