動機
うちの猫はかわいい。1歳、しろきじ、前の飼い主が買えなくなって最近来た。
とにかく抱っこが大っ嫌いだ。なのでよほどのことがなければ抱っこなんてしない。
だから体重が量れない!
爪が切れない!!(寝ているときにそっと切らせてもらう)
抱っこがダメな猫のために、良い体重の測り方はないものか??
市販の体重計は使えないのか?
普通に乗ることがない
餌を置いても、体重計をONにすると逃げる。
遠くにいると体重が見えない。
オートオフ機能
WIFIでとばす体重計があるらしいが、いつ乗るかわからんしね
体重量るのがめんどくさくなってしまう。
かわいい猫よ!!!人類の英知をなめるなよ!!抱っこしなくても体重くらい量ってやる!
ってことで、産業用、研究用なら24時間重さを計測するなにか変な物があるはずや!!
それが・・・意外とないんですよね。。
「上皿自動秤」「ばねばかり」が一番それに近いんです。アナログだし24時間量ってるようなもんだし・・・
カメラ仕込めば24時間量れるなぁ・・っと
でもこれブニョブニョして猫がいそうなところに仕込めないんですよ。そもそも小さいし・・
物理的に負荷が永遠かかっている状態って校正必要になるしなぁ・・・
重量センサーってないんですかね?って検索するとあるわ!。
こんな感じの金属
これから出る電圧をプリアンプ通してPCのオーディオインプットに入れたらいけるんじゃね??
96Khz24bitという無駄なサンプリングレートで体重を計測しまくるんや!!
(そもそもローカットされて入力されないじゃん!)
ってことでADコンバータにつなげる何かを・・・・そしたら
「ロードセル専用のA-DコンバータHX711」ってすげーー便利なもんがあるんですよ。
そうよね。。。あるよね。。センサーだもん。
AMAZONで早速購入!
「デジタルロードセル重量センサ20KGポータブル電子キッチンスケール HX711計量センサーモジュールArduinoと互換」
組み立て
いろいろ準備とかすっ飛ばしてこんな感じです。
20年ぶりくらいの電子工作ですよ!
ひさしぶりの半田付け・・・おっさんには・・こまかいっす。
余っていたRaspberryPiを使います。
AMAZONクオリティーなので配線図?とかデータシートとか一切なし。基盤透かして確認しました。
秋月電子でちゃんとしたの買ってください。安いし。。
1時間ほどしらべて、チップのどの足がどれにつながっていればいいか、やっとわかりました。。
(こちとら素人なんだよ)
くみたて、なんでグルーガン?ってのは・・・・この板に取り付けたからです。
幅400*350の板に設置したら、ユラユラでかさ上げしないと接地しちゃうんです。
かさ上げにはナットを使ってるんですが、この設置個所だと一度ナットを積み上げないといけないのでグルーガンです。
で・・・・
https://github.com/tatobari/hx711py.git
をcloneして校正して・・・
qiita的にここが重要だろう!!と思いますが他のqiitaの記事にあるのでそこは書きません。
今回は「猫と体重計」です!!
取得したデータをElasticsearchへ送ってKibana で確認。
一秒単位のグラフです。
猫があそんでるときに、たまたま計測した
世界で一番しょうもないと思われるElasticsearchとKibanaの使い方です。
なにも重さがかかってないときでも、+-4gほどノイズが乗るんですよ。
さらに最大20グラムの大きな波が30分間隔であるっぽい。
ここからが本題
このままだと、ユラユラでブニョブニョしてロードセルにしっかりと荷重がかからない。
ユラユラ揺れるので猫が乗らないという実用に耐えられない体重計が出来上がってしまいました。
これじゃぁー人間の体重計にもならん。
工作中にたまたま獣医師さんが見に来て、
「なにやってんすか(笑)」
「だっこできないから・・・人類の英知で・・・」
「ねこの体重そんなに量らなくていいですから!(笑)」
というやりとをする
本気出すぜ
もうここまで来たら引き下がれません。4ポイントでささえます。
秋月電子へ発注!
秋月電子のHX711は秒10回のサンプリング固定みたいです。
1枚で2つのロードセルを接続できます。
このターミナルって部品がね・・よくわからなくて。。ジョイントできるんですよ。
1枚はしらなくて無理やりくっつけた。
いろいろすっ飛ばしてこんな感じです。
困ったときのダクトテープです!
DIYだ!!
RaspberryPiの設置部分がなくて・・・収まりどころが悪くて・・・
ノミで削って・・・ノミの刃が切れなくて苦しかった。
こんな感じです。
プログラム
上記のgithubのソースを変えていきます。
hx = HX711(5, 6)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit_A(104.2003)
hx.set_reference_unit_B(-24.513)
hx.reset()
hx2 = HX711(13, 19)
hx2.set_reading_format("MSB", "MSB")
hx2.set_reference_unit_A(103.3425)
hx2.set_reference_unit_B(-23.62031)
hx2.reset()
hx.tare_A()
hx.tare_B()
hx2.tare_A()
hx2.tare_B()
while True:
try:
val_A = hx.get_weight_A(5)
val_B = hx.get_weight_B(5)
val_C = hx2.get_weight_A(5)
val_D = hx2.get_weight_B(5)
val=val_A+val_B+val_C+val_D
print(val, val_A, val_B, val_C, val_D)
hx.power_down()
hx.power_up()
hx2.power_down()
hx2.power_up()
time.sleep(0.8)
except (KeyboardInterrupt, SystemExit):
cleanAndExit()
2枚のHX711を使うので、二つのインスタンスを作ります。
4ポイントあるので合算します。
実際に使ってみてわかったこと
- hx711のデータシートを見るとBチャンネルはおまけみたいな感じでgain32固定です。
- 英語の理解が正しいかよくわかりませんがBチャンネルを使うには5Vを入力しろって書いてあります。
- Bチャンネルの入力は逆相になってる。(だからマイナスが返ってくる)
- Bチャンネルのgainが小さいからreferenceUnitが小さい
バグ
https://github.com/tatobari/hx711py/blob/master/hx711.py
のコードが間違っているので修正します。
def get_reference_unit(self):
return get_reference_unit_A()
selfがないので
def get_reference_unit(self):
return self.get_reference_unit_A()
こんな感じで修正。
完成!!
3700グラム付近を指しています。
寝始めから1時間後に20グラムほど軽くなってます。これは水分が抜けているのか??20グラムの波なのか??
猫がこのベッドで寝ているとき時間が分かるのでスゴイなぁ
ちょっと前に獣医師のところに行って量ったときは3666でしたので誤差ですね。(餌とか水分とか)
久しぶりに半田つかったので楽しかったです。