小鳥にtweetして頂く

hoimei2009-09-11

最近,twitterとかいうもので,人間ばかりがtweet(さえずる)しているので,
ここは本場の小鳥であるクルッポー(本名:Finko)にtweetして頂きました.


Finko (@CyberFinko) | Twitter


全体の設計は,こんな感じ.

センサを使ってクルッポー(Finko)さんの状態からTweetします.


材料:

  1. センサ(シャープ測距センサ[GP2Y0A21YK])
  2. Arduino
  3. USB A-Bケーブル
  4. ネットワークにつながったPC

参考:
id:iwkn さんのponyoV3 (@ponyoV3) | Twitterを参考にさせていただきました!
rubyのrequireでは,id:takahiroxさんのtwitter4r を使用した twitter client for ruby - やる気のないはてだ(A boring diary)を参考にしました!
ありがとうございます.

装置: Arduino + センサ


今回,センサは,シャープ測距センサ[GP2Y0A21YK]を使いました.
10~80cmの対象物の位置を検出することができます.
電源とグラウンドとAnalog Outputだけの簡単接続です.
Arduinoさんの5V電源とGNDとANALOG INの0番に接続します.
これで,籠の中のどの位置にいるかわかる!!
便利〜.


スイッチサイエンスでケーブルつきのものが売っていたのですが,
完売中なので,秋月でモジュールを購入して個別にコネクタケーブルを購入するのがお勧めです.
400円~980円では購入できます.


Arduinoは,電気電子系が苦手な人でも簡単に扱える基盤とソフトウェアとのシステムです.
基盤自体は,スイッチサイエンスAmazonで購入できます.USB A-Bケーブルを使ってサーバ(PC)に接続します.

ソフトウェア開発は,ProcessingベースのArduino IDErubyを使ってます.

プログラム: Arduino IDE + Ruby (twitter4r, serialport)

Arduino IDE 0017】

Arduinoさんに,USB経由でシリアル通信するためのプログラムです.


twiSendData/twiSendData.pde

/* Cyber Finko in Arduino IDE 0017
 published by hoimei and CyberFinko!, 2009.09.10
 http://d.hatena.ne.jp/hoimei
 http://twitter.com/cyberFinko
 Background Material: http://d.hatena.ne.jp/iwkn/20090322
*/
int val;//送信データ用の変数を用意

void setup(){
  Serial.begin(9600);
}

void loop(){ 
  val = analogRead(0);
  Serial.println(val);
}


センサからの情報を垂れ流しにしている様に見えますが, そこはArduinoさんが,きちんと制御していて, PC(サーバ)側からの受信信号が来たときにしかAnalogInの情報を送信してこないです. ArduinoIDEのメニューバーの Tool>Board Tool>Serial Port で,Arduino基盤とシリアルポートの指定ができます. クロスコンパイル(⌘R)して,USB経由でArduinoさんに送って(⌘U)おきます. Ruby with rubygems, twitter4r and serialport】 Mac OS X 10.5.7上で動かしています. 以下の3つを使って,Arduinoさんからの信号を投稿します. インストール $ sudo port install rb-rubygems $ sudo gem install twitter4r $ sudo gem install ruby-serialport プログラムはこんな感じ.

Teet.rb

# Cyber Finko 
# published by hoimei and CyberFinko!, 2009.09.10
# http://d.hatena.ne.jp/hoimei
# http://twitter.com/cyberFinko
# Background Materials: 
# http://d.hatena.ne.jp/iwkn/20090322
# http://d.hatena.ne.jp/takahirox/20090505/1241525041

#!/usr/bin/ruby

require 'rubygems'
gem( 'twitter4r', '>=0.3.1' )
require 'twitter'
require 'serialport'


def generateMessage
messages = ["ピョ・・",
                      "ピョ・・",
                      "モフッ.",
                      "ピョ!ピョピョッ!",
                      "外に出たいなぁ."]
msg = messages[rand(messages.size)]
return msg
end

#シリアルポートを指定
port = "/dev/tty.usbserial-A6004cl0" 
#Arduinoさんで指定したポート $ls /dev/tty.*で探せます.
sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)
#sp.puts "a" #read serial values

#p sp.gets

#10個の値の平均をとる
$val = 0
for i in 0..9
  $val = $val + sp.gets.to_i
#  $val = $val + sp.read.to_i
#  p $val
end
$val = $val/10

#p $val


#つぶやき
#距離が近いと,Analog Inの値が大きくなります.
if($val > 500)
	$message = "センサーが気になる."
elsif($val > 400)
	$message = "羽繕いしているよ."
elsif($val > 300)
	$message = "休憩中・・・zzZZZ"
elsif($val > 200)
	$message = "お水のんでいます."
elsif(50>$val)
	$message = "ご飯食べてます.豆おいしいです."
else
  $message = generateMessage
end

p $message


begin #ログインIDとパスワードを忘れずに・・・
client = Twitter::Client.new(:login=>"name", :password=> "**")
client.status(:post, $message)
rescue
end