Slackからペット用自動給餌器を操作する

#我が家のペット
「くるみちゃん」というシルバーのトイプードルを飼っています。
今年で３歳になりました！
毎日長時間のお留守番を頑張っています。
夕飯は私がいつも帰ってきてからあげているのですが、今日はどうしても帰りが遅くなる・・・というときは、事前に”ペット用自動給餌器”をセットしておき、指定の時間になったら餌を食べられるようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/0cb65431-76e8-6e23-1c5e-8d547ef14d14.png)

#自動給餌器の課題
あらかじめ指定した時間に（例　19:00）
あらかじめ指定した量の（例　F-04)
餌が自動的に出てくる仕組みです。
あらかじめ予定がわかっているときだといいのですが、
帰りに電車が人身事故で遅れたりとか、急な仕事が入って帰りが遅くなったりとかするわけです。

ということで、Slackから”ペット用自動給餌器”を操作できるようにしてみました。

#システム要件
以前の記事でも紹介しましたが、我が家は夫婦Slackを導入し、ペットの見守りを行なっています。そこで今回はSlackから餌をあげられるようにしたいと思います。
以前の記事：[Slackでペットのお留守番を見守る](https://qiita.com/tokotan/items/2596fd5d7fed6e8d1905)

- Slackから任意のタイミングで自動給餌器を操作し餌をあげる

#準備したもの
**電子工作的なもの**
- Raspberry Pi3
- [モータードライバー（TA7291P)](http://akizukidenshi.com/catalog/g/gI-02001/)
- USBケーブル Type-B
- USBコネクタ

>DCモーターや餌の量を測るスイッチは自動給餌器に入っているものを使います。

**システム**
- Slack

**開発環境**
- MacOSX
- Python, Shell
- Slack Bot: Hubot + CoffeeScript

#回路図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/131cf223-f75e-b1bf-1c78-7377a4c7babf.png)

#自動給餌器ハック

**【注意事項】**
言うまでもありませんが、既存製品の分解は自己責任でお願いします！！我が家は、自動給餌器を1年以上使ったところで若干動きがおかしくなったこともあり、買い直すかハックするか悩み、思い切ってハックしましたw

---------

自動給餌器の底部分を開けると、DCモーターが動いて、水車が周り餌の量が一定量出るような仕組みになっていました。一定量の判定は、スイッチで行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/4c6e0114-3199-d768-71bb-f0dde05038d0.png)

DCモーターはをRaspberry Piと繋いだTA7291Pで制御します。
餌の量を判定するためのスイッチのON/OFFを検知するために、RaspberryPiのGPIOピンに繋ぎます。
詳しくは回路図を参照してください。

#DCモーターを操作する
DCモーターを操作し、餌を一定量（スイッチ４回分<-ペットによって餌の量は調整できるようになってます）出すプログラムはこちらの記事のプログラム(motor.py)を使わせていただきました。ありがとうございます！
> [Raspberry Pi 3でpythonを使いモータードライバーを使いモータを制御する！](https://qiita.com/RyosukeKamei/items/147de58738084826f749)

スイッチをGPIOポート８に繋ぎ、スイッチのON/OFFを検出します。水車が８分の１回転するごとに、スイッチが１回ONになります。うちの子の餌の量を計算し、スイッチ４回分の餌を出すことにします。
プログラムは次のような形で書きました。

```foods.sh
#!/bin/sh

#スイッチを繋いだGPIOポート番号
PORT=8

## GPIOをINモードにする
gpio -g mode $PORT in
gpio -g mode $PORT down

## 餌の量(スイッチの回数)
count=4
i=0 #初期値
sudo python /home/pi/.../.../motor.py go 0
while :
do
    if [ `gpio -g read $PORT` -eq "1" ] ; then
        if [ $i -lt $count ] ; then
            i=`expr $i + 1`
        else
            sudo python /home/pi/.../.../motor.py brake 0
	    break
        fi
    fi
	sleep 1
done
```

#Slackから操作する
SlackのくるみちゃんBotに「ごはん」と話しかけると、餌が一定量出るようにしたいと思います。
SlackのBotはHubotで構築します。
※本記事では、RaspberryPiにHubotを導入する手順は省略します。

Hubotのbot/scriptsの下に配置するスクリプトを下記のような形で書きました。

```food.coffee
child_process = require 'child_process'

module.exports = (robot) ->
    #ごはん
    robot.respond /.*ごはん.*/i, (msg) ->
        child_process.exec "/home/pi/.../.../foods.sh", (error, stdout, stderr) ->
            if !error
                try
                    msg.reply "ごはん、いただきます！"
                catch e
                    msg.reply "#{e}"
            else
                msg.reply "#{error}"
        return
```

話しかけた結果、こんな感じでくるみちゃんが返事をしてくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/c2a7a0e2-049d-1019-e5aa-49334e627dd6.png)


餌のイメージ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/3aa3e6a0-32f7-7191-ed42-d1915e0047ad.png)

# 最後に宣伝

MakerFaireTokyo2018に出展します！！
このペット用自動給餌器ハックもデモを行いますので、ご興味ある方は是非見に来てくださいm(_ _)m
> わんこ×IoT　（H/02-07)
http://makezine.jp/event/makers2018/m0265/