engiNERD! RSSフィード

2009-03-22 [Hack] 植木鉢をtwitter bot化するハック このエントリーを含むブックマーク

超ほしかった

植物と話せるPlant Twitterキット - Engadget 日本版

これを買えば植木鉢がtwitter botになる!ほしい!

しかしThinkGeekで$99.99... いくら円高とはいえ、ちょっと気が引けるお値段。

というわけで作ってみた。

http://twitter.com/ponyoV3

Water me!とThank you!しか言わない元祖に比べたらなんと愛らしいことよ。

f:id:iwkn:20090314230444j:image


ちなみに元祖ページはこちら。

no title

Arduino使ってるので実は回路もコードも公開されてるのです。XPortLAN直結する感じですね。

でも今回は研究室常駐のポニョデンマークカクタス)をtwitさせるのが目的なので、遊んでいたMac miniを使うことにします。

  1. 植木鉢の抵抗値読む
  2. 抵抗値が大きい(つまり水が少ないと)
  3. "Water me!"

ちなみに席替えにより窓際から離れてしまったので、XBeeで無線化してやりました。

XBeeも誰にも使われずに研究室で眠っていたのを活用。これぞ技術の無駄遣い?


f:id:iwkn:20090314230422j:image

Mac miniXBee

XBee便利。ふつうにシリアル叩けば無線になっている。


f:id:iwkn:20090314215611j:image

ジャキーン!ArduinoXBeeの2階建てだぁ!



Arduino側のコード

int val;//受信データ用の変数を用意
int com; //コマンド用変数

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

void loop(){ 
  if(Serial.available()>0){ //データが来たら
    com = Serial.read(); //シリアルを読む
    if(com==97){  // 'a'コマンドが来たときだけ10回抵抗値を読んで返す
      for(int i=0;i<10;i++){
        val = analogRead(0);
        Serial.println(val);
      }
    }    
  }
}

Mac mini

Rubyでやってます。

twitter4rとruby-serialportが必要。

require 'rubygems'
require 'twitter'
require 'serialport'


def generateMessage
messages = ["ぽにょ、あまいのがすきー",
                                  "キラッ☆",
                                  "ポニョ、光合成するー",
                                  "足っていいな かけちゃお!",
                                  "あの子がだーいすーきー",
                                  "ニモっていいな食べちゃお",
                                  "セガール,爆破,すきー",
                                  "ポニョ、@iwkn すきー",
                                 "ずっとポニョのターン!"]
msg = messages[rand(messages.size)]
return msg
end

#シリアルポートを指定
port = "/dev/tty.usbserial-******"
sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)
sp.putc "a" #read serial values

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

#つぶやき
if($val > 500)
  $message = "Water me!"
else
  $message = generateMessage
end
#p $message


begin
client = Twitter::Client.new(:login => "name", :password => "password")
client.status(:post, $message)
rescue
end

あとはこいつをcronで定期的に実行する。実世界botもわりと簡単ですね。