飲んだ量を教えてくれるコースターを作ってみた
はじめに
ある日友人がこんな事を言いました。
友人「コースターが欲しいんだよね」
私「買えばいいんじゃ?」
友人「俺がどのぐらいのペースで飲んでいるかを調べて、『お前今日は飲み過ぎ』とか言って欲しい」
私「なるほど!?」
重さを量る方法
電子工作で簡単に重さを量る方法は、ロードセルを使う方法です。
ロードセルとは
力計式はかり。通常は長方形をした「起歪体」(きわいたい)と呼ばれるアルミ合金製の弾性体のブロックに歪みゲージが貼り付けられ、このロードセルと呼ばれるブロックの1辺を垂直に固定し、その対辺に試料皿を固定する。試料が重力に引かれる荷重がロードセルに歪み量を加え、その歪みを4頂点に付けた歪みゲージの抵抗変化を電気信号として測定して試料質量に換算する。低コストで小型化に向くため広範な利用が進んでいる。(wikipediaより)
こういう感じのアルミで出来た量りです。
コースターの材料
ロードセルはただのアルミの塊なので、コースターとして実用するには、何らかの受け皿をもった筐体が必要になります。
3Dプリンタで作成することも考えましたが、もう少し簡単に実現できる方法を探します。
そこでよくよく考えると、ロードセル + 受け皿 + 筐体が揃った、うってつけのものがありました。
ネット通販で売られている電子はかりです。
これらはロードセルを内蔵しているので、今回の用途にうってつけです。
そこで今回はこれを分解して流用することにします。
(注:はかりからはかりを作る矛盾に気がついてはいけません)
流用するときに気をつけるのは、計測できる範囲です。
内蔵しているロードセルがどの程度の幅の重さを計測できるかを確認してから購入するようにしてください。
今回は、ペットボトル一本乗せられることを想定して、最大で2kgまで量れるものを購入しました。
分解
購入したら、早速、分解していきます。
一度もまともに使われることがないまま、分解されるかわいそうな電子はかりよ……。
液晶パネルや、電源などは必要ないので切り離します。
ロードセルからの配線をそのまま筐体から這い出させて、筐体をもういちど組み立て直します。
これで、ロードセル + 受け皿 + 筐体が手に入りました。
このロードセルからの配線を「HX711 ロードセル用ADコンバータ」に接続します。
HX711とは
HX711 は、ロードセル用ADコンバータのことで、Arduinoマイコンなどに接続する事で、ロードセルの抵抗値の変化を測定し、重り等で校正をすることで、重さを量ることが出来ます。
HX711とロードセルとはVDD,GND,INA+,INA-の4線で接続します。
大抵のロードセルは、緑がINA-, 白がINA+, 黒がGND, 赤がVDDなのでこの法則でHX711に接続していきます。
今回はこのHX711をRaspberry Pi Zeroに接続して使用してみます。
HX711とRaspberry Pi とは、VCC, GND, クロック(PD_SCK), データ(DOUT)の4線で接続します。
VCCとGNDのほか、今回はDOUTをGPIO 5番、CLKは GPIO 6番に接続します。
Raspberry Pi上のソフトウェアで動作確認
HX711用のライブラリがGithubにあるので手軽に利用できます。まずはRPiにログインして、ライブラリを持ってきます。
% git clone https://github.com/tatobari/hx711py
この中のexample.py で動作を確認していきます。
まずはエディタでexample.pyの以下の行をコメントアウトします。
hx.set_reference_unit(92)
↓ この行を以下のようにコメントアウトする
#hx.set_reference_unit(92)
つぎに、予め重さが判明しているものを乗せてキャリブレーションしていきます。
今回は手元にある iPhone 7 Plus の重量が 188g だということで、これを使っていきます。
まず、iPhoneをのせた出力をみます。
$ sudo python example.py
139750
186130
186136
205291
186179
186183
186440
186179
186159
186152
186174
186188
:
およそ 186200 という数字が出力されています。
そこで、 186200(出力) ÷ 188(iPhoneの重さ) ≒ 990 という計算をします。
この計算結果に基づいて、さきほどコメントアウトした行を以下のように編集します。
#hx.set_reference_unit(92)
↓ 関数の引数を変更して、再度この行を有効にする
hx.set_reference_unit(990)
これで、較正が正しくされるはずです。再度、iPhoneを乗せて量ってみましょう。
$ sudo python example.py
188
188
188
188
188
188
188
これでおおよそ正しい重さが量れるようになりました。
あとはこれをAWSに投げ込むもよし、ローカルに立てたRDBに入れるもよし、Pythonで重さを検知して自由にプログラミングできるようになりました。
では、今回はここまで。