M5StickCでGoProリモコン

https://twitter.com/jesuslg123/status/1280909172264099842
UIFlowで作ってる人を見かけた。コードはコチラ。
https://github.com/jesuslg123/gopro-remote-stickC
M5StickC は EPS32 ベースで、ArduinoとかUIFlowとかいろいろ使える。
UIFlowは機能ブロックを並べるタイプの初心者向けっぽい言語。
今回使ってみたら、よかったので導入方法も含めて紹介。
リモコンですが、先に断っておくとGoPro純正のヤツとは比較にならない面倒さ。
ただ機能的には十分で、改造もアリアリですし、今後の機能追加も検討されているそうで、加えて楽しい!ということで試す価値アリです。

なんでGoProリモコンが欲しいのか。
BetaFPVの GoProLite BEC基板の問題。
あの BEC基板は設計的に問題があって、表面実装のコネクタ3個所を、別の基板で立体につなぐというのになってる。
基板の精度が違うので、歪んだりとか衝撃があると外れやすい。
特に電源ボタンと録画ボタンがBEC基板上にあり、強く押すとコネクタに負担がかかる構造で気持ち悪い。
そのあたりを理解してポチっとしないといけない。
まあでもスマートにまとまって便利なんで。なんとか他に対策できないかと考えた。
まずは電源ケーブルは標準のJSH3端子は細すぎるし、ポロっと抜けそうなので、2Sでもいけるぜって BT2.0 に変更した。

CineWhoopTokyoさんオマージュな構成。

電源は BEC基板上の MODE と GND をショートしてオートスタートに改造。
RECボタンは FC のポートから取るのが BetaFPV推奨だけど、複数機体に使い回すときに不便。
それでスマホからという運用になった。
でもスマホ持ってる人がそこにいないとできないので、なんか方法ないのか。
ついでに録画をしてるしてないが確認できないのか。
GoPro純正のリモコンとかもあるのだけど、そのためだけになー。
ということで今回のコチラで解決だ。さあやってみよう。

UIFlowの導入についてはココの説明がすばらしいです。
https://lang-ship.com/blog/work/m5stickc-uiflow-l01/
内容についてはよーく読んでもらうとして、オススメのやり方としては以下の流れです。

1.M5StickCに UIFlow のファームを焼く
https://m5stack.com/pages/download
M5Burnerというので焼きます。
後ほどコードを転送するIDEとバージョンがあってないとダメです。
とりあえず最新の1.6.0を焼いてみよう。
焼く際にはデバイスのCOMポートを指定。
ドライバとか必要ですが、ドローン野郎にはおなじみの CP2104 と VCP なので、そのままでもつながるかも。
あと自宅WiFiのSSIDとパスワードも忘れずに。
Obniz みたいにクラウドにつながってやるタイプなんですね。

2.ブラウザ版のUIFlowIDEからコード焼く
http://flow.m5stack.com/
今回は1.6.0なので、Betaの方を使います。
M5StickCの画面に出るAPIコードを使って接続しましょう。
githubからダウンロードした「ESPRemote.m5f」を読み込むわけですが、なんかバグなのかうまく読み込みません。
しゃーないのでデスクトップ版をダウンロード。
https://m5stack.com/pages/download
こっちは読み込めました。
でもデスクトップ版は1.4.5なんですよ。
さっき焼いたファームとバージョンあわない。
ファームを1.4.5.1にするのもありですが、今後もこういうのありそうなので乗り切る方法。
デスクトップ版の python メニューに移動し、そのコードをコピーして、ブラウザ版に貼り付け。

手間ですが、これでブラウザ版にコードを流し込めます。
pythonの場合、最後のあたりに SSID とパスワードを設定する所あると思います。

機能ブロックの場合はこのあたり。

これにつなぎたいGoProの SSIDとパスワードを入力しましょう。
GoPro側で「接続」→「新デバイスの接続」→「GoPro アプリ」です。
あとは右上にある再生ボタンを押せばコードが M5StickC に転送されて完了。

おお動くぞ。

M5StickCの基本的な使い方簡単に説明。
左横下(A)、上部M5ボタン(B)、右横上(C)の3つあります。
Aで電源オン。長押しで電源オフです。短く押すとリセットです。
Bボタンをおしながら電源オンすると、UIFlowメニューになります。
この状態でCボタンを押すとメニューが変わります。
APPListで今回のコードを指定しましょう。(temp.py)
これでリモコンが立ち上がる。

つづいてアプリの使い方です。
Cボタンを長押しでGoProのWiFiにつなぎます。今のは自動接続でないので注意。
つながったあとはCボタンのクリックとロングクリックで移動。
Bボタンでスタート/ストップ。
Bボタンをダブルクリックでモード変更です。
命令が通ると「200」が帰ってきます。

さてシカケを確認してみましょう。
GoPro内にhttpdがあって、そこにコマンド送ることで切り替えるようですね。
「http://10.5.5.9/gp/gpControl/command/mode?p=0」で、動画モード。
「http://10.5.5.9/gp/gpControl/command/mode?p=1」で、写真モード。
「http://10.5.5.9/gp/gpControl/command/shutter?p=0」で、ストップ。
「http://10.5.5.9/gp/gpControl/command/shutter?p=1」で、スタート。
おもったより簡単なシカケ。
https://android.benigumo.com/20180116/gopro-hero6-wifi/
なんかこういうことみたい。ffmpegでストリームデータも引っ張れる模様。
内容を理解すれば他に転用も可能だ。ブラウザとかな。
他のコマンドも調べると出てくるでしょう。

その他、そのスジのみなさまが気になるポイントはコチラにまとまっています。
https://qiita.com/nagase/items/96e87b3c91a0c820e002

そういえば、初代THETA出た時、ESP8266 で似たようなの作ったっけな。時代は繰り返す。
作者の方は ToDo にて機能追加を検討されているようなので今後に期待だ。
複数カメラを一個でやりたいとかの改造もしたいね。
機能を絞って ATOM Matrix に移植してもよいかもな。
マイコンいじりも楽しいのでこの機会にやってみるのもよいかと。
なお M5StickC は 2000円しないぐらいの値段で売られています。