OLYMPUS AIR A01 チルトもできるモーター雲台

シルバーウィークの連休初日は好天に恵まれた東京地方なのだけど、先日宅配されてきたラジコン用のサーボを使って、前に作ったモーター回転雲台にチルト機能を追加してみた。

チルト付きモーターヘッドサーボマウントをステッピングモーターの軸上の三脚ネジにナットで固定し、更にW 1/4のボルトでもってカメラも固定した。

当初から、回転するだけではなくチルトする(カメラを上下に傾ける)仕組みも欲しいと思っていたのだけど、なかなか簡単な方法が見つからなかった。ステッピングモーターをもう一つ使うことを考えていたのだけど、モーターを保持するマウントから作らないとならないし、下側の回転軸にかかる重さも増えるしで、今一つ気乗りがしなかった。
ラジコンなどの趣味はなかったので、サーボというものにちょっと前まで思い至らなかったのだけど、安いこともあって試しにGWS S03T 2BBという製品を買ってみることにした。
また、浅草ギ研という会社が、このサーボ用のアルミ製マウントを作って販売していたので、あわせて注文していた。

朝から組み立てているうちに、W1/4のボルトやナットがなんとか使えそうなことが分かり、特に加工することもなく、回転軸の三脚ネジの上にサーボマウントを載せ、サーボの「腕」にカメラを固定することができた。これでサーボが動けば、カメラは上下にチルトしてくれる。

チルト付きモーターヘッド駆動部分。下が回転担当のステッピングモーターで、軸上に三脚ネジ(エツミのメタルネジ)をマウントを介して装着している。その上に、サーボマウントをナット締めしている。

チルト付きモーターヘッドボルトの余りの部分にカメラのネジ穴をネジ込んでいるが、直接入れると傷だらけになってしまうので、厚手のゴムシートを挟んでいる。こうすることで、回転時のすべりも緩和できる。

動かしているところを動画にしてみた。動画ファイルのサイズの都合でYoutubeに置いた。

動画の最初は、ライブビューの端に置いた上下左右へのパン/チルトを指示するためのTextViewをクリックして動かしている。その後、ライブビューの上をタップしてモーター/サーボを動かしている。

ライブビューの上をタップした場合、タップした位置がほぼ中央になるようにモーターの回転やサーボの駆動を行っているが、画面上のタップ位置と回転するべき角度の関係は、ライブビューを捉えているレンズ(ズームレンズも含む)の焦点距離と、センサーの寸法によって決まる。
冗長な説明は避けるが、レンズの画角は 2atan(Sw/2f) で求められる(Swはセンサーの長辺または短辺長、fは焦点距離)。このことから、ライブビュー上(つまりセンサー上)で中心を上下左右に横切る軸を基準として、タップされたポイントを幅または高さの1/2を基準とした比率d(d = 0~1)で表すと、センサーの中心からの角度は、Ad = atan(Sw * d / 2f) となる(右半分、左半分、上半分、下半分で考えるので、画角のように2倍する必要はない)。
AIR A01の場合、水平方向ならばSwは17mm、垂直方向ならば13mmである。レンズの焦点距離はCAMERA KITのAPIを介してすぐに分かるので、タップされたポイントの座標とライブビューの幅/高さ(座標と寸法で比率を算出)が分かれば、回すべき角度は分かることになる。

ライブビュー上の任意のポイントが画面の中心になるよう駆動できるということで、AIR A01のもつ顔認識機能を活用し、認識結果の矩形の中心が画面の中央になるようにモーターやサーボで動かすことも容易だった。以前に載せた顔認識と自動撮影機能についても、モーターやサーボが撮影対象と決めた矩形(人の顔)が中心になるよう動作してくれる。現在のCAMERA KIT SDK(Android版)では、最大8つの顔認識矩形が通知されるから、その中のどれを選ぶか、の方が難しい問題かもしれない。

画面のタップによるモーター/サーボの駆動だが、スマホの画面だけを捉えると以下のように感じ(上の動画とは別の操作)。

不安定な構造物の上にカメラを載せているので、ピッチ角を動かすサーボは、指定した角度以上は回らないようにしている。
Android側からは「あと10°上に」とか「あと1°下」とかいった相対的なパラメータをもつコマンドを投げているが、サーボには絶対的な角度を与える必要がある。Arduinoの内部で、最後に設定した角度を記憶して処理しているが、安全のため45°以上前に倒れるようなコマンドは無視する、といった判断もしている。

Androidのアプリからは、先に水平方向の回転角を指示し、次のピッチ角の指示を投げている。とはいえ、水平回転が終わってからピッチ角がジジジッと変わるようではカッコ悪いので、Arduinoのスケッチには、これらが並行して動作するよう書いてみた。ただ、動画を見るかぎり余り並行動作感がないので、もっとモーターをゆっくり回してもいいのかもしれない。

チルト付きモーターヘッドArduino ADKにブレッドボードに載せたステッピングモーター用のドライバ基板を接続。サーボ用には、ブレッド上にピンを立ててそこから3本(Vservo, GND, Signal)出している。
サーボを駆動するための電源(Vservo)として、5V 1Aを供給できる三端子レギュレータを使った。入力電圧は12Vである。ヒートシンクも付けたのだが、それなりに熱くなってしまう。

Arduino側のプログラム(「スケッチ」と呼ぶ)では、Timer3、USB_Host_Shield2というライブラリを利用している。Servoライブラリも使いたかったのだが、これらを同時にincludeしていると、なぜかAndroidアクセサリの接続を認識できなくなってしまった。このため、Servoライブラリはあきめらて、ステッピングモーター制御と同様に自前で書いた。

Arduinoの緑の基板のむこうに小さなブレッドボードが見えているが、これには3軸加速度センサーモジュールを載せている。当初はAIR A01からピッチ角を得るつもりだったのだけど、どうやら何か不都合があるようなので、自前で角度を得るために用意した。サーボーの腕の横にでも両面テープで接着し、X軸とY軸の値を読んでピッチ駆動を制限する予定。またケーブルが増えてしまう。

サーボのケーブル処理の問題があるので、この構成では360°回転がいいところだろう。ただ、これはこれとして、全周パノラマの自動撮影とか自動合成とか、次の遊びのタネとなりつつある。
電動雲台にしても、180°程度の回転で妥協するならば、ステッピングモーターではなくサーボをもう一つ使い、サーボマウント同志を接続するば、パン/チルト程度の雲台はすぐにできてしまうんじゃないかな。