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)。

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

CBF125T タコメーター故障&作成 ~その2 ステッピングモーター化~

先日液晶表示のタコメーターを作りましたが、液晶ディスプレイが小さいのと昼間はコントラストが低くて見づらかったのでステッピングモーターに置き換えて針を振らせてみました。

まず前回のタコメーターは下の状態。

反射光でもバックライトでも見えるというディスプレイですが、はやりちょっと見づらいのです。

今回のステッピングモーターについて

ステッピングモーターはAmazonで2個¥1940円で購入。
X27-168という型番で、CNCや3Dプリンタで使う様なヤツではなく、下の写真の様にメーター用の軽量のものです。

後ろ

このモーターはこちらのブログで紹介されていました
またデーターシートはここで発見しました

元々付いていた(壊れた)タコメーターと比べるとこんな感じ。電子回路が別に必要だとしてもかなり小さくて済みそうです。

ところでこのステッピングモーター、2相のバイポーラ動作ですがコイルの駆動が5V/20mAで済むのですね。
という事はAtmega328PのArduinoで直接駆動できます。改めてAtmega328Pの絶対最大定格を見たらI/Oピン電流は40mAと書かれています(20mAだと思ってたのでギリのつもりでしたが、実は結構余裕だったのね)。

また通常動作(マイクロステップ等にしない場合)では、1ステップで1/3度回るのでタコメーターの分解能としては十分です。

回路

回路的には先日作った液晶方式からディスプレイを取り外し、ステッピングモーターの配線4本をつないだだけ。
あ、あとパルスを割込みでカウントするため、入力ピンをD5→D2に変更しています(Atmega328PのArduinoで割込みを使うにはD2かD3に入れる必要があるので)。

取り付け

パネルへは新たな穴を開けて直接モーターを取り付けました。
不要になった穴は夜間に光が漏れそうなので裏からプラパテで埋めたのち、表から黒塗りしています。


取り付けにちょうど良いサイズのタッピングビスが手持ちになかったので、モーターの取り付け穴(元々Φ1.85)にタップを立ててM2ネジで取り付けました。

指針は元々付いていたものを使うのですが、軸の太さが元のメーターだと0.8mmに対し、今回のモーターは1mmと太くなります。
そこで指針の軸穴を0.95mmのドリルで拡大したら丁度良くなりました。
因みに0.95mmのドリルは写真のセットに含まれています(Tinyドローンの軸拡大にも時々0.95mmを使うので単品で買っておきたいのですが売っているのを見かけません。通販で買っとけばよいのですが)。

そして一通り接続したところ。。。

プログラム

前回はゲートタイム200mSでパルスをカウントしていましたが、低回転での分解能を改善するため1パルス毎に割込みをかけてArduinoのmicros()時刻からパルス間隔を測定しています。
モーターコイル2本のそれぞれ両端に加える電圧は以下の配列を用意しておき順次切替えています。

// 各ステップの端子状態
int coil1a[]={1,1,0,0,0,0};
int coil1b[]={0,0,0,1,1,0};
int coil2a[]={1,0,0,0,0,1};
int coil2b[]={0,0,1,1,0,0};

動作させてみる・・・

アイドリング時の振れが大きいです。
またキーをOFFした時に0rpmに戻らずその場で止まってしまうのがカッコ悪いですね。

対策

まず振れが大きい問題についてはソフト的にローパスフィルターの処理を強目にしました。

次にキーOFF時の動作ですが、OFFの瞬間に電源が切れてしまうと0に戻せないので、戻すまでの時間分の電力を貯めておく必要があります。なら電解コンデンサでしょうね。
ざっくり計算で10000μF程度をつけたいところですが手持ちにないし大きすぎるので試しに4700μFを、ArduinoNANOのレギュレータに供給している12VとGND間に付けてみました。
・・が、キーOFF時に0rpmには戻りませんね。
でもこれは想定内。単に12VとGND間にコンデンサを繋いだだけではコンデンサに貯めた電荷は車体側にも流れてしまうのであっという間に放電し、タコメーター側に供給する電力は僅かになってしまいます。
これを防ぐため、バイクから供給する12Vとタコメーターの間をダイオードで分離してみます。また電源ON時にガバッと流れるのがイヤなので抵抗とダイオードをパラにつないで下図の様に接続しました。

これでコンデンサの容量を替えて試したところ2200μFでOKですが1000μFだとダメ。よって少し余裕を持たせて3300μFを取り付けました(4700μFの方が安心ですが50V品で大きくてケースに入らないのです)。

実際の配線は下の様なのを作ってギボシ端子接続に割り込ませています。

コンデンサはテープで貼り付けました。この位置ならケース内に納まります。

もう一度動作確認・・・

指針の揺れがかなり納まり、キーOFF時に0rpmに戻る様になりました。
しかし実際に走ってみると、アクセルを開けている間だけまだ揺れがすこし大きいですね。
もう少しローパスフィルターを強めに効かせようと思いますが、またメーターを外すのが面倒なので次回バラす機会があればやろうと思います。

Arduinoのスケッチ

参考に今回のプログラムを載せておきます。

http://www.hoihoido.com/data/tachometerX27_2.zip

CBF125T タコメーター故障&作成

先日の長距離ツーリング中、岩手県のあたりでタコメーターが壊れました。
最初は指針の大きくブレているなと思っていたらだんだんと明らかに低い回転数を指す様になり、最終的には全く振れなくなりました。
まあ速度計の方は正常なので走るには問題なく、帰宅までこのままの状態だったので原因を調べてみます。

とにかくメーターを外してみます。

中身・・・

更にバラすと・・・

タコメーターは電気式で3本の電線が出ており、黒色が+12V。緑色がGND。黒/黄が信号線です。
黒が+12Vというのに違和感がありますが何故かそうなっています。

基板上にはBAK225というICが載っていて入力パルス数に応じてメーターを動かしている様です。
このあたりの事はこちらのブログが参考になりましたがICのデーターシートは見つかりませんでした。

まずは問題切り分けの為、車体側からタコメーター側に信号が来ていることを確かめます。
タコメーターを接続していないと0V付近のノイズっぽい信号しか見えず、タコメーターを接続すると下の波形が見えました。プルアップでも波形が出るのでオープンコレクタ出力かもしれません。

アイドリング時の波形。

何はともあれ車体から信号は出ているのでメーター側に問題がある様です。
ではメーター側を調べていきます。
後で組み立てる際に指針がずれない様1000rpmの位置にマジックで印をして・・・

取り外しました。

メーターコイルの配線をテスターで当たると導通がなく、どうやらコイルが切れている様です。
でも目で見る限り断線箇所は分かりません。

更にバラしている間にバネも歪んでしまい、もう正確なメーターに戻る気がしません。

さてどうしましょう。
CBF125T用として売られているメーターAssyは1万円くらいします。
同様のメーターがジャンクでないか、バイク基地(UPガレージ)を探したけど見当たらず・・・
市販の適当なメーターを取り付けるのも考えましたが元々がスピードメーターと一体のデザインなのでハンドル回りの納まりが不格好になりそうです。

まあタコメーターなので無くても走れないわけではありませんが、急坂をシフトダウンして上る時に回しすぎていないか気になります。

という事で、使えそうなメーターがみつかるまで、Arduino NANOでパルス数をカウントして手持ちのLCDに表示する事にします。

ざっとこんな回路で・・・

そしてプログラムの作成。
カウンターのライブラリはこちらで紹介されていたものを使用しました。
ゲートタイムを指定できるので200mSにしています。

スケッチ(参考)

下の様に取り付けました(やはり不格好ではあります)。

ところで車体から出ているパルスはエンジン1回転につきパルス1発なのでしょうか?
その前提でプログラムすると回転数が高すぎた表示をする様です。

そこでイグニッションコードに電線を巻いて取り出したノイズと見比べてみると・・・
黄色がイグニッションノイズ。水色が車体からタコメーターに送るパルス。
タコメーターパルス4発に対し一回イグニッションノイズが出ています。

ここでもう一つの疑問が・・・。イグニッションプラグは毎回転スパークするのでしょうか?それとも2回転に1回でしょうか?
4ストロークエンジンなので爆発は2回転に1回ですが、プラグは毎回スパークしているバイクも結構ある様です(点火タイミングを単純にクランク軸から取り出すとそうなる)。

どうやらCBF125Tではエンジンが1回転につきタコメーターパルス2発の前提で表示すれば正しい回転数になる様です。という事はプラグは2回転に1回スパークしているのかな?(タイミングはどこで検出しているのでしょう?)

動作中の動画

とりあえず回転数が分かる様にはなりましたがLCDが小さくてちょっと見づらいですね。
また、一応昼間は反射光、夜は透過光で視認できる仕様のLCDを使っていますが昼間はちょっと見づらいです。

調べていくとメーター表示用のステッピングモーターというのがAmazonでも入手できる様なので、これで指針を動かしてみるのも良いかもしれません。

フライトコントローラーを自作してみる。~その19~ F7マイコン購入

コロナ禍による半導体不足で長らく手に入らなかったSTM32F722マイコン、最近Aliexpressを見たらマトモな値段で売られているのを見つけ、2個注文したのが届きました。
1個1297円×2個。

自作FCの中に壊したのが1枚あって、どうもマイコンが壊れているっぽいのでこれに交換しようと思います。
でも最近、ちょっと忙しいのでもう少し先。。。

CBF125T その3 旅仕様

引き続き激安中華バイクのCBF125Tを旅仕様にしていきます。
というのも近々ロングツーリングを目論んでいるのです。

サイドバッグガード

前回、古~いサイドバッグを取り付けた事を書きました。これで大体OKなのですが、バッグがリヤサスと擦れないか心配なのでガードを作ってみました。
6mmの鉄筋を曲げ、平板に溶接してネジ穴を開けています。

後ろ側のボルトは最初からキャリアについていた穴(何の為の穴か不明ですが)を利用できたのですが、
前側を取り付ける場所がなかったのでキャリアに平板を溶接しています。

これでバッグとショックが擦れる心配が無くなりました。

ホムセン箱

サイドバッグだけではロングツーリングの荷物は積みきれません。そのため昔は防水バッグを使っていましたが既に持って無いし(たぶんボロくなって捨てたのだと思う)、最近はショップでも見かけません。
ショップにはシートバッグというのが売られていますが結構なお値段がする上にバッグ自体は防水では無く、雨の日にはレインカバーを被せる必要があるみたいです。
そこでホームセンター(ナフコ)で収納箱を買ってきて荷締めベルトで縛ったらいい感じになりました(税込み2380円)。
どうやらロングツーリング界では「ホムセン箱」と称してメジャーな方法らしいです。

固定方法については皆さん色々と工夫されている様で、私もボルト止めにするか縛り付けるか、まだ迷っています。また箱の上にも荷物を積む為に、側面にUボルトを取り付けている例も多く、これは真似してみようと思います。

タンクバッグ

頻繁に取り出すものや貴重品はタンクバッグに入れておくと便利ですが、これも昔持っていたものは既にありません。で、初めてジモティーを利用して買ってみました。近くのスーパーの駐車場に受け取りに行くとやはりツーリングをされる方が出品されていたので30分程話し込んでしまいました。
このタンクバッグ、TANAXのMFK-027というモデルで2800円で新品同様でした。

全部搭載してみる

全部搭載するとこんな感じですね。
ハンドルにスマホとGoProも取り付けてみました。
前のオーナーがUSB電源を取り付けていたので走行中に充電もできます。

だいぶ完成形に近づいてきました。
20年以上前は長期連休の旅にツーリングに出かけていましたが久々の復活を目指しているのです。

CBF125T その2 サイドバッグ

前回の続き。格安で購入したCBF125Tでツーリングするため、サイドバッグを取り付けたいと思います。

これがウチにあるサイドバッグ。昔よくツーリングしていた頃のバッグで30年ぐらい前の物です。

これ、バッグそのものは今でもしっかりしているのですが、バイクに取り付けるためのベルトがありません。 メーカーに聞いても流石にこんな古いバッグ用のベルトは無いとの回答。
そうなると作るしかありません。

手芸店で30mm幅のベルトを買ってきて、適合するバックル(NiFCOSR30)も購入。大体こんな構造だったかなという記憶を基にミシンでカタカタやりました。
そして出来たのがこれ( 所々ミシン縫いを失敗して糸がグチャッとなってますが)。

ではバッグを取り付けてみます。

良さそうですね。

次、元々付いていたレインカバーは朽ち果て捨ててしまったので、こちらも何とかする必要があります。
またまた手芸店に出向いて薄手の防水生地を購入。
水を載せてみても大丈夫です。

ところでこのサイドバッグ、荷物が増えた時に容量を増やせる仕組みになっています。
大の状態と小の状態はこんな感じ・・・

という事は大/小両サイズに対応できる様、レインカバーは絶妙なサイズに作る必要があります。これは中々難しそう。そこで一旦適当な布で作ってみてOKになったところで本番生地で作り直しました。
縫い目の裏側にはシームテープを貼りたかったのですが手元にないので、端切れをテープ状に切って接着剤(GPクリア)で貼り付けました。

一応、この状態でシャワーを掛けても浸みこまなかったのでヨシとしましょう。

折角なのでこのサイドバッグを取り付けてツーリングしたいですね。近場に無料のキャンプ場があるので行ってみました。

こんな感じで走って行って・・・

キャンプしてきました。

関係ないけどテントも古く、フライシートのシームテープが劣化して剥がれてしまいました。今回雨は降らなかったので良かったのですが、これも何とかせねば。。。

でも久々のバイクキャンプ。いいですねぇ。

HOILog・・無人航空機飛行日誌を自動化 その2

先日報告したHOILogですが、飛行練習会で使ってみると幾つか問題点が見えてきました。

WTW熊本の練習会で試している風景。
(Tinyなので本来ログはいらないですが)

一番問題なのはGoogleドライブにアップロードする時にリトライが発生した場合。自宅の無線環境だとリトライする事はほぼありませんが、スマホのテザリング経由だと(電波状況にもよると思うけど)頻繁にリトライが発生し、リトライしていてもGoogleドライブには届いている事も多く、複数回のログがアップロードされてしまいます。
Googleドライブ側はこちらの仕組みを使っていますが仕組み的にリトライが発生するとそのまま全部が残ってしまいます。リトライになること自体はネットの都合なので対応が厳しく、きちんと対策するにはGoogleドライブ上のスクリプトを変更していく必要があると思います。

一方SDカードには安定してログが残るので、当面はこっちを主に使いたいと思います。。。が、これまでSDカードには時刻ぐらいしか記録していなかったので、今回機体名や場所を残す様に変更しました。

SDカードに残すログのフォーマット:
右から時刻、飛行場所、機体名、離陸か着陸か、アップロードしたか、その場合のリトライ回数 を示します。

例:

2023-03-19 22:34:15,KUMAMOTO,Mobula6,TakeOff,Upload success,1
2023-03-19 22:34:25,KUMAMOTO,Mobula6,Landing,Upload success,1
2023-03-19 22:34:36,KUMAMOTO,Mobula6,TakeOff,Upload success,1
2023-03-19 22:34:45,KUMAMOTO,Mobula6,Landing,Upload success,1

あとコンフィグファイルのデータ中にスペース文字があった場合にスペースを消してしまっていたのを修正しました。
試しに飛行場所にスペースを1文字入れ「KUMA MOTO」にしてみたのが以下の結果です。。。

2023-03-21 23:58:14,KUMA MOTO,Mobula6,TakeOff,Upload success,1
2023-03-21 23:58:23,KUMA MOTO,Mobula6,Landing,Upload success,1

ついでに飛行場所に日本語を使うとどうなるか実験しました。
飛行場所を日本語(文字コード:UTF-8)で書いたところ、液晶画面には正常に表示できませんがSDカードとGoogleドライブ、どちらのログにも正しく記録されています。

2023-03-19 22:38:15,熊本県合志市,Mobula6,TakeOff,Upload success,1
2023-03-19 22:38:30,熊本県合志市,Mobula6,Landing,Upload success,1

なおM5Stackには液晶画面に日本語を表示させる方法もある様なので、そのうち試そうと思います。

以上を修正したスケッチをここに載せました。
http://www.hoihoido.com/data/HOILog20230323.zip

HOILog・・無人航空機の飛行日誌を自動化

最近M5Stackにハマっていました。
M5Stackというのはまあ簡単に言うとESP32マイコンにLCDディスプレイやバッテリーを含んだ電源管理回路などをつけて一式をケースに入れたものです。
私が購入したのはCore2という機種で外観はこんな感じ・・・

M5Stackは数年前から出ていて気にはなっていたのですが、値段がちょっとお高めだったりして手を付けていませんでした。で、今更ながら購入してみたら結構便利なんですよね。 特に電源管理回路とかイチから作るとそれだけで何かにハマりそうですが、これなら最初から入っています。

HOILog

という事で何を作っていたかというと「無人航空機の飛行日誌を自動でとるシカケ」です。命名:HOILog。
M5Stack Core2を選んだのは内部に時計(RTC)を持っているので時刻を記録し易いのです。

構造は ざっと下の通り・・・

RC受信機が信号を受けるとSBUSやCRSFプロトコルでM5Stackに伝えます。
(SBUSはフタバ系、CRSFはELRS等で使われるプロトコルです。両方対応しています。)
M5Stack側では信号が来たら飛行開始と判断し、マイクロSDカードに時刻を記録します。そして信号が途絶えたら飛行終了ということでまた記録します。

更にM5StackにはWiFi接続機能があります。これを利用してWiFiが利用できる環境であればASAKICHI先生作の飛行日誌システム( 詳細 はこちら) にもアップロードできるので、Googoleドライブ上のスプレッドシートに記録が残っていきます。

動作しているところはこんな感じ→Twitterに上げた動画

ハードウェア

M5Stack Core2の裏にピンソケットがあります。新品の状態ではここにフタを兼ねた気圧センサー基板がついていますが、今回は不要なので取り外して+5V電源、GND、UART2のRX/TXを引き出し、RC受信機に接続します。
ELRS受信器には入力(RX)信号があり、現在は使っていませんが将来何かに使うかもしれないので繋いでおきます。SBUS受信機の場合は入力信号がないのでM5StackのG14(UART2-TX)端子はオープンにしておきます。

ブレッドボード上に組んだセット(回路図にはないですが分かりやすい様に電源にLEDをつけています)。

ソフトウェア

M5StackはULFlow、ArduinoIDE、Micropython等の開発環境が選択できます。私はこの中から一番なじみのあるArduinoIDEを使用しました。
ところがやり始めて気づいたんですけど、コンパイルが結構遅いんです。ググってみると皆さん同じ問題により、PlatformIOに乗り換えられている様です。PlatformIOとはVisualStudioCode(以後VSCode) に入れるプラグインで、たぶん一言で言い表すと各種マイコンに対応した開発環境だと思います。
確かにPlatformIOでビルドするとかなり早くなり快適です。またベースがVSCodeなので入力補完があったり、キーバインディングをEmacs風に変更したりできて便利です。(余談ですがEmacs風キーバインディングにしたとき、VSCodeの仕様によりEscキーを使用できず、代りにAltキーを使う事になるのが弱点です)。

ところがPlatformIOで作ったスケッチが大体安定した動作になった頃、このブログで公開しようかなーと思い、その前に一旦ArduinoIDEに戻してビルドしたところ何だかうまく動作しません。(M5Core2ライブラリはどちらも同じバージョン(0.1.5)なのですが、もっと奥の方のライブラリのバージョン違いが原因かもしれません。)

とりあえずハマったのは下記の2点。
・タイマーの一旦停止後再起動する場合の動作の違い。
 timerStop(timerxx)で停止した後に再起動するとき、 PlatformIOはtimerRestart(timerxx) で再起動できていたのがArduinoIDEだと止まったまま。
 →対策:timerAlarmDisable(timerXX)で止めて timerAlarmEnable(timerXX) で復帰させる。ただし復帰直後のカウントアップが嫌だったので timerAlarmEnable(timerXX) 直前にtimerRestart(timerxx) も実行した。

・HTTPにPOSTした後同じオブジェクトでGETできない問題。
 Googleドライブへアップロードするとリダイレクト指定が返ってきます。このため一旦POSTでアクセスした後、今度はGETでアクセスするという2段階のアクセスが必要となります。そこでPlatformIO上では、HTTPClient http;で作ったオブジェクトを使いまわして接続していました。しかしArduinoIDEだとエラー(エラーコード400が返る)となりました。
色々試したところ、どうやらArduinoIDE上では GET→GETなら できますがPOST→GETはダメでした。
 → 対策: HTTPClient http2; の様にもう一つオブジェクトを宣言し、POSTはhttpオブジェクト、GETはhttp2オブジェクトで使い分けた。

使い方~セットアップ編~

  1. ArduinoIDEとM5Stack Core2の開発環境を準備する。私はこちらのページを参考にしました。
  2. この投稿の一番下からM5Stack Core2用のスケッチをダウンロードして解凍する。
  3. PCとM5Stack Core2の間をUSBケーブルで接続する。
  4. 「2.」で解凍したフォルダ内のHOILog.inoをダブルクリックするとArduinoIDEが開く。
  5. ArduinoIDEのツールメニュー→ボード名を”M5Stack-Core2″、シリアルポートを該当するポート名(不明な場合はWindowsであればデバイスマネージャーで調べる)に設定する。
  6. 書込みボタンを押して書き込む(若干時間が掛かります)。書き込みが完了したら電源ボタンを長押し(約6秒)して一旦電源を切る。
  7. 上の「ハードウェア」に書いた様にM5StackとRC受信機を接続する。
  8. 設定ファイル”hoilogini.txt”を作成して マイクロSDカードのトップディレクトリに置く。※SDカードの使用は必須です。
  9. 電源ボタンを押して起動!!

設定ファイルについて

SDカードのトップディレクトリに”hoihoiini.txt”の名前で作成します。
内容は1行に1パラメータを設定。1行は256バイトまで。行先頭にディレクティブ、その後1文字以上の空白を置いて設定値を書きます。#記号より右側はコメントです。

設定ファイルの例・・・

# HOILog 設定ファイル 

LOGFILE /hoilog.txt # File name
SCREEN 60 # Screen save time.(Seconds)
RCTYPE SBUS # SBUS or CRSF
RCJUDGE RSSI # RSSI or RCSIGNAL
RCRSSICH 16 # Channel number
RCRSSITH 1000 # Threshold value
RCCONTTIME 3 # Signal continue time
BAUDRATE 100000 # SBUS:100000 CRSF:420000
WIFITIMEOUT 20
SSID XXXXXXXX
PSWD XXXXXXXXX
LOGURL https://script.google.com/macros/s/XXXXX/exec
LOC1 ASO
LOC2 AMAKUSA
LOC3 KOSHI
MODEL1 Tyro99
MODEL2 Switch
MODEL3 Five33

各ディレクティブの説明:

LOGFILE:SDカードに残すログファイルの名前です。
SCREEN:指定の秒数イベントがないと画面を暗くします。ボタンを押したりRC信号が変化すると表示を再開します。値が0の場合は常に表示です。
RCTYPE:RC受信機の信号フォーマットがSBUSかCRSFかの指定です。
RCJUDGE:飛行中の判定をRC信号の有無で判定するか、RSSIで判定するかの指定です。受信機によっては電波が途絶えても最後の状態を維持するので単に信号が途絶えたかどうかでは判別できません。その場合でもRSSI(信号強度)がどこかのチャンネルに出ていればこれを基に判別可能です。
RSSICH:RSSI によって飛行中である事を判定をする場合、RCチャンネルの何番がRSSIを示すかを指定します。
RSSITH:RSSI によって飛行中である事を判定をする場合、 RSSICHで示すRCチャンネルの値が幾つ以上なら信号ありとするかを指定します。CRSFの信号範囲が172~1811、SBUSも大体その程度なので1000あたりを入れておけば大体OKだと思います。
RCCONTTIME:瞬間的な信号の切断やノイズによる入感を除去するため、
(立上り/下り共) 信号が何秒間連続で続いたら変化したと判断するかを指定します。
BAUDRATE:RC信号のボーレートを指定します。SBUSは100000固定。CRSFは420000がよく使われる値です(115200も使われる様ですが手元に確認する環境がなく、動作を確認していません)。
WIFITIMEOUT:WiFi接続時、何秒以内に接続できなかったらあきらめるかを指定します。
SSID:WiFi接続のSSIDを指定します。
PSWD:WiFi接続のパスワードを指定します。
LOGURL:Googleドライブにアップロードする為のGoogleApplicationScriptへのURLです。こちらのASAKICHI先生の動画の8分20秒頃に説明があるURLです。
LOC1~5:飛行場所を5つまで設定できます。M5Stack上のメニューでこの中から一つを選択してログに残せます。電源投入直後はLOC1が選択されています。MODEL1~5:機体名を5つまで設定できます。 M5Stack上のメニューでこの中から一つを選択してログに残せます。 電源投入直後はMODEL1が選択されています。

※LOCxやMODELxの値に日本語等の2バイト文字を入れるとどうなるかは試していません。

使い方~操作編~

電源を入れるとまずWiFiに接続した後、下の基本画面になります。
WiFiに接続できなかった場合はSDカードへの記録のみ行い、Googleドライブへのアップロードはしません。
この状態でRC電波を受けるとRCCONTTIMEに設定した値の秒数信号が続く事を確認後、SDカード、およびGoogleドライブのログに記録を残します。
Googleドライブへ記録する間、飛行状態表示部に「START UPLOAD」又は「STOP UPLOAD」と表示し、この間RC信号モニタや時計は動作しません。
Googleドライブへの記録は失敗すると3回までリトライします。最終的に成功したか失敗したかはSDカードに記録します。なお稀にですがサーバが正常に受付けて成功した旨の通知を返したのにM5Stackまで届かなかった時はリトライするので複数回の記録が上がってしまいます。その場合はSDカードのログを参照しながら手動でGoogleドライブ上のデータを修正する必要があります。

M5StackのCore2にはボタンがA,B,Cの3つ搭載されています(このボタンは物理的な接点ではなくタッチセンサーになっていて、押した感触が伝わりにくいですがちゃんとボタンとして機能します)。
基本画面ではボタンCを長押しすると設定画面に移ります。
ボタンA,Bには機能を割り当てていませんが、スクリーンセーバーからの復帰には反応します。

設定画面(MAIN MENU)
上から時計設定、電源OFF、機体選択、飛行場所選択、メニュー終了です。
反転文字になっているところが現在対象となっている行で、ボタンAを押すと上、Bを押すと下の行に移動し、Cを押すと選択されます。
「電源OFF」を選択するとシステムの電源を切ります。「EXIT MENU」を選択すると基本画面に戻ります。
時計設定、機体選択、飛行場所選択の各画面を以下で説明します。

時刻設定画面
ボタンA,Bを押すと反転文字になっている部分の値が上下に変化します。ボタンCは決定ボタンで次の値に進みます。年月日~秒まで進み、次にボタンCを押すと図に「NEXT」と表示された部分に移ります。ここではボタンA,Bを押すと「NEXT」、「SAVE&EXIT」、「EXIT:NonSAVE」と順に変化して行きます。それぞれの状態でボタンCを押すと以下の動作をします。
・NEXT:最初の「年」の設定に戻ります。
・EXIT:NonSAVE:時刻は変更せずにメインメニューに戻ります。
・SAVE&EXIT:内臓時計に設定時刻をセットし、メインメニューに戻ります。

機体選択
ボタンA,Bで対象行を上下させ、ボタンCで選択すると機体が選択されてメインメニューに戻ります。

飛行場所選択
ボタンA,Bで対象行を上下させ、ボタンCで選択すると飛行場所が選択されてメインメニューに戻ります。

ログ

実行後はSDカードのLOGFILEで指定したファイル名に以下の様なログが残っています。

TakeOff,2023-03-05 22:46:36                  ←離陸時刻
Upload success,2023-03-05 22:46:36 ←離陸をGoogleドライブにアップロード成功
Landing,2023-03-05 22:47:13 ←着陸時刻時刻
Upload success,2023-03-05 22:47:13 ←着陸ををGoogleドライブにアップロード成功

Googleドライブ上には(アップロードしていれば)次の様なログが残ります。

スケッチ

HOILog20230306.zip

※このソフトウェアを使用されてもし問題が発生しても責任は持てませんのでそのあたりはよろしくお願いします。