RaspberryPiでドリップスケールを作って、美味しいコーヒーを淹れたい！ - その１

この記事は [BrainPad AdventCalendar 2018](https://qiita.com/advent-calendar/2018/brainpad) 12日目の記事です。
※今年も無事枠をもらえたので、ちょっと箸休め的な話題をどうぞ。

## はじめに

こんにちは。[＠yagizo](https://qiita.com/yagizo)です。自社サービスの開発担当をしている普通のエンジニアです。
私は会社でコーヒー部(※15時くらいの眠くなる時間に、勝手にお湯を沸かしてコーヒーを淹れ、同僚と雑談するという会社非公認の活動団体w)に参加しているのですが、美味しいコーヒーを淹れてくれるカリスマバリスタ的人がいるので、飲み専門になってしまい、ちっとも技術が上達しない悩みを抱えていました。
そんな時、

- [【カフェでバリスタも使っている！】ドリップコーヒーで使うべき２つの器具！ - Lili HanaRe　STAFF BLOG](http://lili-hanare.com/2017/06/03/equipment/)

という記事を見つけ、 **[ドリップスケール](https://www.amazon.co.jp/gp/product/B009GPJMOU/ref=as_li_tl?ie=UTF8&tag=riceproject0c-22&camp=247&creative=1211&linkCode=as2&creativeASIN=B009GPJMOU&linkId=ebbf33c4b7b53198f74f5bd50477c400)** という器具があることを知りました。
ドリップスケールのポイントは **時間** と**量** の計測、さらに美味しいコーヒーのためには **温度** も大切とのことなので、「これなら（最近使っていない)[RaspberryPi](https://www.amazon.co.jp/gp/product/B07BFH96M3/ref=as_li_tl?ie=UTF8&tag=riceproject0c-22&camp=247&creative=1211&linkCode=as2&creativeASIN=B07BFH96M3&linkId=fe083eb8396f406f86ec22598e301708)で安く簡単に作れるんじゃない？という安易な思いつきと、 **美味しいコーヒーを自分の手で** 淹れらるようになりたい!!」という欲望でスタートした企画です。
コーヒブレイクの小ネタとしてお楽しみいただければ幸いです。
![スクリーンショット 2018-12-11 0.24.43.png](https://qiita-image-store.s3.amazonaws.com/0/55900/3210ba92-b943-4aba-b971-e8776d7a3694.png)
　　　　　　　↑
　　　　今回の企画の全貌

## さっそく準備にとりかかろう!

### ラズパイセットアップ

「じゃ、工作に入るぞ！」っと意気込むやぎぞうであったが、その前にラズパイのセットアップから始めないといけない状況であることに気がつく。

(まずはRaspberryPiセットアップしてっと、、、あれ？　色々忘れてる...)

まあ、なんだかんだあった(参考:[忘れる人のためのRaspberry Pi セットアップ](https://qiita.com/yagizo/items/e2015b14037e022c3bdc/))けど、基本セットアップを終え、重さを計量するセンサーの取り付けに入る準備は整った。

### 今回のお買い上げアイテム

死蔵していたラズパイ以外で、今回買い足したものは以下のアイテム。
![スクリーンショット 2018-12-09 11.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/55900/2f1b2967-6db5-756c-aa7f-e81428808587.png)
とりあえず、市販のドリップスケール買うより安く導入できるという条件はクリア(実は性能のいい[はんだごて](https://www.amazon.co.jp/gp/product/B079L4RNV7/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=riceproject0c-22&creative=1211&linkCode=as2&creativeASIN=B079L4RNV7&linkId=a73d6aded114c729176227040a6b0d51)とか欲しくなって、余計な買い物をしたのは家族に内緒)。

「いよいよ工作に...」の前にちょっとだけ、企画の裏側を！
（感の鋭い方はタイトルを見てもしや？と思われたかもしれませんが、たぶん合ってます。あとで「えー」って言われる前に、言い訳のくだりを入れておきます）
昨年のアドベントカレンダーでは、時間が足りなかったので今回は**１ヶ月前**から準備開始。企画を整え、部品を発注したのも11/18。余裕のスタートだったんですよ。
　　**万全の体制！！**
 ...のはずが、「数日で来るはずの部品が来ないぞ...?　Amazon経由だし、注文後すぐに発送済みになったから、明日は来るはず」x時間...完全に油断してました。2回も到着日が変更になり、気がつくと、あれ、入稿日まで１週間切ってる状況に。
　　**(やばい。おかしい、いつものパターンだ)**
半分キレ気味に販売元に問い合わせると、丁寧で親切。でも届かない。結局、週末に秋葉原まで部品を買いに行く羽目に。そしたら、期待通り届きましたよ。同日に。あー、もうなんだかなー。
　　(しまった。愚痴で紙面をつかってしまった。いやホントすんません)

気を取り直して、続きをどうぞ。

## 重量計(デジタルはかり)を工作

計量計を作るのに必要な部品は「[電子天秤ロードセルセンサー](https://www.amazon.co.jp/gp/product/B00U8MSCAK/ref=as_li_tl?ie=UTF8&tag=riceproject0c-22&camp=247&creative=1211&linkCode=as2&creativeASIN=B00U8MSCAK&linkId=2f07ca5ea234885ba7fd129f6410a9d2)」と「[圧力センサー(HX711)](https://www.amazon.co.jp/gp/product/B014VVPYUE/ref=as_li_tl?ie=UTF8&tag=riceproject0c-22&camp=247&creative=1211&linkCode=as2&creativeASIN=B014VVPYUE&linkId=38393f7c671c85bdad168264eecb9658)」とのこと(前者が荷重を検知する装置でその情報を増幅しデジタルに変換するモジュールが後者みたい)。
むき出しの配線だと使いにくいので、ジャンパーピンワイヤー(メス)をハンダ付けし、基盤にピンを付け、使いやすくする（と、簡単に書いたけど、はんだ付け慣れていないので、地味に時間がぁぁ...そしてピンで指を傷つけ**流血**...**涙**が出そうだがぐっとこらえる）。

秤の土台は100円ショップで買ったお洒落なトレイ。台はTrancsendのSSD買った時に５インチベイマウント用のパネルがついていたので、それを流用。
配線は先人たちの知恵に従い、以下のような感じで結線。
![スクリーンショット 2018-12-08 13.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/55900/71f383e2-6b2c-6545-e555-e7c60550d4a9.png)
正直ここまで工作に手間取るとは思わなかったけど、なんとかものはできた〜〜♪
![スクリーンショット 2018-12-08 9.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/55900/7088400d-f419-72c8-50dc-c54775460e0a.png)

### hx711pyのセットアップ

まずはセンサーからのデータを取得できるようにしよう。[hx711py](https://github.com/tatobari/hx711py) というラズパイ用のHX７１１ライブラリがあるとの情報をみつけたので、こちらを使ってアプリを作っていくことに。

```
$ git clone https://github.com/tatobari/hx711py
 :
$ cd hx711py
$ sudo python setup.py install
running install
running bdist_egg
running egg_info
creating hx711.egg-info
writing requirements to hx711.egg-info/requires.txt
writing hx711.egg-info/PKG-INFO
writing top-level names to hx711.egg-info/top_level.txt
writing dependency_links to hx711.egg-info/dependency_links.txt
writing manifest file 'hx711.egg-info/SOURCES.txt'
reading manifest file 'hx711.egg-info/SOURCES.txt'
writing manifest file 'hx711.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-armv7l/egg
running install_lib
running build_py
creating build
creating build/lib.linux-armv7l-2.7
copying hx711.py -> build/lib.linux-armv7l-2.7
creating build/bdist.linux-armv7l
creating build/bdist.linux-armv7l/egg
copying build/lib.linux-armv7l-2.7/hx711.py -> build/bdist.linux-armv7l/egg
byte-compiling build/bdist.linux-armv7l/egg/hx711.py to hx711.pyc
creating build/bdist.linux-armv7l/egg/EGG-INFO
copying hx711.egg-info/PKG-INFO -> build/bdist.linux-armv7l/egg/EGG-INFO
copying hx711.egg-info/SOURCES.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying hx711.egg-info/dependency_links.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying hx711.egg-info/requires.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying hx711.egg-info/top_level.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/hx711-0.1-py2.7.egg' and adding 'build/bdist.linux-armv7l/egg' to it
removing 'build/bdist.linux-armv7l/egg' (and everything under it)
Processing hx711-0.1-py2.7.egg
Removing /usr/local/lib/python2.7/dist-packages/hx711-0.1-py2.7.egg
Copying hx711-0.1-py2.7.egg to /usr/local/lib/python2.7/dist-packages
hx711 0.1 is already the active version in easy-install.pth

Installed /usr/local/lib/python2.7/dist-packages/hx711-0.1-py2.7.egg
Processing dependencies for hx711==0.1
Searching for numpy==1.12.1
Best match: numpy 1.12.1
Adding numpy 1.12.1 to easy-install.pth file

Using /usr/lib/python2.7/dist-packages
Searching for RPi.GPIO==0.6.3
Best match: RPi.GPIO 0.6.3
Adding RPi.GPIO 0.6.3 to easy-install.pth file

Using /usr/lib/python2.7/dist-packages
Finished processing dependencies for hx711==0.1
```
### 動作確認

とりあえずhx711pyについているexample.pyで動くか確認。

```
$ python example.py 
-8388479
-8388479
-8388607
-8388479
-8388479
-8388479
-8388607
-8388607
^CCleaning...
Bye!
```
なんか動いているっぽい。
本当はここから、**重さの調整をしていく作業**が発生するらしいが後回し。なにせ時間がないので、次のセンサーの取り付けにかかる。

## 温度センサーを工作

温度を計測するのに必要な部品は「[DS18B20温度センサー](https://www.amazon.co.jp/gp/product/B01DCY9G0K/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=riceproject0c-22&creative=1211&linkCode=as2&creativeASIN=B01DCY9G0K&linkId=2e9da55ba98c053302a32fc082362bd7)」と抵抗1つ (4.7kΩ)。
むき出しの配線だと[ブレッドボード](https://www.amazon.co.jp/gp/product/B010UZQKJY/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=riceproject0c-22&creative=1211&linkCode=as2&creativeASIN=B010UZQKJY&linkId=2a74c2bbbf225d115681c80dabf54e9d)に刺さらなかったので、ジャンパーピンワイヤー(オス)をハンダ付けする(だいぶ上手になったw)。
配線はこんな感じ。
![スクリーンショット 2018-12-09 22.43.31.png](https://qiita-image-store.s3.amazonaws.com/0/55900/632b6779-94ba-aeae-d3ed-f7b88e0fdc37.png)

### ラズパイ側の設定

1-Wireというインターフェースを有効化するのだが、raspi-configで有効化しただけではうまくいかないらしい。解決方法は、`/boot/config.txt`に以下の設定を追加する。`pullup=on`という設定がポイントらしい。

```
# for DS18B20
dtoverlay=w1-gpio,pullup=on
```

設定後にラズパイ再起動。

### 動作確認

1-Wireを有効化すると、`/sys/bus`配下に`w1`というディレクトリが出現している。その下の`devices`ディレクトリ内に今回追加したセンサー情報(ディレクトリ)があるはず。私の場合は`28-0213134b30aa`という識別子が振られていて（どうやらデバイス毎に固有で変わらないらしい）、その中のw1_slaveでセンサーで取得した情報がみれるとのことなので、確認する。

```
$ cat /sys/bus/w1/devices/28-0213134b30aa/w1_slave 
b8 00 4b 46 7f ff 0c 10 8c : crc=8c YES
b8 00 4b 46 7f ff 0c 10 8c t=11500
```

この中の`t=11500`が取得した温度。1000で割った値が温度(摂氏)となるので、この場合は11.5℃。(最近部屋が寒いと思ったら、寒かったのが可視化されたw）

## 小まとめ

今回は、**センサーの設定**（部品の調達および、工作、動作確認）を行いました。ラズパイって手軽にセンサー取り付けてデータ取得できるので、ホント素敵です。

さて次回はいよいよ**アプリの作成**。
作成した秤からデータを取得し、重さの時間変化を可視化する仕組みの実装に入っていく予定です。
(しれっとBrainPadアドベントカレンダー**初**の**連載企画**に変貌)

**さらに未練がましくいいわけ**
本当は最後までやりたかったんですよ。日頃の行いのせいか、見事に時間を読み誤り、結果、間に合わず。
とはいえ、冬休みの宿題として必ずドリップスケールは完成させますよ。

最後まで読んで**がっかり**された方、次回の**アプリ編**をお待ちください！!

## 参考

以下、今回の企画を遂行するにあたり参考にした先人たちの知恵。ただただ感謝。

* [50: Raspberry Pi3 で歪みセンサーとアンプで scale を作る - Qiita](https://qiita.com/KZ2/items/5492e15cc15f766ca9bd)
* [IoTで玉ねぎチェッカー作成！ - 比較さんのDIYブログ](https://hikaku-san.hatenablog.com/entry/onion-checker)
* [電子天びんの原理ついて - エー・アンド・デイ](https://www.aandd.co.jp/adhome/pdf/tech_doc/balance/tech_seminar20150916_01.pdf)
* [HX711仕様書 - 秋月電子通商](http://akizukidenshi.com/download/ds/avia/hx711.pdf)
* [Raspberry Pi 2のGPIOピン配置 - NegativeMindException](https://blog.negativemind.com/2015/04/14/raspberry-pi-2-gpio-pin/)
* [Raspberry Pi Bから、Raspberry Pi2, Pi3のGPIO PIN配列について - FabShop](https://www.fabshop.jp/raspberry-pi-b%E3%81%8B%E3%82%89%E3%80%81raspberry-pi2-pi3%E3%81%AEgpio-pin%E9%85%8D%E5%88%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
* [Build a digital Raspberry Pi Scale (with Weight Sensor HX711)- RASPBERRY PI TUTORIALS](https://tutorials-raspberrypi.com/digital-raspberry-pi-scale-weight-sensor-hx711/)
* [はんだ付のコツ - YouTube](https://www.youtube.com/watch?v=NhDiQtUeF-M)
* [Raspberry Piで水温を取得する。(DS18B20) - たねやつの木](https://www.taneyats.com/entry/raspi-smart-aquarium-2)