Button switch mouse. Moving 1 dot by 1 push.

Dependencies:   USBDevice mbed

1回押すと、1ドット分ポインタが移動するマウス

マウスでドラッグしていると、あと1ドット移動したいのに、行ったり来たりして、なかなか定まらない事があります。
精神衛生上良くないので、押しボタンで1移動単位を送るUSBマウスを作ってみました。

/media/uploads/morita/image_20140720133530a.jpg

プログラムは、LPC11U35を搭載したオリジナルCPUボード用に作成しましたが、mbed対応のボードで多分動作可能です
(ポート名は、使用ボードに合わせて変更してください)

オリジナルCPUボードは「MC11U35」の名前で、スイッチサイエンスさんで販売しています。
mbedに対応したCPUを搭載していますので、クラウドでのプログラム作成とUSBからのプログラム書き込みが可能です。

*PC用なので、薄くて小さい方が便利です。上記のボードのフォームファクターを生かせてまとめる事ができました。
/media/uploads/morita/image_20140720134116a.jpg

ソフトの構成。
プログラムはmbedクラウド上で、USBDeviceを読み込むだけの作業で作る事ができます。
このあたりは、mbedの中の人に感謝です。
処理と言ってもUSBDeviceの中のUSBmouseを10mSに一回、呼び出しているだけです。
**注意:MC11U35を使用する場合は、プラットフォームの選択をmbed LPC11U24に設定してください**

プログラムはさておき、今回は工作を中心に行きたいと思います。

用意した材料は、ケース、タクトスイッチ6個、CPUボードです。
左が用意したケース、右が開封した状態です。
/media/uploads/morita/image_20140720131834a.jpg /media/uploads/morita/image_20140720131846a.jpg

収まり具合をチェックします。余裕があります。
/media/uploads/morita/image_20140720131900a.jpg

はめ合いのフチにUSBのハウジングがあたりそうですので、先に削る事にします。
USBコネクタをはめて、位置をマーキングします。
ケースの材質は柔らかいので、少し削るだけなら、カッターナイフで大丈夫です。
/media/uploads/morita/image_20140720131917a.jpg

削りが終われば、基板を固定します。
真面目に四隅を固定するのがベストですが、動きまわるものでもないので、厚い目の両面テープで貼り付ける事にします。
(CPUの裏側には、部品の足とかの出っ張りはありません)
/media/uploads/morita/image_20140720131941a.jpg

基板を接着した後、上のふたをかぶせて、USBコネクタのハウジングの逃げを確認します。
現物合わせで切り込み場所にマーキングします(左)、  こんな形に削る必要があります(右)

/media/uploads/morita/image_20140720132005a.jpg /media/uploads/morita/image_20140720132018a.jpg

カッターナイフでは無理がありますので、方法を考えます。
・のこぎりで縦に二本切り込みを入れて、へし折る。
・ハンドニブラーで切り込む。
・Pカッターを使う。
・ヤスリで削る。
・ハンドルーターで加工する。
・NCの切削マシン(もってません)
・ドリルで連続する穴を空ける。

最後の方法で行く事にしました。
穴をあけて(左)、ニッパーで穴の間を切断します(右)
/media/uploads/morita/image_20140720142453b.jpg /media/uploads/morita/image_20140720143420a.jpg

半月状に残った出っ張りですが、左右はニッパーで切り取る事ができます。底面(上の方?)はヤスリで削りました(左)
仮にふたをして、ちゃんと刺さるか確認します(右)
/media/uploads/morita/image_20140720142512a.jpg /media/uploads/morita/image_20140720142526a.jpg

押しボタンの配置を検討します。
実物を置いて、よさそうな場所を探します。位置が決まれば、スイッチの間隔を測ります。
最終的には、右の様な配置に決まりました。位置を紙に書き出して、穴あけのマーカーにした所です。
/media/uploads/morita/image_20140720164936a.jpg /media/uploads/morita/image_20140720142607a.jpg

位置が決まれば、マーカーにした紙の上から、ドリルで穴を空けます。1φで開けましたが0.8φでも入るかもです。
紙を除去すると...(左)OK、裏返せば...裏には、基板取り付け用のポストがありました。
裏を良く確認せずに、デザイン重視で配置した上の失敗です。何事もなかった様に、ポストをニッパーで飛ばしました(右)
もう少し、横に配置していると、ケースの上下を止める、ポストに当たるところでした、セーフ。
/media/uploads/morita/image_20140720142628a.jpg /media/uploads/morita/image_20140720165029a.jpg

今回は、印刷でパネルを作りました。白いケースですので、そのままマジックで手書きでもOKだし、そもそも文字入れなんか不要の声が聞こえてきそうです。
パネルをかぶせたので、スイッチの穴を光にすかせて、尖ったピンセントで穴を空けました。
そこに、タクトスイッチを差し込みます。
/media/uploads/morita/image_20140720164959a.jpg
ほとんど、完成品と同じ形状です。
無理にスイッチをひね事で、すこしくらいの歪みならこの時点で修正できます。

裏側でスイッチの配線を行います。タクトスイッチの足に直接電線をハンダ付します。
CPU側のピン位置は、近い順で適当に決めました。
/media/uploads/morita/image_20140720171908a.jpg

プログラムの書き込みです。 /media/uploads/morita/image_20140720172553a.jpg
おしまい...

ピン接続、
CN2はMC11U35のコネクタ番号です。Pn_xxはLPC11U35のピン名称です。
右クリック用ボタン ・・・ P1_16 ・・・ CN2 / 5番ピン
ポインタUPスイッチ ・・・ P1_19 ・・・ CN2 / 7番ピン
ポインタLEFTスイッチ ・・・ P1_27 ・・・ CN2 / 11番ピン
ポインタRIGHTスイッチ ・・・ P0_2 ・・・ CN2 / 9番ピン
ポインタDOWNスイッチ ・・・ P1_24 ・・・ CN2 / 17番ピン
左クリック用ボタン ・・・ P1_28 ・・・ CN2 / 19番ピン

スイッチ共通のGND ・・・ CN2 / 1番ピン

Files at this revision

API Documentation at this revision

Comitter:
morita
Date:
Sun Jul 20 02:28:20 2014 +0000
Commit message:
First version.;

Changed in this revision

USBDevice.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 00c483aa2b22 USBDevice.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice.lib	Sun Jul 20 02:28:20 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/USBDevice/#0c6524151939
diff -r 000000000000 -r 00c483aa2b22 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jul 20 02:28:20 2014 +0000
@@ -0,0 +1,69 @@
+#include "mbed.h"
+#include "USBMouse.h"
+
+USBMouse mouse;
+
+int main() {
+    DigitalIn psr(P1_16), psl(P1_28);
+    psr.mode(PullUp); psl.mode(PullUp);
+    DigitalIn swu(P1_19), swl(P1_27), swr(P0_2), swd(P1_24);
+    swu.mode(PullUp); swl.mode(PullUp); swr.mode(PullUp); swd.mode(PullUp);
+
+    int16_t x = 0;
+    int16_t y = 0;
+    bool swuf=false,swlf=false,swrf=false,swdf=false;
+//auto repeat stating time = 1.0sec
+#define REPEATTIME 100
+    uint8_t repeat_timer=REPEATTIME;
+
+    while (1) {
+        if(swu==0){
+            if(swuf==false){
+                y--;
+                swuf=true;
+            } else {
+                if(repeat_timer==0){
+                    swuf=false;
+                    repeat_timer=2;
+                }
+            }
+        } else swuf = false;
+        if(swl==0){
+            if(swlf==false){
+                x--;
+                swlf=true;
+            } else {
+                if(repeat_timer==0){
+                    x--;
+                    repeat_timer=2;
+                }
+            }
+        } else swlf = false;
+        if(swr==0){
+            if(swrf==false){
+                x++;
+                swrf=true;
+            } else {
+                if(repeat_timer==0){
+                    x++;
+                    repeat_timer=2;
+                }
+            }
+        } else swrf = false;
+        if(swd==0){
+            if(swdf==false){
+                y++;
+                swdf=true;
+            } else {
+                if(repeat_timer==0){
+                    y++;
+                    repeat_timer=2;
+                }
+            }
+        } else swdf = false;
+        mouse.update(x, y,((psr==0)? 2:0)|((psl==0)? 1:0),0);
+        x=0; y=0;
+        if((swuf | swlf | swrf | swdf)==false)repeat_timer=REPEATTIME; else repeat_timer--;
+        wait_ms(10);
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r 00c483aa2b22 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Jul 20 02:28:20 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/04dd9b1680ae
\ No newline at end of file