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 で楽しむのはいかがでしょうか。