水田水管理

水管理の問題点

人が管理する時、水尻(排水口)の水位を調整する板(調整板)をセットした後、水口(給水口)を全開にして水を取り込みます。
どれぐらいの時間で水田に水が満たされるのかが分からないので、半日ぐらいそのままにしています。そして水が満たされていたら水口を閉じます。
不足している場合はまた数時間後に水の状態を確認に来ます。

水が必要な時期は重なることが多く、同時に水を取り入れると水路の末端部分では水が流れてこない事もあります。
一方では不足し、一方では水尻からどんどん溢れている水田もあります。
水資源を有効に使うには必要な時は給水して、満たされたら自動的に止める事が必要です。

水尻(排水口)から水が溢れるようになっても水田全体に水が行き渡っているとは限りません。全体に水が行き渡っている事を確認するには複数の水位計が必要になってきます。また、こうした水位の情報を全体でまとめて給水の開閉ができなければなりません。

水管理の仕組み

水口では水の供給量の調整(大・中・小)が信号でできること。
水田の複数の位置に水位計を配置し、水位を送れること。
水尻の水位の調整板の上下を信号でできること。

給水開始時の制御
1.全体の制御マイコンを起動し、水口の装置、水尻の装置、水位計の装置と通信を開始する。
2.水尻の調整板を最高位置にする。
3.水口の給水量を(大)にする。
4.各ポイントの水位計の測定を開始し、一定の時間(例えば10分)毎に各ポイントの水位を制御マイコンに送る。
5.全てのポイントの水位計に水を感知したら水尻の調整板を設定したい高さにする。
6.全てのポイントの水位計の水位が増加しなくなったら水口の水を閉じる。
7.全てのポイントの水位計の水位が一定量下がったら水口の水を少し開ける。
8.6~7の制御を繰り返す。

これらを実現するためには通信機能を持ったマイコンが必要になります。
現在の所、TWELITEが最適と考えています。
TWELITEも独自でプログラムができます。また、消費電力を減らすsleepモードがあります。

水口(給水口)制御機構

テスト用として水口制御機構を作ってみました。まだ未完成ですが…。
水の量を制御する部分の全体写真です。
ゲートを上下する部分の写真です。

「楽しい工作シリーズ」のパーツやホームセンターで買える物で作りました。
耐久性には大いに疑問があるし防水も必要ですが、テスト用なので今回は良しとします。
構造はリニアアクチュエータと同じで、長いネジを回転してナットの部分が上下します。
リミットスイッチ(マイクロスイッチ)を取り付けることができました。
全開、半開、全閉の位置で信号が取り出せます。

電子基板の写真です。

スルーホール基板にDIP等の部品をはんだ付けしています。
ギヤボックスがかなり振動するので、ブレッドボードは使えません。
そうなるとDIPのプログラム書き換えがTWELITE R2でできなくなります。
そこで、7Pインターフェースを使ってプログラムの書き換えができるようにしました。

TWELIT DIP 7Pインターフェース

DIPの基板に細ピンヘッダーをはんだ付けしています。
基板にもSET用とVCC用に細ピンヘッダーを付けています。
DIPとR2(R3)とのピンの関係は以下の通りです。



私はコネクタ付きケーブル オスメスしか持っていなかったので 途中でブレッドボードで中継しています。

DIPにピンソケット(メス)をはんだ付けすることも考えましたが、
SETとVCCがない事と、一斉に差し込んだら取れなくなるかもしれないと思いやめました。

SET(15)はモジュールの15番目のピンで、シルクは12、DI1、デジタル入力1のピンです。
※ DIPはSETを接続する必要は無いようです。「twelite r3 データシート」でググってください。

ここで、ピンの番号について説明しておきたいと思います。
TWELITR DIPにはそれぞれのピンについて「ピン(番号)」「シルク(印刷)」「信号名」「機能」があります。
※「シルク」とは基板にシルク印刷された数字や文字の事です。
「ピン(番号)」はモジュールの周囲を反時計回りに1,2,3 … 28と単純に付けられた番号になります。
「シルク(印刷)」はモジュールの半導体チップの機能の数字や文字になります。VCCやGNDもシルク印刷の情報です。
「信号名・機能」は「シルク」を説明する情報と考えて良いと思います。

ACTプログラムでデジタル入出力をするピンを定義する時は「シルク」の数字を使います。

水位センサー

水位センサーのテストをしました。
原理は「雨降りセンサー」と同じです。センサー端子が水につかるとDIPのプルアップされたデジタル入力がLOWに変わります。

※ 回路図は「水魚堂さんのBSch3V」を使用しました。ありがとうございます。

次に、TWELITE DIPのACTプログラムです。
センサーの信号を入力するDIOはシルク18です。 5秒間(感知、1秒待ち、感知、1秒待ち…を5回)ずっとシルク18がLOなら水に浸かっていると判定する。
水に浸かっていると判定したらシルク9を0.5秒間LOにしてLEDを点滅させる。
水位をチェックした後、5秒間のスリープに入ります。


SensorTestのソース
-----
#include <TWELITE>

// DIOの定義
const uint8_t DIO_INPUT = 18;  // 入力
const uint8_t DIO_OUTPUT = 9;  // 出力
// 変数の定義
uint8_t mizu;   // 水に浸かった回数

void setup() {
    // DIOの設定
    pinMode(DIO_INPUT, INPUT_PULLUP); // プルアップ入力設定
    pinMode(DIO_OUTPUT, OUTPUT);      // 出力設定
    digitalWrite(DIO_OUTPUT, HIGH);   // LED消す
    mizu  = 0;
}

void wakeup() {
	Serial << "wakeup " << crlf;
}

void loop() {
    for (int i = 0; i < 5; i++) {   // 5回ループ
        bool state = digitalRead(DIO_INPUT);
    // 水につからないと H
    // 水につかると L
        if (state == LOW) {
            mizu++;
	    Serial << "浸かった " << int(mizu) << crlf;
        } else {
	    Serial << "浸かってない " << crlf;
        }
        delay(1000);  // 1秒待つ
    } 

    if (mizu == 5) {  // 水に5回浸かった
        Serial << "5回浸かった " << crlf;
        digitalWrite(DIO_OUTPUT, LOW);  // 光らせる
        delay(500);
        digitalWrite(DIO_OUTPUT, HIGH);  // 消す            
    }
    // 初期化する
    mizu  = 0;
    // スリープに入る
    Serial << "5秒間スリープ " << crlf;
    Serial.flush();
    the_twelite.sleep(5000);
}

動作が確認できたら、LEDを点滅させている部分を無線で信号を送信するコードに書き換えます。
チェック用のLED点灯部分も不要です。
スリープ時間も30分毎に水位をチェックするぐらいで良いでしょう。30分(30×60×1000=1800000)

水位をチェックする回路が1つしかないですが、水に浸かる端子を上下に動かす事で、任意の位置での水位を判定できると考えました。
単純に、水位に達したら水を止める。水位が減ったら水を入れる。常に水センサーの端子の位置の水位を保てれば良いと思います。
実際の水田の水はどれだけ対策しても漏れはあるし蒸発もします。給水を細かくコントロールすれば良いでしょう。

それと今回初めて使ったのですが、7Pインターフェースを使うとDIOを使いながらでもインタラクティブモードで画面へのメッセージ出力を確認しながらデバッグできるので便利ですね。