ArduinoでtwitterにPOSTする

前回はArduinoでHello, World!的LED点滅をするところまで準備したのだが、この程度じゃなにも面白くない。もう少し使い方を広げたい…というわけで、私が参加してきたセミナーでも使われていた「ArduionからtwitterにPOST」というのをやってみよう。

Arduinoモニタープログラム参加中
電子部品・半導体の通販サイト – チップワンストップ

固定IPでの接続テスト

こちらのサンプルコードを使うと、とりあえずの動作確認ができる。

  • イーサネットシールドと合体
  • 新しいスケッチを作成し、サンプルコードをペースト
  • MACアドレスとIPアドレスを書き換える
  • コンパイル→転送→リセット
  • ブラウザからさっき設定したIPアドレスにアクセス
  • 画面が出ればOK
MACアドレスとIPアドレス
MACアドレス

ネットワークアダプタを一意に識別するアドレス。2桁の16進数を6セット(6オクテット)であらわされる。

通常イーサネットシールド底面に貼られたラベルに書いてある、らしい。私が購入したものは貼られていなかったので、仕方なく「ローカルMACアドレス」を設定した。

先頭オクテットの0x02ビットがグローバルアドレスとローカルアドレスを識別するビットであり、OFFであればグローバルアドレス、ONであればローカルアドレスであることを示している。

MACアドレス – Wikipedia
http://ja.wikipedia.org/wiki/MAC%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

ということなので、最初の16進数を確認して、0x02ビット(右から3番目)が1であればOKなはず。あとは、LAN内でぶつからないような値を設定すればいい。念のため「arp -a」あたりで既存のMACアドレスと重複しないか調べよう。

IPアドレス

添付のライブラリだとIPアドレスを固定する必要がある。家庭であればだいたいLAN内だろうから、開発マシンのIPアドレスを調べ、それに近い値を設定すればいいだろう。設定予定のIPにpingコマンドを発行したりして、重複が起こらないように注意すること。

ツッコミ歓迎

この辺あまり詳しくないので、間違いがあればご指摘いただきたい次第である。

DHCPサーバから動的にIPアドレスを取得する

IPアドレスの重複など人間が気にすべきことじゃない、ということで、DHCPサーバが動いている環境なら動的に割り当てを受けよう。

こちらからライブラリをダウンロード、\path\to\arduino\hardware\libraries\Ethernetに解凍する。examples/WSegbClientWithDHCP\WebClientWithDHCP.pdeにMACアドレスを設定してを実行すると、シリアルモニタにGoogleから取得したコンテンツがだーっと流れてくる。

twitterにPOST

ここまでの準備ができていれば、セミナーでもデモっていたtwitter投稿ライブラリを使うとあっという間にtwitterへのPOSTが可能になる。

こちらのライブラリに付属のサンプルでは普通にEthernetライブラリを使っているが、さっき紹介したDHCPライブラリを使うとさらに簡単。

おまけ

今回はPOSTするトリガとして、SHARPの測距センサユニット「GP2D12[PDF]」を使った。

<th>
  リード線
</th>

<th>
  Arduino
</th>
<td>
  白
</td>

<td>
  A0
</td>
<td>
  黒
</td>

<td>
  GND
</td>
<td>
  赤
</td>

<td>
  5V
</td>
GP2D12
Vo
GND
Vcc

このように配線し、analogRead(0)で読み取った値が500を超えたらPOST処理を呼び出すようにした。

ソースコード

#include <Ethernet.h>
#include <Dhcp.h>
#include <Twitter.h>

byte mac[] = { xDE, xAD, xBE, xEF, xFE, xED } ;

Twitter twitter("{USERNAME}:{PASSWORD}") ;
char msg[] = "夏休み満喫してますか?";

void setup()
{
    Dhcp.beginWithDHCP(mac) ;
    Serial.begin(9600) ;
    delay(1000) ;
}

void loop()
{
    // ポート0のアナログ入力値が500を超えたらPOSTして終了     int dist = analogRead() ;
    Serial.println(dist) ;
    if (dist > 500)
    {
        post(msg) ;
        while(true) ;
    }
    delay(200) ;
}

void post(char* msg)
{
    Serial.println("connecting ...") ;
    // twitterにPOST     if (twitter.post(msg))
    {
        // HTTPステータスが返ってくるのを待つ         int status = twitter.wait() ;
        if (status == 200)      // 成功         {             Serial.println("OK.") ;
        }
        else                    // 失敗         {             Serial.print("failed : code ") ;
            Serial.println(status) ;
        }
    }
    else     {         Serial.println("connection failed.") ;
    }
}

まとめ

前回・今回と「Arduinoが何か出力する」という作例を紹介した。しかし、フィジカル・コンピューティングの魅力は「現実世界からArduinoへ入力する」というインタラクションあってこそ。何かのセンサと今回のtwitterライブラリを組み合わせることで、現実世界で起きた何かをtwitterにPOSTすることができる。

Arduino DHCP Library: Version 0.3

http://blog.jordanterrell.com/post/Arduino-DHCP-Library-Version-03.aspx

Arduino DHCP Libraryを使ってみる : blog.loadlimit – digital matter –

http://blog.loadlimits.info/2009/06/arduino-dhcp-library%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/comment-page-1/

Arduino DHCP Library: Version 0.4

http://blog.jordanterrell.com/post/Arduino-DHCP-Library-Version-04.aspx

建築発明工作ゼミ2008: Arduino Ethernet Shield

http://kousaku-kousaku.blogspot.com/2008/11/arduinoethernet-shield.html

MACアドレス – Wikipedia

http://ja.wikipedia.org/wiki/MAC%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

ArduinoからTwitterにPOSTするライブラリ – Okiraku Programming

http://d.hatena.ne.jp/NeoCat/20090505/1241466723

Arduinoモニタープログラム参加中
電子部品・半導体の通販サイト – チップワンストップ