転倒ます式雨量計をつくる

雨量計があったらいいんじゃないかと思いまして市販品さがしても良さげなのがないので作ることにしました。せっかくなんで公開しておきますんでみんなで使いましょう。

何となくで作っただけなので屋外に放置するとゴミが詰まるだの虫が住んじゃうとかの問題もあるかもしれませんので注意してください。どう注意すりゃいいんだっつう話もありますが。

3Dプリント可能なモデルはこちらにあります。

https://www.thingiverse.com/thing:3958916

サポートの要る部品が結構あるんでスライスする場合には元のSTLをよく見てサポートを付けてください。ベース(base)はサポートなしでも何とかなります。"ます"はサポート必須です。

部品は以下の通りです。
 base - 下のベース部分です。
measure_small/large - 'ます'部分です。大小2つ用意しています。通常は'小’で良いかと。
funnel - 要するにロート/じょうご部分で上の部分になります。
stand - ベースの排水方向は下なので直置きするような場合に付けます。
guard-inner - 内部ガードです。なくてもかまいませんが下の説明を読んでください。

ベースとますの取り付け部分はサポートを除去した後できれいに仕上げてください。ますはベースにネジで取り付けますが、2.6mmか3mmを使ってください。この部分、精度よく付ける必要はなく『なるべくゆるゆる』に組み立てます。ゆるゆるなのでネジロックを使うかダブルナットで固定してください。要するに水がたまったら、かったんするようにゆるく固定します。この部分はとにかく「ゆるく」組み立てます。「ぶれ」についてもフォトリフレクタが検出できる範囲であればまったく問題ありません。精度よくきれいに動かそうとする方が抵抗が大きくなり、ますが転倒しなくなりますので注意してください。

内部ガードは外光の影響を受けるような場合には付けてください。水はねからのガードにもなりますが、完全防水になるわけではありませんので注意してください。外光防止用ですので黒フィラメントで作ると良いです。外箱(funnel)を黒で作ればよさそうなものですが、外を黒で作ってしまうと内部温度が上がってしまいますので外箱は白をお勧めします。

回路

ここではRaspberry Piを使用していますがフォトリフレクタが検出でき、エッジでトリガできるものであれば他のものでもかまいません。

『かったん』したことを検出するにはフォトリフレクタ(反射型フォトインタラプタ)を使うのが簡単です。Raspberry Piで使う場合の回路は以下のような感じです。ここではRPR220を使っています。

rain-g-sch.png

反射を検出しやくするため'ます'の側面に反射テープを貼り付けておきましょう。検出させていない側にも反射テープが貼ってあるのは重量バランスのためです。

 IMG_3583.JPG

フォトリフレクタは2個付けることも可能ですが、通常は1個でかまいません。'ます'は通常はどちらかに傾いて止まっているので、リフレクタ検出の立ち上がりと下りで検出すれば'ます'の転倒を検出できるからです。

回路と配線はまあなんかうまいことやってください。'ます'の動きが軽いので物理検出(スイッチなど)はちょっと難しいと思います。リードスイッチとマグネットは試してみましたがダメでした。今のところフォトリフレクタが一番よさそうなので上の写真のようにしています。

動作確認用のPythonスクリプトは次の通りです(GPIO24を検出に使用しています)。

#!/usr/bin/python
# coding:utf-8
#
# 雨量計テスト用
# ますが転倒するごとにカウントアップ

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
count = 0

# ピン割込みコールバック
def my_callback(channel):
        global count
        count = count +1
        print(count)

# GPIO初期化 : 24を入力として使用
GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_UP)

# 両方のエッジでトリガさせる
# デバウンスは必要なので注意
GPIO.add_event_detect(24, GPIO.BOTH,callback=my_callback, bouncetime=400)


while True:
        # 何秒でもいいので寝ておく
        time.sleep(10)

GPIO.cleanup()

校正とプログラム

もともとそれほど精度があるわけではないので厳密な測定は難しいですが、以下を参考に調整します。

100円ショップ等で売ってる注射器(シリンジ)を用意してください。水は下にこぼれるので注意してください。

ベースと'ます'を組み立てて水平な場所におきます。シリンジで水を少しずつ、ますに入れて『かったん』する量を測定します。'ます'の両側で測定し、何回か平均して水量を測定すると良いかとおもいます。例えば小型ますで片側が2.0cc、もう片側が2.5ccで『かったん』する場合には平均値として2.25ccを『1かったん』として使います。

上側にくる漏斗部分(funnel)の有効面積は40mm×59mmが2つあります。中央のガード部分は漏斗内に落ちないので無効な面積です。つまり合計の有効面積は4,720平方ミリメートルとなります。

有効面積から計算して、1mm/時になる雨量は4,720平方ミリ=47.2平方センチに0.1(cm)を掛けて、4.72ccとなります。

転倒ますが1回動作する容量を2.25ccとしましたので、2.25÷4.72=0.48となり転倒ますが1度動作した場合の雨量は0.48mm/時となります。

1時間に1回、ますが転倒すれば0.48mm/時の雨量となるので、1時間あたり何回、ますが転倒したかを測定することで雨量が計測できます。ただし、測り始めの基準をどうするかという問題はあるのですが、ここでは簡単のために「気にしない」ことにしましょう。

フォトリフレクタは片側に倒れた場合にHighからLow、あるいはLowからHighに遷移します。ですので、両方のエッジを検出することでフォトリフレクタ1個で、どちら側に倒れても検出することができまます。以上を考えて作ったPythonスクリプトは次のようになります。ますが転倒したタイミングで雨量を表示します。

#!/usr/bin/python
# coding:utf-8
#
# 雨量計

import time
import RPi.GPIO as GPIO

# 較正値(雨量:mm/h)
# ます(大)
# cal_val = 0.9
# ます(小)
cal_val = 0.48

GPIO.setmode(GPIO.BCM)
count = 0

# ピン割込みコールバック
def my_callback(channel):
        global last_t
        global now_t
        global count

        count = count +1
        # print(count)
        now_t = time.time()

        diff_t = float(now_t - last_t)
        last_t = now_t
        m_value = float(3600.0 / diff_t)
        # print(m_value)

        rain_val = int(m_value * cal_val)
        print 'Rain : %4d mm/h' % rain_val

# GPIO初期化 : 24を入力として使用
GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_UP)

# 両方のエッジでトリガさせる
# デバウンスは必要なので注意
GPIO.add_event_detect(24, GPIO.BOTH,callback=my_callback, bouncetime=400)

# 起動時は前回カウント時間がわからないので起動時間を使用する
last_t = int(time.time())
now_t = time.time()

while True:
        # 何秒でもいいので寝ておく
        time.sleep(10)

GPIO.cleanup()

凝ったことをしたければエッジの方向別にコールバックを作ればより精度は上がるはずなのですが、そもそも3Dプリントした「ます」は水が張り付いたりして精度よく測れないので、あまり気にすることもないかと思います。チャレンジしてみたい人は、やってみてください。

 

ピエゾ式

ピエゾセンサーというかスピーカーを検出に用いるタイプも用意しました。35φの圧電スピーカーを2個使用します。ます、ベース、スタンドが異なりますので以下のものを使用します。

ます measure-p.stl : 3~4ccでかったんします
ベース base-p.stl
スタンド stand-p.stl
スペーサ spacer-p.stl : 圧電スピーカーが沈みすぎる場合に使ってください

工作は少し注意が必要です。以下の写真のように圧電スピーカーの上に透明のシート(カッティングシートとかプリント保護シールとか何でもかまいませんが耐水性のもの)を底面から端の立ち上がり部分まで貼ります。貼ってから角の排水穴の部分にカッター等で穴を開けておきましょう。

 raing2.png

要するにこの上を水が流れて角から排水されるようにします。

圧電スピーカーは2個を並列に繋ぎ、以下のような回路で受けます。

piezo.jpg

ボルテージフォロワとコンパレータなので適当な回路でかまいませんが、Raspberry PiのGPIOに入力するなら3.3Vで動作するフルスイングのオペアンプを使ってください。

細かい振動等で反応せず、ますがかったんした時にだけ反応するようにVRを調整します。まったく何も反応しない場合には圧電スピーカーの極性を逆にしてください。

プログラムは上にあるものと同じですが、ますの容量が少し変えてあり3~4ccになっているので計算しなおしてください。校正の係数は0.7~0.8あたりです。また、この回路ではL->Hでのみ検出するので、GPIOの割り込みを

GPIO.add_event_detect(24, GPIO.RISING,callback=my_callback, bouncetime=400)

と、RISINGのみに変更してください。圧電スピーカーからの信号は振動なので、かなりバウンスしているのと同じことになりますから、デバウンスは必要です。