BluePillを使ってみよう

シリーズ「プロポを USB Joystick にしよう」。
https://papalagi.org/blog/archives/1523
https://papalagi.org/blog/archives/1566
https://papalagi.org/blog/archives/1594
今回これに追加する形で BluePill こと「STM32F103C8T6」を使って USB プロポを作ってみる。

前に作ってはいたのだけど、HOI-Linkとかと比較してスゴイ差異があるわけでないので使ってなかった。
最近 Minecraft FPV で使えるということで、周囲のニーズが上昇したのと、ソースコードが公開されてるので、アレコレ自分でSBUSへの理解を深めるのにもよい。
安価がゆえに、いろいろと中華マイコンのややこしさを内包してて、逆に入門用としていいんじゃね?とか思ったりして。
ドローンのFCもSTM32系で、Bootloader まわりの理解が進むかも。
ということで、ちょっと記事にしてみた。

今回使うマイコンボードは「STM32F103C8T6」というやつで、「Blue Pill」とか呼ばれてる。
非常に脱線したが、モノはコチラです。今はそんなに安くないですね。
https://www.banggood.com/STM32F103C8T6-ARM-STM32-Small-System-Development-Board-Module-SCM-Core-Board-p-1668936.html
時間かかるのでアマゾンで買うのもアリです。倍ぐらいしますが、元が安いので数百円の差です。
英数字の羅列をよく覚えるオタクでもこの長さは覚えにくい。
「STM32F103」ってのは、3Dプリンタとかマルチモジュールに入っている「F1」のこと。
「STM32F103」は中華サイトだと200円ソコソコで売られている激安のマイコンボード。
Cortex-M3 の ARMベースなので、Arduino純正のAVRマイコンより高性能だ。
元々は「Maple mini」というボードのコピー。
Maple は LeafLabs という会社がやっていたが、2015年に活動休止。
その後、Arduino互換ボードやmbedとして使えるようになった。
Arduinoはいくつかあるが、STM32duinoが、製造元の STマイクロエレクトロニクスもサポートということで無難な感じ。
STM32のメリットは、製造元であるSTマイクロエレクトロニクスが、USB HALのドライバを配布しててこのあたりの活用ができる。
例えば今回の場合だと、Joystickとか USB HID を使って簡単に実装できる。

それでも200円/枚って安すぎないか?
実は搭載されているマイコンもクローンのようです。
BluePill の場合は、CKS の CS32F103C8T6 が載っているのが多いようです。
ピン互換でそのまま動くようですが、CPU ID が違っていたりとかするので、クローンであることを理解してやったほうがいい。
クローンといっても GigaDevice の GD32F103C8T6 とかは、オリジナルの 72MHz より高クロックな 108MHz で動作する。
本家よりプロセスルールが微細化したりして高性能になっているのだ。
DJI のドローンとかでも採用されているので、安物クローンなどとあなどれない。
さらに GigaDevice だと、GD32F103 を RISC-Vベースでクローンした GDVF103 というのも出してる。
かつてのCPUにあったような仁義なき戦いが繰り広げられているので、好事家の人は調べてみるのもいいだろう。

今回のはSTマイクロエレクトロニクスのか?プリントが薄いような・・

とりあえず簡単に作成したいという場合は、おなじみ Oscar Liang のページを参考に作ろう。
https://oscarliang.com/diy-sbus-usb-converter/
ST-Linkとか、USBシリアルなどを準備して、STマイクロエレクトロニクス が配布している Flash ツールで焼くだけ。
ST-Linkの場合は、横から出ている4本足から、USBシリアルは PA9、PA10から接続します。
なぜ基盤についているUSBからイケないのか?については後ほど。
反転回路は記事中のもの(NPN,5K,10K)でもいいですし、HOI-Link(NPN,51K,5.1K)のものでもいいです。

これだけだと面白くないので、ArduinoIDE から自ビルドできる方法をまとめる。
通常のArduinoはブートローダの類が入っていて、基盤のUSBをつなぐとプログラムの入れ替えができる。
ですが、BluePill の場合、そのまま基盤のUSBを接続してもできない。
焼き込む方法は大きくわけて3種類。
ドローン野郎にはおなじみの UART1 を boot ボタンおして DFU でつなぐアレが Serial Bootloader。
USBシリアルを準備して、PA9(TX) に RX、PA10(RX) に TX を接続。
ジャンパを Booloeder にして焼き込みます。
これだと Flash 全部が使えるというメリットがあります。
ドローンの FC はこの構造。(CP210xでつなぐ)
他の方法としては ST-Link を使う。これは Silverware とかでも使われる。
手軽ですが Serial print が使えないので開発には不向きです。
普通の Arduino のようにならないのか?という場合は、Flash の容量を食いますが STM32duino Bootloader を焼き込みます。
おやコレはどこかで・・というと、DIY Multi Module の古いやつで Bootloader あるなしあった。
これだと普通の Arduino のように、基盤のUSB端子からBootジャンパなしに書き換えしたり、シリアルが出てきたりします。
ということになっているのだけど、BulePillに関しては、一部のチップ抵抗値が間違えているらしく、環境によって動いたり動かなかったりがあります。
なので、ArduinoIDE でやるのであれば、USBシリアルからやるのがオススメ。(ズバリ)
これでアレコレもがくと、この手のハードウエアへの理解が深まるかもしれない。

さて自ビルドしてみましょう。
git はコチラです。git clone してライブラリに取り込みましょう。
https://github.com/DarrenLouw/SBUS
追加するボードマネージャーのURLはコチラです。

http://dan.drown.org/stm32duino/package_STM32duino_index.json

あとはコチラの画面の通りやれば焼き込みできます。
USBComposite.h が STM32 由来のドライバで、これで USB HID を構成しています。
それ以外の SBUS.h は Arduino のライブラリとして使えるので、SBUSをマイコンで活用する場合には便利です。

2021年1月16日追記。
CurseForge入れるときにJAVA入れますが、あれ入るとArduinoIDEのJAVAとバージョン違いで動かなくなったりします。その時はいったんJAVAをアンインストールしましょう。
あと元のソースは「SBUS sbus(Serial2);」ってなってますが、これは「SBUS sbus(Serial3);」に変更しましょう。
なお各割当はこんな感じです。

Serial1 → UART1(5v): TX PA9、RX PA10 *USBシリアル接続で使ってる
Serial2 → UART2(3.3v): TX PA2、RX PA3
Serial3 → UART3(5v): TX PB10、RX PB11

ブレッドボードでやるほうがよいですが横着。
USBシリアル経由で焼くとこんな感じになります。
かなり無理目にフリスクに入れた作例がこちら。Bootピンとかあれこれカット。
それでもオシレータは入り切らないのでスライド禁止。

あとはシリーズ「VTXラップカウンターを作ろう」を記事にするかだなー。
電波の取得方法がノウハウで、その部分が進んでないのと、やってるうちにいろいろ応用活用思いついて、なかなか進まないという。
ということで、2020年はこの記事でおしまいです。
2021年も良い年になりますように。

WSL2でLinux版Betaflight Configuratorは使えるのか?

覚書で読み飛ばし推奨。

Betaflight Configurator のサポートから ChromeOS が外れた!マジで!
WSL2でUSBシリアル使えると Configurator系がUbuntuで使えて助かるかもな。
さらにArduinoとかも使えるってことになるし。
という思いつきからこの話は始まる。

WSLではUSBシリアルが使えたのだけど、WSL2からは使えなくなった。
かわりにといったらなんだが、WSL2からはGUIが使えるようになった。
なので「GUIで動いてUSBシリアルを使う」ってのが現時点動かない。
これを何とかできないか。
手順としては、1.WSL2でGUIを使えるようにし、2.WSL2でUSBシリアルを使えるようにする、という2段階になる。やってみた。

■WSL2でGUIを使う
WSL2からGUI使えるってことになってはいるんだけど。
xrdpでリモートデスクトップひっぱるとか、VcXsrvで.bashrcにdisplay設定を書き込むとか、いろいろ紐付けがめんどくさかった。
いずれもWindows 側で受け口を作って、Ubuntu側から引っ張るのだが、実はWSLでは割り当てられるIPアドレスが都度かわる。
WSL/WSL2を立ち上げて、PowerShell から ipconfig すると vEthernet という形でIPアドレスが割り当てられていることがわかる。
/etc/resolv.confを見ると、namesaver として上記の vEthernet のアドレスが割り当てられている。
つまり、WSL側から見て、ホストのWindowsは nameserver のIPアドレスで、そこのXサーバに向けて接続するという方法だった。
ところが割り当てられる都度変わるのでめんどくさい。
そういうスクリプトを組んで工夫してたりしていた。
今回改めてなんか良い方法ないかと探していたら、MobaXterm の方法を知った。
https://qiita.com/vega77/items/f00323e8ce64bfa1fdd6
左上にある「Session」のアイコンから「WSL」を選択。
「Run method」を「Localhost connection」に変更。
右上にある「Settings」のアイコンから「X11」のタブで「X11 remote access」を「full」に。
これだけ。あとは該当の Session で使いたい WSL2 を選択し、そちらのターミナルから実行すればよい。
実行すると MobaXterm の Xserver が動くというシカケ。すごいラク。やったー。
Ubuntu側のGUIを動かすために必要な手順はコチラ。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libgl1-mesa-dev xorg-dev

おなじみの目玉を出して実験。

$ sudo apt install x11-apps
$ xeyes
出た。

これで動くようになった。
せっかくなので、deb版の Betaflight Configurator を動かすところまでやってみよう。

$ sudo apt install gconf-service gconf-service-backend gconf2-common libgconf-2-4
$ wget https://ci.betaflight.tech/job/BetaFlight_Configurator/lastSuccessfulBuild/artifact/release/betaflight-configurator_10.8.0_amd64.deb
$ sudo dpkg -i betaflight-configurator_10.8.0_amd64.deb

そして起動。

$ /opt/betaflight/betaflight-configurator/betaflight-configurator
画像
こいつ・・動くぞ。10.8.0というバージョンが見えます。

ひょっとしたら「なんか足りないよ!」とかいわれるかもしれない。
その場合は「sudo apt –fix-broken install」とかで足りないパッケージをいれよう。
お作法によると、DFUモードの設定と、デバイスにユーザの追加とかがある。
そのあたりは git で確認。
https://github.com/betaflight/betaflight-configurator
設定してもこの段階ではシリアル使えないので、どうやってもつながらないけど。
とにかく WSL2 で Betaflight Configurator が動くところまでは行った。

■WSL2でUSBシリアルを使う
UFEIセキュアブート外してUSB/IPを使うという方法があったが、セキュリティ的にどうだろ。
そこで Virtual Here という USBデバイスを OverIP するツールで実現しているのを発見。
https://contentsviewer.work/Master/WSL/Tips/WSL2-USB/WSL2-USB
具体的にはWSL2のカーネルドライバをビルドして、WSL2のカーネルに追加。
Windows側に Virtual Here のサーバを、WSL2側に Virtual Here のクライアントを入れ、それで接続してやる。
大変詳しいページなのでなぞっていけばできるが、コチラのページといくつか違ったところ。

1.Ubuntu20.04 LTS ベースでやった。
2.kernel Version が 4.19.84 だったので読み替えた。
3.Serial Convererは FTDI に加えて(いつもの) CP210x を追加した。(menuconfig)
4.どうしてもWSL側からWindows側が見つからないので、WindowsDefenderをイジった。

1と2はまあいい。
3の menuconfig 追加はコチラ。

Device Drivers->USB support->USB Serial Converter support->USB CP210x family of UART Bridge Controllers [M]

そして4。ココでちょっとハマった。
これはXサーバの時にも問題になっていたアレ。(それで先にクドクド説明した)
これのせいでDNSが引けないというトラブルもちょいちょい聞いたりします。
調べた結果、Windows側の Firewall であるところの、WindowsDefender が閉じてて WSL からアクセスさせないということになってる。
Dockerとか使うのに、Windows側から WSL 側のポート開放とかの話はよくあるしよく聞く。
WSL側からホストである Windows側へってあんまりニーズないのか知らなかった。
まあとにかく今回発見した。
元ネタは git のどこかの issue で見たのだけど、再度探したら見つからなくて、とにかく内容的にはコチラ。
https://www.howtogeek.com/howto/windows-vista/allow-pings-icmp-echo-request-through-your-windows-vista-firewall/
セキュリティ具合は各自納得できるレベルで調整。

この処置で、あれだけつながらなかった Virtual Here がサクっとつながり、WSL側の/dev/ttyACM0につながる。/dev/ttyACM0 は chmod 666 とかするの忘れずに。
なお Virtual Here 無料版はデバイス接続1個まで。
万難を排し、ついに deb版の Betaflight Configurator が WSL2 で動いたのであった。

画像
つないだのはいつものMeteor65。今回導入したアプリが勢揃い。

なので、掲題の答えは「がんばれば動くが、手間が見合わない」ということでした。
そもそもWindowsのシリアルドライバ関係のトラブルがイヤで、Ubuntuにしたいのに、Virtual Here だと Wndows のドライバ避けられないじゃないか。(今気づく)
別に Ubuntu 準備したほうがマシ。つうかなぜChromeOSのサポートヤメた。
Defenderのこのあたりも、そのうちWSL2になんらかの変更が入るのでなかろうか。
その時にまたあらためて検討。

でも Virtual Here を勉強できたのはよかった。
コレ使うとインターネット越しにUSBデバイスつなげるってことだよね。
おもしれえ。

マイクラでドローンを飛ばせ「Minecraft FPV」

https://minecraftfpv.com/
なんかすごいのキタ。ちょっと夢見てたレベルが実現。
マイクラの世界をFPVドローンで飛ぶ。
ラジコンMODとかはあったのだが、今回のこれはちゃんとFPVだ。
マップデータを引っこ抜いてUnityで飛ばすってはあったけど、今回のこれはちゃんとマイクラだ。
マイクラクラスタとドローンクラスタは、カブってそうで、カブってない空気を感じてる。
ということで、仲間増やすために急ぎ導入方法をまとめてみたよ。

■Minecraftとは
とにかくスゴいおばけタイトル。なんとなく触ってない人はこの機会に触ろう。スゴイから。
Minecraftというのはプラットホームがたくさんある。
当初はMojangの出していたJAVA版から始まって、コンシューマ版はこれとは別々にリリースされていた。
いろいろあってコンシューマ版はサーバとかを共有できるようになっている。
スキンとか販売して商売として成り立つようになった。
なので、最近の「マインクラフトする」というと、コンシューマ版だと思う。
JAVA版は開発版という位置づけのままリリースされていて、こちらはMOD文化などが根付いている。
この MOD 文化が他に例をみないスゴさで、今回の Minecraft FPV もその MOD のひとつだ。
今回はこのJAVA版を使うことになる。つまりできるのはPCだけなので注意。

■JAVA版Minecraftを入手
https://www.minecraft.net/ja-jp/store/minecraft-java-edition
2600円だったと記憶していたが、いつの間にか3000円になってた。
アカウント紐付け式で、マイクロソフトアカウントで買うことになるようだ。
JAVAが動く環境であれば、WindowsでもMacでもLinuxでも動く。

■CurseForgeを入れる
MinecraftつったらMOD。
かつてMODは各バージョン管理を自分でして、手動でフォルダ掘ったりとかしていたけど、今は管理ツールがある。それがCurseForge。
https://curseforge.overwolf.com/
CurseForgeはいろんなゲームのMODプラットフォームなので、たくさんの対応があるようだが、ここはMinecaftを選ぶ。
色がついてない場合は、インストールされていることをCurseForgeが認識していない。
インストールした場所を指定して認識させよう。
あと動かすのにJAVAが必要だ。なかったら入れよう。
https://java.com/ja/download/
できたならば「+ Create Custum Profile」でプロファイルを作成。

もうすでに3つProfileありますが気にしないで

「Profile Name」はテキトウに。(「MinecraftFPV」とか)
Minecraftのバージョンは「1.16.4」。
Modloaderは「forge-35.1.0」を選択する。(デフォルトから変更)

「MyModpacks」でつくったプロファイルを選んで「Add more Content」を選択。

検索窓に「FPV」と入れると「Minecraft FPV」が出てくるので「Install」。
UpdateするときもココにUpdateって出てきます。

すにで「Installed」になってますが気にしないで.

これで実行できる環境ができた。
「Play」をすると純正のラウンチャーが立ち上がって実行できる。

■コントローラーの設定
ドローンといったら、まずプロポの設定。
https://minecraftfpv.com/wiki/controllerSetup
各chのアサインがポイント。
ココを参考にやってみればわかる。
CHごとにスティック動かして割り付けましょう。
あと最低限ARMのスイッチは設定しておきましょう。
他とCHがカブらないように注意。

たくさんあると選択がいろいろ出る。。

プロポのHIDですが、有線接続できるプロポが今手元にないので確認してないですが、多分イケると思う。(追記確認)
HOI-Link(自作のヤツ)はなぜか使えなかった。(ARMせず)
ウチはMapleベースの自作ドングルでやってる。
https://github.com/DarrenLouw/SBUS
vJoySerialFeederもできました。
https://papalagi.org/blog/archives/1594
飛ばせるドローンあればできるので、どうにも使えない場合はこちらもよいかと。
設定はそれなりに手間かかるけど。

2020/12/23 追記
Jumper T16 Plusの有線接続でイケなかったそうです。
こちらはARMはするようですが、プラスの数値しか受け付けない模様。
https://twitter.com/FpvXyda/status/1341405005132275714

Tranis Q X7 は有線で接続したとのこと。
https://twitter.com/ADHayaP/status/1341706303970787328
OpenTXがダメかな?と思ったけど、そうでもないようですね。

ふと思いついて、箱コンでやったらできました。
スロットルがセンター固定なのがアレですが、お手軽ですね。
あとARMをトグルスイッチみたいなので固定できないので、Flippedして常時ARMにするといいです。
ARMしたくない時はボタン押す、みたいな。
x360ceでXInputとかできるかも?ともがいたがダメでした。(Windows10版とかは可能な模様)

2020/12/29 追記
T16IZの有線接続ダメでしたね。(アップデートされた1.7.2で確認)

■とりあえず飛ばしてみる
できたならば、SinglePlayerでマップを作ってとりあえず飛ばしてみる。
ARMスイッチ入れると、プロポの十字がふたつ画面に出てきます。
今のところ機体は5インチ以上でAcroのみです。
飛べたならば、MultiPlayerでMinecraftFPVのサーバにつないでみよう。
https://minecraftfpv.com/wiki/joiningServer
MultiPlayerでサーバのアドレスを指定することでつながります。
こちらではレースモードなど、サーバ側でいろいろ提供できるようですが、まだ詳細までたどりついてないです。
https://minecraftfpv.com/wiki/droneRacing

■高速化をする
動いた環境ができたら、CurseForgeでProfileをコピーして、設定を変えてみよう。
元々軽いですがドローンなのでなるべくヌルヌルな高FPSで使いたいですね。

Profile上で右クリックするとメニューが出ます
ココでも出せます。Duplicate Profile でコピー。

マインクラフトの高速化は検索すると出てきます。
とりあえずこのあたりが処理優先な設定。

あとGeforceとかdGPUが使える人は、JAVAでGeforceが動くように設定しましょう。

右下のアイコンあったりする「NVIDIAコントロールパネル」です。

さらに高速化という場合は、OptiFineを入れましょう。
https://optifine.net/downloads
今回の場合は1.16.4用をダウンロード。
CurseForge の場合、ココから OpenFolder して mods の中に jar をコピーしてください。

先にfpvdroneのmodが入ってますね。

OptiFineが入ると、VideoSettingの画面がこのように変わります。

左下にOptiFineが入ってます表示でてます。

この中のPerformanceをONにしておきましょう。
(作者の方から直々にコメントいただきました。ありがとうございます!)
設定は山盛りあるので、好みに合わせてアレコレやるのが良いでしょう。

■描画をキレイにする
ブロック並ぶゲーム画面にキレイとかあるのか?
と思われそうですが、これがなかなかどうして実はすごいんですよ。
これは先の OptiFine を入れた状態から、Shaders(シェーダー)を入れることでできます。
いわゆる「影MOD」と呼ばれるヤツです。
シェーダーはいろんなものがありますが定番はSEUSってヤツです。

これはなにも選んでない状態。

シェーダー使うとゴリっと重くなります。
このあたりでメモリの割当を増やしてやるとかも必要かも。(4Gから8Gに変えた)
Geforceのドライバも460.89以降にしましょう。なぜかfpsが倍ほど違います。
その他にもリソースパックとかあるので、いろいろイジれます。
マップデータもたくさん配布されています。

この映像の違いを見よ。左上のFPSの違いも注目です。立ってるだけなのに・・

■最後に
コース作ったり、レースをしてみたり、機体の設定したり、PIDを設定したり。
ベースがマインクラフトだけに、できることはムチャクチャたくさんある。
そこにドローンを飛ばすという可能性を加えていただいた、製作者のCroolsbyさんには感謝しかないです。ありがとうございます。
この年末はコロナにドカ雪と、引きこもる要素に事欠かないので、こちらの Minecraft FPV で楽しむのはいかがでしょうか。

GoPro8剥き時代到来

「剥きプロライフ」はいかがでしょうか。
保護カバーがないわけですから、使っているウチにジャンジャン壊れますね。
撮影できてもジャイロダメになったり、WiFiダメになったり。
まあ様々な壊れ方してます。

ウチの界隈は 6での運用が多いです。
理由は ReelSteadyGo が使えるから。
7は6とSoC同じ(ソシオネクストのGP1←古い)で、基本的なハードウェアに差がない。
7は HypersmoothというEISがチョイよいですが、ReelSteadyGo 使えたほうが使い勝手はいいですかね。
ということで 7 はスルー。

で、8です。
これも SoCは同じ GP1 で、世間的には2世代ぐらい古いのですが、今回もソフトウェアの改良でしのぎました。
それがあってスルーしていたのですが、ココで GoPro LABS が登場。
https://gopro.com/ja/jp/news/gopro-labs-launch
これによりアレコレ改造できるようになった。
有名なのだとWebカメラ化とか。
この中に ReelSteadyGo の対応と、QRコードによる設定変更などがあり、ドローン搭載への便利機能がスゴイ強まった。

そうしたところ GoPro9 販売開始。
GoPro9 はセンサーサイズもあがって、サイズもアップしましたが、またまた SoC は GP1。
もうライバルと比較して3周遅れぐらいになっちゃうんでないでしょうか。
コレである限り電池持ちの改善は期待できそうにないですね。
GoPro の苦しい台所事情が垣間見えます。
いろいろ強まってますが、代わり映えしないともいえる。
ただこれによって GoPro8 も値下がりし始めました。
海外だと新品350ドルぐらいが定価になっているっぽいですね。
安くなったが安くない。でもジャンクの6も取引価格高止まりですし。
あいかわらず評判は悪いですが、BetaFPV から 8向けの BEC も売り出されています。
ということで、今後は GoPro8 を剥きプロのメインにすることにしました。

剥き方についてはコチラを参照。
GoPro Hero8 Black disassembly guide.pdf
https://drive.google.com/file/d/1SbetTFhECogr-prt_DqIpXEdTE3Jd8EF/view?fbclid=IwAR0sOXk296xgcrXXDbRanmnYhMVzmSibe6zTS1s-RfiPeJYQgtsDIv5CQIQ
これを見ながらやるとなにも難しくないです。(いったいなにを紹介する記事なのか)

いよいよ分解する前に、SSIDとPASSは控えておきましょう。
3つ爪を外します。ここまでは簡単。
バリっとへっぱがします。戻したいときは慎重に。(この例はもう戻せない)
カメラのフレキとコネクタが幅広になってますね。
ココらへんは代わり映えしないですね。
3枚におろせました。BECボードも入れて14gぐらいですね。
とりあえず通電チェック。

6も8もあまりかわらないです。
びみょーに形が違うので、これをベースに寸法取りを行ってケース作成を行います。
(続く)

vJoySerialFeederを使ってみる

HOI-LINK はさらに低遅延化して、v2となったようです。
http://www.hoihoido.com/blog/?p=4202
風のウワサに聞くと、ケーブル接続より低遅延になったとか。
まさにプロポ接続界の阿頼耶識システム。
残念ながらココから先は非公開となったそうです。

HOI-LINKを通して、この関係にいろいろ興味が出た。
PCに信号データを入れて、もっとあれこれ活用する方法はないだろうか。
そこで見つけたのが「vJoySerialFeeder」。
https://github.com/Cleric-K/vJoySerialFeeder
海外では2年ぐらい前から使われているし、DonkeyCar界隈でもよく活用されているそうだ。
対象はWindowsとLinuxだ。残念ながらMacはない。
これはなにをするものなのか → シリアルプロトコルをUSB HIDに変換して送り出すもの。
わかりにくいので、絵にまとめてみた。

これが無線でドローンを操縦する仕掛けで、ポイントは2つある。
電波部分と通信部分だ。
これをUSB HIDドングルとかで、PCシミュレータに繋ぐ場合はこうなる。

電波部分はそのままだが、USB HIDの通信部分は工夫で高精度/低遅延になる。
そして今回の vJoySerialFeeder の場合はこうなる。

通信部分はシリアルに統一されるので、電波部分とかの差異も確認しやすくなる。
また実機から MultiWii プロトコルを引っ張れるので、実機のセッテングの差異などもある程度確認できる。
あと通信状況を可視化してくれる機能とかもある。

あんまり日本語記事なかったが、DonkeyCar関連で記事があった。
https://qiita.com/rukihena/items/ed17c2245db504dd263a
必要なことはほぼ書かれているので、コチラを参考にするとできる。
こちらは Linux を対象に書いてあるので、Windows向けに簡単に説明をまとめる。
実機があればコストゼロでできるので、試してみるのもよいでしょう。

■共通項目
vJoyをダウンロードしてインストール。
https://sourceforge.net/projects/vjoystick/
vJoySerialFeeder/releasesからダウンロードしてzip解凍する。
vJoyのバージョンと合わせる必要があります。
https://github.com/Cleric-K/vJoySerialFeeder/releases

■実機を接続する場合(MultiWii)
まず MultiWii での接続例。
これはドローン持ってれば追加投資なしで実施可能です。
Betaflight につなぐように USB で PC につなぎましょう。
この際にレシーバーが機能するようにしてください。
外付けのレシーバーだと電源ないとダメとかありますね。
そこらへんの TinyWhoop が実験にはよいでしょう。
FCを USB HID化(set usb_hid_cdc = on)とは違う手法なので、本体はなにもイジらなくてOKです。

Betaflightとかの接続と同じです。

vJoySerialFeeder を起動します。
Profileをテキトウに書いて、Protocol を MultiWii に。
Port を Refresh すると、ドローンが接続されている COM ポートを見つけてくれると思うので Connect します。
Add Axis を4つ押して4ch。スイッチ関係使うなら Add Button で必要な数入れておきましょう。
Add Bit-mapped をいれると信号を見える化してくれます。他にも機能盛りだくさんですね。
いろいろできますが、シミュレータ側で調整できるので、とりあえず割り当てられてるといいみたいです。
なにが正しいかはわからないですが、とりあえず画像を参考に設定してみてください。

左上に「vJoy – Virtual Joystick」が認識されています。

あとはシミュレータ(今回はVeloci)を立ち上げると、コントローラとして Assign されていると思います。
いつもどおり設定してもらえばOK。
SPI接続の内臓受信機の場合は、低遅延って話題の RedPine と比較してみるのもいいかもしれんですね。

■受信機直結の場合(SBUS)
受信機からチョクに取りたい場合。
つまるところ、受信機にUSBシリアル変換基盤をつけて、PCにシリアルを流し込むわけです。
今回はいつもの SBUS ですが、IBUS や DSM もできます。
SBUS というと、HOI-LINK の時にもありましたが、信号が反転している(Inverted)問題です。
前回は反転回路を組みましたが、今回は USBシリアル変換基板に反転機能があるので、それを利用しましょう。
USBシリアル変換基板はコチラです。
FT234x
https://akizukidenshi.com/catalog/g/gM-08461/
USBシリアル変換基盤ならなんでもいいんですが、安くて小さいというメリットがあります。
XM+とかだと幅がほぼ同じであるため、おなじスミチューブに入れられます。
こちらの Rx を Inverted に FT_PROG というツールを使って切り替えます。
FT_PROG
https://www.ftdichip.com/Support/Utilities.htm#FT_PROG

普通に接続します。FT234xはちっこいですね。
Scan and Parse します。
Invert RS232C Signals のところで RxD を反転にします。
Program を押す。
Program で完了。
配線してみました。

配線は 5v/GND はそのままで、SBUS は Rx に接続します。
あとは MultiWii の時と同じ流れになります。
Protocol を SBUS にしてください。
細かい設定もいろいろありますが、デフォ設定あるのでとりあえずそれで。
あとはシミュレータで設定すれば完了です。

まあ設定はそれぞれがもがいてください。(まだよくわかってない)

駆け足ですがこんな感じです。とりあえずまとめてみた感じです。いつもの拙速主義です。
長時間の運用に耐えるのかとか、遅延とか、その他問題はないのかとかは、これからしばらく使ってやってみます。
今回のはシリアル処理が PC 内に入っちゃうので、仮想シリアルを挟むといろいろ応用できる。これは夢広がる。
あんまり日本で使われていない感じなので、この機会にいろんな活用例が出るといいなと思っています。

Fireworks!

人間が長い間飛べなかったのは空を飛べるわけがないって考える人が圧倒的に多かったからなんだ。うまく言えないけど、人間は、鳥にだってなれたんじゃないかと思うんだ。そして、今だって鳥になれると思うんだ。人間の格好をしたままでさ。
大事なのは、やる気みたいなもので、ちゃんと空を飛ぶ方法というのはあって、それを学んだり勉強したりしようとする気持ちが大事なんだと思うね俺は。

リチャード・バック「イリュージョン」/村上龍訳

リチャード・バックは「FPVドローン」という、彼らの時代には想像のつかないチートみたいな方法で空を飛ぶことを、どう思うだろうか。
リチャード・バックというと「かもめのジョナサン」が有名。
当時はグルイズム的なところはヒッピーに担ぎ上げられた過去がある。
オウムでも同じようなこと言っていたのがいるな。
他の作品を見ると、とにかく飛行機で飛びたかっただけの人であることがわかる。
結婚した「One」あたりから、なんつうか普通になり、挙句の果てに「かもめのジョナサン」に最終章を足してしまった。
それでもリチャード・バックには正直でリアルな男の生きざまを感じる。

今回「花火撮影の手伝いしない?」ということで呼ばれてみた。
暗闇での位置確認は必要だろうなあと思い一工夫。
FAI DTRC2019 で使った Neopixel を引っ張り出して設営。サイズは10mぐらい。
当初は線香花火をイメージして設置したのだが、動画を見ると、葉っぱもついて花のような、打ち上げ花火のような。
急場しのぎにしてはいい感じになり、実際かなり活躍し、いい感じに動画で拾ってもらえた。
準備が十分だったところも、足りないところもあったりして、それでもなんとか無事完了して。
そしてまた次の課題が見えてくるドローンはホント飽きないな、と思うのです。

なんせ空を飛べる。

続・HOI-LINK HR を作ろうぜ

前回記事からの続き。
https://papalagi.org/blog/archives/1523

ほいほい堂さんで改良版リリースの情報をいただきました。ありがとうございます。
■HOI-LINK-HR の遅延を減らせるか試す。
http://www.hoihoido.com/blog/wp/?p=4158
低遅延化とSBUS区切り検出の改善が行われ、新しいHex(20200822版)が配布されています。
http://www.hoihoido.com/HOI-Link/HOI-LinkHR20200822.zip
今回のやつは、前回のショートカット版では動きません。
お作法通りブートローダから焼いていかないとダメなので、そのあたりの説明を書いてみます。
ブートローダの役割や構成の仕方などは、ほいほい堂さんの記事をよーく読み込んでもらうとして、作成する手順だけまとめます。

■ファイルを集める
http://www.hoihoido.com/OpenStick/index.html
HOI-LINK HRのそもそものベースである、OpenStick のページです。
ブートローダ焼付後は、USB接続だけでファームを焼けるようになります。
焼き付けるツールが「MybootOS(64bitOSも使用可能なバイナリ) MybootX86-bin-160725.zip」になります。
http://www.hoihoido.com/OpenStick/MybootX86-bin-160725.zip
加えて「UBW用inf(ドライバ)MCHP-USB.zip」が必要ですが、残念ながらリンク切れ。
ココに落ちているのを見つけました。
https://www.microchip.com/forums/m836237.aspx
ココからダウンロードです。(MCHPUSB+Driver.zip)
https://www.microchip.com/forums/download.axd?file=0;836237
続いてブートローダのファームですが、ブートローダ単体より「ブートローダ+OpenStickLiteのセット」を焼いて動作確認し、その後 HOI-LINK HR のファームを焼き直したほうが、間違いないかもしれないです。
http://www.hoihoido.com/blog/wp/?p=1764
ココからダウンロード。
http://www.hoihoido.com/OpenStick/OpenStickLiteBinary161011.zip
この中の「Bootloader18F14K50+OpenStickLite.hex」を使いましょう。

■作成手順
まず前回同様の手順で、PICKit3 でファームを焼き付けます。

前回と同じ方法です。

最初に焼き付けるのは「Bootloader18F14K50+OpenStickLite.hex」です。
PICKit3 で焼き付けましょう。
USBでつないだら「JOYSTICKmini」というデバイスが見えると焼付成功。

次にブートローダ用のドライバを入れます。
「MCHPUSB+Driver.zip」の「Realease」の中にこんなファイルが並んでいます。

「mchpusb.inf」というファイルを右クリックし「インストール」。

次にPICをブートローダモードで立ち上げます。
VPP(PICKit3をつなぐ左端の端子)をGNDに落とした状態にして、USBを接続し電源オンします。
これでブートローダモードになります。
この状態から焼き込みツールで焼き付けます。
「MybootX86-bin-160725.zip」の中にある「Myboot.exe」を立ち上げます。
この際に、Defender から怒られるとおもいます。

「詳細情報」を押すと実行できるようになります。

あとは「Open Hex」で、20200822版の「HOI-LINK.hex」を指定して「Write Verify」すれば焼付完了。

VPP→GNDを外して、USBを接続し直すとデバイスに出てくると思います。
SBUS反転回路とかの接続は前回と同じですので、そちらを参照してください。

ブートローダを一度焼いたあとは、PCからUSB経由で焼付可能になります。
次回からの更新はラクチンですね。(最初からそうしようよ)
いずれにしても最初はブートローダ焼付に PICKit3 が登場することは避けられないので、ブートローダごとまとまったバイナリがあったほうが新しいのを作るときには便利です。
その場合は PICKit3 でコチラから吸い出して保存することができます。

■さいごに
今回でちゃんとお作法通りに作成することができました。
そして低遅延化の効果ですが、これは確かに効果出てるように思います。
FrskyのUSB接続だと、「遅延ゼロで11bit」という実環境以上に恵まれた環境になっており、ゲームとしてのプレイ環境としては一番理想なのかも。
しかしながらシミュレータという観点から見ると、実際に発生するであろう無線プロトコルの遅延も含めてよりリアルな操作環境がシミュレートできる。
そうした中で、HOI-LIK HR の低遅延化はさらに高い効果が得られそうです。

こういう「体感できる」っておもしろいですねえ。
ほいほい堂さん今回もありがとうございました!
さらなる改善も期待しております!

HOI-LINK HR を作ろうぜ

これはプロポを USB 経由でPCに接続する、高分解能な無線ドングル。

8/22追記。
正しい手順通りの作成方法を続編でまとめてあるので、そちらも確認推奨。
続・HOI_LINK HR を作ろうぜ
https://papalagi.org/blog/archives/1566

プロポは USB-HID で接続され、PC側の扱いはそんなに難しくない。
中華のプロポはファームアップ用途で USB 端子が大体ついており、そこにつなぐと使える。
Futaba のヤツはめんどくさいらしく、無線ドングルのニーズが高いらしい。
無線ドングルは売られているものもあるし、古いFCを再利用(set usb_hid_cdc = on)とかがある。
かなりニッチな、ドローン用プロポ接続状況はそんな感じ。

プロポの受信機は SBUS という規格で接続されるのだが、こちらは 11bit 通信する。
しかしながら、一般的な無線ドングルからは 8bit に低分解能化されているらしい。
ということから、ほいほい堂さんで 11bit を再現するデバイスの作成記事がある。
■HOI-LINK高分解能化
http://www.hoihoido.com/blog/wp/?p=4118
さらに HOI-LINK HR として販売もされてる。
https://nonsaya.thebase.in/items/30961376
詳しく説明されているので一読。
ありがたいことに、ほいほい堂さんでは、ソースもHexも配布されています。
これを使って私も作ってみました。
販売とかされているものなので、作成ガイドはどうかなと思い、ほいほい堂さんに確認したところ、快諾いただいたので今回まとめてみました。
アチコチの加工とか、あれやこれや悩むことを考えたら、買ったほうがよさげです。
でも作ると楽しいですし、理解も進むし、改造とかもできるし、受信機を選べるなどのメリットがあるので作ってみてはどうでしょう。
おもしろいぜ。

部品構成については大きく分けて3つ。
1.PIC
PIC焼くのなんてプレステのレッドハンド以来っすよ。(おっさんホイホイ)
こちらは、ほいほい堂さんでも開発に使われたコチラを使います。
■AE-PIC18F14K50
http://akizukidenshi.com/catalog/g/gK-05499/
これのいいところは、USB周りとオシレータ周りが実装されているというところで、自作組はラクでいいです。
これにファームを焼き付けるのですが、「PICKit3」というのを使います。
純正は5000円するみたいですが、アマゾンでパチが2000円ぐらいで売られています。
Microchip というメーカのものなのですが、回路図も公開してて海賊版上等な姿勢らしいです。よく知らんですが。
動かないこともあるかもしれないので、そのあたりは自己判断で。
とりあえず私はガンガン動いています。

2.SBUS 反転回路
SBUSは100MHzの反転信号(Inverted)で通信する。
マイコンとかラズパイとかに入れるときは、UnInverted(反転しない←ややこし)にする必要がある。
反転回路は、ほいほい堂さんにあるとおり、2SC1815と、51KΩ、5.1kΩ の3つあればできます。
受信機が UnInverted SBUS を出力できれば、この回路は必要ないです。
NewBeeDrone の BeeCieverV2 とかできますね。
あれは D16 と SFHSS も使えるし小型なので余ってればよいかも。
それ以外も基板からチョクに信号をとることも可能です。
https://oscarliang.com/uninverted-sbus-smart-port-frsky-receivers/

3.受信機
SBUS のものなら、なんのプロトコルでもいけると思います。
とりあえず手持ちにあった XM+ で構成してみました。
Frsky の近距離で切れちゃう問題にあたったので、なんか工夫がいるかも。

では早速作ってみましょう。
1.PICの焼付
PICKit3 を利用します。
こちらから該当の MPLAB X IDE をダウンロードしてインストールしましょう。
https://www.microchip.com/mplab/mplab-x-ide
コンパイラあるとソースからビルドできますが、Hex焼くだけなら IDE だけでOK。
Hex はほいほい堂さんで配布されている 6/15版を使います。
http://www.hoihoido.com/blog/wp/?p=4118
ソースも公開されていますし、ビルドして焼くのが正当派ですが、まあまずは Hex を焼いてみっか。

AE-PIC18F14K50 と PICKit3 と PC を接続。
コネクタは左詰めで右端が1本余ります。
焼くためのポイントは電源供給。
AE-PIC18F14K50 の MiniUSB をつないで 5v くれてやればよさそうですが、これでは焼けない。
VDDとGNDにチョクで電源を入れてやりましょう。
手持ちにあったブレッドボード向けの 5v 供給 MicroUSB をつかってみた。
みんな持ってる 5v BEC とかでもいいと思う。

焼付作業です。
MPLAB X IDE で、File → Import → Hex で Hexファイルを指定。
その後、こちらのように対象 PIC の種類と焼くツールを指定。

こちらのボタンを押すとサックリ焼いてくれます。

右下にログが出ますが、赤字が出てると焼付失敗です。
基盤構成してからつながらないとヘコむので、がんばって焼き切りましょう。

こんな感じになると焼けているハズです。

2.反転回路の作成
焼けたなら配線ですね。配線は主に反転回路です。ココが一番手間。
Uninverted なレシーバーならこのあたりは必要なく、PICにそのままつないで終わり・・だと思います。(試してない)
PIC側の配線は VDDとGNDとSBUS(UnInverted)の3ヶ所です。

反転回路に必要なのは、トランジスタ 2SC1815 と、抵抗51kΩ、抵抗5.1kΩ の3つです。
http://akizukidenshi.com/catalog/g/gI-06475/
http://akizukidenshi.com/catalog/g/gR-16513/
http://akizukidenshi.com/catalog/g/gR-16512/
fritzingでいい感じに書けなかったですが、トランジスタの E(GND)を一列横にずらして、端子を4列に並べると使い勝手がよいかもしれんです。
私も実際のはそうしています。

3.動作確認
ブレッドボードの試作回路を作りました。
数作るときには PIC の確認するとかにも使えます。
動いたらハンダしてフリスクにまとめました。
この手の電子工作はフリスクに入れ込むのがよくあります。
基盤はフリスクサイズのが秋月電子で売られています。
http://akizukidenshi.com/catalog/g/gP-12188/
60円のと70円のがあって、60円はタダのハンダ穴が並んでて、70円はブレッドボード的な接続になっています。
これ店頭でも横に並んでて、間違えて混在購入とかして、チョイチョイ間違えて悩んだりあります。
よくチェックしましょう。

上が試験用。フリスクは高さがギリで要工夫。

色々悩んだ結果、後日のファームアップデートに対応できるように、基盤を二分割した。

8/6追記:フリスク基板側の反転回路の説明図作ったんで貼っときます。

上の写真とセットで判断してみて。

あとは PC に接続して、デバイスに「HOI-LINK」が出ていることを確認しましょう。
受信機のバインドを忘れないでやって、あとはシミュレータで再設定すればOKです。

で、実際使ってどうか。
私は一緒に充電できるのもあって、有線USB接続でずっと使ってきた。
これは 11bit なのか、はたまた 8bit なのかわからないのですが、まあ変わらない操作感でした。
7/29 の夜にあった WTWONLINE はコレでやっていたのですが、タイムに貢献できていないのは参加者の皆様が知っている。
複数作って周囲のドローンシミュ廃人に配布して確認してみようと思っています。

繰り返しになりますが、素晴らしい情報を公開いただいた、ほいほい堂さんに感謝いたします。
改良版にも大いに期待しております!

追加作成中。慣れると簡単に作れます。反転回路とケース加工以外は。

8/2追記。
ほいほい堂さんから情報いただきました。
上記の記事は最短で動かす方法をいろいろ試した結果で説明していますが、正しくはブートローダーを焼いて、その後ファームを焼くのが正道とのことです。
ほいほい堂さんで説明されています。
http://www.hoihoido.com/blog/wp/?p=1764
ブートローダーを焼くと、USBからファームの焼き込みができたりします。
一発目のブートローダー焼き込みにはPICKit3等の焼き込みツールが必要なので、必要な道具はおなじです。
時間できたらブートローダー版もやってみます。(続・HOI-LINK HR を作ろうぜ、にまとめました)

続・M5StickCでGoProリモコン

前回はコチラ。
https://papalagi.org/blog/archives/1477

反応がよかったので、気を良くして続編登場。
剥きプロは脆弱なので、多頭飼育はあたりまえ。
まあウチの界隈も片手では足りないぐらいある。
沼の中にあるさらに深い沼なのだ。
リモコンが複数対応したいのは、あるよなーとは思う。

最初は ArduinoIDE 使って ATOM Lite あたりのシンプルなの作ろうと考えていた。
「WiFiMulti.h」というクラスがあって、複数リストから電波強度強いのをつなげるみたいなの。
「あれ使えるじゃん!」でピーンとなってゴソゴソ始めた。
WiFiつながるところまで進めて、コマンドを作り込むあたりまで進んだ。
そんな時に、コザックさん(いつもお世話になっております)から、APP.List でスクリプト増やせばいいんじゃね?というアイデアが出た。
それが一番簡単じゃないか。なぜ気づかなかった。

UIFlowはハタからはわからないが、「/flash」の下に Python(厳密にはMicroPython)に拡張子pyスクリプトが並んでおり、そこにスクリプトを置けば「APP.List」に並ぶ。
至極簡単な話なんだけど、標準のツールにそのあたりをどうこうする機能が「ない」。
Linux だと pip から ampy 引っ張ってサクっといけるが、あんま一般的でないかんじ。
なんかもっとないかなーとおもったら VSCode でやる方法が比較的簡単?っぽいのでまとめてみた。

■Microsoft Visual Studio Code
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
マイクロソフトだー。
いろんなところに対応しているので、自分の環境にあわせてインストール。
続いて「Extentions」から「M5Stack」(M5Stickではないので注意)を検索すると、連携する拡張が出てくる。

これをインストールして、割り当てられたCOMポートを指定してつなぐ。
ただし。
つなぐ前に M5StickC 側におまじないがいる。
通常は Internet 経由の接続になっていますが、これを USB に変更。
そういえばさりげなく7/24に更新されて V1.6.1 になってます。

M5ボタンを押しながら起動。
Switch mode
USB
戻って Reboot
USBモードでたちあがる

その後、VSCode に戻って、エクスプローラから COM をリロードすると、ファイルの中身が見えるようになると思う。

「apps」の中にお好みの「スクリプト名.py」を「+」で追加。スクリプト名は日本語ダメよ。
そして例のスクリプトをコピペ。SSIDとPASSは各GoProに変更しよう。
ココからも実行できるので、GoPro に接続するのを確認しても良いと思う。

これで APP.List から選ぶことで切り替えることができます。やれやれっすね。

初心者に簡単な機能ブロックな UIFlow。
凝ったことをするにはめんどくさいという、人生において何度も経験したヤツ再び。
まあでも機能的には困らなくなった。
解像度とFPSのメニュー作るぐらいか?
電池残量は電池の管理チップ撤去してるから動かないんでないかな。
あと教えてもらった GoPro API を見る限りでは、WiFi のオフとかなかった。
https://github.com/KonradIT/gopro-py-api
ステータスもざっくりjsonで吐き出されるので、なんかそういうの得意な人にまかせたい。

ロクにテストしてない上に急いで作ったので、うまくいかなかったら連絡ください。
一緒に頑張るぐらいはやってみますよ。

7/28追記。
GoPro6 Black のWiFiコマンド一覧あった。
https://github.com/KonradIT/goprowifihack/blob/master/HERO6/HERO6-Commands.md

Turn WiFi OFF: http://10.5.5.9/gp/gpControl/setting/63/0

WiFiオフある!と思って試してみたけど、Bad Request で通過せず。残念。
あとスクリプトの最後にコレを追加すると、自動でWiFiに接続して動画メニューに遷移します。

buttonB_pressFor()
buttonB_wasPressed()
buttonB_wasPressed()

8/13追記。
https://twitter.com/papalagiorg/status/1289861400374865920
8/3ぐらいにやって追記忘れてた。
剥きプロは電源切ると初期化されて、細かい設定したいとなるとスマホ使うしかない。
M5StickCのリモコンでも同様の設定を流し込むことで実現可能。
こ汚いサンプルも上記リンク先に置いておきました。
各コマンドはコチラにまとまっている。
https://github.com/KonradIT/goprowifihack/blob/master/HERO6/HERO6-Commands.md

あとSDカードに「gpauto」というテキストファイルを置くことで、アレコレを自動実行してくれる。
WiFiオフとか、SSID変更とか、自動録画開始とかできる模様。
https://github.com/konradit/gpauto
1台ずつの運用ならSSIDとPASSを共通にしちゃうのもありですね。
元ネタはさすがのoscarliangから。
https://oscarliang.com/naked-gopro/

M5Camera WiFi ストリーミングをやってみた

FPVドローンをやるようになってから、なんとか 5.8GHz 使わずに無免許でできる方法はないかを考えてきた。
5.8GHz はそこそこ安いし、簡単だし、まあ便利なんだけど、免許とか業務利用とか同時利用3機までとか心底めんどう。
低遅延で、5.8GHz VTX システムと同じように、複数の環境で受信できるのが望ましい。

そうなるとまあ WiFi ベースなんですね。
なんかねえかと探した先に見つかったのが WebRTC。
■WebRTC Native Client Momo がスゲエ
https://papalagi.org/blog/archives/635
Momoスゴイ。解像度高く低遅延でオープンソース。
ラズパイのGPUを使って H264 をエンコして転送する。
ドローンの FPV カメラとして利用するには、H264 はあまり適さず、VP8 か VP9 が必要な感じ。(ハードウェアエンコ効かなくなってしまう)
そこそこの解像度欲しいとなると、Jetson nano を積みたくなり、それだとちっこいドローンには難しい。
たしかに DokeyCar のたぐいはみんな Jetson nano とかですね。
85mmクラスのドローンでラズパイゼロが載せられる限界。
搭載してみた。

愛すべき雑な仕事。
そういえばカッコイイマウンタも作ったような…

遅延は200msぐらいで、解像度も720pぐらいだが、まあなんとか実用というレベルにはなった。
しかしラズパイは Linux なんでブートの時間長い。電源ブチ切りもちょっと気になる。
なお余談ですが、ラズパイゼロに 1S Lipo から電源供給する時は、電子工作とドローン界隈逆なので注意。
https://papalagi.org/blog/archives/740

もっと軽い WiFi カメラないものか。
で、今回 M5camera(わずか5g)を活用する方法が盛り上がっていたので試したみた。
M5camera は ESP32 に OV2640 という2万画素のカメラモジュールをつけたもの。
解像度はそこそこ、MotionJpeg になっちゃうが、パッケージがシンプルだし、軽いし、安い。(2000円弱)

果たしてやり方とは。ズバリこちら!
■LovyanGFXとJpgLoopAnimeでM5StackとM5Cameraの全画面WiFi動画ストリーミング実験
https://www.mgo-tec.com/blog-entry-lgfx-jpgloopanime-m5stack-m5camera01.html
mgo-tecさんは M5 を始めとするマイコンを使って様々な作例を作られる方で、いつも参考にさせてもらっている。
M5camera が出てからストリーミングができないか、いろいろやられていた。
LovyanGFXはらびやんさん作成の M5 向けグラフィックライブラリで、界隈ではスゴイスゴイと繰り返し聞いていた。
この両名が悪魔合体して、M5camera のストリーミングをいっきに実用レベルに引き上げた形だ。

さあやってみよう。
M5cameraがストリームサーバになって、M5Stackが表示します。
M5Stackで素早く描画するために LavyamGFX が活躍するという構成です。
リンク先はあらためてコチラで補足することはないぐらい丁寧に書かれているので、上記リンクを熟読して作成してください。
jpgWriteRow は 1.0.6 だと 203行ですかね。(動きました)
あと先日のライブラリアップデートで 「WiFi.h」が 2つになってどっちやねん!エラーがあるので、ESP32用でないのは消すなりするといいです。(雑)

早速動かしてみました。想像以上によく動く。
M5Stackの画面にグリグリ動くとちょっと感動しますね。
だいたい遅延は100msぐらいでしょうか。この手のモノとしては少ない遅延です。
やはり動き速くなると時折コマ落ちが発生するようです。
なおストリームの出力先はPCのブラウザでもいけます。
ドローンに載せてどんな感じか後日検証してみましょう。

ブラウザはM5cameraのIPアドレス叩けば出ます。