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番ピン

Committer:
morita
Date:
Sun Jul 20 02:28:20 2014 +0000
Revision:
0:00c483aa2b22
First version.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morita 0:00c483aa2b22 1 #include "mbed.h"
morita 0:00c483aa2b22 2 #include "USBMouse.h"
morita 0:00c483aa2b22 3
morita 0:00c483aa2b22 4 USBMouse mouse;
morita 0:00c483aa2b22 5
morita 0:00c483aa2b22 6 int main() {
morita 0:00c483aa2b22 7 DigitalIn psr(P1_16), psl(P1_28);
morita 0:00c483aa2b22 8 psr.mode(PullUp); psl.mode(PullUp);
morita 0:00c483aa2b22 9 DigitalIn swu(P1_19), swl(P1_27), swr(P0_2), swd(P1_24);
morita 0:00c483aa2b22 10 swu.mode(PullUp); swl.mode(PullUp); swr.mode(PullUp); swd.mode(PullUp);
morita 0:00c483aa2b22 11
morita 0:00c483aa2b22 12 int16_t x = 0;
morita 0:00c483aa2b22 13 int16_t y = 0;
morita 0:00c483aa2b22 14 bool swuf=false,swlf=false,swrf=false,swdf=false;
morita 0:00c483aa2b22 15 //auto repeat stating time = 1.0sec
morita 0:00c483aa2b22 16 #define REPEATTIME 100
morita 0:00c483aa2b22 17 uint8_t repeat_timer=REPEATTIME;
morita 0:00c483aa2b22 18
morita 0:00c483aa2b22 19 while (1) {
morita 0:00c483aa2b22 20 if(swu==0){
morita 0:00c483aa2b22 21 if(swuf==false){
morita 0:00c483aa2b22 22 y--;
morita 0:00c483aa2b22 23 swuf=true;
morita 0:00c483aa2b22 24 } else {
morita 0:00c483aa2b22 25 if(repeat_timer==0){
morita 0:00c483aa2b22 26 swuf=false;
morita 0:00c483aa2b22 27 repeat_timer=2;
morita 0:00c483aa2b22 28 }
morita 0:00c483aa2b22 29 }
morita 0:00c483aa2b22 30 } else swuf = false;
morita 0:00c483aa2b22 31 if(swl==0){
morita 0:00c483aa2b22 32 if(swlf==false){
morita 0:00c483aa2b22 33 x--;
morita 0:00c483aa2b22 34 swlf=true;
morita 0:00c483aa2b22 35 } else {
morita 0:00c483aa2b22 36 if(repeat_timer==0){
morita 0:00c483aa2b22 37 x--;
morita 0:00c483aa2b22 38 repeat_timer=2;
morita 0:00c483aa2b22 39 }
morita 0:00c483aa2b22 40 }
morita 0:00c483aa2b22 41 } else swlf = false;
morita 0:00c483aa2b22 42 if(swr==0){
morita 0:00c483aa2b22 43 if(swrf==false){
morita 0:00c483aa2b22 44 x++;
morita 0:00c483aa2b22 45 swrf=true;
morita 0:00c483aa2b22 46 } else {
morita 0:00c483aa2b22 47 if(repeat_timer==0){
morita 0:00c483aa2b22 48 x++;
morita 0:00c483aa2b22 49 repeat_timer=2;
morita 0:00c483aa2b22 50 }
morita 0:00c483aa2b22 51 }
morita 0:00c483aa2b22 52 } else swrf = false;
morita 0:00c483aa2b22 53 if(swd==0){
morita 0:00c483aa2b22 54 if(swdf==false){
morita 0:00c483aa2b22 55 y++;
morita 0:00c483aa2b22 56 swdf=true;
morita 0:00c483aa2b22 57 } else {
morita 0:00c483aa2b22 58 if(repeat_timer==0){
morita 0:00c483aa2b22 59 y++;
morita 0:00c483aa2b22 60 repeat_timer=2;
morita 0:00c483aa2b22 61 }
morita 0:00c483aa2b22 62 }
morita 0:00c483aa2b22 63 } else swdf = false;
morita 0:00c483aa2b22 64 mouse.update(x, y,((psr==0)? 2:0)|((psl==0)? 1:0),0);
morita 0:00c483aa2b22 65 x=0; y=0;
morita 0:00c483aa2b22 66 if((swuf | swlf | swrf | swdf)==false)repeat_timer=REPEATTIME; else repeat_timer--;
morita 0:00c483aa2b22 67 wait_ms(10);
morita 0:00c483aa2b22 68 }
morita 0:00c483aa2b22 69 }