トイレの自動洗浄を自作で後付けしてみた②(プログラム編)

前回自宅トイレのレバーをひねる動きを自動化すべく、貯水タンクの栓を引っ張る機構とセンサの設置を行いました。今回は用が済んだら流れてくれるようにArduinoにプログラムを書き込みたいと思います。

基本動作

実現したい動作は大体こういう感じです

  • 便器から離れたら水を流す
  • 立った時も座った時も反応する
  • 間違えて流さない
  • 離れたらすぐに反応してほしい

この条件を満たすようにプログラムを考えます。とりあえずの構想は、

  1. センサで測った距離が80cm以上の時は何もしない
  2. 距離が80cm以下で6秒間センサ値が変化しなかったら、座っているまたは立っていると判断し流しスタンバイ状態
  3. 距離が大きく離れたらモータを動かして流す
  4. 5秒くらいしたら止める
  5. 繰り返し

こんな感じで行こうと思います。

実際のコード

実際にAruduinoに書いた制御プログラムです。

#include <Servo.h>

const int servoPin = 3;    // サーボの接続ピン
const int ledPin = 8;     //表示用LEDの接続ピン
const int sensorPin = 0;  //距離センサの接続ピン
Servo myservo;             // サーボオブジェクトを生成
int pos = 0;               // サーボのポジション(変数)

void setup()
{
  myservo.attach(servoPin);  // サーボ変数をピンに割り当て
  pinMode(ledPin, OUTPUT);
}

//map関数をdoublueで使えるように
double dmap(double value, double fromMin, double fromMax, double toMin, double toMax) {
  double a = (toMax - toMin) / (fromMax - fromMin);
  double b = toMax - a * fromMax;
  return a * value + b;
}

//センサーで距離を計測
double measure_dist() {
  double data = analogRead(sensorPin);  //センサーからの値(0~1023の整数)を取得
  double v = dmap(data, 0, 1023, 0.0, 5.0);   //0~1023→0V~5Vに変換
  double dist_inv = dmap(v, 0.4, 3.1, 0.015, 0.15);   //0V~5V→距離の逆数に変換
  return 1.0 / dist_inv;    //距離を返す
}

void loop()
{
  double dist = 0;
  double dist_old = 0;
  int i = 0;
  while (i < 5) {
    dist = measure_dist();
    
    //距離が変化していなかったらカウントを増やす
    //変化していたらカウントを0にする
    if (abs(dist - dist_old) < 5 and dist < 40) {
      i++;
    } else {
      i = 0;
    }

    dist_old = dist;
    delay(1000);
  }

  digitalWrite(ledPin, 1);

  //最大10分経ったらリセットする
  int sec = 0;
  while (sec < 60 * 10) {
    dist = measure_dist();

    //距離が離れたら水を流す
    if ( dist - dist_old > 10) {
      digitalWrite(ledPin, 0);
      myservo.write(180);   //180[deg]にする
      delay(6000);    //6秒待つ
      myservo.write(0);   //0[deg]にする
      break;
    }
    
    delay(1000);
    sec++;
  }
  
}

 

「トイレの自動洗浄を自作で後付けしてみた②(プログラム編)」への4件のフィードバック

  1. はじめまして。
    トイレの洗浄レバーをサーボモーターで制御したいと思い、
    こちらの記事にお邪魔しました。
    電子工作未経験で初挑戦したいのですが、秋月電子で販売している
    PICアクチュエーターキットで可能かどうかアドバイス頂けると幸いです。
    大小で洗浄レバー分けて回せるようにしたいと考えております。
    Twitterの方でリクエストもしましたのでよろしければお願い致します。

    1. ご質問ありがとうございます!
      こちらのキットでしょうか?↓
      http://akizukidenshi.com/catalog/g/gK-01809/

      このキットだと通常時と動作時の2つの角度しか設定できないっぽいので、大←通常→小、で動作させるのはできないかもしれないです。そこを諦めてもいいなら可能だと思います!

      それと、上のキットはアナログサーボ用らしいのでサーボモータを買うときは注意です。(自分が使っていたのはデジタルサーボ)

      1. お返事頂きありがとうございます。
        そちらのキットでした!やはりこれでは不可能なのですね。。

        こちらの記事で紹介されているArduinoとSG92Rの組み合わせであれば
        大←通常→小で動作させる事が出来ますでしょうか。
        赤外線リモコンで大のボタンを押すと左へ45度、小のボタンを押すと右へ45度
        のようなものを作りたいと考えております。
        度々の質問となり申し訳ございませんがお返事いただけると幸いです。
        よろしくお願いいたします。

        1. Arduinoならばサーボモータを好きな角度に動かせるので、ご質問のような動作ももちろん可能です!
          モータキットを使うにしても、何秒間モータを保持して戻すとかの部分は結局プログラミングする必要があるかと思いますので、Arduinoを使うのはおすすめです。

          Arduinoとサーボモータ、赤外線センサの組み合わせはよくあるので、ネットで探せば情報がすぐ見つけられるのも利点です。
          少しだけ電気とプログラムの知識が必要ですが、できると思います。
          頑張ってください!

ppdr へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA