Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ(OAuth対応)

お待たせ(?)しました!ArduinoからTwitPicに画像をポストするライブラリ「TwitPic」がTwitPicのOAuth APIに対応したよ!

TwitterのBASIC認証廃止に伴い、TwitPicのBASIC認証を使ったAPIが廃止され、ArduinoからTwitPicに画像をポストするライブラリが動かなくなっていました。今回、TwitPicがOAuthに対応した新しいAPIを用意してくれたので、そのAPIを使って画像をポストするようにライブラリを更新しました。

TwitPicのOAuth APIはv1とv2の2つがあって、v2はシグネチャの演算(SHA)が大変なのとTwitterへのポストを行ってくれないのでv1を使うことにしました。v1ならTwitterへのポストも行ってくれます。TwitPicのAPI仕様については次のURLを参照してください。

TwitPic Developers - API v1 » uploadAndPost (POST w/ OAuth)
http://dev.twitpic.com/docs/1/uploadAndPost/

従来、ライブラリにはユーザ名とパスワードの2つのパラメータを指定するだけで良かったけど、今回のOAuth対応版では次の5つのパラメータを設定する必要があります。
  • TwitPic API Key
  • Consumer key
  • Consumer Secret
  • Access Token
  • Access Token Secret
TwitPic API KeyはTwitPicのデベロッパーページで、残りの4つはTwitterのデベロッパーページで簡単に取得できます。順を追って説明していきます。


ライブラリのインストール


次のURLからライブラリをダウンロードして、Arduinoのライブラリフォルダ(OSXの場合~/Documents/Arduino/libraries、Windowsの場合My Documents/Arduino/libraries)にコピーしてください。

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


TwitPic API Key


TwitPicのデベロッパーページでアプリケーションを登録してAPI Keyを取得します。

TwitPic Developers - Register an Application
http://dev.twitpic.com/apps/new

  • Application Title:
    アプリケーション名を英語で。TwitPicのページで「from ~」に表示されます。
  • Application Description:
    アプリケーションの概要を入力してください。適当でOKです。
  • Application Homepage:
    アプリケーションのホームページのURLを入力してください。なければ自分のブログのURLでもOKです。
  • Your Email:
    あなたのメールアドレス。
登録するとAPI Keyが表示されます。登録したアプリケーションの情報はあとで確認・変更できます。


Consumer key/Consumer Secret


先ほどのAPI Keyと同じように今度はTwitterのデベロッパーページでアプリケーションを登録します。

Twitter Applications
http://dev.twitter.com/apps

  • アプリケーション名:
    アプリケーションの名前を英語で。TL上で「from ~」に表示されます。
  • アプリケーションの説明:
    アプリケーションの概要を入力してください。これも適当でOKです。
  • アプリケーションのウェブサイトURL:
    なければ自分のブログのURLでOK。
  • 所属会社/団体
    空欄でOK。
  • アプリケーションの種類:
    「クライアントアプリケーション」を選んで下さい。
  • Default Access type:
    「 Read & Write」を選んで下さい。
  • アプリケーションのアイコン:
    好きなアイコンを選んで下さい。無くてもOK。
登録するとアプリケーションの詳細ページにジャンプします。そのページの真ん中の方にConsumer keyとConsumer secretが表示されます。

consumer.png


Access Token/Access Token Secret


先ほどのアプリケーションの詳細ページの右側に「My Access Token」と書かれたリンクがあります。このリンクをクリックするとAccess TokenとAccess Token Secretが表示されます。

access_token.png


サンプルスケッチ


5つのパラメータは次の5つの変数を通してライブラリに渡します。↑で取得したパラメータをこれら変数に設定してください。これらの変数はライブラリ内から参照されます。
  • twitpic_api_key
  • consumer_key
  • consumer_secret
  • access_token
  • access_token_secret

#include <Ethernet.h>
#include <TwitPic.h> // ライブラリをインポート
#include "SampleImage.h"

// Your TwitPic API Key(key)
const prog_char twitpic_api_key[] PROGMEM     = "Your TwitPic API Key";

// Your Twitter Consumer key(consumer_token)/Consumer Secret(consumer_secret)
const prog_char consumer_key[] PROGMEM        = "Your Consumer key";
const prog_char consumer_secret[] PROGMEM     = "Your Consumer Secret";

// Your Twitter Access Token (oauth_token)/Access Token Secret (oauth_token_secret)
const prog_char access_token[] PROGMEM        = "Your Access Token";
const prog_char access_token_secret[] PROGMEM = "Your Access Token Secret";

TwitPic twitpic; // TwitPicのインスタンス

void sampleImageTransfer(Client *client)
{
  for(uint32_t i=0; i<sizeof(sampleImage); i++){
    client->print(pgm_read_byte(sampleImage+i)); // Flashメモリから画像を1byteづつ読み込んで送信
  }
}

// ネットワーク環境に合わせて変更する
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
  10, 0, 0, 177 };

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(57600);

  delay(3000);

  int ret = twitpic.uploadAndPost("Sample Image Post from Arduino", sizeof(sampleImage), &sampleImageTransfer); // 画像をポストする

  if(ret < 0){
    Serial.print("post failed : err code = ");
    Serial.println(ret);
  }
  else{
    Serial.println("OK.");
  }
}

void loop()
{
}


画像のみポストしたい場合は、upload関数を使ってください。画像と一緒にTLにメッセージを流したい場合は、uploadAndPost関数を使ってください。エンジョイ!


Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ
http://arms22.blog91.fc2.com/blog-entry-287.html


Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング: 666




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



Arduinoで遊ぼう - JPEGカメラで撮った写真をTwitPicにポストする

JPEGカメラモジュール+イーサーネットシールド /w Arduino
TwitPicに画像をポストするライブラリの応用編。JPEGカメラモジュールで撮った写真を直接TwitPicにポストしてみるよ。

接続する


c328r_2led_1sw.png
今回、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
TwitPicライブラリ
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
Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ
http://arms22.blog91.fc2.com/blog-entry-287.html


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



Arduinoイーサネット・シールド
スイッチサイエンス
売り上げランキング: 3761



Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング: 1792



Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ

Twitter上で画像を共有するサービス「TwitPic」にArduinoから画像をポストするライブラリを作ったよ!ArduinoからTwitterにつぶやきをポストするライブラリはあったけど、画像をポストするライブラリはなかったでしょ?

JPEGカメラモジュールと組み合わせれば定点観測カメラなんかも簡単に作ることができるよ!ご利用は計画的にね!

追記2010/1/5
そうそうArduinoをインターネットに接続するにはイーサネット・シールドが必要だよ。

Arduinoと接続する


JPEGカメラモジュール接続図

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

ライブラリをダウンロードする


TwitPicライブラリ
http://arms22.googlecode.com/files/TwitPic_001.zip
http://arms22.googlecode.com/files/TwitPic_002.zip

ダウンロード+解凍してできたTwitPicフォルダをArduinoフォルダのHardware/librariesにコピーしてください。Mac用のArduino IDEでバージョンが0017以上の場合~/Documents/Arduino/librariesにTwitPicフォルダをコピーしてください。librariesフォルダがない場合は新規作成してください。


サンプルスケッチ


サンプルを実行させると次のような画像とメッセージをポストするよ。
※IPアドレスやMACアドレスはあなたの環境に合わせて変更してください。

twitpic_sample_shot.png


#include <Ethernet.h>
#include <TwitPic.h>
#include "SampleImage.h"

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };

TwitPic twitpic("Yourname","Password");

uint32_t sampleImageTransfer(Client *client)
{
  if(client){
    for(uint32_t i=0; i<sizeof(sampleImage); i++){
      client->print(pgm_read_byte(sampleImage+i));
    }
  }
  return sizeof(sampleImage);
}

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(3000);

  int ret = twitpic.uploadAndPost("Sample Image Post from Arduino", &sampleImageTransfer);
  if(ret < 0){
    Serial.print("post failed : err code = ");
    Serial.println(ret);
  }
  else{
    Serial.println("OK.");
  }
}

void loop()
{
}


Ethernet.hとTwitPic.hをインクルードします。あなたの環境にあわせてMACアドレス、IPアドレスを変更します。TwitPicクラスのインスタンスを作成します。この時、あなたのTwitterIDとパスワードを指定します。setup関数でEthernetライブラリの初期化を行います。

画像のポストにはuploadAndPost関数またはupload関数を使います。uploadAndPost関数はTLにメッセージを流しますが、upload関数は画像のポストのみ行います。

uploadAndPost関数の第1引数にはポストするメッセージ、第2引数には画像を転送するユーザ関数のポインタを渡します。

ユーザ関数は2つの機能をライブラリに提供する必要があります。1つは転送する画像サイズをライブラリに通知すること、もう1つは画像の転送を行うことです。

ライブラリは最初に引数0を渡しユーザ関数を呼び出します。この時ユーザ関数はこれから転送する画像のサイズを返します。次に引数にClientクラスのポインタを渡して呼び出します。この時ユーザ関数はClientクラスを使って画像を転送します。

画像の転送が完了しポストに成功したらuploadAndPost関数は0を返します。失敗した場合、負の値を返します。-1は致命的なエラー。-1001はTwitterIDまたはパスワードが無効です。-1002は画像が見つかりません。-1003は無効な画像タイプです。-1004は画像サイズが4MB以上です。

今のところこのライブラリはJPEG画像のポストにしか対応していません。



Arduinoイーサネット・シールド
スイッチサイエンス
売り上げランキング: 8652



Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング: 2539






Ads by Google
最近の記事
カテゴリ
Arduino (114)
電子工作 (114)
スタバッテルミン (5)
スタバカップアンプ (17)
電光掲示板 (7)
イベント (59)
太陽電池 (12)
ニキシー管 (19)
ARM (8)
PIC (20)
USBデバイス (7)
V850 (17)
Xfind (6)
プログラミング (5)
Android (3)
未分類 (25)
カメラ (6)
本 (18)
mbed (2)
SoftModem (0)
3Dプリンタ (35)
Amazon.co.jp
最近のコメント
claynets:オープンソースのPCBCAD「KiCad」。 (08/26)
arms22:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (08/11)
Sekine:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (08/10)
arms22:ArduinoでSDメモリカードを読み書きする (08/05)
arms22:ArduinoでSDメモリカードを読み書きする (07/24)
arms22:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (07/22)
Sekine:Arduinoで遊ぼう-AVRライタを使わないBootloaderの書き込み (07/20)
arms22:Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」 (07/11)
hepotann:Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」 (07/10)
hepotann:Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」 (07/06)
リンク
Ads by Google
以前の記事
プライバシーポリシー
当サイトでは、第三者配信による広告サービスを利用しています。このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 (氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、ここをクリックしてください。