Android
Arduino
GoogleMapsAPI
SkyWay
GoogleDriveAPI

セルラードローンの自作 Part2 (CelluCon(セルコン))

2017.11.11現在、サンプルアプリがうまく動かないようです。

2017.11.16に修正しました。
アプリ APKを https://github.com/i386koba/CelluCon.Android/raw/master/app-debug.apk からスマフォにダウンロードして、Androidの設定で「提供元不明アプリを実行する」として実行してください。

以前Qiitaに投稿したスマフォをラジコンに乗せて,WebRTCですごく遠くから操縦できるモノ作ってみた。(セルラードローンの自作) の続編です。
一年以上ほったらかしにしてしまいましたが、これをちょこっと紹介する機会があり、分かりにくいところを直したので、Qiitaも更新してみました。
縁あってこのような辺境の地にたどりついた皆様、今回は多くの人が実装できるように、できるだけ簡単に実験できるように説明したつもりですが、わからないところあればご指摘ください。
また、「セルラーRC」という名前で出していましたが、人に紹介する機に、名前をラジコンのような簡単な名称にしようと「セルコン」と改名ました。

CelluCon セルコン とは

  • セルラーコントロール(CellularControl)を短くしてセルコン。
  • 遠方のラジコン模型のライブ映像、GPS位置、センサ情報を携帯電話網(セルラーネットワーク)で確認し、操縦できるシステムのこと。
  • WebRTCの接続サービスSkyWayを利用してメディア、データ、操作コマンドをAndroidとWebブラウザでやり取りしています。
  • 私とは全く関係ないですが SkyWayの事例紹介(IoT)のRomoは, GPSと地図表示機能はないようですがセルコンに似ています。
  • WebRTC Conference Japan(2015?)で「ROMO TURISMO powered by SkyWay」の展示のようすが、以下のから視聴できます。

https://youtu.be/oO-WjCKX9LY

  • そのほか、SkyWayにある事例紹介で同じような仕組みのものがいくつかあります。

システムの概念図
alt

  • スマートフォンをラジコン模型に搭載させて、スマートフォンのカメラ映像とGPS、外部センサによる情報を、インターネットにつながったPCのWeb画面上から確認できます。
  • PCのマウスかゲームパッドを操作すると、スマートフォンのBluetoothより、ラジコン操作コマンドが発信されます。
  • スマートフォンからのBluetoothを受信するArduinoマイコンが、ラジコン操作コマンドでラジコンのサーボ、ESC(スピードコントローラー(駆動モーターのコントローラー))を制御します。

オープンソースとして https://github.com/cellucon/ で公開しています。

  • けど、GitHubより、このドキュメントの方がまとまっています。そのうちGitHubも整理します。
  • しかも、GitHubも素人なので、いまのところプルリクエストされたこともないですが、頑張ろうと思っています。

とりあえず様子を知りたい人

スマフォカメラ画像とGPS情報をWeb画面にWebRTCのSkyWayを使って転送してます。
実際にラジコンを操作するまでには、後述するようにラジコン買ったり、マイコン半田付けせねばならないので、とりあえずスマフォカメラとGPSのGoogleMap表示の様子を知りたい人は以下のようになります。

 Android

  • アプリ APKを https://github.com/i386koba/CelluCon.Android/raw/master/app-debug.apk からスマフォにダウンロードして、Androidの設定で「提供元不明アプリを実行する」として実行してください。
  • アプリを起動するとGoogleIDを聞かれます.使用するGoogleIDを選択するか、追加してください。
  • 初回はGoogleドライブへのアクセス権限を確認
  • ログインしたGoogleID の GoogleドライブにWebRTCのPeer.JSコネクションID が保存されます。
  • PeerIDが、Googleドライブに保存されますと、「PeerID update!」とスマフォ画面の中段左に表示されます。

Googleドライブにアクセスする理由

サンプルアプリでは、WebRTCの接続サービスSkyWayを利用してAndroidとWebブラウザとメディア転送とデータ転送行っていますが、接続初回にお互いのPeerIDを相手に知らせなければなりません。
なので、AndroidからGoogleIDで認証して、認証したGoogleドライブに取得したPeerIDの記述したファイルをアップロードしています。
Web画面でもGoogleIDで認証して、GoogleドライブにあるPeerIDのファイルを読みこみ、AndroidのPeerIDを取得しています。

2017.11.11現在、サンプルアプリがうまく動かないようです。

2017.11.16に修正しました。
初回のGoogleドライブへのアクセス権限の確認、UserRecoverableAuthIOException が発生した際の動作をコメントアウトしていました。(GoogleドライブをAsyncTaskで操作するようにしたとき、AsyncTaskのクラスを別ファイルにしたとき、startActivityForResultにエラーが出てコメントアウトしてた。)
自身のGoogleアカウントは一度権限を許可されていたので、UserRecoverableAuthIOException が発生せずに、コメントアウトしていても動いていたので、気が付きませんでした。

参考:グーグルのAPIを使うときに欠かせないGoogle OAuthの作り方と使い方 (3/3)
http://www.atmarkit.co.jp/ait/articles/1509/15/news017_3.html

Web操縦画面

  • https://i386koba.github.io/CelluCon.web/ からWeb画面を開きます。
  • Androidアプリで保存したPeerIDを、Web画面からGoogleドライブにアクセスするため、画面中段右の「Authorize GoogleID」ボタンを押してください。
  • GoogleIDの選択ポップアップが出ますのでAndroidアプリでログインしたGoogleIDを選択してください。
  • この後、「このアプリは確認されていません」と出ます。Google、未承認アプリに警告画面 フィッシング詐欺対策を強化にありますように2017年7月18日より、セルコンのようなGoogleの承認プロセスを通過していないWebアプリでは、このような警告が出ます。
  • 警告画面の「詳細」をクリックして「i386koba.github.io(安全ではないページ)に移動」をクリックしてください。(安全ですよー。疑わしい人はソース見てください)
  • 386koba.github.io に移動するには、「次へ」を入力してくださいと出ますので入力してください。
  • i386koba.github.io にアクセスを許可しますか?で許可をクリックしてください。
  • テキストエリアに「Google drive load PeerId file.…」と表示されてIDを読み込みに行きます。
  • PeerIDが読み込まれてPeer接続できると、Androidアプリにカメラ映像が表示され、Web画面にも表示されます。スマフォのGPS情報でGoogleMapが表示されます。

    Goolgeの認証で毎回ユーザーを選択したかったのですができていません。
    さらに使用している gapi.auth.authorize APIもすでに非推奨なので、そのうち変えなければです。

  • SkyWay Peer 認証サンプルも知らぬ間にありましたが、軌跡の記録にもGoogleDrive使っていますので、認証もこのままGoogleDriveで行う予定です。

以下 SkyWay Peer認証サンプルについて @yusuke84 さんよりコメントありました。

SkyWayの認証機能ですが、APIキーの不正利用を防ぐためのものです。
new Peer()する際(シグナリングサーバへ接続する際)に、お客様が用意した認証サーバで生成したクレデンシャルを渡し、シグナリングサーバでそのクレデンシャルが正規のものかを検証、正規のもの以外であれば接続を拒否します。文脈から、ひょっとすると、 @i386koba さんが考えられているものとは違う可能性がるので、コメントさせてもらいました。

おっしゃる通り勘違いしておりました。、また、PeerIDの交換についてもコメントいただきました。

PeerIDの交換についてですが、一番簡単に実装する方法は、listAllPeers()を利用して、PeerID一覧を取得し接続先を選択するという方法になると思います。
その代わり、listAllPeers()は誰でもAPIキーがわかれば利用できてしまうため、注意が必要です。
接続先のPeerIDを外に漏らしたくない場合は、書かれているように、認証機能の付いた何らかのユーザ管理の仕組みを利用するしかないと思います。

私も当初はWeb画面でlistAllPeers()を使い、IDのリストを選択するようにしましたが、現状一つのAPIキーで複数人が使う設定なので、Googleドライブを用いています。
ただ、APIキーもソース内に書かれておりますので、listAllPeers()によってPeerIDはダダ洩れですね。
権限(listAllPeers APIを利用する)をOFFにできるようなので、OFFにした方がいいですね。

セルコンで用意するもの

スマートフォンを乗せるラジコン

alt

私の使用してているラジコンカーは、

  • タミヤ 1/10 XBシリーズ No.46 XB グラスホッパー 2.4GHz プロポ付き塗装済み完成品 Amazon ¥ 12,386。

素性のわかるESC,サーボのついたラジコンカーのなかで一番安いものを選びましたが、人に見せたときに「まだグラスホッパーあるんだ、懐かしー。」といわれました。(1984年5月発売、その後2005年6月にタミヤより再発売とのこと)。
発売当時はオフロードバギー・ラジコンカーブームの真っ只中、1983年からコロコロコミックスの漫画「ラジコンボーイ」などでタミヤのRCが人気があったようです。
当時は中学生でしたので、すでにコロコロは読んでおらず、「ゲームセンターあらし」しか記憶にありません。私より少し下の年代ではグラスホッパーはメジャーなんでしょうか?。
「やっぱり子供の頃ラジコンで遊んだしょ?」と聞かれまして、「ええ、まぁ」とお茶を濁しましたが、タミヤのRCは高嶺の花、とても買えませんでした。どうでもいい情報でした...

  • 上記完成品を購入し、セラコンを構成すると、プロポと受信機が余ります。余らせたくない人は以下のキットを個別に購入すればよいのですが、組み立てが必要で、スピードコントローラー 、サーボ 、バッテリー・充電器が別売りです。

  • タミヤ 1/10 電動RCカーシリーズ No.346 グラスホッパー キット Amazon ¥ 5,444

RCキットとサーボ等を揃えると合計¥10,270。
https://github.com/cellucon/What_is_CelluCon/wiki/RC-kit にキット部品の購入先をまとめてみましたが、完成品買ったほうがいいと思います…
その他のAmazonとかで数千円で売っている完成品ラジコンでも、サーボPWMで制御しているものだったら使えるはずです。ただ、ネット上の情報だけではサーボPWMでやってるかはわからないので、もし手元にあるラジコンを分解して調べてから、元とに直せる人は挑戦して見てください。「これが使える!」とかあれば教えていただきたいです。

検証はしていませんが、

  • Wltoys A959 1/18 1:18 スケール 2.4G 4WD 四駆 オフロード車 バギー RC カー Amazon¥ 6,575

はサーボとESCが写真には写っています。(レビューに受信機はESCと一体型とあるんで、ESCは別購入かな。)

ラジコン以外の乗り物の場合

とりあえず動けば良い、RCカーでなくても良いなら、タミヤ タンク工作基本セットなどが安くていいとおもいます。私も最初はこれでした。

  • タミヤ タンク工作基本セット 秋月電子 ¥1,170

ただし、サーボPWMでは動かないので、別のハードとスケッチを作らねばです。
まだ、まとまっていませんが https://github.com/cellucon/TAMIYA-tank に書きはじめています。

ラジコン「カー」でないもの、飛ばすのはNG。

Arduinoからサーボ用PWMが出しているので、ブラシレスモーターなどいくつも動かすことはでき、4chサーボの航空機なども操縦可能ですが、携帯電話を空に飛ばすのは違法。

Q。携帯電話等を無人航空機に搭載した試験を行いたいのですが、誰でも免許申請できますか。
A.実用化試験局の免許人は携帯電話等事業者となりますので、携帯電話等事業者以外は免許申請を行うことはできません。

  • つまり、Docomoとか携帯電話等事業者は携帯電話を空に飛ばせるが、一般人はだめ。

セルコン専用基板

セルコン専用基板スケッチは、ArduinoのアナログポートからRCバッテリ電圧、ホイル回転パルスカウント、GPSモジュールのデータなどを送るように実験的に設計していますが、うまくいっていないこともあり、最近はほとんどいじってないです。
とりあえず以下のラジコンを動かすためだけの最小構成なら確実に動くと思いますので、最初はこちらから動作させてみてください。

Bluetoothを受信するArduinoベースマイコン 最小構成

タイヤの回転数やラジコンバッテリーの電圧などは測定できないですが、スマフォのGPS情報とカメラ画面をみながらラジコンを操作できるセルコンを実験出来ます。

接続図
alt
回路図 よりわかりやすいかと、接続図は fritzing で作図してみました。
しかし、ラジコンバッテリやブラシモーターESCはfritzingのパーツが見つかりませんでした.
(見つからないパーツを作ろうかとおもったんですが、GitHub で別のESCのパーツを見つけたので、とりあえずそれにしました。いずれはESCパーツを作成しようかと思っています)
図中のバッテリは実際は7.4Vで、ESCはブラシモーター用のになります。

  • ハードウェアのライセンス Creative Commons License CC-BY-SA クリエイティブ・コモンズ・ライセンス

 部品

BluetoothでもBLEのモジュールは安いんですが、SPPがないので使えません。

  • マイコンの5Vシリアル信号をBTモジュールRN-42の3.3Vレベル入力用に電流制御する抵抗 10KΩ

普段は分圧抵抗で3.3V にしていましたが、http://www.cepstrum.co.jp/hobby/5v33v/5v33v.html
より、直列抵抗にしてみました。RN-42はシリアル5V耐入力と明記されていませんが 、抵抗無しの5vシリアル直付けでも動くとのブログ報告もありました。

  • BTモジュールRN-42電源用 5V-> 3.3V レギュレータ (例)秋月電子 LP2950L-3.3V ¥20

BTモジュールRN-42の消費電流40mAとのこと、レギュレーター電流は100mAあるのでOK。
セラコン 0.1uF、電解コンデンサ 47uF、10V以上を付けます。

 こちらのほうが便利

XBee用2.54mmピッチ変換基板に3.3V レギュレーターが実装されていますので、こちらを使ったほうが便利でしょう

サーボ用ヘッダピンはセンターピンが5V、サイドがPWM信号、GNDとなっており、逆差ししても、信号線やGNDが逆電圧にならず、サーボやマイコンが壊れない様になっています。
タミヤのサーボソケットの場合、センター5Vが赤色、GNDが黒、信号線が白(FUTABA仕様)となっています。
ほかのメーカーではGND茶色、信号オレンジ、黄色など。
サーボソケットの色は「servo pinout」で画像検索すれば詳しくわかるかと思います。

接続図をもとに、各部品をユニバーサル基板上にはんだ付けします。
(基板を作ろうかとも考えています。できたら紹介します。)

マイコンのプログラム

Arduinoマイコンにスケッチを https://github.com/cellucon/arduino.mini/blob/master/cellucon.mini.ino からダウンロードして書き込んでください。

マイコン電源

Arduinoとサーボの5V電源はESCのサーボ端子から供給される5V電源(BEC「Battery Eliminator Circuit」といいます) を使用します。
ESCの電源スイッチを入れるとマイコンが動きだします。
タミヤのESCはサーボPWMが来ていないと「ピーピーピー」とブザーが鳴り続けます。
スマフォで以下のアプリを立ち上げてとBTモジュールがつながると、マイコンがサーボアタッチするので、ESCのブザーが鳴り止み、方向舵のサーボがセンターに動きます。

スマートフォンで動かすアプリ

  • Android 4.0.3以上、GPS,磁気センサー、Bluetooth のあるスマフォで実行できます。
  • アプリはAPKを https://github.com/i386koba/CelluCon.Android/raw/master/app-debug.apk からスマフォにダウンロードして実行してください。
  • アプリ名は「CellularRC」です。(旧アプリの名前です。そのうち変えます。2017.10.19)
  • Androidの設定で「提供元不明アプリを実行する」としてください。
  • GPSの起動を要求されたらGPSを有効にしてください。
  • アプリを起動するとGoogleIDを聞かれます.

alt

  • GoogleIDを選択するか、追加してください。ログインしたGoogleIDのGoogleドライブにPeer.JSコネクションIDが保存されます。
  • PeerIDが、Googleドライブに保存されますと、「PeerID update!」とスマフォ画面の中段左に表示されます。
  • Androidアプリのソースコードは https://github.com/i386koba/CelluCon.Android にあります。

操作するWeb画面(カメラ映像、位置情報、遠隔操作パネル)

image

  • https://i386koba.github.io/CelluCon.web/ からWeb画面を開けます。
  • Androidアプリで保存したPeerIDを、Web画面からGoogleドライブにアクセスするため、画面中段右の「Authorize GoogleID」ボタンを押してください。
  • GoogleIDの選択ポップアップが出ますのでAndroidアプリでログインしたGoogleIDを選択してください。
  • テキストエリアに「Google drive load PeerId file.…」と表示されてIDを読み込みに行きます。
  • PeerIDが読み込まれてPeer接続できると、Androidアプリにカメラ映像が表示され、Web画面にも表示されます。

alt

  • スマフォのGPS情報がWeb画面に転送されていますので、Web画面のGoogleMapにスマフォの(大体の)位置が青丸アイコンで表示されます。

  • 青丸アイコンを現在地にドラッグしてください。本来ならスマフォの磁気センサで方角、ラジコンの回転センサで距離が計算されて移動した軌跡が描かれますが、ホイル回転計がないので、GPSだけの軌跡になります。

  • ソースコードは https://github.com/i386koba/CelluCon.web

 操作

  • Android の設定からBluetooth画面を開いて BTモジュールとペアリングしてください。
  • ペアリング後、Androidアプリの「BT接続」ボタンを押してください。
  • うまくつながると、ラジコンのESCのブザーが消えて、方向サーボがセンターに動きます。
  • スマフォをラジコンにセット。私は100円ショップの車用スマフォホルダをラジコンに両面テープで固定しました。
  • Web画面の右側の緑三角を上下にドラックすると前進、後進、左右にドラッグすると方向舵が動きます。周りの安全に注意して操縦くださいね。
  • HTML5に対応したGamePadでも操縦できます。(X-boxのコントローラーで動きました)
  • Web画面のGoogleMap左下の軌跡記録にチェックを入れると軌跡とスマフォカメラのスナップショットが記録されて、一般公開され場所は一発で特定されてしまいます。できるだけ公開してもらいたいのですが、問題のない方のみチェックしてください。
  • 軌跡一覧画面は https://i386koba.github.io/CelluCon.web/mapLink.html です。

現状の問題点

SkyWayの移行について

Skywayのサイトより2018年3月をもって現状サービス終了。

  • 2013年12月よりトライアル提供をおこなっておりましたSkyWayを、さらなるニーズに応えるため2017年9月7日より商用サービスとして提供を開始しました。
  • 商用提供に伴い、トライアル提供を行っておりました旧SkyWayは2018年3月をもってサービス終了予定です。

とのことで、2018年3月以降、Skywayを商用利用してつづけるか、ほかのWebRTC接続サービスにするか、専用サーバーを構築するかは未定(2017.10時点)です。

以下 SkyWay サービス以降についても @yusuke84 さんよりコメントありました。

商用利用=有償利用ということであれば、ご安心下さい。SkyWayは2018年3月以降も無償で利用可能です。
SkyWayは、商用サービス提供開始と同時に、Community Editionという無償で利用できるプランをリリースしました。旧SkyWay(トライアル提供のSkyWay)をご利用の方は、Community Editionに移行していただくことにより、2018年3月以降も無償で利用可能です。
Community Editionへの移行にはAPIキーの再発行とSDKの差し替えが必要になります。詳しくはこちらのページをご覧ください。

APIキーの再発行とSDKの差し替えをして、今後もSkyWayを利用したいと思います。
現状、私のAPIキーを使いまわしていますが、月間接続回数〜500,000、通信量〜500GBの制限までならないとは思いますが、本格的に使いたい人はユーザーごとSkyWayのAPIキーを取得してもらうのがよいと思います。
Web画面の初回立ち上げ時にAPIキーを取得案内して、Web(JavaScript)用とAndroid用のAPIキーを入力してもらい、それぞれGoogleドライブに保存する。AndroidはGoogleIDでログインしてAPIキーを取ってくる。にしようかと思います。
また、現状、PeerID の Googleドライブへの保存を Android側でしていますが、こちらもWeb画面側からPeerID を Googleドライブへ保存するように変更したいです。
Web用とAndroid用とAPIキーをとるのも面倒な話で、Androidに不慣れということもありますし、AndroidもHTML5のJavascriptにしたいところですが…
今後の課題です。

軌跡の誤差

  • GPSは10mほどの誤差があり、小さなラジコンを操作するには不便です。
  • 国産GPS みちびき使えば 数センチの精度になるとニュースで聞いた! (実はみちびきを受信するだけではだめだった)
  • みちびき対応スマフォを購入してみましたが、ほとんど精度良くなりません。

結局、数センチのGPSっていうのは、ネットワーク型RTK測量でないとダメと、みちびき対応スマフォを買ってからわかった。

ホイールの回転計によるトレース精度向上。

  • ホイル回転計の移動距離はまぁ正確ですが、方向はスマフォの地磁気センサによる角度なのであやしい。ラジコンを運転して、すぐに変な方向に進んだことになり、ズレてしまいます。

方向陀サーボの角度と、両ホイールの回転計での回転差を計算して正確に位置を割り出すのが目標。GPSが取れない室内などの操縦では有益とおもいます。

自動操縦

  • 自動操縦はWeb画面のGoogleMapに軌跡を描くことで、その線をトレースする機能は作成しましたが、現在地がいまいちなので、いまいちの所からいまいちな所にしか移動できません。

と、課題山積なのですが、皆さんが楽しんでもらえたら幸いです。