UfoCtrl Ver3.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」で認識できるかもしれません。(が確証も責任も持てませんのでその辺りは各ご自身の判断にてお願いいたします。)

また当然のことながら、2025年に入ってから本格始動し公開に漕ぎ着けました汎用マイクロコントローラーとモータードライバを組み合わせてDIYするグッズコントローラーもこのアプリで制御することが出来ます。
DIYグッズコントローラーについては過去記事
マイクロコントローラーSeeed Studio XIAO nRF52840とモータードライバTB6612を組み合わせてUfoCtrlで制御できる小型軽量なグッズコントローラーを作成する
U.F.O. SAコントローラーからの脱却 バッテリー容量不安からの開放 小型軽量DIYコントローラーで反応も改善
汎用品を組み合わせて作るオリジナルグッズコントローラーの動作確認
をご参照ください。

改修内容

今まで1つの接続で2モーターを制御できる系統(いわゆるU.F.O. TW接続枠)は1枠に限定していたのですが、今回それを全枠に適用拡大しました。最大4デバイスまで接続可能で、最大8モーターを制御可能になりました。
同種のグッズを複数動作させる際に同期させるか反転させるか無関係に動かすかという関連制御周りを今回の改修に合わせて再整理し、適用確率を自由化しました。

動作確認の動画を撮影してアップしましたので、よろしければご覧ください。
R18指定にしているため、このページに埋め込んでも見ることが出来ないので動画へのリンクを貼っておきます。
UfoCtrl Ver3.00の動作デモ動画(R-18)

と、改修内容的にはあまり変更が多く無いように見受けられるかもしれませんが、実は内部的にはデータ構造に大きくメスを入れる必要がある大改修でして、筆者はこの改修を決断し実行するまでに実に3年半という年月を要した(最初はU.F.O. TW専用のUfoTwCtrlという別アプリを作っていました)、というほど筆者的には手を入れづらかった(入れたくなかった)改修です。
それでも今回この改修をするに至ったのにはやはりDIYグッズコントローラーが完成し、DIYにしては比較的簡単に1デバイスで2モーターまで制御できるコントローラーを自作できるようになったために、1デバイスで2モーター制御できる接続枠が1つしかなかった今までのUfoCtrlでは機能不足に陥ることが明らかだったためです。
その一方で、元々制御対象としていた+1D対応のグッズは一向に新製品が出ない状態が続いていますので、なんとなくこのアプリの方向性としては今後DIYグッズコントローラーの制御が主体になって行くのかなあという気もしたりします。
そういう意味でもアプリ名変更もアリか?とも思ったのですが、ぶっちゃけUfoという文字列を外すと誰もこのサイトに来てくれなくなってしまって結果的にアプリもなんもかんも埋もれてしまうので、現時点ではまだ外せないかなぁというのが正直なところです。
まあコントローラーがDIYになっても動かすのはU.F.O. SAのカップですので、やっぱりUfoCtrlなんじゃないかって気もしますし。
あ、オフレコなんですが今後、解析が出来て実用化出来そうだったら……凄い脱線ですし出来るかどうかも分からん話なのですがLove Spouse対応機器がコントロールできないか検討したいなぁなどとも考えております。

というわけで、なんか無機質な高層マンションみたいな画面構成になってしまいましたが、4つの接続枠全てに方向限定トグルボタンとパターン選択スピナーが2つずつ付いている画面になりました。
当然のことながら、1デバイスで1モーターしか動かない機器を接続した場合は、下行の方向限定トグルボタンとパターン選択スピナーはどう変更しても一切動作には影響しませんのでご了承ください。
1モーターのみの機器を接続したときは下1行を隠すもしくは無効化するなどの処置も考えましたが、それをやると下段の設定を弄りたいときは1モーターのデバイスを切断しなければならない、みたいな面倒ごとも発生し得るので、枠はそのままにしてどのような設定であっても一切無視という形を現在は取っています。
1モーターの機器を接続しているときの方向限定トグルボタンとパターン選択スピナーは上段をご使用ください。

毎度のことながら、4枠分目一杯まで使わない人にとってはこの画面では見にくいし操作しにくいものでありますので、まずはメニューの「Switches」を開きまして、使用する接続枠を限定することをオススメします。

試しに2枠に限定するとこんな感じに多少見やすくかつ操作しやすくなるかと思います。
なお、接続デバイス名称のところが「ufotwGI」となっているのはDIYグッズコントローラーのプログラムでそう指定していまして、DIYグッズコントローラーを2デバイス接続している状態のスクリーンショットです。(この名称はプログラム上で簡単に変更できます)

ところで、2個上の「Switches」の画面、やけにスッキリしたと思いませんか?
U.F.O. TW接続専用枠の使用/不使用が無くなった他、「Volumeボタンを」「送り戻しボタンを」の選択肢から「Rel変更に使う」が消えています。
あ、そうだメインの画面の方でも暗い青色の枠にしていた「Rel」選択の行がごっそり消えています。
これが大きな改修点の2つ目、関連制御周りの再整理&確率自由化の影響です。

元々は2つ以上のデバイスが接続されているときに同期を取るように動かしたり反転させるように動かしたり無関係に動かしたり、という関連制御を組み込んでいまして、それを「Rel」のスピナーで選択変更できるようにしていました。
Sync,Mirror,Unrelated、そして、SyncとMirrorを時々入れ替えるFlip、と、Sync/Mirror/Unrelatedを時々切り替えるRandomという合計5つのモードを持っていました。
UfoTwCtrlアプリではU.F.O. TWの左右のカップの動きについての関連を制御するものとして機能させていました。
UfoSaCtrlTripとUfoTwCtrlを合体させたUfoCtrlの前バージョンまでは、同種のグッズを2つ以上接続している場合に機能するようにし、U.F.O. TWは1つのデバイスで左右カップを動かしますので同種グッズを2つ接続したのと同じ扱いにして機能させてきました。
今まではU.F.O. TWの接続枠が1つしかなかったために、これで機能することが出来たのですが、実は今回、今までやってきた誤魔化しが通用しなくなってしまいました。
例えて言うと、U.F.O. TWを2セット以上同時接続できるようにしてしまったので、左右カップでの関連制御とセット単位での関連制御とを分けて考える必要が避けられなくなってしまったのです。
2人にセットしたU.F.O. TWを同期させたいのか、あるいは2人にセットしたU.F.O. TWは無関係に動作すべきだが左右のカップの動きは連携させたいのか、1デバイスで2モーター制御出来る機器が複数接続できるようになったので、デバイス内の関連なのかデバイス間の関連なのかをきっちり分けて考える必要があります。

これを画面上で設定させ続けるのは困難であるため、メイン画面および「Switches」の画面から「Rel」の操作関連を削除し、設定はSettingの文字列に記述する方法を取ることにしました。

#RelationChangePhases min/max: int(1〜)Sync/Mirror/Unrelatedを切り替えるまでにいくつのパターンを消化するか、の最小値最大値を指定, Sync/Mirror/Unrelated Weight: int(0〜) 重み付け(確率)
2/5,3/3/6
#ConnectConfig: デバイス名パターン正規表現,制御書き込み対象Characteristicパターン正規表現,書き込み値/区切りで3バイト固定(int)制御値入る所をnに(TWのみ2箇所n),2箇所nの場合はRelationChangePhases min/max, Sync/Mirror/Unrelated Weightも書く
(?i)ufo.?tw.*,.*2222.*,5/n/n,2/5,3/3/6
(?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の終わりを示す必須コメント行)

上記はSettingsのデフォルト文字列を一部抜粋したものです。
#RelationChangePhases min/maxの行にカンマ区切りで設定を追加しています。
Sync/Mirror/UnrelatedのWeight重み付けを整数値半角スラッシュ区切りで記述してください。
こちらの設定はいわゆるデバイス間の関連を定義するものでして、同種のデバイスが2つ以上接続されているときに、上記の例では2〜5回ごとにSync/Mirror/Unrelatedを3:3:6の比率で切り替えるということになります。

また、#ConnectConfigに記載するデバイス情報でも、1デバイスで2モーターを制御出来る機器の場合=書き込み値の3バイトにnが2箇所ある場合=上記の例では一番上の行の場合は従来の設定に加えてRelationChangePhases min/max, Sync/Mirror/Unrelated Weightを追記する必要があります。
こちらの設定はいわゆるデバイス内の関連を定義するものですので、各デバイスごとに定義することが出来ます。
1デバイスで1つのモーターしか制御出来ない機器の場合はデバイス内での関連が発生しませんので定義しないでください。

なお、前バージョンまでは#RelationChangePhases min/maxのデフォルトを3/7としていたのですが、個人的にちょっと同じ関連が長く続き過ぎるなと思うことがちょいちょいあったので今回デフォルト値を2/5と短くしています。お好みで変更してください。

画面上で設定する際は「Flip」「Random」という選択肢もあったのですが、今回はその設定そのものは出来ません。
しかし、Sync/Mirror/Unrelated Weightの値の書き方次第で実現可能です。なので略しました。
3/3/6みたいに全ての数値が1以上である場合は「Ramdom」でSync/Mirror/Unrelatedを切り替えていくことになります。その比率は3:3:6なのですが、切り替わるときは今までと同じのにはならないようにしているので、例えばUnrelatedから切り替わるときは3:3つまり50%50%でSyncかMirrorが選択されます。Syncから切り替わるときは3:6つまり1:2でMirrorかUnrelatedに切り替わります。
デフォルト値でUnrelatedの割合を高く記載しているのは、そもそもUnrelatedで動作していても偶然SyncやMirrorのような動きになってしまうことがあり得ることと、SyncやMirrorは回転方向こそ逆なものの動き的には同期しているので感覚的に同種に近く感じられるため、つまり同期っぽい動きと無関係な動きとで50%50%になるように考えて3:3:6としています。
なお、ここで、Unrelatedの値を0にすると、SyncとMirrorを切り替えるだけになるため従来の「Flip」と同義にすることができます。
同様にしてSyncのみ正整数でMirrorとUnrelatedを0にするとSync固定に、Mirrorのみ正整数、Unrelatedのみ正整数でもそれぞれ固定できますので、従来画面から設定できていた全ての関連制御はこのSync/Mirror/Unrelated Weightの値の書き方で全て網羅できます。
注意点としては全て0にはしないでください。プログラムで防御していないので多分異常終了します。

なお、細かい話ですが、#RelationChangePhasesのカウントは1モーター目の方でのみ計測しています。これはUnrelatedで動いているときに1つのパターンの長さがまちまちであるため1モーター目と2モーター目で足並みが揃わないためにそうしています。
SyncやMirrorからUnrelatedに移行するときは同期が取れている状態からの移行なので綺麗に移行出来るのですが、UnrelatedからSyncやMirrorに移行するときは足並みが揃わないので2モーター目がパターン消化途中であってもぶった斬って移行するようにしています。

DIYグッズコントローラーの完成でバッテリー容量の呪縛から開放されたので一気に使用頻度が下がった感があるモーター稼働積算計ですが、4デバイス8モーターへの変更に合わせてこちらも改修しております。

デバイス設定の使い分けについて

DIYグッズコントローラーではプログラム上で名称定義しているところを変更してマイクロコントローラーに書き込むことによってデバイス名称を簡単に変更することができます。
デフォルトではU.F.O. TWと同種のデバイスとして検出されるように「ufotwGI」という名称にしていますが、これがSettingsの デバイス名パターン正規表現である「(?i)ufo.?tw.*」の条件に合致する名称であるため、例えばU.F.O. TWとDIYグッズコントローラーを接続したときには同種のデバイスが2つ接続されたとみなして関連制御を行います。
それ以外にもDIYグッズコントローラーを2つ接続しても関連制御が発動します。
無条件に関連制御を行わせたくない場合には同じデバイスグループにならないような名称設定をすることが可能です。

例えばU.F.O. TWのデバイス定義とそっくりで名称の正規表現部分のみ異なる行を追記します。

(?i)ogc.*,.*2222.*,5/n/n,2/5,3/3/6

冒頭の「(?i)」は英大文字小文字を区別しないという宣言でして「.?」というのは何でも良いから1文字ないしは1文字もなくても良いという意味でして「.*」というのはどんな文字が何文字あっても良いし無くても良いという意味ですので、上記の例ですと「OGC」とか「ogc」とかで始まる名称であれば全てここの行の定義が適用されることになります。
ちなみにOGC=OriginalGoodsControllerです。
「(?i)ufo.?tw.*」ってのはU.F.O. TWが接続されるカップによって名称が「UFO TW」の場合と「UFO-TW」になる場合とがあるので「.?」を使っているんですね。

このようにして別のデバイス定義を作成して、そちらで適用されるようなデバイス名称をDIYグッズコントローラーに書き込んであげれば、例えば「OGC-1」「OGC-2」とかにすると、どの機器が接続されているか見分けが付きつつU.F.O. TWとは別の同一デバイスグループとして扱うみたいな形にも出来ますので、UfoCtrlのデバイス定義とDIYグッズコントローラーのデバイス名称を上手く定義して関連制御をどのようにしたいか自由に決めることが出来ます。

なお、デバイス名の正規表現は複数当て嵌まってしまうことが無いようにご注意ください。
例えば「(?i)ufo.?tw.*」の他に「(?i)ufo.?t.*」なんてデバイス定義の行を追記してしまうと、「UFO TW」がどちらにも当てはまってしまうのでどちらのデバイス定義が適用されるか不確実になります。ご注意ください。

元となるUfoCtrlの説明

はこちら。
UfoCtrl Ver2.00 U.F.O. TW U.F.O. SA A10サイクロンSA (+PLUSプラス) バッハスマート ROCKET+1D 等BLE制御アプリ
UfoCtrl Ver1.10 U.F.O. TW U.F.O. SA A10サイクロンSA (+PLUSプラス) バッハスマート ROCKET+1D 等BLE制御アプリ
UfoCtrl Ver1.00 U.F.O. TW U.F.O. SA A10サイクロンSA (+PLUSプラス) バッハスマート ROCKET+1D 等BLE制御アプリ
の解説をご参照ください。

ダウンロードファイル

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

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

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

※データ構造が大きく変わっているためアップデートしただけですと上手く動作しないかもしれません。
上手く動作しない場合は一度アンインストールしてから再度インストールしていただくか、Androidのアプリ設定からUfoCtrlのアプリデータを削除してからアプリの起動をお試しください。
なお、退避させたいデータがある場合は事前に各自でデータ退避をお願い致します。

2025-07-01

この記事のタグ

U.F.O.

TW

SA

アプリ

制御

電動

自作

チクニー

開発