「ひまわりスタンド」自動で丁度良い角度に調整してくれるスマホスタンド
スマホスタンドって、動画を見るときなどに便利ですよね。私はよく、キッチンで料理するときにスマホでレシピ動画を再生します。このときスマホスタンドを使うのですが、キッチン内での立ち位置によっては、スマホの画面を見にくくなってしまうことがあります。こんなとき、スマホスタンドが自動で丁度良い角度に調整してくれたら便利ですよね。そこで今回、そんな夢のようなスマホスタンド「ひまわりスタンド」を製作してみました!
なぜ「ひまわり」かというと、ひまわりの花には太陽の方向を向き続けるという性質があるからです。(向日葵という漢字からも分かりますね!)
使用部品
- Raspberry Pi 4
- Androidスマホ
- サーボモータ(SG-90)
- ジャンパワイヤ(オス-メス)
- スタンド(3Dプリンタ製)
- ネジ・ナット類
システム構成
Androidスマホのインカメラで顔を検知し、Raspberry Piを介してサーボモータを駆動しスタンドの角度を調整します。2つのサーボモータで横方向と縦方向の角度調整が可能です。
実装
今回使用したサーボモータ(SG-90)はデータシートによると、周期20msのPWM信号のパルス幅を0.5〜2.4msの範囲で調整することで、角度を-90〜90度の範囲で指定し駆動することができます。
Androidアプリとの通信のため、Raspberry Pi上にWebサーバを構築しました。HTTPリクエストによって、サーボモータを指定した角度に駆動できます。
Raspberry Pi上のプログラムは、Rustで記述しました。主な使用クレート(外部ライブラリ)は、GPIO制御のrppalとWebサーバのactix_webです。
Androidアプリではリアルタイムでの顔の検出とスタンドの角度変化量指示値の計算、送信を行っています。 顔の検出にあたっては当初CloudVisionAPIを使用する予定で実装したが、逐一通信を行わなくてはならなかったために処理が遅くなってしまったため、MLKitを使用する方針に転換しました。 MLKitはGoogleが提供している、オンデバイス機械学習をAndroidやiOSで利用できるようにするためのSDKであり、この中のFaceDetectionというAPIを用いてカメラの映像からリアルタイムで顔を検出しています。処理の手順は以下の通りです。
- カメラの映像からMLKitのFaceDetectionによって両目の座標を取得
- 両目の座標の平均を取って眉間の座標を計算
- 眉間の座標と中央の距離にゲインをかけて角度変化量指示値を計算
- 指示値をRaspberry Piに送信
ゲインは試行錯誤的に決定しています。 また、顔検出は毎フレーム実行されているが、Raspberry Piへの指示値の送信は0.1秒間隔で行っています。
スタンドは3Dプリンタで製作しました。
動作例
頭の動きにスマホスタンドが追従してくれています!
最後に
今回、自動で丁度良い角度に調整してくれるスマホスタンドを製作しました。ただし、以下のような課題があります。
- スマホをスタンドに取り付ける機構が未完成(現在はテープで固定)
- 通信が不安定
- アプリのバックグラウンド実行非対応
- iOS非対応
これらに対処すれば、より実用性の高いスマホスタンドになるでしょう!
コメント