memorandums

日々のメモです。

arduinoで遊ぶ。そして、温度センサ+twitter4jでついったーボット作成

ひさしぶりに書きます。お盆はしっかり休みました。今週末に大阪本部のオープンキャンパスで模擬講義があるため、ここ数日は準備運動を兼ねてArduinoでいろいろと作っていました。元ネタはArduino本3冊(Arduinoをはじめよう、Making_Things_Talk、PrototypingLab)です。特に参考になるのはPrototypingLabです。funnelを初めて使ってみました。ArduinoをGainerのように使えるのはとても便利。ただPCの負荷が高いのがちょっと気になりますね。。。

主に遊んだことは、モーターを使ったスイッチのオン/オフ、赤外線リモコン、AC100のオン/オフです。

スイッチはそれなりに固いのでモーターで直接押し込めるとは思えません。そこでタミヤミニモーター低速ギヤボックスを購入してみました。しかし。。。結果はダメ。押し込むパワーは得られませんでした。この案件はちょっと真面目に考える必要がありそうです。

つづいて赤外線リモコン。最近の家電製品のほとんどは(赤外線)リモコンがついています。PCやネット経由でこれらの機器をオン/オフできると便利ですね。以下のページを参考にarduinoで赤外線リモコンの信号を学習し再生することで家電製品(例えばエアコン)をオン/オフできました。ただ。。。自宅の東芝製エアコンは制御できたのですがパナ製のテレビ/ビデオはダメ。。。要調査です。とりあえず研究室のレグザはいけそうなのでネット越しにオン/オフできるようにしたいと思います。これができれば。。。出勤時に到着前に携帯から研究室のエアコンをオンできる。。。といいな、と。

Link: Arduinoで学習リモコン
Link: パソコンで赤外線リモコン

最後に、AC100のオン/オフ。カホパーツで秋月のSSRキットを購入してきてAC100機器をオン/オフ。これは面白い。ただ。。。最近の機器の多くは電源スイッチが電子化されているのでAC100Vを供給しても機器が動作しません。例えば扇風機とか、です。アイデア次第でしょうけど実用的なネタはなかなか思いつきません。

で、ついさきほど完成したのが温度センサーの値をツイートするプログラム。ほとんどPrototypingLabの例(温度を計りたい)そのままです。ただ。。。PrototypingLabの例ではfunnelを利用していますがPCの負荷が高いようなので簡単化しました。以下がプログラムです。ちなみに使用した温度センサーは書籍の通りLM35DZです。ボットのツイッターアカウントは@swken_bot_1です。よろしければのぞいて見てください。これで上記のネタで研究室のエアコンを遠隔でオン/オフできるようにして温度変化をツイッターで確認すれば便利そうです。とりあえず楽しみ楽しみ。なお、ツイートには温度(摂氏)に日時をつけています。日時をつけたのは同じ内容のツイートを連続して投稿すると蹴られてしまうためです。仕様なんでしょうね。。。


Arduino

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

void loop()
{
  Serial.println(analogRead(0));  //10秒毎に温度を送信する
  delay(10000);
}


■Processing

import processing.serial.*;
import twitter4j.*;

Serial myPort;
final int LF = 10;
float temp;
int cnt = 0;

void setup()
{
  myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil(LF);
  frameRate(1);
}
 
void tweet(String str) {
  try{
    //ユーザ名とパスワード
    Twitter twitter = new Twitter("username","password");
    Date d = new Date();
    Status status = twitter.updateStatus(str + ",        " + d);
  } catch(Exception e){
    System.out.print(e.getMessage());
  }
}

void draw() {
  if (++cnt >= 300) {  //5分おきにツイートする
    cnt = 0;
    DecimalFormat exFormat1 = new DecimalFormat("#.#");
    String s = exFormat1.format(temp);
    tweet(s);
    println(s);
  }
}

void serialEvent(Serial myPort)
{
  String myString = myPort.readStringUntil(LF);
  if (myString != null){
    temp = map(Float.parseFloat(myString),0,205,0,100);
  }
}


■回路



ツイッターの表示例