yoppa.org


Processing 2.0とTwitter4Jで、ProcessingからTweetしてみる

多摩美の授業で、Arduinoで取得したセンサーの値を、Processing経由でTwitterへ投稿するサンプルを作成する必要がありいろいろ調べてみた。昨年度は、Stewgateというプロキシを経由してやってみたのだけれど、できればProcessingで完結したい。というわけで調べてみた。

Processingのフォーラムで調べてみると、Twitter4JというJavaのライブラリを使うといいらしい。ただ、どうやってライブラリをProcessingに追加するかなどがいまいちあいまい… ということでまとめてみた。

まず、Twitter4Jのページから、最新版のライブラリをダウンロード。その中にあるlibフォルダ以下にある.jarファイルがProcessingで必要なものとなる。これらをまとめて、Processing側からLibraryとして認識されるよう”library.properties”などを記述。これでProcessingからLibraryとして認識されるはず。下記からProcessing用にまとめたものをダウンロードできます。

このZipファイルを解凍した”twitter4j”フォルダを、~/Document/Processing/libraries/ 以下にコピー。これで準備完了。

あとは、TwitterのDeveloper向けページで新規にアプリを作成し、”Consumer key”, “Consumer secret”, “Access token”, “Access token secret”をそれぞれ取得。また、Settingの項目の”Application Type”を”Read and Write”にしておくこと。

下記のテストコードで確認できます。画面をクリックすると、Tweetするはず。

[code language=”cpp”]
import twitter4j.conf.*;
import twitter4j.internal.async.*;
import twitter4j.internal.org.json.*;
import twitter4j.internal.logging.*;
import twitter4j.http.*;
import twitter4j.internal.util.*;
import twitter4j.api.*;
import twitter4j.util.*;
import twitter4j.internal.http.*;
import twitter4j.*;

String msg = "Automatically posted from Processing";

String consumerKey = "xxxx";
String consumerSecret = "xxxx";
String accessToken = "xxxx";
String accessSecret = "xxxx";
Twitter myTwitter;

int ms;
color bg = color(0, 0, 0);

void setup() {
size(400, 400);
frameRate(60);

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(consumerKey);
cb.setOAuthConsumerSecret(consumerSecret);
cb.setOAuthAccessToken(accessToken);
cb.setOAuthAccessTokenSecret(accessSecret);
myTwitter = new TwitterFactory(cb.build()).getInstance();
}

void draw() {
background(bg);
if (millis() – ms > 1000) {
bg = color(0, 0, 0);
}
}

void mousePressed() {
try {
Status st = myTwitter.updateStatus(msg + ", " + getDate());
println("Successfully updated the status to [" + st.getText() + "].");
ms = millis();
bg = color(0, 0, 255);
}
catch (TwitterException e) {
println(e.getStatusCode());
bg = color(255, 0, 0);
}
}

String getDate() {
String monthStr, dayStr, hourStr, minuteStr, secondStr;

if (month() < 10) {
monthStr = "0" + month();
}
else {
monthStr = "" + month();
}
if (day() < 10) {
dayStr = "0" + day();
}
else {
dayStr = "" + day();
}
if (hour() < 10) {
hourStr = "0" + hour();
}
else {
hourStr = "" + hour();
}
if (minute() < 10) {
minuteStr = "0" + minute();
}
else {
minuteStr = "" + minute();
}
if (second() < 10) {
secondStr = "0" + second();
}
else {
secondStr = "" + second();
}

return monthStr + "/" + dayStr + ", " + hourStr + ":" + minuteStr + ":" + secondStr;
}
[/code]

追記

Arduinoと連携して、3分に一度、周囲の環境情報(このサンプルでは照度と温度)をつぶやくサンプルつくったので、こちらも掲載。センサーは、ArduinoのAnalog In 0に、照度センサー(NJL7502L)の値を、Analog In 1に温度センサー(LM61BIZ)の値を入れてます。

こんな感じでつぶやくはず!!

Arduino側

[code language=”cpp”]
void setup() {
Serial.begin(9600);
}

void loop() {
int in0 = analogRead(0);
int in1 = analogRead(1);

Serial.print(in0);
Serial.print(‘\t’);
Serial.println(in1);

delay(180000);
}
[/code]

Processing側

[code language=”cpp”]
import processing.serial.*;
import twitter4j.conf.*;
import twitter4j.internal.async.*;
import twitter4j.internal.org.json.*;
import twitter4j.internal.logging.*;
import twitter4j.http.*;
import twitter4j.internal.util.*;
import twitter4j.api.*;
import twitter4j.util.*;
import twitter4j.internal.http.*;
import twitter4j.*;

String consumerKey = "xxxx";
String consumerSecret = "xxxx";
String accessToken = "xxxx";
String accessSecret = "xxxx";

Twitter myTwitter;
Serial myPort;

float illumi, tempr;

int ms;
color bg = color(0, 0, 0);

void setup() {
size(400, 400);
frameRate(60);

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setOAuthConsumerKey(consumerKey);
cb.setOAuthConsumerSecret(consumerSecret);
cb.setOAuthAccessToken(accessToken);
cb.setOAuthAccessTokenSecret(accessSecret);
myTwitter = new TwitterFactory(cb.build()).getInstance();

myPort = new Serial(this, Serial.list()[0], 9600);
myPort.bufferUntil(‘\n’);
}

void draw() {
background(bg);
if (millis() – ms > 1000) {
bg = color(0, 0, 0);
}
}

void tweetValue() {
try {
Status st = myTwitter.updateStatus("My room illumination is " + illumi + ", temprture is " + tempr + ", " + getDate());
println("Successfully updated the status to [" + st.getText() + "].");
ms = millis();
bg = color(0, 0, 255);
}
catch (TwitterException e) {
println(e.getStatusCode());
bg = color(255, 0, 0);
}
}

void serialEvent(Serial p) {
String inString0 = myPort.readStringUntil(‘\t’);
illumi = float(inString0);

String inString1 = myPort.readStringUntil(‘\n’);
tempr = float(inString1) * 500.0 /1024.0 -60.0;

tweetValue();
}

void mouseReleased() {
tweetValue();
}

String getDate() {
String monthStr, dayStr, hourStr, minuteStr, secondStr;

if (month() < 10) {
monthStr = "0" + month();
}
else {
monthStr = "" + month();
}
if (day() < 10) {
dayStr = "0" + day();
}
else {
dayStr = "" + day();
}
if (hour() < 10) {
hourStr = "0" + hour();
}
else {
hourStr = "" + hour();
}
if (minute() < 10) {
minuteStr = "0" + minute();
}
else {
minuteStr = "" + minute();
}
if (second() < 10) {
secondStr = "0" + second();
}
else {
secondStr = "" + second();
}

return monthStr + "/" + dayStr + ", " + hourStr + ":" + minuteStr + ":" + secondStr;
}
[/code]



第11回:オブジェクト指向プログラミング (2) クラスの継承

前回に引き続き、Processingにおけるオブジェクト指向プログラミング(OOP)の方法について解説していきます。今回はOOPの重要な概念の一つである「継承 (インヘリタンス) 」について考えていきます。継承とは、既存クラスの機能構造を共有する新たなクラス(サブクラス)を派生させることです。サブクラスからは親となるクラスのプロパティやメソッドをそのまま引き継ぐことが可能です。この継承の仕組みを効果的に活用することで、既存のクラスを再利用しながらそこに新たな機能を加えていくということが可能となります。


第11回:オブジェクト指向プログラミング (2) クラスの継承

前回に引き続き、Processingにおけるオブジェクト指向プログラミング(OOP)の方法について解説していきます。今回はOOPの重要な概念の一つである「継承 (インヘリタンス) 」について考えていきます。継承とは、既存クラスの機能構造を共有する新たなクラス(サブクラス)を派生させることです。サブクラスからは親となるクラスのプロパティやメソッドをそのまま引き継ぐことが可能です。この継承の仕組みを効果的に活用することで、既存のクラスを再利用しながらそこに新たな機能を加えていくということが可能となります。



第11回:Tumblrを使う4 – 静的ページの作成、サイトの設計

今回も引き続きTumblrを使用したWebサイトの構築について考えていきます。Tumblrは、これまでやってきたように様々なメディアを投稿するミニBlog + SNSという側面だけでなく、サイト全体のコンテンツを管理するCMS(コンテンツ・マネジメント・システム)という性格もあわせ持っています。今回は、TumblrをCMSとして使用する際に重要となる、静的なページの作成について解説していきます。


第11回: 衛星アプリを作る – 7 地上から衛星を眺める

今回はまず、いままで使用していた衛星の軌道計算のサンプルが正しい軌道を表示していなかったので、その修正について説明します。その後で、新規の軌道計算を用いて、まずメルカトル図法の世界地図に軌道をマッピングする方法を解説します。その後は、ARアプリの前段階として地上から衛星を眺めてみます。そのために、緯度・経度という極座標系から、(x, y, z)のデカルト座標系への変換方法について解説して、実際にコーディングしてみます。


第4回:Arduino と Processingを接続する3 – 計測データを視覚化

ArduinoとProcessingの連携の3回目となる今回は、さらに高度な連携について解説していきます。今回はArduino側にFirmataライブラリを使用せず、独自にシリアル通信のプログラムを作成し、より柔軟に相互の連携を行います。さらに、この値をどう扱えば面白い視覚化ができるのか考えていきます。


第10回:Processingでオブジェクト指向プログラミング – 1

今回は「オブジェクト指向プログラミング(OOP)」というプログラミングの手法について解説します。OOPは、現在最も普及しているプログラミングの構造化の手法といえるでしょう。今後、本格的なプログラムを設計・実装していく上で避けて通ることのできない重要な概念です。OOPは様々な難解な用語が登場するため、最初は戸惑うかもしれません。しかし、実際にやっていることは実はシンプルな内容です。Processingで実際にプログラミングしながら、その考え方についてじっくりと学んでいきましょう。