見出し画像

トラックボールマウスを作りたかった

こんにちは。

トラックボールマウスって、ありますよね。

いらすとやにはなんでもあるな

従来のマウスと違って、カーソルを動かすために腕全体を動かす必要がなく、親指(または他の指)の動きのみで画面上のあらゆる操作を済ませられるという、そのロマンだけで他のすべてが許される可能性があるマウスです。

更にロマンだけでなく、腕を動かさなくて良いため、腱鞘炎予防になるという実用性も兼ね備えております。

ところが、ひとつだけどうしようもない欠点を抱えているのです。

それは値段。

最低4桁

高い。



5桁もちらほら

高い!



もうむり

高すぎる!!!


光学式マウスはもはや百均でいくらでも買えるというのに、トラックボールはこんなにお高く止まりやがってます。せめて3桁円でないと。

まあ3桁台のものも探せばあるのでしょうが、相場がこれである以上、そんな価格で販売されている商品は信用できません。

金がない。しかし欲しい……。


なら、作ればいいじゃない。

そうなるのは、全くもって自然であります。




自作トラックボールマウスへの道

トラックボールマウスとは、基本構造はただのマウスとほぼ変わりません。

カーソル移動の方式が少し変わっているだけで、クリック、ホイールといった操作は普通のマウスで代替できます。

そしてカーソル移動にボールを使うマウスは、既に普及しています。

そう。どこの家庭にも、職場にも……。

ボールが……
ない


ボールが……
ない


ボールが……
ない


なんということでしょう。
もはやボール式マウスはどこにもいません。

光学式のこの時代に、ボール式はすべて絶滅してしまったのでしょうか……。




おや?

あった!!!!



ですがこのマウスは家族が現在進行形で使用中なので、改造には不向きです。

なお、もう市場にもボール式マウスなんてほぼありません。

私に改造が許されているのは光学式マウスしかないようです。

あのボールの感触も楽しみにしていたので名残惜しいですが、光学式トラックボールマウスへと舵を切らざるを得なくなってしまいました。




自作光学式トラックボールマウスへの道

光学式トラックボールなんて作れるのでしょうか?
という疑問をお持ちの方はおられるかもしれません。ですが安心してください。

トラックボールマウスも光学式マウスの一種です。

トラックボールの回転を読み取る技術は光学式マウスとそう変わりません。

なんなら昔なじみのボール式マウスもX,Y方向の変位をロータリエンコーダで読み取っているので光学式と言えないこともありません。

つまり手頃なボールと光学式マウスがあれば、誰でも簡単にトラックボールマウスが作れるということです。


まぁボールを固定するのがめんどくさいので今回はやりませんけど。




自作光学式トラックマウスへの道

さて、ここで一度考え直してみましょう。

己に問いかけるのです。

私は本当にトラックボールマウスが欲しかったのか?


本当に?


本当は指先でカーソルが動かせるマウスなら、なんでも良かったんじゃないのか?


ボールを指先で繰る感触なんてどうでも良かったんじゃないのか?


むしろ一般的なトラックボールマウスは形が普通のマウスに寄せすぎてて面白くないのではないか?




自己暗示が済んだところで、もう一度私の往く道を捉え直します。






自作光学式トラック 持ちやすそうなマウスへの道

用意する材料は以下の3つ。

  1. 光学式マウス(安ければ安いほど良い)

  2. 握りやすそうなもの

  3. 透明でそこそこ硬い板

あと基板を切ったり繋げたりするので、ニッパーなどの工具や半田ごて、適当な線も要ります。

私が使ったマウスはこれです。

CanDoで買った110円のマウスです。安いので失敗してもそこまで心が痛みませんね。


握りやすそうなのはこれ。

スマホをゲーム用にするケースみたいなやつ。これも110円。
右側の取っ手をもぎ取って使いました。


薄い透明な板はそこら辺にあった適当なやつ。
写真を見せるのすら憚られるので上げません。


作り方

まずマウスを分解し、基板を取り出します。

110円の80円分くらい?

裏面を見てどのへんで切ろうか考えます。


ここらへん(赤線)で切ると良さそうですね。結ぶのは5本で済みます。


でも実際は手元が狂ってこうなっちゃいました。

ちょっと救済の技法みがでた

そのせいでマウスホイールを横断する余計な半田作業が増えました。皆さんは丁寧に基板をポキポキしましょう。



そして実際に切って……握りやすそうなプラスチックにくっつけて……


断面とかを申し訳程度に処理したり持ちやすくしようとしてみたり……


オプティカルセンサを親指でスイスイできる丁度いい位置に持ってきたり……




なんやかんやするとこうなりました。

こうなりました。






こうなりました。

こうなりました


親指でセンサ部分をスイスイし、他の指でクリックとかホイールとかを操作します。

赤い導線が人間を無理やり延命させるチューブみたいで面白いですね。

周りに見せたところ「『シテ…コロシテ…コロシテ…』って声が聞こえる」という感想も頂きました。好感触です。


結果的にトラックボールマウスとは似ても似つかないフォルムになってしまいましたが、指先でカーソルを操作することが出来るので十分です。

と、思っていました。

こちらをご覧ください。

なんと、上下操作が反転してしまうのです。

これはいけない。

ということで、カーソル操作を上下反転させるソフトを探します。



マウス操作反転ソフト

ちょろっと検索しただけでも複数のソフトを見つけることができました。
リンクも貼ろうかと思ったんですが、色々と面倒くさかったので気になった方は独自で調べてください。

sakasamouse

さかさまうす。名前から分かるとおり日本人が開発したソフトらしいです。
使用してみたところ、起動直後にカーソルが隅っこにバビューン。カーソルは二度と帰ってきませんでした。


さかさまうす ぷらす!

進化形らしいのですが、進化前同様、起動直後にバビューン。二度と帰ってきませんでした。


MagRoleArrow

これもマウス操作をいじるソフト。速度や方向を変更できるらしいです。
方向反転の設定にして実行したところバビューン。二度と(ry


Mafmouse

海外のソフト。有料というか、無料版では利用時間に制限があるらしく使ってすらいません。
ですのでちゃんと動くかも? でもそのために12ユーロ用意して送金するのは面倒です。


あれ? 実用に足るのなくね?







マウス操作反転ソフト自作への道

見つけられなかったら、作るしかありません。

ところが私は特別にプログラムが書けるわけでもなく、しかもC言語しか知りません。

ですので汎用性のあるプログラムなど書けないものと割り切って、

  1. Windows環境のみ対応

  2. ショートカットキーによるオンオフ機能なし

  3. タスクトレイとかに表示もされない

  4. モニタ解像度に依存

という必要最低限構成で書きました。
それがこれです。

#include <Windows.h>

#define YPX 1080

int main() {

	//現在カーソル位置
	POINT pt;
	//前回カーソル位置
	POINT ppt;

	//補正値
	long ady = 0;

	//カーソル位置取得
	GetCursorPos(&pt);
	ppt = pt;
	ady = pt.y;


	for (;;) {

		GetCursorPos(&pt);

		//カーソルが下端に行ってしまったときのスタック回避用
		if (pt.y == YPX - 1) {
			pt.y = YPX - 2;
			SetCursorPos(pt.x, pt.y);
			ppt.y = YPX - 5;

		}

		//カーソルが上端に行ってしまったときのスタック回避用
		if (pt.y == 0) {
			pt.y = 2;
			SetCursorPos(pt.x, pt.y);
			ppt.y = 5;
		}

		//y方向変位の2倍を引く
		if (pt.y - ppt.y >= 1 || pt.y - ppt.y <= -1) {
			ady = pt.y - 2 * (pt.y - ppt.y);
			SetCursorPos(pt.x, ady);
			ppt.y = ady;
		}

	}

	return 0;
}

このプログラムはマウスからの信号を直接検知して動いているわけではなく、ディスプレイ上の座標を取得して動作します。

このプログラムがやっていることは、上下操作の移動分の2倍を現在位置から引くというものです。上に10px移動させた瞬間下に20px移動させると、実質上下反転して動いているように感じますよね。それだけです。

また、座標を取得して反転させる都合上、上下端に到達してしまうと反転させるための移動自体ができなくなるので、端に到着するとブルブル震えさせて端っこにくっつかないようにしています。

ブルブルといっても実用には支障がないと思います。ウィンドウの全画面表示がしたかったらWin+↑とかで対応してください。

誰も彼もソースコードをビルド出来る環境を持っているわけではないと思うので、本当はexeファイルを上げたかったのですが、アップローダーとかめんどいし知らねえexeファイル使うの怖すぎると思うので、使いたい方は各自でビルドしてください。
環境がなくても、大衆の言うとおりにVisual Studio Communityをインストールすればすぐできます。多分。

モニター解像度がフルHDじゃない人は上のDefine文を書き換えると良いと思います。

コンソールは出っぱなしです。広い心を持って受け入れてください。


ちなみに、こんな単純なプログラムを書くのに数日かかりました。面白いですね。
下端を検出するif文で、なぜYPXそのままの値じゃないのか、疑問に思った方はおられるでしょうか。それはYPXの値にするとモニターの上下端がつながってしまうからです。

いやほんと、なぜかカーソルが世界一周して上から降りてきちゃうんですよ。不思議ですよね。誰か原因教えてください。

追記(2021/12/28)
なんでカーソルが天地一周するかわかりました。
目的のWindowsタブレットで試したところ、1280だと思っていた画面サイズがそれよりも大幅に小さかったことが判明しました。というのも、1280の設定でビルドした実行ファイルを起動したにもかかわらずカーソルが一周したため、カーソルの現在座標を表示する仕様のファイルを実行したのです。
1043くらいでやっと一周しなくなり、そこで気が付きました。
1080ピクセルの画素に座標を割り当てる際、開始の数字は0からです。
ということは、0~1079までの数字しか割り当てられません。
つまり、カーソル座標がディスプレイの下限を超えようとしたときに一周するという理屈でした。1080ピクセルのディスプレイでは1080番目の座標は存在しませんからね。分かりづれぇ~




結果

トラックボールマウスもどきができる!!!







あとがき

本当は無線がよかった、とか。
センサをスイスイするだけじゃ可動範囲が狭すぎる、とか。
色々不満はありますよ。

無線に関しては、USBドングルタイプのものだったらまだ何とかできそうなレベルの基板でしたが、Bluetoothはもう手の付けようがない感じの基板だったので断念。
じゃあドングルタイプで作れよって話なんですが、私はWindowsタブレットでこのマウスを使いたかったので、ドングルが差せないためNG。

ただ実は無線対応ということで一度Wiiリモコンを使おうかと思っていて、実際そういった発想に辿り着く人間はそう少ないわけでもないらしく、「Wiinremote」というフリーソフトがあったりします。

これを使うとパソコンでWiiリモコンをBluetoothデバイスとして認識し、マウスやショートカットキーとして使えるようになるんですが、いくつか難点が。

まず加速度センサでカーソルを動かすのは無理があるのでは? という点。

そしてこれはWin10側の問題なんですが、カーソルが消えるという点。

私は早々に加速度センサでの操作を諦め(というか初っ端から考慮に入れてなかった)、ヌンチャクのスティックを使った操作で行こうと決めていたんですが、一度画面にタップしたりしてしまったり時間経過だったりでカーソルが消えてしまうんですよ。

一度カーソルが消えると二度と現れません。マウスを接続しない限り。

Wiiリモコンがマウス扱いなんじゃないのか! と思ったんですが、そういうわけでもないらしく。

ただ、カーソルの存在はあります。見えないだけ。どないせえっちゅうねん。

そんなこんなで無線を諦めました。

あと可動範囲が狭いのはもう無理です。ただ私が面倒臭がってやめたボールの実装ができれば解決するでしょう。

他に熱意のある方がおられればやってみてください。そして簡単な方法を見つけて共有してほしいです。


お疲れさまでした。

ここはどこだ