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

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

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

Posted by arms22 on 2010年07月01日 5  0

お待たせ(?)しました!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にポストする

Posted by arms22 on 2010年01月09日 1  0

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に画像をポストするライブラリ

Posted by arms22 on 2010年01月02日 6  0

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






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