シャアザクカメラのソフト

動画公開からだいぶ時間があいたけど、BB戦士のシャアザクWiFiカメラとラジコンサーボを仕込んで、Android端末で操作&映像の表示する装置のソフトのソースを公開しました。

Androidアプリ

【ソース】 http://licheng.sakura.ne.jp/charzaku/CharZaku_Android.zip
このアプリは、
(1) microbridgeでArduinoと通信し、サーボ(シャアザクの首)を制御する。
(2) HTTP通信でWiFiカメラ(CS-W07G-CY)からカメラ画像を取得する。
という2つの機能を独立に処理しています。CharZakuクラスがこのアプリのメインのアクティビティです。
(1) サーボの制御
画面上のSeekbarを動かすとそれに応じてサーボが動きます。サーボの制御は後述するArduino側でおこなっており、Arduinoとの通信にはmicrobridgeを使っています。このアプリはmicrobridgeのServoControlというデモアプリをベースに作成しました。microbridgeに関してはお習字ロボの記事(Androidアプリ編)を参照して下さい。
(2) カメラ画像の取得
WiFiカメラ(CS-W07G-CY)から取得した画像を画面に表示します。カメラ画像の要求と取得はHTTP通信でおこなっています。CharZaku.updateCamImage()がカメラ画像取得処理です。HTTPリクエストを投げて、HTTPレスポンスからビットマップ画像を生成しています。この処理は時間がかかるのでメインスレッドで実行すると画面が固まったりします。そのため、別スレッドで実行しています。カメラ画像取得スレッドを生成・開始しているのが、CharZaku.connectCam()です。このスレッドで、20msのスリープをおいて繰り返しupdateCamImage()を実行しています。
カメラ画像の取得は別スレッドで実行しますが、画面の描画はメインスレッドで実行しなければなりません。そのためupdateCamImage()の最後で、画像取得を通知するメッセージを画像データとともに、メインスレッドに送っています。このメッセージを受け取るハンドラがCharZaku.mHandlerです。このハンドラは、画像取得通知メッセージを受け取ると、画像データを画面に表示します。

Arduinoスケッチ

【ソース】 http://licheng.sakura.ne.jp/charzaku/CharZaku_Arduino.zip
Arduinoはサーボ1軸(シャアザクの首)の角度制御に用いているのみです。Android端末との通信はmicrobridgeを使用しています。microbridgeおよびServoクラスに関しては、お習字ロボの記事(Arduinoスケッチ編)を参照してください。
このスケッチは、ほとんどmicrobrigdeのサンプル(Demo)そのままですが、いちおう簡単に説明します。冒頭で1個のサーボ(首の回転用)を制御するためにServoクラスのオブジェクトを定義します。

// 首のサーボ
Servo servo;

初期化では、まずサーボの制御パルスのピンを設定し、初期位置の角度を指令します。

  // サーボのピン設定
  servo.attach(6);
  // サーボの角度初期値
  servo.write(90);

【参考】 Arduino日本語リファレンス: http://www.musashinodenpa.com/arduino/ref/

続いて、Androidとの接続を設定します。

  // ADBの初期化  
  ADB::init();
  // ADB接続を開く
  // TCPのポート4567、自動再接続有効、イベントハンドラの登録
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler); 

メインループではADBをポーリングするのみです。

  // ADBのポーリング
  ADB::poll();

Androidからメッセージの受信があったときは、adbEventHandler関数がコールバックされます。メッセージは1バイトのunsigned char型データで、そのまま首のサーボの指令値(0〜180度)です。これをサーボに指令します。

  servo.write(data[1]);