時間になったら洗面所から浴室に向いているサーキュレーターの角度を変えて下に降ろし、ファン作動させる。
また時間になったらファンを止め、サーキュレーターを上昇させる。
主に夜中から日中にかけて浴室をほとんど使わない時間帯に作動させ、カビ防止を図るのが目的。
この記事は上記の機構をRaspberry Piという小型コンピューターを使って実現しようという内容である。なお文中に貼り付けてあるAliExpress商品へのリンクは必ずしも最安値の商品とは限らないのでご承知おきください。
洗面所外にある玄関灯ON/OFF切り替えRaspberry Piを活用
先日、Raspberry Piを使ってスマートロックを作ろうとして意外にも最終的な物理的取り付けがうまくいかず、当面はスマートスイッチとして活用しているという記事を公開した。
そのRaspberry Pi本体は玄関のスイッチ脇に設置してあるのだが、実はそのすぐそばに洗面所もある。そしてRaspberry Piというのはもっとポテンシャルのあるコンピューターなので玄関灯2個のオンオフぐらいをさせていたのでは宝の持ち腐れでラズベリーパイ財団にも申し訳が立たない。
そこで壁を隔てたすぐ近くにある洗面所設置のサーキュレーターを自動で回そうと、さらにそれだけではつまらないので昇降もさせたら映えるのではないかと、そんなふうに考えた。
洗面所サーキュレーターの動き
サーキュレーター昇降について
もともとうちには浴室ドアの上に板に固定したサーキュレーターがついている。というか自分でつけたのだ。言葉で説明するのは難しいが西洋や中国のお城の堀にかかった鎖で昇降させる橋を想像してもらえばすぐわかると思う。
こんなのを今までおそらく何年にも渡って手動で板の角度を変え、手動でON/OFFしていた。
それをまずは時間になったらサーボの回転で板が昇降するようにする。
サーキュレーター作動について
これは時間になったらON/OFFさせるだけで必ずしもラズベリーパイを使わなくとも1000円ぐらいで売られてる市販のAC用タイマーを使えばできるがあれだと単純にONの時間とOFFの時間を設定するだけで細かく曜日ごととか、季節ごととか設定できない。
できるものもあるかもしれないがそれなりに数千円とかする。
だが自分にはすでにRaspberry Piがあるのだ。だからリレーとコードだけ揃えればできるはず。
準備するもの
サーキュレーター昇降系に必要な部材
360度回転サーボ
サーボは今まで180度タイプばかり使っていたが今回始めて360度自在に回るものを使う。
プログラムがどんなふうに違うのか不安があったが、Pythonコードを適当にいじってみたらなにも工夫しなくとも例えば+90度でループさせるか、-90度でループさせるかで正方向・逆方向と回った。
簡単すぎる。これで本当にいいのか?
サーボメタルギア,13kg/15kg,mg995,mg996,双葉,jr,rcモデル,ヘリコプター,arduino uno,diy用|Parts & Accessories| – AliExpress
模型工作用ウィンチ
模型工作用ウィンチを買った。サーボのギアにうまくウィンチの内径歯車が合うのか少々不安があったがあっさり適合した。
ただ嵌め合いがけっこうキツめなのでサーボのキアは金属製のものを使わないとサーボ側が壊れる恐れがある。
滑車
この滑車というのはサーキュレーターの昇降とは直接関わらないのだが、滑車の片側にはサーキュレーターを吊るし、反対側には錘を付けておくことでサーキュレーター一体の板を少しでも軽く動くようにしておく。
滑車はホームセンターで適当なのを選んで買う。あまり安物(回転抵抗とか型の跡が激しくあるとか)だと却って動きが重くなるかもしれないのでほどほどにまともそうなのを選ぼう。
サーキュレーター回転作動系に必要な部材
SSR(ソリッドステートリレー)
本業で使ってこれは便利だなと知ったので家でも使うことにした。
微弱な信号を1次側に送るだけで2次側を接続してくれて1次側と2次側はまったく絶縁されているとのこと。
だからRaspberry PiからON信号またはOFF信号を送ることで2次側のAC電線をつなげたり切り離したりができる。
それに付随してSSR接続用二芯ACケーブルとSSR駆動細い二芯線を用意する。このときSSRを洗面所側に配置するか玄関側に配置するかでケーブルの太さの選定が変わってくる。
1次側は極細でも問題ないが、2次側はAC電源が流れるので相応に太さが必要だ。2次側のケーブルを洗面所のドアと枠の間に通すのは危険なのでできれば1次側を通して洗面所にSSRを置きたい。
ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ: 組立キット(モジュール) 秋月電子通商-電子部品・ネット通販
ヒューズとホルダー
一応100V電源を扱うので途中にヒューズを噛ませておいたほうが安心だ。
これがないと最悪火災の恐れがあるが、これをつけておけばショートしたときにヒューズが壊れるぐらいでほかは無事ということが期待できる。
エーモン ミニ管ヒューズホルダー DC12V・30W/DC24V・60W 2.5A(MAX) 2845
¥112(2022/01/01 18:30時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
その他小物(他でも代替可能なもの)
- サーボブラケットと固定用ビス
せっかくなのでサーボに適合するブラケットを買ったが適当な金具をホームセンターで買ってきて合わせても可能だろう
- ドア枠通る薄い延長ケーブル三芯(サーボ用)
サーボが3本リード線なので3本セットになったきれいなリード線を買ったが、区別できればなんでもよい - サーボ接続端子
これもサーボときれいに接続させたいから専用の端子を先端にカシメたが何ならはんだ付けしてしまっても問題ない - 滑車用バランサー(錘用)
滑車にぶら下がってサーキュレーターとバランスを取る目的なだけなのでそこらの小石で適当な重さのものを使っても可 - 滑車用ワイヤー
ウィンチのワイヤーが長かったのでそれを使ったが頑丈な紐ならなんでもOKだろう - AC電源用ケーブルとプラグのくっついたもの
- リード線適量
作業項目
前提:板に固定されたサーキュレーターが壁に蝶番で固定されている
さきほども紹介したがこんなふうにはるか昔に施工した。あまり参考にはならないかもしれないがよかったらこちらも御覧ください。
これを自動で昇降できるようにする。
前準備 端子取付等
SSR用電線
参考サイト
ラズパイを使って、ソリッドステートリレーでAC100Vの制御│FABSHOP.JP -デジタルでものづくり! ファブショップ !
Raspberry PiでAC100V(ソリッド・ステート・リレー)制御 – 株式会社インデペンデンスシステムズ横浜
配線はINPUT側がラズベリーパイから+ーを持ってきてつなげる。OUTPUT側はACコードの片側を割ってつなげる。
購入先→ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ: 組立キット(モジュール) 秋月電子通商-電子部品・ネット通販
サーボ延長電線
サーボの電線は30cmぐらいしかないのでラズベリーパイまで延長する必要がある。こういうのを買って先端に端子を圧着して作った。
協和ハーモネット 細径3心並列線 KFC 0.1SQ X 3C 5m 白/赤/黒
¥520(2021/12/31 21:24時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
サーボ設置
サーボとウィンチを組み立て
サーボのギアは金属製なので多少ガンガンやっても壊れることはなさそう。
ウィンチの内径ギアとサーボのギアは寸法ぴったりで入るようにできていた。
ウィンチをギアに固定するのにビスで締めると後からワイヤーをウィンチに通すのがちょっと大変なのでワイヤーの長さを決めて、ウィンチにワイヤーを通してから最後にビス締めするようにしたほうが良さげ。
だとすると現地で設置しながらやらなければならず前作業としてできないのでやや面倒ではある。
サーボを板に固定
サーボをブラケットに固定してからそれを板に固定しようと思ったが、ワイヤーの長さを決めるのに何度かサーボをつけたり外したりとしなければならず、サーボブラケットを先に板に固定してから後でサーボをブラケットに固定するようになる。たぶん。
ウィンチ先端を壁に固定
ウィンチの先端はフックになっているので完全に固定ということではなく、ネジフックを壁に固定してそこにウィンチのフックを引っ掛ける。
サーボ配線接続
さきほどの3芯電線にサーボ端子をカシメてドアの隙間を通したりして敷設する。
バランサー設置
滑車を天井に固定
滑車はホームセンターで実物を見て買ったが、正直いって安いものはベアリングがついておらずどれを買っても似たようなものだと思う。
ちゃんと動いてほしかったらベアリングを内蔵した高いものをつけたいところだが設置場所がたかだか洗面所のサーキュレーターだから我慢しよう。
ワイヤー先端に錘をつける
ワイヤーの長さを現地でだいたい決めてからワイヤーに錘を固定する。
錘は何を使ってもよいが自分は勤め先で不良品で捨ててあったコンプレッサー用クランクピンウェイトという鉄の塊を使った。
ワイヤーを滑車に通す
錘をつけたワイヤーを滑車に通して固定したい箇所にあてて長さを決める。
ワイヤーを板に固定
滑車のワイヤーを板に固定する方法は以下のとおり。
- ネジフックを板にねじ込む
- ワイヤーを折り返してアルミスリーブでカシメて輪っかをつくる
- 作った輪っかをネジフックにひっかける
板がやや落ち気味になる程度に錘を調整
ここが難しいところで錘が重すぎるとサーキュレーターが着いている板が上がってしまう。手を離すと板が僅かに落ちてくるぐらいがちょうど良いがそういうふうに錘の重さを合わせるのがちょっとむずかしい。適当なところで妥協するしかない。
▼めいっぱい板を立てて持ち上げたところ
▼ウィンチを最大限緩めサーキュレーター稼働できる状態
Raspberry Piプログラム
ルーチン群
- サーボ右回転(板を持ち上げる)
- サーボ左回転(板を下ろす)
- SSRをON(サーキュレーター稼働)
- SSRをOFF(サーキュレーター停止)
以上であるが左右の回転とSSRのON/OFFをそれぞれプログラムを作っていたら多くなりすぎるので起動時引数という対応を取りたい。よって以下のようにする。
- サーボ回転(第1引数は左右、第2引数はループ回数)
- SSR切り替え(引数はONまたはOFF)
- 上記Pythonプログラムを呼ぶシェルスクリプトを作る
- Blynkループから上記シェルスクリプトを呼ぶための改造
Pythonコード
必ずしもpythonでなくても実現できると思うがラズベリーパイといったらpythonという固定観念でガチガチに固まっている人間なのでこれでやる。
つい先日までArduinoIDEでC言語みたいなの駆使していたからちょっと感覚が狂うが仕方ない。
▼サーボ回転の参考サイト(ほとんど参考にしなかった)
サーボを回すPython
サーボの回転制御にはGPIO17を当てているが根拠はない。また360度回転のサーボを制御するのに180度回転サーボと同じロジックを使って良いものかどうか不明なまま使っているのでコピーする人は自己責任にて。
つけたファイル名はmg995_turn.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#第1引数 "right"or "left"をつける
#第2引数 ループ回数(1回のループで90度回る)
import sys
import RPi.GPIO as GPIO
import time
args = sys.argv
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
gp_out = 17
GPIO.setup(gp_out, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50)
servo.start(0)
#time.sleep(1)
def servo_angle(angle):
duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180 #角度からデューティ比を求める
servo.ChangeDutyCycle(duty) #デューティ比を変更
for num in range(int(args[2])):
if args[1] == "right":
servo_angle(90)
elif args[1] == "left":
servo_angle(-90)
time.sleep(0.5)
time.sleep(0.5)
servo.stop()
GPIO.cleanup()
SSRをONまたはOFFするPython
以下はSSRをON/OFFするプログラム名前は適当にACC_ON_OFF.pyとつけた。
呼ぶときはpython3 ACC_ON_OFF.py [ON|OFF]
引数にONまたはOFFとつけるとGPIO12をHIGHにするかLOWにするかという動きになる。GPIOは適当に決めた。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#このファイルを呼ぶときには引数で"ON"or "OFF"をつける
import sys
import RPi.GPIO as GPIO
args = sys.argv
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
gp_out = 12
GPIO.setmode(GPIO.BCM)
GPIO.setup(gp_out,GPIO.OUT)
if args[1] == "ON":
GPIO.output(gp_out,GPIO.HIGH)
elif args[1] == "OFF":
GPIO.output(gp_out,GPIO.LOW)
#GPIO.cleanup()
シェルスクリプトを作成
ちなみにシェルスクリプトもPythonファイルもホームディレクトリの下のpython_codeというディレクトリに入れている
単発でサーキュレーターを下ろすcir_down.sh
#!/bin/bash
python3 /home/pi/python_code/mg995_turn.py left 1
単発でサーキュレーターを下ろすcir_down.sh
#!/bin/bash
python3 /home/pi/python_code/mg995_turn.py right 1
サーキュレーターを降ろして回すcirculator_on.sh
#!/bin/bash
python3 /home/pi/python_code/mg995_turn.py left 10
python3 /home/pi/python_code/ACC_ON_OFF.py ON
サーキュレーターを上げて止めるcirculator_off.sh
#!/bin/bash
python3 /home/pi/python_code/mg995_turn.py right 20
python3 /home/pi/python_code/ACC_ON_OFF.py OFF
これらのうち単発の2ファイルは通常使うものではなく、サーボの動作テストしたいときに使う。
また、サーキュレーターを降ろして回すcirculator_on.shと上げて止めるcirculator_off.sh内でmg995_turn.pyの第2引数が違っている理由は下げるときと上げるときとややサーボの負荷が違っており同じパラメータ数値では同じ位置に戻らなかったためだ。
これはいずれサーボの回転回数ではなくリードスイッチを設置してここに来るまで回し続けるとかっていう処理に改善しようと思っている。
crontabに仕込む
crontabに仕込んでおいて指定した時刻にサーキュレーターが降りてきて回りだし、また指定した時刻にサーキュレーターが止まって上に上がって格納されるしかけにする。
ターミナル(コマンドプロンプト画面ね)でcrontab -eと入力する。以下の行を足す。
00 01 * * * /home/pi/python_code/circulator_on.sh
00 17 * * * /home/pi/python_code/circulator_off.sh
これは毎日00分01時にcirculator_on.shを実行するというのと、00分17時にcirculator_off.shを実行するということだ。
ラズベリーパイへの配線
きれいな図を作るのができないので言葉だけで残しておく。
mg995サーボの電源+ーは適当に取るとして制御線はプログラムから読み取れるようにGPIO17とする。
SSRの制御線はこれまたプログラムから読み取れるようにGPIO12でGNDはどこでも適当に。
▼一応つくってみた。
動作検証
上記いろいろ記した内容で一応理論的にはいけるのだが現実はそんなに甘くない。
障害として滑車がいまいちなめらかに回らず(滑車とは呼べないww)ワイヤーがなめらかに動かない。それってどうなるかというとサーキュレーターをつけている板がなめらかに上下しないということ。
つまりサーボが引っ張り上げるときにはより重くなるし、下ろすときもスムーズに降りずウィンチのワイヤーがたるんでしまう。
これを克服する方法として1つはもうちょっとまともな滑車を2個追加で買ってサーボに引っ張らせる。今はサーボウィンチのワイヤーが直接壁とつながっているため1の力で1引き上げようとして無理をしているが2個滑車を使うことで1の力で1/2だけ引き上げることにする。
それと同時に錘をもう少し重くしてしまう。こうすることで錘の増えた分、下に下りやすくなり、またウィンチのレシオを下げることでより強い力で持ち上げることができるようになるかなと。
ちょっと文章で説明するのは難しいが誰か理解できたろうか・・・
あとがき
一応ではあるが、今回のDIYにより毎日同時刻に浴室を乾燥してくれる。ただしちゃんと浴室のドアを開放しておくことが前提でここが閉まっているとヒューマンエラーとなり浴室がカビっぽくなる。
いずれ近日中に動作検証のところで述べた改善点を実施してまた記事にしたい。
【追記】完璧にした
上記の記事を読んでもらえればわかるのだが、リードスイッチではなくマイクロスイッチを上限と下限にうまく取り付けてサーボをほぼエンドレスで回しつつセンサーとなるスイッチで止まるようにした。
一応完璧に動くようになった。やり遂げたのだが達成感より空虚感のほうがちょっと大きいのはなぜだろう・・・
おそらくRaspberry Piをこんな使い方で燻ぶらせている不満じゃないかなと思う。まあとにかく完成したので興味が有る方はリンク先も見ておいてください。