ESCを作ってみる~その4~ メロディエディターにハマる

先日のESC自作実験でbluejayファームウェアを入れた事を書きました。

bluejayにはスタートアップ時にモーターからビープ音が鳴りますが、代わりにメロディーを鳴らす機能があります。これにはESC Configurator中のMelody Editorを使う事で、PC上であれこれ試した後、納得がいった時点でESCに書き込むことができるのです。
これ、色々と鳴らしていると楽しくなってハマってしまいました。

まずやり方のメモ・・・

Bluejay ESCにスタートアップメロディを書き込む方法

まずブラウザー(Chromeでやりました)を立ち上げてESC Configuratorを開きます。
ページの真ん中より少し下あたりに「Open Melody Editor」というボタンがあり、これを押すとメロディーエディターが開きます。

下の画面がメロディーエディターです。
「bluejay:b=570,o=4,d=32:4b,p,・・・」と書かれている場所がメロディーのデーターで、立ち上げ直後はBluejay標準のビープ音が設定されています。
ここで「Play」ボタンを押すとPCからメロディーが流れます(まずはPCだけで試せるのです)。
また「Select a Melody」プルダウンにはあらかじめ色々なメロディーが収録されているので、色々切り替えて鳴らす事もできます。

で、このメロディーデータ、音楽知識ゼロなのでパッと見なんだかわかりませんが、調べるとノキアが開発したRTTTL(RingToneTextTransferLanguage)という、元は携帯電話の着メロを記述する為のものだそうです。
詳細説明はウィキペディアにありました。
→ https://en.wikipedia.org/wiki/Ring_Tone_Text_Transfer_Language

この説明をメロディーデータと見比べると何となく判ってきたので、試しに「お風呂が沸きました」のメロディーを入れてみます。ネット上に落ちていた楽譜を見ながら何とか変換したのが次のデータ。

DollsDream:b=200,o=4,d=16:8g,8f,4e,8g,8c5,4b,8g,8d5,4c5,4e5,4p,8c5,8b,4a,8f5,8d5,4c5,4b,2c5

ではこれをESCに書き込んでいきます。

PCとFCをUSBケーブルで接続し、ESCに電源を入れて・・・
ESC Configuratorの「Open Port Selection」でポート番号を選んだ後、「Connect」ボタンを押します。

下の画面が出れば接続成功なので、右下の「Read Settings」ボタンを押します。

すると下の画面に変り、諸々の設定内容が表示されています。ここで「Open Melody Editor」ボタンを押します。

すると先ほどと同じ様なメロディーエディターが開きます。
さっきと違うのは「Accept」や「Write Melodies」ボタンが増えているあたりです。

では作ったデーターをコピペして「Play」を押してみましょう。先程と同様にPCからメロディーが流れます。内容に納得がいったら「Accept」を押した後「Write Melodies」を押すとESCに書き込まれます(書込みはあっという間でした)。

あとはMelody Editorを「Close」し、ESC Configuratorの「Disconnect」を押した時点でESCが再起動するので、先ほど書き込んだメロディーが今度はモーターから流れます。

実際にESCの起動音として使うには、あまりに長いと待っていられないのでb=200の部分を調整すればよいと思います(この値はテンポなので数値を大きくすると早くなる)。

楽しくなってきたので色んな曲を入れてみました。

メロディーデーターと共に動画を掲載します(音楽は素人なので変な個所もあると思いますが・・)。

♪お風呂が沸きました
DollsDream:b=200,o=4,d=16:8g,8f,4e,8g,8c5,4b,8g,8d5,4c5,4e5,4p,8c5,8b,4a,8f5,8d5,4c5,4b,2c5

♪Jupiter
Jupiter:b=150,o=4,d=16:8f,8g#,4a#.,8c#5,8c5,8g#,8c#5,4d#5,4c#5,8c5,8a#,8c5,4a#,4g#,2f

♪ロンドンデリーの歌
Londonderry:d=4,o=4,b=150:8d,8d#,8f,4g.,8f,8g,8c5,8a#,8g,8f,8d#,4c,8d#,8g,8g#,4a#.,8c5,8a#,8g,8d#,8g,2f

♪トトロ
Totoro:b=140,o=4,d=32:8c,8d,8e,8f,8g,8p,8e,4c,4g,8f,8f,4d,.2p,8f,8p,8d,4b3,4a,8g,8g,4e.

♪まんが日本昔話
mukashi:b=140,o=4,d=16:8a,8g, 2a,16g.,32p,16g.,32p,16f.,32p,16f.,32p,16g.,32p,16g.,32p,16g.,32p,8f,2g

♪威風堂々Elger:b=150,o=4,d=16:2c5,8b,8c5,4d5,2a,2g,2f,8e,8f,4g,2d,4d.,8p,2e,8f#,4g,8a,2d5,2g,2c5,8c5,4b,8a,2g,4g.,8p

♪未来少年コナンConan:b=150,o=4,d=16:16e.,32p,16e.,32p,16d.,32p,8c,8c,8c,8e,4a,4g,2p,16f.,32p,16f.,32p,16f.,32p,8e,8d,8d,8d,8f,4b,4a,8p

で、ESC製作計画の方ですが・・・

4in1ESCを作ってみようと悪あがきしていますが、やっぱり格安の両面プリント基板では厳しいです。
4層基板じゃないと無理かなぁ。できれば銅箔も分厚くしたいし。でも値段が一気に上がるんですよね。。。

配線がぐちゃぐちゃになる。。。脳みそ沸騰中。

ESCを作ってみる~その3~

ESC自作実験の続きです。

回路

何はともあれ目標とする回路図を書いてみました。動作させてみてマズいところは修正していきます。

マイコンのマニュアルはSiLabsの公式ページからダウンロードしました。
 https://www.silabs.com/documents/public/reference-manuals/efm8bb2-rm.pdf
ドライバのマニュアルは良く分からないところからダウンロードしました。
 https://static.qingshow.net/fortiortech/file/1597746029372.pdf

回路をざっと説明すると次の通りです。

  • 制御用マイコン
    SiLabsのEFM8BB21F16G。この中のBLHeli_Sファームウェアが全体を制御します。
  • 出力パワーMOS-FET
    モーターのコイルに電流を流す為のNch MOS-FETで、手持ちの2SK2232を使用します。
    全てはこの6個のMOS-FETを狙い通りにON/OFFする事がESCの目的となります。
  • FET駆動用ゲートドライバ
    FORTIORのFD6288Q。パワーMOSのゲート駆動用ICです。ゲート駆動するのもそれなりのパワーがいるので電圧及び電流容量アップ、またH/L同時ONの防止等を行います。
  • ブートストラップ回路
    NchのパワーMOSを駆動するにはソース端子よりも10V程度高い電圧が必要です。H側FETがONしている時、ソースとドレインはほぼ同電位なので、結局電源よりも高い電圧が必要です。
    そこでL出力期間にコンデンサにチャージしておき、H出力期間に電源以上の電圧を取り出します。
  • 電気角検出回路
    ブラシレスモーターをセンサー(ホール素子等)を使わずに回すには、現在の回転角を検出する必要があります。このためコイル電圧を抵抗分割してマイコン内臓のコンパレーターで検出します。

ゲートドライバICにはパワーMOSと同じ電源電圧を入れているので2~4セル程度の電圧なら回せると思いますが、2SK2232のゲート・ソース間電圧が最大20Vなので6セルで回すとFETが壊れるかもしれません。
なお部品摘出元の市販ESCでは12Vのレギュレータを挟んでゲートドライバに入れてありました。

製作

で、作ったのがこれ。
パワーMOSは手元にあった2SK2232を6個使用しています。
マイコンとゲートドライバは先日作った基板に載せて、それをブレッドボードに挿しています。
モーターは軸が曲がったジャンク品を接続。
黄色いUSBケーブルを挿しているのはHOIHOI-FC Rev1。既にRev2があるので実機には載せないけど諸々の実験には便利に使っています(なにせ内部の回路が全て判っているので)。ここからDshot信号を発生させるのです。

動作

配線をミスってたりQFNのハンダ付けが上手くいってなかったりしましたが、何とか動作しました。
動作中の動画・・・

Bluejayを入れてみる

マイコンにSiLabs EFM8BB2を使ったESCではBluejayというファームウェアをインストールできます。(Bluejayの存在は最近知ったのですけど・・・)
BluejayはRPMtelemtryが使える等の機能強化がなされているのです。
インストールするにはブラウザから下記のサイトを開くとコンフィグレータが立上がります。
https://esc-configurator.com/
(Chromeで実行しました。ほかのブラウザは試していません。
スタンドアロン版もある様ですがメンテしないので非推奨と書かれていました。ドローンの場合ネットが繋がらない環境で使う事も多いので、その場合どうなんでしょうね?)

実行結果が下の画面です。BLHeliSuite同様、FC経由でConnectしてファームを書き換えました。
更にメロディーエディター機能もあるのでスタートアップのビープ音も変更してみました。

Bluejayに書換後、モーターが回らないので焦りましたが、原因はFCのプロトコル設定がPWMになっていました。BluejayはPWMのサポートは無くDshot専用なんですね。

Dshotに変更し、更にRPMtelemetryをONにした動画。BetaflightConfiguratorに回転数が表示されています。

という事で・・・

バラック状態ですがESCを作れる事が分かってきました。
この先ですが、最終的にはFCとESCを纏めて巷で言うAIO(All In One)基板を作るという野望があります。でもこれはかなり大変そうですね。Ki-cad上で基板設計は出来たとしてもチップ抵抗もこれまでより細かいサイズにする必要があるでしょうし、部品点数も多いので手作業での実装はたぶん無理。また基板も4層以上になるでしょうから値段も上がるし・・・
まずは4in1ESCを作るところからかな?

ESCを作ってみる~その2~

大晦日に基板が到着したので作業を続行します。

前回の投稿にジャンクESCからマイコン(EFM8BB21F16G)とドライバIC(FD6288Q)を摘出した事を書きました。これらのICを基板に載せ、ブレッドボード上であれこれ実験する予定です。

基板に搭載

今回はメタルマスクを作らなかったのでコピー用紙をレーザーカットしてクリームハンダを塗ります。

部品を載せて・・・

リフローしました。

チップ内蔵クロックを使用するので発振子も不要ですし、この後ピンヘッダと電源のコンデンサだけを取り付けました。

マイコンの動作確認

ではEFM8BB2マイコンのGNDとP05端子にフライトコントローラー(以下FC)を接続し、3.3Vの電源を入れます。
この状態でBLHeliSuiteを起動すると設定内容を読出せたので、マイコンは生きていますね(ジャンクから取出したので一応確認)。

次はマイコンに何か書き込んでみたいのですが、公式の書込み機(Toolstick)は持っていません。
調べたところEFM8BBxマイコンにプログラムを書き込むにはざっと以下の方法がある様です。

  • C2インターフェース経由での書込み。
    公式の書き込み機(Toolstick)はこのC2インターフェースに接続する様です。
  • ファクトリーブートローダー
    新品状態ではこのブートローダーが書かれていてUARTから書ける様ですが、今回ESCから摘出したマイコンには下記のBLHeliブートローダーが上書きされているので、この方法は使えません。
  • BLHeliブートローダー
    ESCを購入した時点でファームウェアと共に書かれているブートローダーで、FCからの信号端子をそのまま使ってファームを書き換える事ができます。
    普段FC経由でファームをアップデートする時はこのブートローダーが動作しています。

という事でまずはBLHeliブートローダーからのファーム書換えをやってみます。
と言っても普段やっている通りで、FCを接続すると問題なく書換えができました。

しかし将来的に新品マイコンを買ってきた場合にはこの方法は使えないのでC2インターフェース経由でも読書き可能な事を確認したいですね。公式のマニュアルによると開発ツールのSimplicityStudioから書込み機(Toolstick)を使って接続する様ですが、上記の通りToolstickは持っていません。

そこで見つけたのはPCでBLHeliSuiteを立上げておいてArduino経由でC2インターフェースに接続する方法。 この方法ならBLHeliのファームを壊して文鎮化した場合でも書き直せる様です。

BLHeliSuiteからArduino経由C2-I/Fでファームを書いてみる。

ざっと流れを言うと、BLHeliSuiteを起動し、まずArduinoにファームを書込むことでArduinoがC2インターフェースでの書込み機に変身します。(この時ArduinoIDE等は使わず、BLHeliSuiteから直接書くことができます。)
その後Arduinoとマイコンを接続してマイコンにファームを書込む流れとなります。

ではまずPC上でBLHeliSuiteを実行し、「Make interfaces」タブをクリックすると下の様な画面になりました。

次にPCのUSBポートにArduino(今回NANOを使用)を接続しておき、画面右のボード選択でArduinoNANOを選択、画面最下部でCOMポート番号を選んだら右下の「Arduino 4way-interface」をクリックします。

ここで3つのファームから1つを選ぶ画面が現れたので4wArduinoNano_16_PB3PB4v20002.hexを選択しました。
(ここでPB3PB4とかPD3PD2というのはArduinoのどの端子をC2インターフェースに接続するかの違いだと思います。MULTIというのは良く分かりませんが複数のESCを接続できるんでしょうね?)

あとは「開く」とか「OK」(だったかな?)とかを適当に押すとArduinoにファームが書き込まれます。
これでArduinoが書込み機となりました。

次にArduinoとEFM8BB2マイコンの間を接続して電源を入れます。接続は下の3本です。

 <Arduino>     <EFM8BB2>
 PB3又はD11 ⇔  C2CK
 PB4又はD12 ⇔  C2D
 GND        ⇔  GND

BLHelisuiteのメニュー「Select ATMEL/SiLABS Interface」から、B SiLABS C2(4way-if)を選択します。

あとは普段通り。「Connect」→「Flash BLHeli」とボタンを押してファームを選択すると書込みができました。

Lチカプログラムを書いてみる。

上記の方法で当面の目的は叶えられました。でも折角なので前回ビルドしたLチカサンプルプログラムを書込んでみようと思います・・・が、BLHelisuiteでLチカプログラムを書こうとするとエラーが出てきました。「変なものを書いているよ」という警告ですがキャンセルボタンしか無いです。
どうやらなんでも書き込めるわけではない様ですね。

そこで更に調べていくとow-Silprogというのを発見しました。こちらもBLHelisuiteと同じ様にArduino経由で読み書きするツールです(どうやらBLHelisuiteのC2接続機能のベースになったツールっぽい)。
こちらはAvrBurnToor_V101.exeを使ってArduinoにファームを書込みますが、そこからC2インターフェースに接続するので基本的にやっている事は同じです(但しArduinoに書いたファームはBLHelisuiteとは互換性はない様でした)。
このサイトの説明によるとWindows上で動くGUIツールを使った読み書きもできる様ですが、このツールの存在場所を見つけられませんでした。が、コマンドラインから使う為の命令一覧が載っているので、こちらは実行できました。
この方法でマイコンFLASH内のアドレスを指定して内容を読出す事ができます。実はジャンクから摘出したマイコンではファクトリーブートローダーは上書きされていると先ほど書いたのはこれで読んだ結果からです。

で、bwというコマンドではインテルHEX形式を指定して書込めるという事なので、下の様に1行ずつ書き込んでいきました(Lチカプログラムは10行もないのでコピペで実施した)。

これでLチカも動作していますね。
ならばファクトリーブートローダーを書き戻す事も出来そうですがキリが無いので一旦止めて、本来の目的であるESCを動かす事を先に進めたいと思います。

つづく・・・

ESCを作ってみる~その1~

前からやってみたかったESCの製作をしてみました。
以前FCを作ったので、加えてESCも作れるとドローンの主要パーツが揃う事になります。(あ、モーターは別ですね)

※略語の確認
 FC :フライトコントローラー
     マイコン基板にセンサーが載ったやつ。ドローンを制御する。
 ESC:エレクトリック・スピード・コントローラー
     ブラシレスモーターを回すドライバ。

ドローン系ESCの種類

今回もESCのファームウェアを1から作るような根性はないのでオープンソースの優秀なファームを使う予定です。
レース系ドローンでよく使われるESC用ファームにはBLHeliというのがあり、更にBLHeli内の分類、その他最近登場したファームも含めて整理してみました。

  • BLHeli
    AtmelやSiLabsのマイコンが対象ですがちょっと古いタイプでレースではあまり使われません。
  • BLHeli_S
    マニュアルによるとBLHeliのnext generationという事です。_Sが何を意味するのかは判りません。SiLabs製マイコンのみ対象でAtmelは対象外みたいですね。
  • BLHeli_32
    STM32マイコンを使った32bit版です。
    RPM telemetry(回転数をFCに送信する機能)がありFC側でRPMフィルターという高度な処理ができるのですが、上の二つと違ってソースが公開されてないっぽいです。
  • bluejay
    これ最近知ったのですがBLHeli_Sの派生版で、SiLabsのマイコンが対象ですがRPM telemetryが使えます。
  • AM32
    これも先ほど知ったのですがSTM32を使ったオープンソースのファームウェアらしいです。

今回製作するESCはBLHeli_Sを対象にします。そして上手くいけば後にbluejayも試そうと思っています。

SiLabs製マイコンについて

という事でSiLabsのマイコンを使う事になりますが、このメーカーって馴染みが無いので調べてみました。
BLHeli_SでサポートしているのはEFM8BBxという8bitマイコンで、このCPUコアはインテル8051の命令セットとコンパチです。8051って随分昔に使った事があり懐かしいですね。たしか8080に周辺回路をつけてワンチップマイコン化した様なやつだったと思います。でもEFM8BBxは処理速度が大幅に向上しているそうです。
ところでBLHeli_Sのソースはアセンブラで書かれているんですね。80のアセンブラなんてすっかり忘れたなー。

BLHeli_Sのビルド

EFM8BBxの開発環境はSimplicity StudioというのがSiLabsのサイトからダウンロードできます。
そこで絶対必要というわけではない(ビルド済HEXファイルをダウンロードすればよいので)ですがBLHeli_Sをビルドしてみたいと思います。
Simplicity StudioにはWindows上で動くGUIな開発環境が付属していますがBLHeli_Sのビルドはコマンドラインからバッチファイルを実行します。
で、実行してみたところC8051開発ツールが評価版なのでサイズの制限でビルドできないっぽいメッセージが出ました。えー、お金いるの? どうやら内部で使っているKeliというコンパイラ/アセンブラのライセンスをARMから買うっぽいですね。
まぁBLHeli_Sのビルドは絶対ではないので一旦置いといて付属のサンプルからLチカプログラムを実行したところ、やはり同じメッセージが出て止まりました。
でもSimplicity Studioを使うならKeliのラインセンスは無料でもらえっぽいメッセージが出ているので表示に従ってラインセンスをもらうとビルドできてしまいました。
という事はBLHeli_Sもビルドできる様になったのかな・・・もう一度バッチを実行してみると確かにこちらも最後まで進み、無事HEXファイルが出来ていました。

ハードウェアの準備

何はともあれ実行してみる為のハードウェアが必要です。
EFM8BBxの評価ボードを調べると市販はされていますが5000円以上します。でもよく考えるとこのマイコンは沢山持っていますよね。
こんな感じで・・・

ジャンクのESC群。ここから摘出すればよいのです。ついでにパワーMOS FETをドライブするドライバIC(FORTIOR FD6288Q)も摘出できます。
なおドライバICのFD6288QはH側にN-MOSを使う場合に必要な電源電圧より数V高い電圧を発生してくれたり、H側とL側が同時にONして貫通電流でFETを壊す事故を回避してくれます。

という事で摘出しました。
・マイコン:EFM8BB21F16G x3個
・ドライバ:FD6288Q x3個

マイコンとドライバ、どちらも0.5mmピッチのQFNパッケージなのでそのままでは配線し辛く、引き出し基板が必要です。Ki-Cadで描いてFutionPCBに発注しました(送料込みで$16.4)。

引き出し基板が届いたら色々試していきたいと思います。