DGCCtrl Ver1.00 DIYグッズコントローラー専用緻密なランダム制御動作を可能にするAndroid野良アプリ
DGCCtrlとはDGC(DIY Goods Controller)のフレキシビリティと性能の高さを活かしてUfoCtrlでは不可能だった緻密なランダム制御を実現するAndroid野良アプリです。
UfoCtrlと同様にAndroid4.3以上に対応し、BLE通信にてDGCを制御します。
※このアプリを使用するには対応するDGC(DIYグッズコントローラー)を自作していただく必要があります(DGCの作例もDGCに書き込むプログラムも筆者から提供しています)。U.F.O. SAやU.F.O. TWなどの+1D機器には対応しておりません。

アプリ関連記事やDGC(DIY Goods Controller)関連記事を漁っておられる方はご存知かと思いますが、革命的だったU.F.O. SAの登場以降、幾つか販売された+1D対応機器にてユーザー側で動作を自由に制御出来るという機能を活かして筆者は2016年から+1D機器をBLE通信にてランダム制御出来るAndroid野良アプリを開発し続けてここまでやって来ました。
しかしながら、ここ最近は+1D対応機器が増えることも無く、また、そもそも+1DとはAV映像等との連携を強化して販売促進に繋げたい狙いで設けられたと思われる規格でして(個人の感想です)、ユーザーが自由に制御出来るというのはたまたまその仕組みに乗っかることが出来ただけだとも言えるモノです(個人の感想です)。
すなわち、筆者の個人的な予想では今後+1Dという規格そのものがフェードアウトして行ってしまうのではないかと思っていて、結構危機感を勝手に募らせておりました。
筆者はたまたまU.F.O. SAを2台所持していて、コントローラー部分の配線にコネクタ化改造を施し、グッズの側にもそのコントローラーと接続出来るようにコネクタ化改造を施しまして、様々なグッズをU.F.O. SAのコントローラーと筆者自作のUfoCtrlアプリを使用してランダム制御して堪能することが出来ましたが、一般的にはU.F.O. SAを複数台所持している方は非常に少ないと予想され、左右の乳首で異なるランダム制御などという恵まれた環境に与れる人はU.F.O. SAが販売終了してしまった現在では減少する一方となってしまっています。(あ、U.F.O. TWは1セットで左右独立ランダム制御の恩恵に与れますが、コントローラーがカップに内蔵されているためコネクタ化改造して他のグッズを動かすことは困難ですのでU.F.O. TW専用となってしまいます。)
一方で+1D対応機器でなくてもランダム制御が出来れば飛躍的に使用感が向上するグッズというものもありまして、そういったモノでも接続出来るコントローラーがあると嬉しいのですが、そんなモノが量販されるなんてことがあるはずがなく、やるとしたらどうにか自作するしか無いなと思っておりました。
筆者の2台のU.F.O. SAもいつまで稼働し続けられるか不安でしたし、1台故障するだけで左右別制御は出来なくなってしまいます。また、本体は生きていてもバッテリー劣化という問題が常に付き纏っています。
そういった事情から筆者は2025年にU.F.O. SAのコントローラーを代替出来るようなコントローラーを汎用品の組み合わせで作り上げるという企画を個人一人で立ち上げました。
名称が定まらずにここまで来てしまったのですが、ここ最近ではそれをDGC(DIYグッズコントローラー)と呼ぶこととし、汎用品の組み合わせにも関わらず小型で軽量で比較的安価に製造出来る作例を4つ紹介するに至りました。
DGCはUSBの電力をベースとするため、最大で約5V程度までと想定されているグッズで、単純に電力の増減でモーターを制御しているだけという構造のグッズで、有線接続出来るグッズであれば概ねこのDGCでランダム制御動作を堪能出来る!これでもうU.F.O. SAのコントローラーに頼らなくても良い!U.F.O. SAのバッテリー容量の少なさと充電頻度を気にしなくて良い! というふうになることが出来ました。
また、DGCでは昇圧回路を追加することにより5Vの超える電圧を必要とするグッズのコントロールも可能になりましたし、筆者が作例を公開しているものは全て1つのコントローラーで2つのモーターを制御出来るようになっていますので、1台のDGCで左右胸独立ランダム制御を堪能することが出来るようになったのです。(まあ別に胸に限らんで別のとこに使って全然良いんですけど左右胸が一番分かり易いメリットですので)
ただ、2025年の活動としては+1Dに頼らなくても+1Dの任意制御と同等のことが出来るDGCを開発したよ! というレベルでしかなかったのですが……2026年となる今年、筆者が感銘を受けたグッズの制御が従来の+1Dの機構では実現出来ないと判明した筆者は+1D規格では実現不可能だった緻密なランダム制御をDGCで実現しよう! と思い立ち、その設計とプログラミングとを今まで頑張ってやって来ました。
DGC専用になってしまいますので+1D機器には今回のDGCCtrlは使用出来ません。
しかしながら、DGC本体の方のプログラムは今回リリースしますDGCCtrlに対応するのはもちろん、従来のUfoCtrlによるBLE通信も変わらず受け取って動作するようにプログラムを組んでありますので、これからのDGCはDGCCtrlで緻密で素早いランダム制御を堪能するも良し、UfoCtrlで今まで10年間磨き上げて来た熟練のランダム制御を堪能するも良し、という明確に+1Dを超える機能を持つに至りました!
DGCはDIYですがら作り方は筆者が公開していますが完成品の販売はしておりませんので各個人で部品を調達して組み上げていただく必要がありますし、グッズの方もDGCに接続出来るように改造して頂く必要があります。(どのみちグッズ側の改造が必要になるので、それが出来る位だったらDGCもご自身で作れると思います)
しかしながら、特に振動系のグッズなんかはありきたりのつまらないパターンしか無くてすぐ飽きるし感覚も麻痺するというか慣れちゃうモノばっかりだったのが、ランダム制御出来るようになるとガラリと世界が変わりますので、興味のある方は是非、DGCの作成に手を染めて、U.F.O.のみならずクリップローターなど振動系のグッズなども試してみてください。
きっと世界が広がりますよ。
DGCに関する記事はこちらのサイトでは
『DGCSet Ver1.00 DIYグッズコントローラーの設定値を調整、変更、動作確認できるツールアプリ』
『昇圧回路基板を追加して5V以上のグッズに対応するDIYグッズコントローラーを作成』
『マイクロコントローラーSeeed Studio XIAO nRF52840とモータードライバTB6612を組み合わせてUfoCtrlで制御できる小型軽量なグッズコントローラーを作成する』
『U.F.O. SAコントローラーからの脱却 バッテリー容量不安からの開放 小型軽量DIYコントローラーで反応も改善』
『汎用品を組み合わせて作るオリジナルグッズコントローラーの動作確認』
『なぜ今グッズコントローラーをDIYしようとするのか』
『宇宙からの帰還を考える』
等で紹介しておりますので気になる方はご参照ください。(具体的な作業およびプログラム等は筆者のFANBOXにて開発支援してくださっている方と共有しています。)
UfoCtrlとの違い
とはいえ、丸10年以上に渡って開発を続けてきたUfoCtrlが劣っているだなんて筆者本人が言う気は毛頭ありません。
+1Dの仕組みの限界、BLE通信の実用レベルでの限界による制限を、仕組みそのものを新たに設計からやり直すことで今まで出来なかったことを可能にした、というのが今回のDGCCtrlです。
UfoCtrlでは実用限界として最短でも200ms毎に1回しかモーターの回転(出力)を変更することが出来ませんでした。言い方を変えると1秒間で最大でも5回しか出力を変えられませんでした。
DGCCtrlでDGCを駆動するとこの間隔が10msにまで短縮出来ます。1秒間で100回出力変更が出来ます。
これがUfoCtrlとの最大の違いです。
モーターの回転(出力)変更が短時間で出来るようになると何が変わるのか?
例えば滑らかに出力を上げてグゥウワっと盛り上がるような動きをさせることが出来ます。
細切れにリズミカルに動作と停止を切り替えることが出来、新たな感覚を享受することが出来ます。
クリップローターなんかでこのような細切れ動作を繰り返すと両胸をちまちまと摘まれているかのような、それにちょっと近い感じの刺激を受けることが出来るようになったりします。
U.F.O.などの回転系ではアタッチメントの形状によっては乳首と当たらない範囲で動かれるだけになってしまう可能性もあるため必ずしもメリットになるとは限らないのですが、常に乳首を挟んでいる振動系ローターなんかですと、上記のような新たな感覚が得られますしランダム制御になることで飽きが来にくくなったり感覚が疲弊し難くなって長時間の使用にも適するようになったりしますので、ずっと振動しているだけでつまらなかったニップルローターが大化けする可能性があります。
もちろん、U.F.O.などの回転系でも乳首と接触する率が高い密な形状のアタッチメントを使用していればちょっと動かしてすぐ止めるみたいな動作でもいちいち「(^ω^ ≡ ^ω^)おっおっおっ」となる可能性が十分にありますし、滑らかな回転増減なんかもUfoCtrlでは味わえなかったモノですので試してみる価値はあるかと思います。
仕組み的にはBLE通信の間隔を短縮したわけではありません。むしろBLE通信の間隔は設定次第ではありますが数秒に1回というレベルで疎になります。
+1Dでは直にモーターへの出力を-100〜0〜+100で指定する形であったため、モーターの動きを変更したいときは都度BLE通信をする必要がありました。
DGCCtrlではDGCとの役割分担を新たに設計して、DGCには動作条件を与え、DGCではその動作条件に従ってモーターの制御をし続けるという形にしました。
すなわち、その動作条件の変更が無い限りはDGCの側だけでモーターの制御は完結します。
この構造により10ms毎のモーターの制御が可能となりました。
一応DGCCtrl Ver1.00の動作デモ動画(R-18)へのリンクを貼っておきましょうか。見る人ほとんどいないから無くても良いかと思ったけど一応撮りました。R18制限を掛けておりますので18歳以上の方でないとご視聴できません。
この動画のU.F.O. SA、左側はDGCCtrlで、右側はUfoCtrlで制御しています。DGCCtrlもUfoCtrlも近接センサーでオンオフするように設定していますので同時に動かせるし止められます。1台のAndroid端末でDGCCtrlとUfoCtrl両方のアプリを立ち上げてそれぞれ別のDGCに接続しています。
ぼーっと見ていると差なんて分からないのですが、注目していただきたいのは左側の動きの変化の滑らかさ、また、短時間でコロコロ動いたり止まったり、UfoCtrlよりも忙しく変化しているときがあることです。(ランダム制御ですので忙しくしていないときももちろんあります。)
使用方法
ノリはUfoCtrlと同じですので、UfoCtrlの操作に慣れている方であればすぐに使用することが出来るでしょう。
と言いますか、恐らくUfoCtrlに見向きもしなかったのにいきなりDGCCtrlに興味を抱く方など居ないと思いますし、説明もやたらと大変になるのである程度UfoCtrlを知っているという前提で説明を続けさせていただきますね。
強調しておきたいのは筆者が『出来る限り必要最低限の実装しかしないように心掛けている』というところです。
過去には筆者のアプリにバックドアがあるんじゃないかとか好き勝手言っているヤツとか見掛けることもあったりしましたが、極力必要最低限の権限しか求めないようにしていますし、そもそもアプリのapkファイルのサイズが100KBにも満たなくてこれだけの機能を詰め込んでいますから余計な実装なんてする余裕などびた一文無いってことをご理解いただければと思います。
お使いの機種によっては「なんでこんな権限求めてくるんだよ?」って疑問になる方もいらっしゃるかと思いますが、それはAndroidOS側がそういう整理にした結果であってアプリ開発者はむしろそれに振り回された被害者であることをここで声を大にして言わせていただきます。
なお、その特に大問題になりがちな位置情報権限周りのお話は過去記事『UfoTwCtrl Ver3.00 U.F.O. TWを左右別々ランダム/任意パターンでコントロールするAndroidアプリ』辺りをご参照いただければと思います。
当事者である筆者が今見返してもうんざりするくらい複雑だしAndroidOSバージョンによってはなんでこんなことになってんのか理解に苦しみますがこれが現状です。
ですので、アプリ側から要求した権限等はちゃんと与えてくださらないとまともに動きませんのでご留意ください。

メイン画面の紹介に移る前に注意事項です。
DGCCtrlもUfoCtrl同様、画面オフにした状態でも制御し続けるためにFrontForegroundServiceという形態を取っています。(むしろ画面オフで使うことを念頭に置いた開発をしています。)
このアプリを終了するときはきちんとアプリ画面左上の『>』辺りをタップして終了させるか、メイン画面表示時にAndroidOS標準で操作できる『戻る』ボタンをタップしてきちんとアプリを終了させてください。
ただ単に他のアプリの画面を前面に出したとか、このアプリの画面を隠したというだけではアプリは終了せずにForegroundServiceがずっと居残って実行し続けてしまいます。つまり、バッテリー消費に悪影響が出ます。ご注意ください。
このアプリからの通知を許可してくれている場合は実行中であることを示す通知を出していますので、それでこのアプリの実行状態が分かりますし、通知からアプリを終了させることも出来ます。
それではアプリのメイン画面です。

初めてアプリを起動するとUfoCtrlと似た画面。しかし、ちょっとスッキリしたかもしれません。
UfoCtrlが必要に応じてどんどんと機能拡張をした結果ギチギチになってしまった画面ですが、今回のDGCCtrlでは改めてランダム制御にのみ特化し改めて機能のシンプル化スリム化を行いました。
また、DGCCtrlではDGCしか扱えず、+1D対応機器は接続すら出来ないため不要になった機能もあります。
その結果若干スッキリしたのですが、しかしそれでも4台分もの表示はほとんどの人には無用だと思うのでまずはメニューの「Switches」をタップしてカスタマイズを行いましょう。

ここもUfoCtrlと似た画面ですが、随分と表示が減りました。
最上部の「接続枠」のところがメイン画面の表示件数ですので、見易い数なり使うだけの数なりに設定すると良いでしょう。(筆者は今のところ2台表示にしていて1台目はU.F.O. SA使用時用としていてU.F.O.向けのパターンを選択している状態にしていて、2台目をニップルローター用としてローター向けのパターンを選択している状態にして使っています。こうすると使うグッズによっていちいちパターン選択をやり直す必要が無いので楽ですので、こんな使い方も出来ますよということで。)
Volボタン高さは通常メイン画面の全ての行を同じ高さになるようにレイアウトしていますが、Volボタンの部分をもっと大きくしたいと思う方も居るであろうと考えて調整出来るようにしたものです。
『LCDOFFボタン』はメイン画面のメニューの左隣にあるボタンでこれを有効にするとAndroid端末の電源ボタンを押さなくてもこのボタンタップで画面を消灯(実際にロック)することが出来ます。
ただし、このボタンを使用するにはAndroidの端末管理権限というかなり重要な権限を必要としますので、このアプリにそんな重大な権限は与えたくないという方は使用しないで普通に電源ボタン等で画面消灯してください。
なぜ、こんな機能があるのかというと、筆者の手持ちの端末が揃いも揃って電源ボタンの反応が悪いのであんまり電源ボタンを使いたくないからです。
『近接センサーをON/OFF切替に使う』はその名のとおり、近接センサーに手をかざすたびにオンとオフを切り替えられますのでわざわざ画面を表示してVolボタンをタップなどしなくても好きな時に動かして好きな時に止められます。
『Mediaボタンを使う』はAndroid端末本体にあるボリュームボタンやイヤホン端子やBluetooth等で接続した音楽再生関連のリモコンとかキーボートなんかでもこのDGCCtrlを操作出来るようにしてあるのですが、まあ、大抵は使用するとしても本体に付いているボリュームボタンくらいですよね。ま、実装はしてあるということで。
んで『Mediaボタンを使う』ようにすると『Volumeボタン』と『送り戻しボタン』についてそれぞれ何を操作するのか選択出来るようになります。
今回DGCCtrlではUfoCtrlのときに実装していたVol1,2,3という3段階を廃止してオンかオフかという状態しか無いようになりましたので、選択肢が少なくなりました。

試しにこんな感じにしてメイン画面に戻ってみましょう。

『1)』とか『2)』ある行はデバイスの接続状態を管理する行です。接続されていればデバイス名称が表示され、右にあるボタンはその時々の状態に応じて未接続時には『Connect』ボタン、接続処理中には『Cancel』ボタン、接続中には『DisCon』ボタンとして機能します。
その下には2行、パターン選択のスピナーがあります。
これはDGCデバイスは筆者の提示した作例では全て1デバイスで2つのモーターを制御出来るため、各モーターに対して別のパターンを割り当てられるように2つのパターン選択スピナー枠を用意しています。
同期とか反転とかどうなったの?って思う方もいらっしゃるかもしれませんが、現在ではUfoCtrlも含めSettingsの方の記述で対応しております。
ええ、左右別々のパターンにしていても、ときに左右同期して動いたり、左右反転して動いたりします(出来ますし、しないようにも出来ます)。

アプリのデフォルトとしては4パターンご用意していますが、まだこのアプリも日が浅いためこのパターンそのものの完成度が高くないかもしれません。
是非皆さんパターンの設定もイジれますのでより良いパターン構築を目指してみてください。
画面下部には0と1だけになったVolボタンとUfoCtrlにもあった『Always/LCD』ボタン、『VolOnly』ボタンがあります。
『Always』になっているときは常にVolボタンの状況に従って動いたり止まったりします。『LCD』になっているときはVol1にしても画面が点灯している間は動きません。画面を消灯したときのみ動くようになります。
これはDGCCtrlにしろUfoCtrlにしろチクニーやオナニー等で実使用する際は長時間アプリを実行し続けることになるのでバッテリー消費等考慮して画面を消灯している状態での使用をメインに考えた故の機能となっています。
例えば強過ぎるとかでとにかく今すぐ止めたい!というときに『しっかりVolを0にしなければいけない』という作りだとすぐに止められない可能性がありますよね?
『LCD』にしておくと画面オンにするだけでも止められますので、フェールセーフとしても使用出来ます。(近接センサーもVolumeボタンも使えるようにしておくとどれでも止められるので便利です)
『VolOnly』ボタンをタップすると画面のほとんどがVolボタンだけの状態になります。

画面をリモコンのように使いたい方はこのモードが便利かもしれません。
戻るときは左上のアプリアイコンのところの『<』辺りをタップするか、AndroidOSに標準で機能している戻るボタンをタップしてください。
なお、ここで一点お詫びがあります。
『VolOnly』ボタンをタップしても上記画像のようにならない方。済みません、そして、早期にお試し戴きましてありがとうございます。
この機能説明の記事を書いている最中にバグであることを確認してアプリを修正してダウンロードファイルを差し替えさせていただいておりますので、ご面倒お掛けして済みませんが再ダウンロードして上書きインストールをお願い致します。
設定
UfoCtrlと同様にこのDGCCtrlでも設定でランダムパターンから接続まで多くの機能の調整が可能です。

メイン画面右上のメニューから『Settings』を選択して設定画面に遷移します。

今までの筆者のアプリ同様。『RecoveryBasicData』でアプリのデフォルト値に戻すことが出来、Save枠が3つ、Saveしたモノを呼び出したいときは対応する番号のLoad枠を使用してください。
設定は全てベタなテキストです。重要な設定が出来たらアプリ保存するだけでなくテキスト全体を他のテキストエディタ等にコピペして保存しておくのをオススメします。
というのも、今後もし大きな改修が発生したときに設定の記載にも変化が生じてそのままでは使えなくなることが起こりうるためです。この辺りはUfoCtrlでも同じです。
デフォルトの設定は以下のようになっています。
#Random(ConnectConfigを除き、設定数値記載行に書かれた「0123456789-/,」以外はコメントとみなす。複数行書けるPatternの終わり、RandomPattern全体の終わりには必ず必須コメント行(行頭##)が必要)
#Weight=n(1-65535)/Time=m-n(1000-65535ms)/Pow=m-n(0-100)/ReverseRate=m-n(0-100%)/On=m-n(10-2550ms)/OnGradualRate=m-n(0-100%)/Off=m-n(0-2550ms)/OffGradualRate=m-n(0-100%)
#実際のOn,Offは10ms刻みになります(データ通信量削減のため10で割った値を送信するため)
#省略したときの値Time=1000/Pow=0/ReverseRate=0/On=2550/OnGradualRate=0/Off=0/OffGradualRate=0
U.F.O. (Low)
4/1000-3500
1/1000-12000/5-25/-100/600-2500/n//f
1/1000-12000/5-25/-100/600-2500/n/-1000/f
1/1000-12000/5-25/-100/600-2500/n/-1000/-100
1/1000-12000/10-35/-100/80-2000/n//f
1/1000-12000/10-35/-100/80-2000/-100//f
1/1000-12000/10-35/-100/80-2000/-100/-1000/-100
1/1000-9000/18-60/-100/60-1200/100/400-800/f
1/1000-9000/18-60/-100/60-1200/100/400-800/100
1/1000-9000/18-70/-100/60-1000/-100/-800/-100
1/1000-5000/35-70/-100/60-240/n/40-200/f
##PatternEnd(1つのパターンの終わりを表す必須コメント行)
U.F.O. (High)
4/-3500
1/1000-12000/10-40/-100/600-2500/n//f
1/1000-12000/10-40/-100/600-2500/n/-1000/f
1/1000-12000/10-40/-100/600-2500/n/-1000/-100
1/1000-12000/15-50/-100/80-2000/n//f
1/1000-12000/15-50/-100/80-2000/-100//f
1/1000-12000/15-50/-100/80-2000/-100/-1000/-100
1/1000-9000/25-75/-100/60-1200/100/400-800/f
1/1000-9000/25-75/-100/60-1200/100/400-800/100
1/1000-9000/25-100/-100/40-1000/-100/-800/-100
1/1000-5000/75-100/-100/40-200/n/40-200/f
##
Roter (Low)
4/-3500
1/-12000/5-30/r/600-2500/n//f
1/-12000/5-30/r/600-2500/n/-1000/f
1/-12000/5-30/r/600-2500/n/-1000/-100
1/-12000/15-60/r/80-700/n//f
1/-12000/15-60/r/80-700/-100/-700/f
1/-12000/15-60/r/80-700/-100/-700/-100
1/-12000/30-90/r/40-140/n/40-180/f
1/-12000/30-90/r/40-140/-100/40-180/f
1/-12000/30-90/r/40-140/-100/40-180/-100
##
Roter (High)
4/-3500
1/-12000/15-90/r/600-2500/n//f
1/-12000/15-90/r/600-2500/n/-1000/f
1/-12000/15-90/r/600-2500/n/-1000/-100
1/-12000/25-95/r/80-700/n//f
1/-12000/25-95/r/80-700/-100/-700/f
1/-12000/25-95/r/80-700/-100/-700/-100
1/-12000/50-100/r/40-140/n/40-180/f
1/-12000/50-100/r/40-140/-100/40-180/f
1/-12000/50-100/r/40-140/-100/40-180/-100
##
##RandomEnd(RandomPattern全体の終わりを示す必須コメント行)
#RelationChangePhases m-n: int(1〜255)Sync/Mirror/Unrelatedを切り替えるまでにいくつのパターンを消化するか、の最小値最大値を指定, Sync/Mirror/Unrelated Weight: int(0〜) 重み付け(確率)
2-5,1/1/3
#ConnectConfig: デバイス名パターン正規表現,制御書き込み対象Characteristicパターン正規表現,RelationChangePhases m-n, Sync/Mirror/Unrelated Weight
(?i).*dgc.*,.*3333.*,2-5,1/1/3
.*GI.*,.*3333.*,2-5,1/1/3
##ConnectConfigEnd
最初にランダムパターンの記述があり、次にデバイス間の同期や反転をどうするかの設定、そして、接続デバイスに関する設定と続きます。
行頭に『#』を書いた場合はその行は全てコメントとみなします。
#RelationChangePhases以外は複数記述が出来また、数が決まっていないため、必ず終わりを示す行頭コメント行『##』(##の後ろは何を書いても書かなくても良い)が必要になります。
また、ランダムパターンの記述内でパターン名称以外については「0123456789-/,」以外はコメントとみなしますので、見易さ編集し易さのために文字を入れたりしてみても良いでしょう。
今回のデフォルトではランダムパターンの各パラメタセットは1行に1つのみ記述する形を取っていますがUfoCtrlみたいに同じ行に『,』区切りで複数のパラメタセットを書く形でも可能なはずです(試してないけどUfoCtrlと同じ作りにしてるので)。
ただ、今回の設定では1つのパラメタセットがかなり長いので1行に1つの方が見易いかなとは思います。
ランダムパターンでは先頭行にそのパターン名称、次の行からはパラメタセットを記述します。数は不定ですのでパターンの終わりには『##』の行を置いてください。
パラメタセットで記述する項目は以下になります。
・Weight=n(1-65535) 選択される確率を変動させる重み付け。値が大きいほど選択される確率が増します。
・Time=m-n(1000-65535ms) このパラメタセットを継続する時間を範囲指定します。この範囲内で毎回ランダムに継続時間を決定します。
・Pow=m-n(0-100) モーターを回転させる出力を範囲指定します。このパラメタはこのままDGCに渡され、DGC側でモーターをオンにするタイミングが訪れるたびにこの範囲内で毎回ランダムに出力を決定します。
・ReverseRate=m-n(0-100%) 回転方向を反転させる確率を範囲指定します。この範囲内で毎回ランダムに反転確率を決定します。DGC側では渡された反転確率に従ってモーターの回転方向を毎回ランダムに決定します。例えば、どちらかの方向にはモーターが動いてくれないなんて場合にはこの範囲指定を0固定または100固定にすると正転固定もしくは逆転固定できます。また、急激に頻繁に回転方向が変化するのを嫌う場合も0や100にすると良いでしょう。特に振動系のグッズの場合は余り反転させることに意味を感じられない場合が多く、無駄に反転してモーターが傷んだりしたらやだなあという感じもしたのでローター向けのデフォルト設定では0固定にしています。
・OnTime=m-n(10-2550ms) モーターをオンにする時間を範囲指定します。このパラメタはこのままDGCに渡され、DGC側でモーターをオンにするタイミングが訪れるたびにこの範囲内で毎回ランダムにオン時間を決定します。
・OnGradualRate=m-n(0-100%) モーターをオンにするときにすぐに決定したPowの値で出力するかもしくは上記で決定したOnの時間を掛けて徐々にPowの値に近づけていくかで、徐々に近づけるように制御する確率を範囲指定します。この範囲内で毎回ランダムにOnGradual確率を決定します。DGC側では渡されたOnGradual確率にしたがってモーターの回転を毎回すぐにPowにするか徐々にPowにするか決定します。
・OffTime=m-n(0-2550ms) モーターをオフにする時間を範囲指定します。このパラメタはこのままDGCに渡され、DGC側でモーターをオフにするタイミングが訪れるたびにこの範囲内で毎回ランダムにオフ時間を決定します。
・OffGradualRate=m-n(0-100%) モーターをオフにするときにすぐにオフするかもしくは上記で決定したOffの時間を掛けて徐々にオフに近づけていくかで、徐々に近づけるように制御する確率を範囲指定します。この範囲内で毎回ランダムにOffGradual確率を決定します。DGC側では渡されたOffGradual確率にしたがってモーターの回転を毎回すぐにオフにするか徐々にオフにするか決定します。
AndroidアプリであるDGCCtrlから次のパラメタセットがDGCに渡されるまで、DGC側はそのパラメタセットの値に従ってOnとOffを繰り返します。繰り返す毎に範囲指定されているパラメタはランダム決定を都度やり直します。
各パラメタの記述はUfoCtrlのときと同様に省略記法が可能です。以降全てが省略値で良い場合は記述そのものを省略して良く、途中のパラメタであっても省略値で良い場合は値の書かずにパラメタ区切り『/』を続けて書いて良く、範囲指定でもn-mの片側が省略値と同じ場合はそれを省略可能です。
また、わざわざそのように書くメリットはありませんが範囲指定は大小関係を問いません。1-100でも100-1でも1-100として認識します。
上記のデフォルト設定値でもちょこちょこ省略記法を用いているので参考にしてください。
省略したときの値はTime=1000/Pow=0/ReverseRate=0/OnTime=2550/OnGradualRate=0/OffTime=0/OffGradualRate=0となります。
特に停止を指示するパラメタセットはPow以降のパラメタを記述する必要が一切ありません。というか、書いても良いですけど書くメリットがありません。そもそも停止時にはDGCに対して『停止』という情報しか与えませんので。
また、動作するパラメタセットを10個ほど書いているため停止のパラメタセットの重み付けを4と重くして選択される確率の調整をしています。
デフォルトでのパラメタ設定の考え方は、弱めの動きは比較的長時間でも良いようにしていて、Gradualも一切しないパターンとかオフ時間をゼロにして動いたまま出力だけが変化しているようなパターンも用意したりしています。
逆に強めの動きは連続するとしんどくなったり感覚が麻痺してしまったりしがちですので短時間でオンオフが切り替わるように設定し、またオフ時間もほとんどゼロにならないような形、つまり連続オン時間が長くなってしまわないように設定しています。
これらの設定を弄りたいときはまずはPowの値の調整だけやってみてください。それだけでも、望みの動きに近付いていけると思います。ずっと使い続けていれば『もうちょっとこうしたら……』みたいなことが思い浮かぶかもしれないのでもしそうなったらどんな定義をしたらその動きを再現出来るか考えて弄っていただければと思います。
なお、デフォルト設定ではローター向けの設定では全て反転確率をゼロに固定しています。つまり、常に同じ方向にしか回転しません。
これは反転するように設定してもローターの振動の回転方向が感覚で分かる人なんて多分居ないというのと、あまり意味無い反転ならしない方が多少はモーター負荷的にもマシかもしれないという(実際は筆者は分からんです)のと、例えば極短時間、20msとしましょうか、で-100⇒+100なんていう動きをGradualで変移させたりすると最初フル回転で10ms掛けて一旦停止してそこからまた10msでフル回転という動きになりますが、回転方向が感覚として分かるなら20ms掛けて反転したという動きに捉えることが出来るのですがローターだと10ms刻みで動いたり止まったりという感覚にしかなりません。(実際には10ms間隔だと止まったことすら知覚出来ないかもしれない。モーターの慣性もあるし)。つまり、思った(指定した)値の半分の時間で忙しく動いたり止まったりみたいな制御になることが往々にしてあるため、悩んだ末に「反転しない方が良くね?」となってそうしています。
反転させたい方はReverseRateの値を調整してください。

動作のイメージ図(手抜き)です。
フルにランダムにするとこんな感じになるという一例ですが、ここからGradual変移させたくなければそのようにパラメタ設定すれば良いし反転させたくなければReverseRateを0か100に固定すれば良いし、時間もPowも自由度があるのでそれぞれ範囲を好みに合わせて調整していてください、ということで。
なお、範囲指定としているところでも「0-100」とかではなくて「50」とか範囲指定せずに書けば「50-50」つまり「50」固定とみなしますので固定指定も可能です。
Off時間にはゼロを設定することが可能なのでOffをゼロにすると停止することなく動作し続けながらPowだけを変移させていく動きにすることが出来ます。
ちなみに参考情報としてDGCに渡されるパラメタセットは以下のようになります。
・1B 上位Bitから 1ch NA/Stop/Move 2ch NA/Stop/Sync/Mirror/Move 送信BytesはBaseを1BとしてMoveがあるごとに+9B
・2B Pow(0-100)Min-Max
・1B ReverseRate(0-100)%
・2B OnTime(1-255)10ms Min-Max
・1B OnGradualRate(0-100)%
・2B OffTime(0-255)10ms Min-Max
・1B OffGradualRate(0-100)%
先頭バイトは各モーターの動作状況を表すフラグでして停止状態はこのフラグのみで表せるので左右両方とも停止する場合は1Byteのみの送信になります。
動作させるときは動作パラメタ9Bytes分を付与しますが、パラメタセットが変更されるタイミングが必ずしも左右で同時とは限らないので片側だけ動作パラメタを送信する場合は1+9=10Bytesの送信、両側動作で同時送信のときのみ1+9+9=19Bytesのデータ送信となります。
PowやOnTime,OffTimeは設定に書かれたまんまが送信されますが、ReverseRate,OnGradualRate,OffGradualRateは設定値に書かれた範囲からDGCCtrlの方で都度ランダムで決定した固定値をDGCに送信しています。
最大でも19Bytesの送信データ量に抑えることでBLE通信はもっともシンプルなやり取りで行えることになり、通信安定性にも配慮出来ているかと思います。
#RelationChangePhasesのところはUfoCtrlと同じです。同種とみなされるデバイスが複数接続された場合に、その複数のデバイス同士で同期するか反転するかあるいは無関係に動くかという設定をしているところです。
ただし、今回のDGCCtrlではパラメタセットの値を同じ、もしくは反転の場合はReverseRateを逆(100-n)にしたパラメタセットを送信する、というところまでしか出来ません。
各DGC間で同期を取るわけではなく、あくまでもパラメタセットが同時に同値で指定されるだけで、そこからDGCではランダム決定する部分があるので完全同期というわけではありません。
ただし、範囲指定をしない設定を記述することも可能ですので、ランダム要素を廃したパラメタセットにすれば完全同期もしくは完全反転出来るようにはなります。
#ConnectConfigのところもUfoCtrlと同じです。ただし、デフォルトでは制御書き込み対象Characteristicパターン正規表現のところは「.*2222.*」ではなく「.*3333.*」にしています。(2222は+1D用ですのでそれと被らないDGCCtrl専用Characteristicが必要になります。)
ここを変えることは出来ますがその場合はDGCのプログラム側もそれに合わせて修正する必要が生じます。
デバイス名パターン正規表現を2種類書いてしまっていますが、これは筆者が名称をしっかり定義しきれて来なかった弊害でして、DGCCtrlなので「dgc」という名前を大文字小文字関わらず含んでいれば接続対象とみなしたい他、従来どおりUfoCtrlとも接続できるようにしていますがUfoCtrl側の設定変更をしないのであれば名称の冒頭は「ufotw」が好ましい。
で、結果デフォルトでは「ufotwDGC」という名称を各DGCのプログラムでは採用しているのですが、ここでしかし、DGCのVer2.00までではまだこの名称が確立しておらず「ufotwGI」という名称をデフォルトとしてしまっていたため、DGC Ver2.00を書き込んだDGCは「ufotwGI」というデバイス名称を記憶してしまっていてVer3.00で上書きしてもその記憶が残ってしまっています。
なので、苦し紛れに大文字で「GI」という文字を含んでいる場合でも接続できるようにもう一行設定を書いていたりします。うーむ余りここは綺麗じゃないところ。
でこれ、先程のデバイス間の同期とか反転とかの話はこのデバイス設定のどの条件で当てはまったかによって種別が同じか別かを判断します。
つまり、「(?i).*dgc.*」の条件で接続したデバイスと「.*GI.*」の条件で接続したデバイスとは別種とみなされ同期も反転もされません。
デバイス間同期反転は同じデバイス種別のみなされるデバイスが複数接続したときのみ発動します。
ちなみに、「ufotwGI」という名称だとどちらにも条件合致してしまうのですが、多分先に書いた「(?i).*dgc.*」の側のデバイス種別になると思います。
まあ、複数のDGCを同時に動かす人にしか関係無いところですから、あまり気にしないでください。
また、こちらも設定ですので自由に変更が可能ですが、それに合わせてDGC側のデバイス名称も修正しないと接続出来なくなりますのでお気を付けください。
で、#ConnectConfigのところにも行毎に同期反転設定を記述しています。こちらはデバイス内の同期反転定義、つまり左右で同期するかどうかを定義しているところになります。
こちらの定義は同じDGC内の左右の話ですのでがっつり同期しますし反転しますので、こちらの定義は重要です。
UfoCtrlと同様にSync/Mirror/Unrelatedで同じのが連続して選択されたりすることはありません(2-5回は続くようにするがその次は必ず別のになる)ので、実は割とSyncやMirrorになる確率が高い(一旦Unrelatedになると次はかならずSyncかMirrorになるので)ので1/1/3なんて重み付けにしていても結構同期反転します。
ダウンロードファイル
勝手な再配布はしないでください。
また、このファイルのみへの直接リンクを貼ることもご遠慮ください。
特に、うちのサイトは弱小なので、検索で上位に表示されるサイトに勝手にコピーされると、盗まれたのとほぼ同じ状況に陥ります。
何かしらの問題が発覚して、こちらのサイトでファイルを差し替えても、それが皆さんの元には反映されなくなることにも繋がります。
DGCCtrlアプリ配布ページはこちらです。
DGCCtrl Ver1.00(UfoCtrl開発活動支援プラン)
また、同時に対応するDGC側のプログラムも配布しています。
DGCCtrlに対応するのはDGC Ver3.00(以降)となります。
DGCで使用しているマイクロコントローラの種類に応じてダウンロードして書き込みをしてください。
なお、筆者のDGCの作例と皆さんが作られたDGCとで接続した配線のPINが異なる可能性があります。(特にSoCは同じでも実装が微妙に異なる基板を使用するなど多いと思います)また、特にESP32 C3では筆者の作例が2つあってそこで既にちょっと配線が異なる部分があったりします。
配線のピンの定義はプログラムの上部の方にありますので、そこは皆さんのDGCの配線に合わせて修正のうえ、プログラム書き込みを行ってください。
あと一つお詫びがあります。
前回『DGCSet Ver1.00 DIYグッズコントローラーの設定値を調整、変更、動作確認できるツールアプリ』のリリースとともに対応するDGC Ver2.00を配布しましたが、一部パラメタについて記憶はするけど実態として反映しないというバグがありました。
今回のVer3.00にてその点の修正もしております。
また、これは仕様の説明になりますが、DGCSetにてパラメタを変更してもデバイス名称はすぐには変わりません。DGCを一旦再起動(電源を入れ直すかResetボタンを押す)して初めてDGC側の変更反映がされます。
しかし、DGC側の反映がされても、Android側にデバイス名変更が反映されない場合があります。
これはAndroidOSが恐らくデバイス情報をキャッシュしているためで、BLEデバイスとしては同じなのにデバイス名称だけ変更されているという状態をAndroidが(というかデバイス名称が変わるなんて想定されないのが普通だと思います)考慮していないのでAndroid側で一旦Bluetoothをオフにしてオンし直すなどしないと変更されたデバイス名称の再取得は行われないかと思います。ので、ご注意ください。
DGC Ver2.00を書き込んだことがある方はデバイス名称がマイクロコントローラ内に記憶されているため、今回のDGC Ver3.00を書き込んでもデバイス名称は『UfotwGI』のままになるかと思います。(プログラム上は『ufotwDGC』と定義していますが記憶が残っている場合は記憶の方を優先する作りにしていますので)
そのままでも接続できるようにDGCCtrlは作っておりますが、気になる方はDGCSetにてデバイス名称を変更してください。
DGC Ver3.00のプログラムも
DGCCtrlアプリ配布ページはこちらです。
DGCCtrl Ver1.00(UfoCtrl開発活動支援プラン)
と同じページに置いてあります。
書き込み方が分からない方は筆者のFANBOXの過去記事を探してみてください。
改めて纏めたいなあという気持ちも無いわけではないのですが、纏めるとこちらでは当たり前と思って端折る情報が実は皆さんにとっては重要だったりとか、つまり、過去記事は量が多いし今から遡るのは面倒かとは思うのですが、それだけ色々とやって来て、その時々でノウハウをなるべく漏らさずに書いて来たつもりでもいますので、纏めると却って纏めだけを見た人が露頭に迷う危険性が上がる気もするんですよねぇ。
なお、ダウンロードページにも書きましたが今回からESP32-WROOM-32D向けのプログラムは作らなくなりました。筆者が破損させてしまったのと、このマイクロコントローラは消費電力が高く、大きいのでDGCには不向きなので、元々無知な筆者が価格だけで購入してしまったものを勿体無いからこれで配線とプログラムを勉強しながらやって行こうとしただけで、現在はもう配線の問題も無いのでこのままESP32-WROOM-32Dは終了ということでご了承ください。
(ESP32 H2とか入手出来たらそっちを増やそうかなあとか思っていたりもするのですが、最近某Aliさんがさらに扱いづらくなって(いや筆者が卑しいだけなんですけど)なかなか入手できない……とほほ。)
チクラッシュ 'N
乳首ローター 'N
挟乳痴態
乳首責めローター 'N
CHICKRO-
(チクロー) 'N
激感
ニップルバイブ
レッド 'N
激感
ニップルバイブ
ブラック 'N

Chick Rush
チクラッシュ 'm

百戦錬磨シリーズ
乳首ローター 'm

CHICKRO-
チクロー 'm
Chick Rush 'F
乳首ローター 'F
CHICKRO-
ブラック 'F
CHICKRO-
ピンク 'F
挟乳痴態
乳首責めローター 'F