UfoCtrl Ver2.00 U.F.O. TW U.F.O. SA A10サイクロンSA (+PLUSプラス) バッハスマート ROCKET+1D 等BLE制御アプリ

設定の記述を大幅に見直し、制御の自由度を大幅に向上させました。
また、記述のルールも改めて整理して分かり易さと自由度のバランスを再調整しています。

このアプリはBLE(Bluetooth Low Energy)通信機能を持つAndroid4.3(API18)以上の機器でU.F.O. TW、U.F.O. SA、A10サイクロンSA +PLUS(プラス)バッハスマートROCKET+1Dなどの+1D対応グッズをランダムコントロールしたり任意の固定パターンを登録して制御出来たりする野良アプリです。
また、上記以外の機器でも条件が合致する機器であれば接続情報を正しく設定に記述することで同様に制御できる可能性があります。

対象となるデバイスは以下になります。

なお、ROCKET2
ROCKET2
についても、
筆者が購入していないため動作するか不明ですが、販売サイトの画像を見た限りですとROCKET+1Dと同じ「ROCKET」というデバイス名を使用している可能性が高く、このアプリはデバイス名で接続機器を判別しているため「ROCKET」で認識できるかもしれません。(が確証も責任も持てませんのでその辺りは各ご自身の判断にてお願いいたします。)

改修内容

Settings画面で設定する値の記載方法を大幅に見直しました。

大まかなトピックは以下の通りです。

規定のデータの一部を一例として挙げます。(横に長いので横スクロールさせて見てください。)

#Random(設定数値記載行に書かれた「0123456789-/,」以外はコメントとみなす(ConnectConfigを除く))(複数行書けるVolumeの終わり、RandomPatternの終わり、ConnectConfigの終わりには必ず必須コメント行(行頭##)が必要)
Random(U.F.O. TW)
#Start: int(1〜)加速時最低Power, Stop: int(1〜)減速時最低Power, CounterWeight: int(0〜): モーター稼働積算計に加算するときの乗数
1,1,1
#TimePattern: int(1〜)単位100msec 要素数自由。値重複可(確率上昇)
10,16,22,28,34,40,46,52
#GradualPattern: int(0,1〜){/int(1〜)}Power変化値/時間(単位100msec)の分数型で記載。時間が1のときは分母省略可能。約分せず。0はGradualさせない。要素数自由。値重複可(確率上昇)
0,0,0,0,1,3/2,2,3,1/2,3/4,1/3,2/3
#PWMPattern: int(0,2〜){/int(2〜)/int(0〜)}On時間(単位100msec)/Off時間(単位100msec)/OnのときPowerを何%に増(減)速するか(増減させないとき/100を省略可)。約分せず。0はPWMさせない。要素数自由。値重複可(確率上昇)
0,0,0,0,0,2/2/175,4/2/150,2/4/200,4/4/125,4/8/175
#Volume1 PowerPattern: int(-100〜100 必須)以下Option/TimeIndexRange: int(1〜 "n"(単独限定)|"n-m"(範囲指定nm省略可))/GradualIndexRange: int(〃)/PWMIndexRange: int(〃)/NextVolume: int(1〜3 以外は無視)/NextPowerIndexRange: int(Range〃)。要素数自由。複数行可(終わりを示す##コメント行必須)。値重複可(確率上昇)
0/-5,0/-5,0/-5
1/-6,5/-7,10,15,20/-6,25/-4///2
-1/-6,-5/-7,-10,-15,-20/-6,25/-4///2
##Volume2 PowerPattern{/TimeIndexRange/GradualIndexRange/PWMIndexRange/NextVolume/NextPowerIndexRange}(Volume1の終わりを締める必須コメント行)
0/-5,0/-5
7/-6/g/p/1,14/-7,21,28,35/-6/-11/2-9,42/-4/-10/3-8/3
-7/-6/g/p/1,-14/-7,-21,-28,-35/-6/-11/2-9,-42/-4/-10/3-8/3
##Volume3 PowerPattern{/TimeIndexRange/GradualIndexRange/PWMIndexRange/NextVolume/NextPowerIndexRange}(Volume2の終わりを締める必須コメント行)
0/-5
20/-6///1,25/-7///2,30,35/-7,40/-6/-11/2-9,45/-5/-10/3-8,50/-4/2-8/4-8
-20/-6///1,-25/-7///2,-30,-35/-7,-40/-6/-11/2-9,-45/-5/-10/3-8,-50/-4/2-8/4-8
##VolEnd(Volume3の終わりを示す必須コメント行)

ランダムパターンのコメント行を除く最初の行は今までと同じパターン名称です。

その次の行はDisplacement Thresholdが無くなって要素数が3つに減っています。
上の例では設定値内にコメントを書いていませんが、例えば

Start1,減速1,重1み

みたいに書いても大丈夫です。ただし、上記例内にも書いてあるように「0123456789-/,」は設定値とみなしますのでコメントのつもりで「,」とか書いたりすると値がズレて格納されたりエラーが出たりしますので注意してください。

以前はこの次にPowerPatternを書いていましたが、処理簡易化の都合上、先にTimePattern、GradualPattern、PWMPatternを記述してください。ここは従来通りの書き方で各1行で書き切ってください。コメント含めても大丈夫です。

続いてVolume1〜3のPowerPattern記述になりますが以前は正の値だけ書けば良く正負反転はプログラム側でランダムとしていましたが、今回からはプログラム側による反転を無くしましたので必要があれば負の値も書いてください。(元から反転を受け付けないROCKET+1D用などでは書く必要ありません。)
ここは複数行に跨って書いて良い代わりに各Volumeの記述終わりを示す必須コメント行(冒頭##)が各1行だけ必要になります。##しか見ていないので##以降の文字は任意です。
各Powerに「/」を挟んでTimeIndexRange、GradualIndexRange、PWMIndexRange、NextVolume、NextPowerIndexRangeを紐付け記述することが出来ます。
上記例ではコメントを含めていませんが、1つのパターンの記述に最大で「/」を5つ書くことになるため、どこが何か分かり難くなり、設定ミスが発生し易くなります。ですので例えば、

25/t-4/g/p/nv2/np

みたいにコメントを含めて、どこが何の設定値なのか分かり易くしてみても良いかもしれません。

また、改行もしくはカンマが区切りになりますが、空要素は読み飛ばしますので、例えば

25/t-4/g/p/nv2/np,

みたいにカンマを最後に書いてかつ改行してしまっても大丈夫なようにしています。

TimeIndexRange、GradualIndexRange、PWMIndexRange、NextPowerIndexRangeの書き方は

2-12

みたいに選択肢とするIndexの開始(1始まり)と終了を間に「-」を入れて整数値で書く形になるのですが、開始が1の場合は

-12

というように省略出来ます。(以前の省略記法から変わっていますので注意)

終了側も制限しない場合は省略出来、

2-

と書けます。上の例ですと1番目の要素だけを除いた選択肢から抽出するようになります。

開始も終了も制限しない場合はどちらも省略出来るので

-

とも書けますが、この場合は全て省略して「(空)」にしてしまっても良いです。

指定(制限)の必要が無い場合は「/」も省略することが出来ます。ただし、書き順的に後方全てが指定(制限)が無い場合に限ります。
例えばTimeIndexRangeは制限しないけどGradualIndexRangeは制限するなどという場合に「/」を省略してしまうとGradualIndexRangeのつもりで書いた記述をTimeIndexRangeの記述とみなしてしまいます。

41//2-8

この例ではPWMIndexRange以降の指定が全く無いので省略出来ていますが、TimeIndexRangeはその後のGradualIndexRangeで制限を書いていますので省略出来ません。

ランダムパターンごとに各Volumeの終わりを示す必須コメント行が必要です。
上記の例を良く見ていただきたいのですが、Volumeの設定が始まるまでのコメント行は全て冒頭#1つです。
冒頭#1つは自由コメント行で、これはどこにでも何行でも書いて良いものです。

一方各Volumeの終わりを示す必須コメント行は冒頭##と#が2個連続しているもので、これは必ず1行だけ書いてください。仮に連続して2行書いたりするとVolumeの設定値が無い扱いになってエラーになります。

ランダムパターンは幾つでも書けますが、ランダムパターン記述の終わりにも必須コメント行(冒頭##)が必要です。

##RandomEnd(Randomの終わりを示す必須コメント行)

続きまして。

#MinimumInterval: int(1〜)最小通信時間間隔。通信取りこぼしが発生する場合は数値を大きめに取ってみてください。 単位100msec
2
#RelationChangePhases min,max: int(1〜)Rel設定でRandom,Flipを選択している際に、Sync,Mirror,Unrelatedを切り替えるまでにいくつのパターンを消化するか、の最小値最大値を指定
3,7
#ConnectConfig: デバイス名パターン正規表現,制御書き込み対象Characteristicパターン正規表現,書き込み値/区切りで3バイト固定(int)制御値入る所をnに(TWのみ2箇所n)
(?i)ufo.?tw.*,.*2222.*,5/n/n
(?i)ufo.?sa.*,.*2222.*,2/1/n
(?i)cyc.?sa.*,.*2222.*,1/1/n
(?i)bach.?smart.*,.*2222.*,6/3/n
(?i).*rocket.*,.*2222.*,7/3/n
##ConnectConfigEnd(ConnectConfigの終わりを示す必須コメント行)

ここではSwitchHeightWeightの記述行が無くなりました。⇒Switches画面に移動
また、ConnectConfigは複数書けるので終わりを示す必須コメント行(冒頭##)が必要です。
なお、このConnectConfig内の記述だけはコメントを一切許しません(値に色々な文字を含む可能性があるため)。自由コメント行は途中に含んでいても大丈夫です。


最後の固定パターン。

#Custom1: 先頭行にパターン名称、2行目にStart,Stop,CounterWeight、3行目以降にパターンをPower,Time,Gradual,PWMで記述。行数自由。Volume終わりを示す##コメント行必須。1パターンにつき3ボリューム分のデータが必要。
Demo
12,5,3
#Vol1
42,15,0,0
0,15,0,0
42,10,2,2/2/175
-42,10,2,2/2/50
0,10,1/2,0
##Vol2
42,30,0,0
0,10,0,0
42,32,0,2/2
0,10,0,0
42,32,0,6/2
0,10,0,0
42,32,0,2/6
0,10,0,0
##Vol3
42,32,2,4/4/175
-42,32,1/2,2/6/50##DataEnd
-12,6,5,0
-24,50,1/3,8/2/100
##Vol3End
##DataEnd

固定パターンの記述方法は基本的に変わっていませんが、ランダムパターンの記述と歩調を合わせるように各Volumeの終わりを示す必須コメント行を冒頭##とすることと、記述中コメントを許すようにしています。
また、固定パターンも幾つも書けるのですが、これで設定は終わりですので、固定パターン記述の終わりを示す必須コメント行(上の例では##DataEndとしている行)はあっても無くても構いません。
ただ、この必須コメント行を書くとこれ以降は読み込まないので、これより下は全て行頭#とか関係無くコメント扱いになりますので、いっぱい固めてコメント書いておきたい場合などはデータ終わりを示す必須コメント行も書くと良いでしょう。
逆に書いた設定が最後まで読み込まれていない場合はデータ終了の必須コメント行まで書いてしまった後に記述を続けていないか確認してください。


Switches画面です。

ここでVolボタンの高さを設定するようにしました。値は整数で%。100%で他の行と同じ高さになります。


Displacement Thresholdが無くなる影響についてですが、同じPowerでかつ同じPWMが続いてしまう場合はランダム抽出をやり直しますが、それ以外の場合は同じPowerであっても続けることにしました。
元々Displacement ThresholdというのはPWMがまだ無かった頃の産物でして、同じPowerですと実質Gradualが一度も動かないためずっと同じPowerが継続してしまい、長時間動きに変化が起きないという問題を回避するための設定でした。
今はPWMがありまして、ON/OFFが小刻みに切り替わるその間隔が異なったり、Powerにも倍率掛けるようになっていますので、同じPowerが選択されたとしてもPWMが違えば異なる動きとなるため、長時間変化が起きないという問題は起きません。
というわけで、これを今回廃止しました。
ちなみに何回やっても同じPowerで同じPWMになってしまう場合は10回ほど再抽出処理をした後諦めて同じ値で続行します。
そうならないように設定を書いてください。(実は以前は諦める処理を入れてなかったので無限ループに陥る設定が書けてしまっていました。)

ランダムパターン内でVolumeが遷移しても画面上のVol表示は変わりません。
これは複数台制御しているときにそれぞれ異なるVolumeになっているときに表示のしようがないことと、ユーザーから画面で指示したものではないVolume遷移であるため、現在どのVolumeからPowerを抽出しているかについては画面上では表示していません。
逆に、一旦停止して再度動作させるときなどはユーザー指示になりますので、必ずユーザーが指示したVolumeからPowerを抽出します。
そういった意味で、あくまで画面上のVolの表示はユーザーの指示によるもののみの表示となっています。


今回、エラー処理についても多少強化しましたので、エラーが発生した箇所など分かり易くなっているかと思いますが、それでも不可解なエラーが出てしまうケースがあるので一つご紹介しておきます。

DataError at
2#Start,Stop,CounterWeight

という謎なエラーが出ている例ですが、これはランダムパターンの終了を示す必須コメントの##が足らずに#1つの自由コメントになってしまっているせいで、プログラム側はまだランダムパターンが続いていると判断していて#MinimumIntervalの値である「2」がパターン名だと解釈して、その次を読んだところでおかしいぞ?となってエラーになっているためこのようなメッセージとなっています。「2」は何らかのインデックスではなくてランダムパターン名称のつもりで出力してるんですね。


今回、一応規定のデータでも時折Volume遷移するようにデータを書いています。
時々強めのモードに切り替わったり、また元に戻ったりというイメージです。

今回の改修でそれなりの記述量に収めながらも自由度を非常に高く出来たと思いますので、欲しいランダムパターン(なんじゃいそら)を追求してみるのも良いかと思います。

その他従来の機能等は
Ver1.10の記事『UfoCtrl Ver1.10 U.F.O. TW U.F.O. SA A10サイクロンSA (+PLUSプラス) バッハスマート ROCKET+1D 等BLE制御アプリ
Ver1.00の記事『UfoCtrl Ver1.00 U.F.O. TW U.F.O. SA A10サイクロンSA (+PLUSプラス) バッハスマート ROCKET+1D 等BLE制御アプリ
の解説をご参照ください。

ダウンロードファイル

勝手な再配布はしないでください。
また、このファイルのみへの直接リンクを貼ることもご遠慮ください。
特に、うちのサイトは弱小なので、検索で上位に表示されるサイトに勝手にコピーされると、盗まれたのとほぼ同じ状況に陥ります。
何かしらの問題が発覚して、こちらのサイトでファイルを差し替えても、それが皆さんの元には反映されなくなることにも繋がります。

諸事情によりアプリの無料配布を終了致しました。
今後は活動を支援してくださる方とのみ細細と共有していければと思います。

今後のUfoCtrlアプリ配布ページはこちらです。
UfoCtrl Ver2.00 (UfoCtrl開発活動支援プラン)

2024-11-05

この記事のタグ

U.F.O.

TW

SA

アプリ

制御

電動

自作

チクニー

開発