天気によって散水量を調整できる自動水やり機をつくる

# ラズパイとサーボモータで自動水やり機をつくる

## 背景

先日，家の庭に畑を作りそこに大根や枝豆やなどの家庭菜園を始めました．
最初のころは楽しみながら水やりしていましたが，今ではめんどくさすぎて雨の日を祈るばかりです．
そこで，勝手に水やりしてくれるものがあればいいじゃん！と気が付いたので調べてみました．

### 既製品は高いし時限式ばかり

https://www.amazon.co.jp/s?k=自動水やり機
アマゾンで自動水やり機を検索し値段と機能を確認したところ，やはり高価なものばかり．．．
1万円以上するものは蛇口をタイマーで制御し，定刻になるとスプリンクラーが作動するという仕組みのものが多く，一万円以下のものは簡易的な植物の水やりに適したポンプ式が多いように思います．
できればお金をかけたくないので安いものを購入したいところですが，私の家の植物たちは外の畑にあるので，簡易ポンプ式では水の量や水圧などに限界がある可能性があります．また，ポンプ式はポンプ式内の水を足さなければならないという手間があるので，やはりめんどくさいです．
そこで，自動でお水を撒いてくれる仕組みを自作してみることにしました．また，ただの時限式だと面白くないので何かないかなと探していると，面白そうなtweetを見つけました．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">まじかよ気象庁公式の天気予報APIができてるぞ、感激して大声で泣いちゃった<a href="https://t.co/2HQumqjel8">https://t.co/2HQumqjel8</a></p>&mdash; Torishima (@izutorishima) <a href="https://twitter.com/izutorishima/status/1364441626672685058?ref_src=twsrc%5Etfw">February 24, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これは気象庁が公式に公開しているjsonファイルのようです．今回はこれを利用して気象庁からの天気情報を取得し，天気に応じて散水量を調整してくれる自動水やり機を作ってみました．
以下に本機能を示します．

  * 時間による定期実行
  * QRコードによる実行(GET通信)
  * 天気に応じて散水量調節
  * LINE notifiyによる正常動作の確認
  
# 使用したもの
## 家にあった
 * [raspberry pi4](https://raspberry-pi.ksyic.com/)
 * [リレーモジュール](https://www.amazon.co.jp/SODIAL-R-SHOMAM10778-リレーモジュール/dp/B00L11KL10)
 * 単三乾電池×4
 * 3Dプリンター
 * はんだごて

## 購入した

 * [ホース](https://www.amazon.co.jp/gp/product/B08399Q17T)
 * [蛇口のアダプタ](https://www.amazon.co.jp/タカギ-takagi-三方向コネクターコック付き-FJ-G099FJ/dp/B000EVPH8A/)
 * [サーボモータ](https://www.amazon.co.jp/gp/product/B08GWQC884) (ホントにトルク40Kgかどうか怪しい)

# 完成後の様子

https://www.youtube.com/watch?v=whX-leu37hU

# 仕組み

自動水やりの大まかな処理の流れを説明します．

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1698242/7eccbec2-8b14-4aea-7357-d72b27e60c2b.png width = 100%>

raspberry pi4で立てたnode.jsサーバからpythonファイルを実行してサーボモータを操作します.
pythonファイルを実行するトリガーとしてGET通信とnode-cronを使用することでQRコードによる実行と定期実行を可能にしました．

## ハードウェア
### 1.ホース

まず，[アマゾンで購入した](https://www.amazon.co.jp/gp/product/B08399Q17T)散水ホースを畑にセットし蛇口をひねるだけで水やりできるようにしました．もうこれで満足してしまいそうですが，すでにサーボモータなどを注文済みなので後には引けません．

### 2.蛇口

今回は,蛇口の先に取り付けた蛇口アダプターのベンを開け閉めすることで水の流れを管理するようにしました.
[以下の蛇口アダプターの簡略図](#### 蛇口アダプターの簡略図)に示すように，サーボモータがONになった時にベンが開き水が流れ，OFFになった時にベンが閉まり水が止まるようにしました.
このベンをサーボモータで操作して水やりのオン，オフを切り替えるようにするので,サーボモータとアダプターを固定する仕組みが必要になります．

#### 蛇口アダプターの簡略図

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1698242/890ad9af-96f1-fcef-b7bd-1aa70de8d463.png width="150"><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1698242/034ffc71-21a9-14c5-f429-5f8ee0068043.png width="150">

そこで,[蛇口とサーボモータを固定するためのマウンタ](https://a360.co/3Aur2Gh)を3Dプリンターで刷りました．
始めて自分で一からモデリングしたので，あまり良いものではありませんが個人利用の範囲でご自由にお使いください．

<iframe src="https://myoit282.autodesk360.com/shares/public/SH56a43QTfd62c1cd9687b4702272f8ca059?mode=embed" width="640" height="480" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"  frameborder="0"></iframe>

**注意1：このマウンタでは接続部分が摩耗してすぐにゆるゆるになるのでご注意ください．私は↓のようにハンダごてで無理やり溶かして固定しちゃいました★**

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">3Dプリントした奴同士を固定する時はコレが手っ取り早い！ <a href="https://t.co/8jRrHk9DxU">pic.twitter.com/8jRrHk9DxU</a></p>&mdash; 遠藤 (@VsvkKSzFkgAXqf9) <a href="https://twitter.com/VsvkKSzFkgAXqf9/status/1411231337827028998?ref_src=twsrc%5Etfw">July 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**注意2:ハンダは安全に持ちましょう．**

### 配線と電源

今回使用したサーボモータは6Vで動作するのでラズパイの他に外部電源が必要です.6Vは単三電池を4つで出力可能なのでこれを外部電源としました.また,必ずリレーモジュールを電源とサーボモータの間に挟むようにしましょう.そうしないと,サーボモータに常に電流が流れることになり無駄に電力を消費してしまいます.そこで,リレーモジュールを使って必要のないときは外部電源からの電流を遮断しましょう.

![sprinc_kairo_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1698242/ffcc8f22-b458-2546-584e-544d6ad05833.png)


## ソフトウェア

### 1.使用したプログラミング言語やライブラリ

<pre>
Python3
├── WiringPi
└── GPIO
JavaScript
├── node.js
└── npm
└── pm2
</pre>

サーボモータを操作するにはパルス波信号を用います．raspberry piにはパルス波を出力できるPWM制御が存在するのでこちらを使用します．また，raspberry piのPWM制御には二種類あり，ソフトウェアPWMとハードウェアPWMがあります．今回はより厳密にパルス波を制御できるハードウェアPWMを用います．

### 3.ラズパイの起動

ラズパイのセットアップには以下の記事を参考にしました。OSの書き込み~ssh接続までしてください。

https://qiita.com/zaburo/items/752c45ffe86c356b8700

https://qiita.com/c60evaporator/items/2384416f1122ae124f50

### 4.ライブラリのインストール

ssh接続が完了したら、必要なライブラリ等をインストールしていきます.

http://wiringpi.com/download-and-install/

公式の手順に従ってインストールしていきます.
まずWringPiがインストールされてないことを確認します.

```text:Raspbian
gpio -v
```
もし、すでにWiringPiがインストールされている場合以下のコードを実行する必要はありません.
それでは以下のコードでインストールしましょう.

```text:Raspbian
sudo apt-get purge wiringpi
hash -r
```

次に,node.js系のライブラリをインストールしていきます.
インストールは以下のサイトを参考にしました.


https://qiita.com/mascii/items/77c685df65c4cbca9315

任意のディレクトリで以下のコードを実行します.

```text:Raspbian
sudo apt-get update
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install npm n -g
sudo n stable
```
続けて以下のコードを実行します.

```text:Raspbian
curl -L https://git.io/v7kPb | bash
```
パスとバージョンを確認します.

```text:Raspbian
pi@raspberrypi:~ $ node -v
v8.6.0
pi@raspberrypi:~ $ npm -v
5.4.2
```
**注意3:バージョンが異なっている可能性がありますので、上記の出力と全く同じでなくて構いません**

最後にpm2をインストールします.これはraspberrypiでnode.jsを常時実行するためのライブラリです.
とても便利なのでインストールしておきましょう.

```text:Raspbian
sudo npm i -g pm2
```
事前準備はこれで終わりです.

### 5.プログラム
https://github.com/Nikudanngo/sprinkler

それでは実際に自動水やり機を操作するためのプログラムをインストールしましょう.
ソースコードは私の[git hub](https://github.com/Nikudanngo/sprinkler)で公開しています.ここから`git clone`をして私の汚いコードを落としてきます.
適当なディレクトリを用意して以下のコードを実行しましょう.

```text:Raspbian
git clone https://github.com/Nikudanngo/sprinkler.git
```
無事に落とし込めたら,`sprinkler/setting.py`を少し編集します.`vim`とか好きなエディタで開いて以下の`token`にLINE Notifyで作成したトークンを貼り付けてください.

```text:setting.py
  33	    token = "取得したアクセストークン"
```

LINE Notifyのトークンの入手方法は以下のサイトを参考にしてくだい．

https://zenn.dev/protoout/articles/18-line-notify-setup

### 6.サーバ立ち上げ
私の書いたコードはnode.jsで立てたローカルサーバ`http://localhost:3000/`に`/on`または`/off`でゲットすることでPythonプログラム(厳密にはPythonをsudoで実行させるための.shファイル)が走ってサーボモータを回す仕組みになっています．また，定期実行として毎日7:00と18:00にサーボモータを回転するようになっています．
そのため，以下のコードでnodeサーバを立ち上げます．
```
node ontime.js
```

あとは同じWANないの端末からして`http://localhost:3000/on`にアクセスしてサーボモータを回転させたり`pm2`を使ってnodeサーバを常時実行させて定期実行させてみましょう．

```
pm2 start ontime.js
```

止めたくなったらこちら
```
pm2 stop ontime.js
```


# 参考にした偉大なる先人様たち
  * [IoTLT Vol46 蛇口IoTの裏側](https://hr-sano.net/blog/2019/03/19/behind_the_prototyping_jaguchi_iot/) : https://hr-sano.net/blog/2019/03/19/behind_the_prototyping_jaguchi_iot/
  * [気象庁JSONデータ](https://qiita.com/michan06/items/48503631dd30275288f7) : https://qiita.com/michan06/items/48503631dd30275288f7
  * [Rasperry PiにNode.jsをインストールする (1 - インストール)](https://raspi.taneyats.com/entry/install-nodejs): https://raspi.taneyats.com/entry/install-nodejs
  * [Raspberry Pi 4でWiringPiでgpioを使用可能にする](http://www.fecorp.co.jp/raspberry-pi-4でwiringpiでgpioを使用可能にする/) : http://www.fecorp.co.jp/raspberry-pi-4でwiringpiでgpioを使用可能にする/
  * [Raspberry PiにNode.jsとnpmの最新版をインストールする](https://qiita.com/mascii/items/77c685df65c4cbca9315) : https://qiita.com/mascii/items/77c685df65c4cbca9315