2007年10月24日 星期三

自製USB滑鼠

USB滑鼠

本部落格的出發點在於引導學習。所以跟別人不一樣,這裡放上來的code一定只是可以動而且讓人看完馬上就燃起一股要改寫的衝動。這樣應該會讓學習的成效比較好。





上一次一樣,今天還是拿EasyLogger來修改。



第一步當然還是使用HID descriptor tool把下面的表格自動轉換成程式碼,這部份大家應該已經很熟,所以就不再重覆了。要是不小心忘記了,回去看一下上次的自製USB HID搖桿就好了。網路可以查到的東西就不太需要背誦下來,讓大腦用在獨特的地方比較好。這句話的意思是說:大家一定要記得把這個部落格放進書籤



mouse hid descriptor



轉出來就是下面這樣的程式碼





PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE
// (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
//




上面這張表格的意思是我們向系統註冊了5 個byte大小的資料表來表示我們的滑鼠的資料,分別是按鍵狀態和X及Y的絕對座標。所以每當我們像下面這個程式片段傳5 個byte給PC時系統就會去對滑鼠游標做相對應的動作。





if (key & 1 << BIT_S)
reportBuffer[0] = 0;
else
reportBuffer[0] = 1;

if (keyBoth) {
if (key & 1 << BIT_A ) {
reportBuffer[1] = 0x32;
reportBuffer[2] = 0x52;
reportBuffer[3] = 0x3f;
reportBuffer[4] = 0x10;
}else{
reportBuffer[1] = 0x98;
reportBuffer[2] = 0x50;
reportBuffer[3] = 0x3f;
reportBuffer[4] = 0x10;
}
}
//
//




今天的程式是平常在工作時使用USB示波器(如下圖),在移動觀察波形的時間軸時非常不方便,所以就做了今天這個小電路來取代滑鼠。這樣USB示波器用起來的感覺就跟真的示波器差不多了。



USB示波器



mouse電路圖



今天的完整程式在這裡



3 則留言:

fat 提到...

可否利用現USB有鍵盤,加裝一些簡單的開關掣,當開掣後等同按鍵盤一個鍵,利用FLASH接收按鍵信號,便可以控制一個遊戲的運作,免了寫LOW LEVEL COMPUTER CODE,可行嗎?

棒棒 提到...

您好,
這樣可行但是我知道的實作方式都很複雜 ,因為USB的信號不是直接repeat就行了 ,中間還有很多協定要解析.(也許有現成的晶片可做到,但我不知道)

如果是使用PS/2鍵盤來做您上面的功能, 再轉成USB人性化界面裝置就簡單太多了.

匿名 提到...

您好:
想請問說在X、Y的向量設成32767 report 必須設成10bit 但我這樣做造成無法移動,把report設成8bit 的話就可以移動,那這樣的話把X和Y的解析度設成那麼大不就沒意義了嗎?

張貼留言