ふぁぼマウスを作ってみた
2013.01.19 · 1048 words · 3 minute read
Sun Microsystems製の3ボタンマウス(Model Type 5)が廃棄されていたので、ボタン部分を活かしてtwitter(web版)を快適に閲覧する為の装置を作ってみました。
※タイトルにふぁぼ"マウス"とありますが、マウス本来の機能(カーソル操作)は出来ません。
このマウス、専用マウスパッドが必要な光学式&接続がMini-DIN3ピンなのでDOS機には使えず、そのままでは歴史的資料価値しかありません。
バラすとこんな感じで、ボタン部にはオムロン製のマイクロスイッチが3つ使用されている。
マイコン・光学周りは用途が微妙だったので、マイクロスイッチのみ元の基板から取り外して、マウスの幅を合わせてカットしたCサイズ基板に移植。
こちらを参考にして、ブレッドボード上でV-USBの回路を組んで動作チェック。
3.6Vのツェナーダイオードが手元に無かったのでVfが3.6Vの青色LEDを使用、68Ωの抵抗もなかったので100Ωの抵抗を使用。
MacBook Air、MacBook Pro Retinaでは問題なく認識したので、たぶん大丈夫のはず…
これをマイクロスイッチを移植した基板に実装。(裏面のはんだモリモリは気にしたら負け)
Arduino IDE 1.0以降に対応したV-USBライブラリをこちらからダウンロード、適宜libraryフォルダに投入。
プログラムはこんな感じで。
#include "UsbKeyboard.h"
#define BUTTON_L 12
#define BUTTON_C 11
#define BUTTON_R 10
int lastState = LOW;
int lastStateC = LOW;
unsigned long pushTime = 0;
void setup() {
pinMode(BUTTON_L, INPUT);
pinMode(BUTTON_C, INPUT);
pinMode(BUTTON_R, INPUT);
TIMSK0 &= !(1<TOIE0);
cli();
usbDeviceDisconnect();
delayMs(250);
usbDeviceConnect();
sei();
}
void loop() {
UsbKeyboard.update();
//中央ボタンの処理
if( (digitalRead(BUTTON_C) == HIGH) && (lastStateC==LOW) ) {
lastStateC = HIGH;
pushTime = millis(); //長押し計測開始
delay(70);
}
else if( (digitalRead(BUTTON_C) == LOW) && (lastStateC==HIGH) ) {
if( (millis() - pushTime) > 500 ){ //500ミリ秒以上長押しの場合
UsbKeyboard.sendKeyStroke(KEY_T); //Tを送信
delay(200);
UsbKeyboard.sendKeyStroke(88); //Enterを送信
lastStateC = LOW;
}
else{
UsbKeyboard.sendKeyStroke(KEY_F); //Fを送信
delay(70);
lastStateC = LOW;
}
}
//左ボタンの処理
else if( (digitalRead(BUTTON_L) == HIGH) && (lastState==LOW) ) {
delay(30);
if( (digitalRead(BUTTON_R) == HIGH) ) { //右ボタンも押されている場合
UsbKeyboard.sendKeyStroke(55); //ピリオドを送信
lastState = HIGH;
delay(70);
}
else {
UsbKeyboard.sendKeyStroke(KEY_J); //Jを送信
lastState = HIGH;
delay(70);
}
}
else if( (digitalRead(BUTTON_L) == LOW) && (lastState==HIGH) ) {
lastState = LOW;
delay(100);
}
//右ボタンの処理
else if( (digitalRead(BUTTON_R) == HIGH) && (lastState==LOW) ) {
delay(30);
if( (digitalRead(BUTTON_L) == HIGH) ) { //左ボタンも押されている場合
UsbKeyboard.sendKeyStroke(55); //ピリオドを送信
lastState = HIGH;
delay(70);
}
else {
UsbKeyboard.sendKeyStroke(KEY_K); //Kを送信
lastState = HIGH;
delay(70);
}
}
else if( (digitalRead(BUTTON_R) == LOW) && (lastState==HIGH) ) {
lastState = LOW;
delay(100);
}
}
void delayMs(unsigned int ms) {
for( int i=0; i<ms; i++ ) {
delayMicroseconds(1000);
}
}
twitterのショートカットと各ボタンが対応しており、左ボタンで下のツイートへ移動(Jキー)、右ボタンで上のツイートへ移動(Kキー)、左右同時押しで更新(ピリオドキー)、真ん中ボタン1回押しでfav(Fキー)、真ん中ボタン長押し(0.5秒)でRT(Tキー)という感じ。