スマホで「重さ」を正確に測るアプリは作れるのか?

コラム

私たちの身近にあるスマートフォンには、加速度センサー、ジャイロセンサー、気圧センサー、マイクなど、非常に高性能な測定機器が詰め込まれています。しかし、キッチンスケールのように「上から押された力(垂直抗力)」を直接測る圧力センサーは搭載されていません。

スマホの画面の上にモノを置いたら、何グラムか表示されるアプリがあればすごく便利ですよね。直接測れないなら、どうにかして別のセンサーで代用できないんですか?

そこが今回のテーマです。物理法則をうまく利用して別の物理量に変換すれば、センサーのデータから質量 $m$ をあぶり出せるのではないか?そう考えて、限界まで思考実験を行いました。

結論から言うと、ユーザーに面倒な準備をさせず、スマホを置くだけで測れるアプリを作ることは「物理学的・数学的に不可能」であるという結論に至りました。

この記事では、高校物理の知識から出発し、どのようにして与えられた情報から正確な質量を求めようとしたのか、そしてなぜアプリ化を断念したのか、その全プロセスを共有します。

1. 静力学(釣り合い)への挑戦

質量 mm を求めるには、重力 mgmg と釣り合う何か別の力を見つける必要があります。まずは物が動かない「静的」な状態での計測を考えました。

1.1 気圧センサー × ジップロック(気体の状態方程式)

最近のスマホに搭載されている気圧センサーは、約1Pa(高さにして約10cm)の変化を検知できる超高精度なものです。スマホを少し空気を入れた袋に入れて密閉し、その上に物体を置いたときの「袋の潰れ具合(体積変化)」を気圧上昇から逆算しようと試みました。

理想気体の状態方程式 PV=nRTPV = nRT (あるいはボイルの法則 P1V1=P2V2P_1 V_1 = P_2 V_2)を背景に持ちつつ、上に物体を置いたときの力の釣り合いは、次のような式になります。

mg=ΔPAcontact+Ftensionmg = \Delta P \cdot A_{\text{contact}} + F_{\text{tension}}

  • mm: 求めたい未知の質量
  • gg: 重力加速度
  • ΔP\Delta P: 内部気圧の変化(スマホで取得可能)
  • AcontactA_{\text{contact}}: 物体と袋の接触面積
  • FtensionF_{\text{tension}}: 袋の表面がピンと張る力(フープ応力などの張力)

なるほど、気圧の変化 ΔP\Delta P に面積をかければ、物体を押し返す力になるわけですね。でも、接触面積って物体によって変わっちゃいませんか?

まさにそこが落とし穴でした。100gの「平らな板」と100gの「尖ったペン」では、袋との接触面積 $A_{\text{contact}}$ が全く異なります。

【断念の理由】 未知数である接触面積 AcontactA_{\text{contact}} をアプリ側で知る術がありません。さらに、袋の膨らみ具合や材質によって、袋自体が物体を支えようとする張力 FtensionF_{\text{tension}} が極めて非線形に干渉してきます。環境に依存する未知数が多すぎるため、スマホが取得できる ΔP\Delta P だけでは方程式を解くことができませんでした。

1.2 ジャイロ × タッチパネルの「デジタルシーソー」

未知の変数(袋の張力や接触面積)を排除するため、誰もが持っている「丸いペン」1本だけを使うアプローチを考えました。

机に置いたペンの上にスマホを載せ、シーソーのようにバランスを取ります。スマホのジャイロセンサーが「水平(傾き θ=0\theta = 0)」を検知した瞬間、ユーザーはペンの真上の画面をタッチします。タッチパネルはミリ単位の距離を測れる「デジタル定規」として機能します。

次に、10円玉(4.5g)などの基準となる重りを画面の端に置き、測りたい物体を反対側に置いて、再び水平に釣り合う位置を探します。このとき、「力のモーメントの釣り合い」が成り立ちます。

スマホの質量を MM、重心の座標を xGx_G、支点(ペン)の座標を xPx_{P}、測りたい物体の座標を xobjx_{obj}、10円玉の質量を m0m_0、その座標を x0x_0 とします。 支点周りのトルクの和がゼロになるので、

MgxGxP+mgxobjxPm0gx0xP=0Mg|x_G - x_P| + mg|x_{obj} - x_P| - m_0 g|x_0 - x_P| = 0

この式から、厄介な重力加速度 gg がすべての項から約分されて消去されます。事前キャリブレーションで MMxGx_G を求めておけば、未知の質量 mm は純粋な距離の比率だけで完全に導き出せます。

数式上は、摩擦や弾性といった不確定要素がゼロになる、極めて美しい解法です!地球上どこでも、重力加速度の違いを無視して測れます。

【断念の理由】 「スマホ自身の重さ(約200g)をカウンターウェイトにする以上、それより重いものは原理的に測れない」という致命的な欠陥がありました。また、丸いペンの上でスマホをミリ単位で釣り合わせる作業はシビアすぎて、実用性が皆無でした。

2. 動力学(振動・回転)への挑戦

静止した状態での計測が行き詰まったため、今度は「動き(振動や回転)」の中に質量を見出すアプローチへ切り替えました。

2.1 マイク × 紐(弦の固有振動数)

ギターの弦は、強く張られる(重いものが吊るされる)ほど高い音になります。机の端から紐を垂らし、物体を吊るして紐を指で弾き、スマホのマイクでその音の周波数を解析します。

両端が固定された弦の基本振動周波数 ff は、弦の長さを LL、線密度を ρ\rho、張力を TT とすると、波動方程式から以下の式で導かれます。

f=12LTρf = \frac{1}{2L} \sqrt{\frac{T}{\rho}}

ここで、弦を引っ張る張力は吊るした物体の重力に等しいので、T=mgT = mg です。代入して質量 mm について解くと、

m=4L2ρgf2m = \frac{4L^2 \rho}{g} f^2

つまり、質量 mm は「周波数 ff の2乗」に完全に比例します。紐の長さや材質を変えなければ、基準となる重り(500mlペットボトルなど)の周波数 freff_{ref} と比較することで、比例定数ごと約分して以下のシンプルな式になります。

m=500×(fobjfref)2m = 500 \times \left(\frac{f_{obj}}{f_{ref}}\right)^2

おおっ、音の高さだけで重さがわかるなんて魔法みたいですね!でも、測る前にいちいちペットボトルを吊るさないといけないんですか?

【断念の理由】 高木くんの言う通りです。理屈としては非常に正確に測れますが、ユーザーに「はじくと音が出る適切な紐」と「基準の重り」を用意するハードルが高く、「スマホを置くだけで測れるアプリ」というコンセプトから外れてしまいました。

2.2 加速度センサー × 片持ち梁(カンチレバー)

基準の重りを用意させたくないなら、「スマホ自身の質量 MM」を基準の重りにすればいい。そう考えて考案したのが、定規を使った振動解析です。

机の端から突き出した定規の先端にスマホをテープで固定し、指で弾いて上下に振動させます。スマホの加速度センサーで固有振動数 f0f_0 を測ります。次に、測りたい物体をスマホに載せて再び弾き、新しい固有振動数 f1f_1 を測ります。

片持ち梁を一つのバネと見なしたとき、その固有振動数 ff はバネ定数 kk と先端の質量を用いて以下のように表されます。

f=12πkMassf = \frac{1}{2\pi} \sqrt{\frac{k}{\text{Mass}}}

スマホのみの時(f0f_0)と、物体を載せた時(f1f_1)の2つの式を立てます。

f0=12πkM,f1=12πkM+mf_0 = \frac{1}{2\pi} \sqrt{\frac{k}{M}}, \quad f_1 = \frac{1}{2\pi} \sqrt{\frac{k}{M+m}}

この2つの式の比をとります。

f0f1=12πkM12πkM+m=M+mM\frac{f_0}{f_1} = \frac{\frac{1}{2\pi} \sqrt{\frac{k}{M}}}{\frac{1}{2\pi} \sqrt{\frac{k}{M+m}}} = \sqrt{\frac{M + m}{M}}

ここがこの数式のハイライトです。定規のヤング率や断面二次モーメントといった複雑な要素で構成される「バネ定数 $k$」が、比をとることで完全に約分されて消滅するのです!

これを未知の質量 mm について解くと、

m=M((f0f1)21)m = M \left( \left(\frac{f_0}{f_1}\right)^2 - 1 \right)

【断念の理由】 数式としては完璧です。しかし現実には、定規を机に固定する強さや指で押さえる位置がミリ単位でずれるとバネ定数 kk が変動してしまいます。また、厳密には「定規自体の有効質量」が振動に寄与するため、それを無視すると実用的な精度を出すのは困難でした。

2.3 ジャイロ × ねじれ振り子(慣性モーメント)

バネ定数すら気にしたくないなら、回転運動の「慣性モーメント」を使うしかありません。 スマホの中心に紐をテープで貼り付け、空中に水平に吊るしてねじるように回転させます。

ねじれ振り子の運動方程式 Id2θdt2=κθI \frac{d^2 \theta}{dt^2} = -\kappa \theta から、周期 TT は以下になります。

T=2πIκT = 2\pi \sqrt{\frac{I}{\kappa}}

スマホのみの慣性モーメントを I0I_0 とし、距離 rr の位置に質量 mm の物体を載せたときの全体の慣性モーメントは Itotal=I0+mr2I_{total} = I_0 + mr^2 となります。 先ほどと同様に周期の比をとれば、紐のねじり剛性 κ\kappa が約分され、質量 mm が導き出せます。

【断念の理由】 「スマホの重心に正確に紐を貼って空中に吊るして回す」という体験が、アプリとしてあまりにも異常すぎました。論外です。

3. 流体力学による「究極の解」

気体(空気)は温度で膨張し、固体(定規や袋)は材質によって弾性や摩擦が変わります。これらの「環境依存の未知変数」をすべて排除できる最強の物質が一つだけありました。 それが 「水」 です。水は縮まず(非圧縮性流体)、温度変化による体積のブレも無視できます。

気圧センサー × 水底(アルキメデス+パスカルの融合)

寸胴鍋(またはバケツ)に水を張り、密閉したスマホを水底に沈めます。水面に空のタッパーを浮かべ、その中に測りたい物体を入れます。

物体をタッパーに入れると、アルキメデスの原理によって、物体と同じ重さの水を押し退けようとします。タッパーの断面積を SS、水位の上昇を Δh\Delta h、水の密度を ρ\rho とすると、浮力と重力の釣り合いから、

mg=ρ(SΔh)g    Δh=mρSmg = \rho (S \Delta h) g \implies \Delta h = \frac{m}{\rho S}

となります。 一方、水位が上がれば、パスカルの原理により水底のスマホにかかる静水圧が ΔP\Delta P 上昇します。

ΔP=ρgΔh\Delta P = \rho g \Delta h

この2つの式を組み合わせると、驚くべきことが起きます。

ΔP=ρg(mρS)\Delta P = \rho g \left( \frac{m}{\rho S} \right)

温度によって変化しやすい「水の密度 ρ\rho」が、分母と分子で完全に約分されて消滅するのです。 残った式を mm について解くと、こうなります。

m=ΔPSgm = \frac{\Delta P \cdot S}{g}

未知の変数はゼロ。必要なのは「鍋の底面積 SS」を定規で測って入力することだけです。スマホの気圧センサーの圧倒的な分解能(1Pa)を考えれば、数グラム単位での正確な計量が可能な「究極の解」が完成しました。

やりましたね!密度も消えて、完璧な数式になりました!これなら絶対に正確に測れます!

ええ、物理学的にも数学的にも非の打ち所がありません。ただ、私たちは開発者として冷静になりました。 「鍋を用意し、水を張り、スマホを沈め、タッパーを浮かべる」——これはもはや、ただの不便極まりないキッチンスケールです。

おわりに:ソフトウェアの限界

「ユーザーに何の準備もさせず、スマホを置くだけで測れる魔法のアプリ」は、作れません。

質量 mm を導き出すには、必ず運動方程式や力の釣り合いの式を立てる必要があります。しかし、スマホのセンサーだけで外界の事象を測ろうとすると、摩擦、弾性、接触面積といった「未知の変数が、立てられる方程式の数を常に上回ってしまう」状態に陥ります。 連立方程式が解けない以上、ソフトウェアの力で物理的な制約を飛び越えることはできないのです。

今回の挑戦はアプリのリリースには至りませんでしたが、数式を捏ね回し、どうやって物理の壁をすり抜けるかを議論したプロセス自体は非常にエキサイティングでした。「不可能であることを論理的・数式的に証明する」というのも、開発における重要なステップです。

この「限界まで論理を詰める」プロセスを大切にしながら、今後も新たなプロダクト作りに挑戦していきたいと思います。

高橋 アイコン 高橋