![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Button switch mouse. Moving 1 dot by 1 push.
1回押すと、1ドット分ポインタが移動するマウス
マウスでドラッグしていると、あと1ドット移動したいのに、行ったり来たりして、なかなか定まらない事があります。
精神衛生上良くないので、押しボタンで1移動単位を送るUSBマウスを作ってみました。
プログラムは、LPC11U35を搭載したオリジナルCPUボード用に作成しましたが、mbed対応のボードで多分動作可能です
(ポート名は、使用ボードに合わせて変更してください)
*オリジナルCPUボードは「MC11U35」の名前で、スイッチサイエンスさんで販売しています。
mbedに対応したCPUを搭載していますので、クラウドでのプログラム作成とUSBからのプログラム書き込みが可能です。
*PC用なので、薄くて小さい方が便利です。上記のボードのフォームファクターを生かせてまとめる事ができました。
ソフトの構成。
プログラムはmbedクラウド上で、USBDeviceを読み込むだけの作業で作る事ができます。
このあたりは、mbedの中の人に感謝です。
処理と言ってもUSBDeviceの中のUSBmouseを10mSに一回、呼び出しているだけです。
**注意:MC11U35を使用する場合は、プラットフォームの選択をmbed LPC11U24
に設定してください**
プログラムはさておき、今回は工作を中心に行きたいと思います。
用意した材料は、ケース、タクトスイッチ6個、CPUボードです。
左が用意したケース、右が開封した状態です。
収まり具合をチェックします。余裕があります。
はめ合いのフチにUSBのハウジングがあたりそうですので、先に削る事にします。
USBコネクタをはめて、位置をマーキングします。
ケースの材質は柔らかいので、少し削るだけなら、カッターナイフで大丈夫です。
削りが終われば、基板を固定します。
真面目に四隅を固定するのがベストですが、動きまわるものでもないので、厚い目の両面テープで貼り付ける事にします。
(CPUの裏側には、部品の足とかの出っ張りはありません)
基板を接着した後、上のふたをかぶせて、USBコネクタのハウジングの逃げを確認します。
現物合わせで切り込み場所にマーキングします(左)、 こんな形に削る必要があります(右)
カッターナイフでは無理がありますので、方法を考えます。
・のこぎりで縦に二本切り込みを入れて、へし折る。
・ハンドニブラーで切り込む。
・Pカッターを使う。
・ヤスリで削る。
・ハンドルーターで加工する。
・NCの切削マシン(もってません)
・ドリルで連続する穴を空ける。
最後の方法で行く事にしました。
穴をあけて(左)、ニッパーで穴の間を切断します(右)
半月状に残った出っ張りですが、左右はニッパーで切り取る事ができます。底面(上の方?)はヤスリで削りました(左)
仮にふたをして、ちゃんと刺さるか確認します(右)
押しボタンの配置を検討します。
実物を置いて、よさそうな場所を探します。位置が決まれば、スイッチの間隔を測ります。
最終的には、右の様な配置に決まりました。位置を紙に書き出して、穴あけのマーカーにした所です。
位置が決まれば、マーカーにした紙の上から、ドリルで穴を空けます。1φで開けましたが0.8φでも入るかもです。
紙を除去すると...(左)OK、裏返せば...裏には、基板取り付け用のポストがありました。
裏を良く確認せずに、デザイン重視で配置した上の失敗です。何事もなかった様に、ポストをニッパーで飛ばしました(右)
もう少し、横に配置していると、ケースの上下を止める、ポストに当たるところでした、セーフ。
今回は、印刷でパネルを作りました。白いケースですので、そのままマジックで手書きでもOKだし、そもそも文字入れなんか不要の声が聞こえてきそうです。
パネルをかぶせたので、スイッチの穴を光にすかせて、尖ったピンセントで穴を空けました。
そこに、タクトスイッチを差し込みます。
ほとんど、完成品と同じ形状です。
無理にスイッチをひね事で、すこしくらいの歪みならこの時点で修正できます。
裏側でスイッチの配線を行います。タクトスイッチの足に直接電線をハンダ付します。
CPU側のピン位置は、近い順で適当に決めました。
プログラムの書き込みです。
おしまい...
ピン接続、
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番ピン
main.cpp@0:00c483aa2b22, 2014-07-20 (annotated)
- Committer:
- morita
- Date:
- Sun Jul 20 02:28:20 2014 +0000
- Revision:
- 0:00c483aa2b22
First version.;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |