2013年1月12日

トイレットペーパー使用量報告bot

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ウォシュレットでスッキリした後はお尻を拭かなければなりません。

という訳で、お家のトイレからプライバシーが吹き飛ぶガジェット第二弾は、Arduino + Ethernet Shield + ロータリエンコーダでトイレットペーパーの使った長さをツイートする装置。(上記写真)

実際のツイートはこんな感じ。
という具合に、長さを±1cmくらいの誤差でつぶやきます。

使用したのはArduino UNO、Ethernet Shield、ロータリエンコーダ(マウスから入手)の3つ。


故障気味のマウスを分解、マウスのホイール部分を取り出します。


これをArduinoに接続。
写真では試験的にMEGA2560を使ってますが、実際はUNOで事足ります。

ロータリエンコーダはA、B、2つのパルスの位相が1/4周期ずれて出力されるので、このパルスをそれぞれカウントすることで回転方向と回転量を導出することが出来る。
このパルスを検出してカウントするためにattachInterruptを使いますが、このとき外部割り込みに使用できるピンはデジタル2番、3番ピン。
エンコーダは、端子が出ている方の面を手前にして左からA、B、GNDとなっている(メーカによって異なる)ので、AをArduinoのデジタル2番ピン、Bを3番ピンに接続します。
更に、ホイールの表面がトイレットペーパーの表面に当たるように、紙巻器に固定します。


長さの計測開始は約1cmからで、計測終了&ツイートはトイレットペーパーの引き出しが終わってから3秒後(3秒間エンコーダが回転しなかったら終了と見なす)としました。

プログラムは、こちらを参考にしつつ、以下のような感じで。
//Copyright 2012 bildr
//Released under the MIT License - Please reuse change and share
//modified by Kei.Y - Additional portions license is CC0

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

byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //Ethernet ShieldのMACアドレス
byte ip[] = { 192, 168, 1, 123 }; //IPアドレス
Twitter twitter("/* 取得したトークン */");
char msg[256];

int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;
long encoderValueTemp = 0;
long lastUse = 0;
int stopCount = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {
  Ethernet.begin(mac, ip); 
  Serial.begin (9600);

  pinMode(encoderPin1, INPUT); 
  pinMode(encoderPin2, INPUT);

  digitalWrite(encoderPin1, HIGH);
  digitalWrite(encoderPin2, HIGH);

  attachInterrupt(0, updateEncoder, CHANGE); 
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop(){ 
  if(encoderValue > lastUse && (encoderValue - lastUse)>5){
    if(encoderValue == encoderValueTemp){
      stopCount++;
      if(stopCount > 3 ){
        sprintf(msg,"おしりを拭きました(´ε`;)フキフキ 長さ%dcm",(int)((encoderValue - lastUse)/5.4));
        postTweet();
        lastUse = encoderValue;
        stopCount = 0;
      }
    }
    encoderValueTemp = encoderValue;
  }
  delay(1000);
}


void updateEncoder(){
  int MSB = digitalRead(encoderPin1);
  int LSB = digitalRead(encoderPin2);

  int encoded = (MSB << 1) |LSB;
  int sum  = (lastEncoded << 2) | encoded;

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded;
}

void postTweet(){
  Serial.println("connecting ...");
  if (twitter.post(msg)) {
    int status = twitter.wait();
    if (status == 200) {
      Serial.println("OK.");
    }
    else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } 
  else {
    Serial.println("connection failed.");
  }
}
使用用途として、トイレットペーパー使用量を他人と比較したり、無駄づかい防止・節約の為の意識付けなどがありますが、プライバシーも一緒に流れていく事に変わりはありません。

追記:ウォシュレット実況botと合体させて無線化しました。
ウォシュレット実況botの無線化
http://eleclog.quitsq.com/2013/01/toilet-tweet-bot-wireless.html


追記 2016.01.03 : 実際のツイートを開発用アカウントからメインアカウントのツイートに差し替えしました。

0 件のコメント:

コメントを投稿

記事へのコメントはいつも確認している訳ではないので、お返事が遅れる場合があります。
ご質問やご意見は twitter@9SQ へお送り頂けると早くお返事できると思います。