ESP8266 wifiで動かす電動雲台

しばらく時間があいてしまったが、Arduino ADKにESP-WROOM-02を接続し、PCやスマホからwifiでもって雲台を操作する話。

wifi雲台 全景

ブログを見直してみると、前回はArduino ADK上に簡易httpdを実装し、PCのブラウザからリクエストを投げて、レスポンスを得たところまで書いていた。実のところ、そこまで動けばあとは簡単なのであまりモチベーションが上がらなかったのだけど、一応年内に区切りをつけたかったので取り急ぎまとめておくことにした。

雲台を構成するパーツについて

雲台には、回転用と傾斜用の2つのラジコンサーボを用いている。

wifi雲台 サーボこの写真でいくと、左側が傾斜用であり、右側が回転用になる。
傾斜用サーボの「腕」にはカメラの三脚穴にねじ込むためのW 1/4のボルトおよびナットを着けてある。2つのサーボのあいだは、浅草ギ研のサーボブラケット同士を普通に接続してあり、回転用サーボの基部にはタカチのMB-S1という小型のアルミケースを着けてある。

wifi雲台 基部アルミケースの底には、エツミのメタルネジという三脚ネジ用のパーツを使っており、このネジ穴で三脚に固定する。

wifi雲台 基部2基部にアルミケースを使ったのは、穴開け以外の加工が不要だから。左側に見えるアルミケースの底側中央に8mmの穴をあけてメタルネジを飛び出させ、適当にスペーサーを挟んで蝶ナットで固定している。W1/4規格のボルトナットなどは、ホームセンターで購入した。
右側がケースの上部側になるが、サーボブラケットをビス4本でネジ止めしてある。

wifi雲台 上部雲台上部(カメラ取り付け側)は、サーボブラケットからW1/4のボルトの頭を飛び出させ、スペーサーでもってカメラのネジ穴に具合が良い程度にネジを残している。

wifi雲台 上部カメラを装着する際には、傷をつけたり動作中に緩んだりしないよう、防振ゴムをかませている。

制御ボード

wifi雲台 基板制御は、Arduino ADK上のスケッチで行う。シリアルポート(Tx1, Rx1)に手前側の小型ブレッドボードに載せたWROOM-02を接続している。以前掲載したものと同じように、このブレッドボードにはArduino ADKの5Vピンから3.3Vを得るための三端子レギュレータが載っている。ArduinoのI/Oピン2本をサーボの駆動パルスに用いるため、向こう側のブレッドボードに引出し、5V出力の三端子レギュレータによって得るサーボ用の電源とともに2つのサーボに接続している。

なお、サーボ用の三端子レギュレータ(TA4805S)とArduino ADKのVinには、12VのACアダプタの出力を接続している。大きい方のブレッドボードの左端に載せているのが、5Vを作るための三端子レギュレータを載せた基板で、12Vから5Vを作ってやるとそれなりに熱を出すのでヒートシンクも着けておいた。

スケッチのこと

WROOM-02をhttpdとして動作させるためのコードは、前回掲載したものに若干手を入れた程度で、回転用および傾斜用サーボの角度(0~180)をリクエストパラメータとして得て、サーボに駆動パルスを与える。駆動パルスとは、目標角度を表す1~2msec幅のHパルスを、15~20msecに一度の頻度で発生させるだけである。
今回の実装では、回転が終了するまでリクエストの応答(200 OK)を返さないようにしたので、タイマ割り込み等は用いず、目標角度に達するまで15~20msecごとにパルスを与える続けるようなループ処理にした。

実際のところあまり整理がついていないので、今回はソースコードを掲載しないことにした。

スマホ側

たとえばWEBブラウザから所定のリクエストを送ればサーボはジージー言って動いてくれるわけなのだけど、少々考えるところがあって、今回もAndroidのアプリを作ることにした。

スマホ wifiESP8266_AP というのが、今回のwifi雲台のアクセスポイント名であり、スケッチにそのように書いた。

スマホ wifiの詳細いちおう、wifi接続の詳細を見てみると、すぐそばに置いてあるので当然電波強度は強い。セキュリティやIPアドレスについても想定した値で接続できていることが分かる。

WifiTapServo 画面今回作ったアプリは、スマホとArduino ADKをUSBで直結してサーボを動かしたときのアプリをより単純にし、画面上の矩形内をタップすると、タップ位置のX座標から回転角(0~180°)、Y座標から傾斜角(やはり0~180°)を算出する。中央がいずれも90°であり、サーボのニュートラル位置にあたる。
タップすると赤い丸を描画してhttpリクエストを実行するスレッドを開始し、スレッド内で応答を受信すると同じ位置に青い丸を描く。そして、右下のHOMEボタンをタップすれば、ニュートラルに復帰する。
画面にはFocal Length: という入力フィールドがあるが、ここに値(レンズの焦点距離)が入力されている場合、カメラが捉えているライブビューがタップされたときと同様に、その位置がライブビュー上で中央になるよう、回転と傾斜を行う。その仕組みについては、9月に書いていた

ライブビューは別のスマホなりタブレットに表示し、それを見ながらwifi雲台制御用のスマホの画面をタップするのでいいんじゃないかな、という発想で作ってみたのだけど、各種APIが公開されているAIR A01を載せるならば、やはりライブビューを表示するスマホで雲台も操作したい。しかしながらO.I.Shareしか使えないOM-DやPEN、あるいはオリンパス社以外の、wifi接続可能なカメラを使うとすれば、こういうやり方しかないだろう。

アプリを使って雲台を動かしている動画をyoutubeにおいてみた。

操作用のスマホとしてはMNPした空家のものを使った。焦点距離は未入力で、Slow というチェックを入れた状態で開始。適当に動かしてからHomeボタンでニュートラルに復帰させ、Slowチェックを外して動かしている。
Slowがチェックされている場合、Arduinoが維持している現在の角度からhttp経由で指定された目標角度まで、およそ20msecに1°ずつ変位させている。チェックされていない場合は、指定角度に相当するパルス幅をいきなり与える。いずれの場合も、目標角度が現在角度に達した以降はその角度に相当する幅のパルスを与え続けるようにした。その方が安定して動く感じだし、トルクも出るのでは?と思ったのでそのようにしたが、果たしてどうなのか。

次のステップ

やはり、ライブビューを表示し撮影操作しているスマホで雲台の動きも操作したくなってきた。スマホのwifiがAIR A01への接続専用になっているので、雲台を操作するには別のスマホやPCを使うこと以外考えもしなかったのだけど、これを1台で済ます方法は目の前に転がっていた。

つまり、雲台のwifiアクセスポイントに接続するためのwifiステーションをWROOM-02を使って別に作り、それをArduino ADKで制御すればよい。AIR A01を制御するアプリから、同時にUSB経由でArduino ADK上のスケッチにコマンドを投げるようなアプリはすでに書いている。

実際は、現行のArduino ADK + WROOM-02の構成はそのまま残してスマホにUSBでつなぐ。Arduino をもう一つ買うのはもったいないので、雲台制御用のプログラムなんかはWROOM-02単独で動作させるようにし、必要な電圧変換や電源措置を考えればよい。1月中にはなんとかしたいところ。