Arduinoで重さを数値化する!
人気のマイコンArduinoとセンサを使って、さまざまな物の重さをデジタルで計測してみる連載を全4回でお送りしています。教えてくれるのは、メディアアートの分野で、また「ちょっと深い仕組み」を解説する書籍の世界で活躍中の、伊藤尚未さんです。第2回の今回はArduinoを使って重さを数値化していきます。それでは早速見ていきましょう!
目次
こんにちは、伊藤尚未です。
前回、重さを計るセンサ=ロードセルの仕組みを見てきました。アルミの角棒に歪みセンサが貼りつけてあり、その抵抗値が変わることでホイートストンブリッジにより出力、センシングするという仕組みでした。
そこで今度はこの電圧値を読み取るには…というところで、実は思考停止しまして(汗)。
今回の制作で使用する部品:
名前、説明 | デバイス |
---|---|
ロードセル 秋月電子通商 | |
コンバータ 秋月電子通商 | |
ブレッドボード | |
ジャンパー線 | |
アクリル板 5㎜厚、ポリ座金、透明ゴム足、ねじ類 |
ホームセンターにて適当なものを購入 |
釣り用の錘 | 釣具店にて数種を購入 |
1.Arduinoで電圧はどうやって計るのか?
はて?Arduinoで電圧値ってどうやっているのだろう?
電圧があるということはそこに抵抗が仮想的にあると考え、analogRead()で取れないかとイメージしてみました。前回の実験でも0.1mVが1.9mVという変化を確認しました…が、いやいや約20倍の変化だとしてもあまりにも小さい。
確かシリコンベースのトランジスタが0.6Vで稼働するとか、ゲルマニウムダイオードは0.2Vで稼働とか、これに比べてもあまりにも小さい。しかもanalogRead()で読めたとしてもそのままでは1024の分解能なので、2kgのロードセルでもざっくり2g目盛りの精度ということになります。計りとしては1g目盛りの精度にはしたいところ…。
と妄想模索していたら、なんとロードセル用のコンバータがあるではないですか!
2.コンバータを使う
ということで、ロードセル用ADコンバータモジュール基板を早速購入。
まずは部品をハンダ付けし、稼働できる体制にします。とはいえ、実はほぼ基板は完成されているので、端子、コネクタを付けるだけです。
説明書を読むと一部ハンダジャンパーもせよとのことで、一応してみます。
これに使われているHX711というICのなかに、アナログ値を24ビットでデジタル値にするコンバータがあるそうで、特にロードセルに特化しているようです。
しかも購入した秋月電子さんがArduino用のサンプルスケッチまで公開しています。まさにこの工作のものではないかと!「渡りに船」にはそのまま乗っちゃいましょう。コンバータとロードセルをつなげてブレッドボードを使ってArduinoに繋げました。
で、サンプルソースをそのままアップロードしてみると…あ、もう、これ普通に使えるではないですか!シリアルモニターに変化がしっかり出ていますし、便利に「g」とか単位も表示されています。
と、とりあえずあまり確認もせずに走らせてはいけないのでしょうけれど、何もしなくても稼働確認できると、これは小躍りせずにはいられません。
さて、改めてサンプルスケッチの中身を見てみます。前段に設定値がいくつかあり、見るとロードセルの製品にそれぞれ合わせた設定値があるので、これに合わせましょう。ひとつ以外はコメントアウトしているので、どれかを選べばよいということでしょう。
//---------------------------------------------------//
// ロードセル S字型 SC301A 100kG [P-12036]
//---------------------------------------------------//
//#define OUT_VOL 0.002f //定格出力 [V]
//#define LOAD 100000.0f //定格容量 [g]
//---------------------------------------------------//
// ロードセル シングルポイント( ビーム型) SC601 120kG [P-12035]
//---------------------------------------------------//
//#define OUT_VOL 0.001f //定格出力 [V]
//#define LOAD 120000.0f //定格容量 [g]
//---------------------------------------------------//
// ロードセル シングルポイント( ビーム型) SC133 20kG [P-12034]
//---------------------------------------------------//
#define OUT_VOL 0.002f //定格出力 [V]
#define LOAD 20000.0f //定格容量 [g]
//---------------------------------------------------//
// ロードセル シングルポイント(ビーム型) SC616C 500g[P-12532]
//---------------------------------------------------//
//#define OUT_VOL 0.0007f //定格出力 [V]
//#define LOAD 500.0f //定格容量 [g]
(懇切丁寧で助かります)
さて、目指すは手で簡易に扱える程度の1㎏前後のものを計れるようにしようとイメージし、ロードセルは2㎏のものを使いました。
ん?ロードセルは2kgのものなのですが、サンプルの設定値にはちょうど2kgの設定値がないですね。これはどうしたものでしょう?と思いながらも、Arduino内部で数値として扱えるのですから、後で決まった重りなどを使ってキャリブレーションすればよいのでは?と楽観的に考え、とりあえずはロードセルのデータシートを見ながら、設定値を20,000のところを2,000にして、まずは何も考えずにロード。
#define LOAD 2000.0f //定格容量 [g]
しようと思いましたが、慌てない、慌てない!モノを乗せて計れる設えを作らなければキャリブレーションもできません。先に筐体を作りましょう。
3.筐体を作る
センサ稼働することが確認できたので、きちんと筐体を作ります。実際にどれくらいの精度なのか、キャリブレーションするにしても重りを載せる皿も必要になるわけですし、まずはアクリルで作ってみました。
5㎜厚のアクリル板を10㎝×8㎝にカットして、ロードセル取り付け用の穴を開け、サラも切っておきます。
ロードセル側には5mm径と4㎜径の穴がふたつずつ空いており、すでにタップ(メスねじ化)されているのでM5とM4の皿ねじで止めようと思います。5㎜径の方は台、4㎜径の方は皿の方になるようにします。ここでもロードセルに「こっち側に荷重かけますよ」という目印もあるので分かりやすいですね。
台がブレてはいけないので、ゴム足を付けました。
錘を載せる皿もアクリルで作りましたが、これもロードセルのシリコン部分に当たらないように台と同じくポリ座金5枚程度、スペーサーにしています。
これで一応計りとしての筐体ができました。
4.実際に動かしてみる
さて、動かしてみると快適に反応します。しかもシリアルモニタで小数点以下まで表示されているので、嬉しい!普通のデジタル計りでは大体1g目盛り単位なので小数点まで分かるとは!と感心しています。
24ビットの分解能を持つコンバータの能力になにか感動を感じます。実際には小数点以下はブレていますが、気にしません。
AE_HX711 test
-0.003 [g] (0xd18c)
0.005 [g] (0xd19d)
0.012 [g] (0xd194)
-0.002 [g] (0xd199)
0.000 [g] (0xd1bc)
-0.001 [g] (0xd1a0)
0.011 [g] (0xd1c6)
0.012 [g] (0xd1b9)
0.002 [g] (0xd1ca)
-0.002 [g] (0xd185)
0.015 [g] (0xd1a5)
0.006 [g] (0xd1a5)
さて、ここで基準となる重りを乗せてキャリブレーションしたいと思いますが、標準となる精密分銅は高価なので、何か他のものを代用しようと思います。他の計りで計ったもので校正できればよいかと。そこで思いついたのは釣りなどに使う錘、これを代用しました。
あれ?釣りの錘に書いてある数字は重さ表示ではないのですね?
釣りをやられている方には当たり前のことでしょうけど、この錘は「号」で表示されており、何グラムか分かりません。
調べてみますと1号は3.75gと決まっているようです。これは尺貫法を元にしているようで、1匁(もんめ)が3.75g、1000匁で1貫(かん)つまり3.75kgということです。ということで40号が150gになります。
ここで閑話休題。
では、「号」ではなくそのまま「匁」表記で良いのでは?と、これも想像(たびたびこういう妄想が入ります)ですが、釣りの錘は、重さを計るためのものではないので正確性はさておき、目安としての数値表記が必要だろう。またその扱いから誤差が生じやすいと考えられ、わざわざ違う呼び名にされたのではないかと…。
自分が知らなかったことを知るって楽しいことですね。ちなみに既存の計りで計ってみると確かに20号は75g(近似値)でした。
5.重さ比べをするために
今回は重さ比べをするゲームを作ろうと思っていますので、何かを乗せて、それが設定値と同じ(誤差も設定)か、重いか、軽いかを判断できれば目標達成です。なので厳密なグラム数が必要なわけではないのですが、一応錘で計れるようにしたいと思います。
で、作ったものに20号の錘を乗せてみると、シリアルモニタには244gと出ています。かなり校正が必要そうです。
さて、サンプルソースを見ながら定格出力の数値をいじくって、近い値になるようにしてみました。
#define OUT_VOL 0.00068f //定格出力 [V]
(これで何となく近い値になりました)
他にも載せて試してみます。
これで何となく計りができたようです。この初期に乗せた錘の重さを記憶しておき、次に乗せるものがどれだけ違うのか、ということを判断できる装置にすれば、重さ比べゲームはできそうですね。
重さを比べた後にどういう反応をさせるかということもイメージしながらハード、ソフトに手を加えていきます。
次回もお楽しみに!
今回の連載の流れ
第1回:電子計りの仕組みと圧力センサを使った重さの計測
第2回:Arduinoで重さを数値化する!(今回)
第3回:重さ比べで遊べる機械を作る!
第4回:有名なあのシーンを再現してみる!