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年も良い年になりますように。