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電路圖



今天的完整程式在這裡



展開卷軸...

2007年10月21日 星期日

用wiimote在PC上玩保齡球

wii pc 保齡球
剛剛用google找了一下,wii都上市要一年了居然沒有人寫這個主題。加上最近連寫了很多韌體的實作文章,今天來點比較輕鬆的好了。

第一步:當然是要有保齡球遊戲,可以去這裡看

第二步:要有wiimote一隻和GlovePIE程式

第三步:可以參考wiimote與PC自動連線將wii手把連上PC

第四步:要自己寫一個像下面一樣的腳本檔(以後我會寫GlovePIE教學文)。下面的腳本是可以直接使用,但需配合螢幕解析度調整三個按鈕的座標。



//保齡球範例腳本

var.xCutoff = 4
var.zCutoff = 0
var.yCutoff = 35


var.xRot = Wiimote.RawForceX
var.yRot = Wiimote.RawForceY
var.zRot = Wiimote.RawForceZ

debug = 'x '+ mouse.CursorPosX + 'y' + mouse.Cursorposy

if wiimote.a then

//X和Y改成new game的座標
mouse.CursorPosX=50
mouse.CursorPosY=450
mouse.LeftButton=true
wait (50 ms)
mouse.LeftButton=false
endif

if wiimote.b then

//X和Y改成finish the game的座標
mouse.CursorPosX=1000
mouse.CursorPosY=700
mouse.LeftButton=true
wait (50 ms)
mouse.LeftButton=false
endif

if var.yRot > var.yCutoff then
var.delay= 1150 + var.yRot*5 + var.xRot*6


//X和Y改成GO的座標
mouse.CursorPosX=148
mouse.CursorPosY=871
mouse.LeftButton=true
wait (var.delay ms)
mouse.LeftButton=false
endif
//
//


相關資料網路上應該很多就不再多說了。以後我會把wii sports在PC上的替代方案收集齊全,也會撰寫GlovePIE入門的教學文和跟wii有關的物理學知識。

相關網站:貓星球


展開卷軸...

2007年10月17日 星期三

自製USB HID搖桿

HID裝置

上次實做USB鍵盤之後,今天我們繼續來改寫程式變成USB HID搖桿



這種複雜度的電路之前看到很多談到wii改機的部落格都說就算不是讀電子相關科系的人都可以做。

技能檢定不會過啦



今天我們還是一樣使用Atmel的AVR Tiny45配上EasyLogger的範例來改。不過我更簡化了一點電路,整個做好的成品就只有上面的照片那樣而已。詳細電路圖和相關開發工具請參考上一次的介紹



usb using attiny45



跟現實生活一樣位處越高層的長官要懂的東西越少以免大腦爆炸,我們如果只是要實做出一個USB搖桿就不用管太多細節。以後我們慢慢往下層走時會講到越來越多的細節。今天要修改的部份還是如第一次所說,使用HID descriptor tool建立如下的表格。

joystick HID descriptor

工具自動產生的程式碼就像下面那樣。有一點要特別注意:所有REPORT_SIZE乘上REPORT_COUNT的總和一定要是8的倍數,不然會因為組不成完整的Byte而讓PC端發生錯誤。




PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {

0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x55, 0x00, // UNIT_EXPONENT (0)
0x65, 0x00, // UNIT (None)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
//
//




下面的影片是從windows控制台截取來的





今天的完整程式在這

展開卷軸...

2007年10月10日 星期三

本部落格正式開張

留言專用區

展開卷軸...

2007年10月9日 星期二

自製 USB HID鍵盤

上一次跟大家稍加說明了人性化界面之後,今天要稍微深入一點實作一個小電路和小程式了。



電腦系統的複雜度是遠超乎人腦可以掌控的範圍,所以工程師和專家們通常都制定了一套很嚴謹規範讓大家分層負責。這樣每個人只需要搞清礎自己負責的事就好了,就不會讓腦袋爆炸了。







套用一個生活化的例子就是:會計主任只要看看發票加總的金額是發出去的錢是不是一樣就好了,不用去管那到底是真發票還是假發票。整理發票是他下面的人在搞的。



為了怕大腦爆炸我們也先不用管到電子信號是怎樣傳遞,今天就先實做一個會自動按上下左右四個方向鍵的電路和程式就好了。



首先我們去Objective Development網站下載公開的範例程式EasyLogger



如果沒有裝過WINAVR的話,還要去sourceforge.net下載

WinAVR開發工具包



由於篇幅的關係,我們就先假設大家都抓下來也裝好了。

再來就是改寫EasyLogger裡面的main.c 。下面是改寫後的片斷。



/* USB report descriptor */
PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard
// LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard
// Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x19, 0x00, // USAGE_MINIMUM (Reserved
// (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM
// (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
};

#define KEY_UP 82
#define KEY_DOWN 81
#define KEY_LEFT 80
#define KEY_RIGHT 79


/* -----------------------------*/


static void timerPoll(void)
{
static uchar timerCnt;
static uchar i;

if(TIFR & (1 << TOV1)){
TIFR = (1 << TOV1); /* clear overflow */
if(++timerCnt >= 63){ /* ~ 1 second interval */
timerCnt = 0;
if (!FlagKey) {
FlagKey = 1;
if (++i > 3)
i=0;
switch (i) {
case 0:
reportBuffer[0] = 0;
reportBuffer[1] = KEY_RIGHT;
break;
case 1:
reportBuffer[0] = 0;
reportBuffer[1] = KEY_DOWN;
break;
case 2:
reportBuffer[0] = 0;
reportBuffer[1] = KEY_LEFT;
break;
case 3:
reportBuffer[0] = 0;
reportBuffer[1] = KEY_UP;
break;
}
}
}
}
}


//
//
//




程式其實很簡單,就是像上次說的:先向作業系統提交一份表格。上面我們所提交的表格是說以後只要鍵盤有狀態改變我就會送2個byte上來.第一個byte是功能鍵(如Ctrl)的狀態,第二個byte是按鍵碼.



再來就是大約每隔一秒就依序上傳上,右,下,左四個方向鍵被按的資訊了.



整個程式看起來很簡單,但卻是個極佳的例子來說明魔盤為何在網路上被批評。今天先寫到這裡賣個關子同時讓大家吸收一下。







我們可以在USB.ORG這文件的第53頁找到各按鍵的代碼

USB HID Usage Tables







USB using ATTiny45







最基本這樣的電路圖簡夠簡單了吧 ?如果要做商業用途的話請自行閱讀Objective Development的授權說明。



今天的完整程式可以在這裡



展開卷軸...

2007年10月3日 星期三

wiimote與PC自動連線

PC上用wiimote玩了許久的全民打棒球之後,上禮拜在終於玩到了別人的wii實機. 原來wiimote跟wii本尊的配對是那麼地簡單 .

人就是常常喜歡跟別人比來比去 ,在沒有玩到wii的時候 ,總覺得在玩game之前先用滑鼠設定一下也還不會太麻煩 ,但一碰到wii之後 .心裡面的"訪談製造機"馬上就跳出一句"wii能, PC為什麼不能 ?"

wii 可以 ,PC當然也要可以啦. 這應該沒什麼困難的吧.

1/10/08 經反應sdk下載點失效後, sdk下載點修改到簡體中文官網

我的藍芽棒用的是BlueSoleil ,所以就把這個字打給Google去查. 不用一秒鐘Google就跳出來說GlovePIE配上BlueSoleil本身就可以自動連結, 但是我怎麼試也試不出來. 作者也沒講要如何啟動這功能.

一時找不到現成的那就自己來動手吧 ,二話不說 ,馬上就去IVT 官方網站下載SDK. 下載回來後就看一下API的文件準備開始自己寫個小工具......


結果搞半天都還搞不出什麼名堂. 程式都已經縮減成下面那樣只有五行了, 驅動程式還是一直回覆我系統錯誤



int main(int argc, char* argv[])
{
BOOL bResult;
DWORD dwResult;
bResult=BT_InitializeLibrary();
SDK_BtInquiry();
}

//
//


在絕望之際 ,只好再去求助Google了 ,結果IVT的官方論壇已經有人回覆說要換最新版的驅動程式就好了.回來再仔細看看, 也對, 人家SDK的檔名就註明了是供2.0版以上用的 ,我的驅動程式是1.4版的當然不太能用嘛.

那會不會......GlovePIE也是換新版驅動就好了呢 ?這種小問題當然是馬上動手做實驗就知道囉.

1分鐘
2分鐘
3分鐘過去

還真的咧 ,只要換上官網上最新的驅動程式 ,而且照著貓星球先配對過一次, 變成下面這種畫面.

bluesoleil


只要在GlovePIE有執行的狀態, 而且沒有刪除wiimote的資料. 我們在任何時候同時按著wiimote的1,2二鍵就可以自動與PC連結了.

最棒的是GlovePIE 後面可以加上-號和一個檔名 ,像是 GlovePIE -mouse.pie 這樣

那我們只要在啟動裡放進上面的指令, 自己在客廳組的HTPC就可以只用把遙控器和其他的無線鍵盤滑鼠都拿掉了. 一支wiimote加上GlovePIE再配上2.x的BlueSoleil就輕鬆將它都取代了.不管是當家庭劇院播放器或是拿來玩體感遊戲都很適用.

相關閱讀:
使用 wii 手把 來玩全民打棒球

展開卷軸...

2007年10月2日 星期二

自製 USB HID裝置-1

之前為了要用wii控制器玩全民打棒球和網球拍拍 ,生平第一次到江湖中闖盪就碰上了所謂的反外掛程式.

在經過一連串地搜集秘笈和修練之後 ,終於達成願望每天在電腦前面揮棒做宅男專屬的運動. 還意外地增強了自己的內力. 也算是一種不賴的機緣 .


那就從"人性化界面裝置"開始練起吧!


HID (Human Interface Device) 正體中文的MS Windows譯作"人性化界面裝置" ,是從10幾年前的Win98開始就內建支援了.既然名字都有"人性化"了, 那我的說明要配合來人性化囉.

當一個HID裝置插入電腦後 ,第一件事就是送一張表格給作業系統, 告訴作業系統它是什麼裝置和有多少參數要傳給電腦(如 3軸,6按鍵的搖桿). 註冊好之後 ,裝置和電腦就可以開始溝通了.由於HID規範就僅僅只有前述的那一張表格 ,PC就完全被矇在鼓裡. 無法得知USB插槽的後面是50元隻的雜牌鼠,還是連點高手外掛鼠或是高檔的魔盤或手裡鍵.這也就是我最近幾天搜尋到的硬體外掛的廣告都說不會被擋的原因了.

下面的連結可以從USB.ORG網站下載到前面講的表格撰寫工具.

HID Descriptor Tool

抓下來後可以看到有各種裝置的描述表如下


USAGE_PAGE (Generic Desktop) 05 01
USAGE (Mouse) 09 02
COLLECTION (Application) A1 01
USAGE (Pointer) 09 01
COLLECTION (Physical) A1 00
USAGE_PAGE (Button) 05 09
USAGE_MINIMUM (Button 1) 19 01
USAGE_MAXIMUM (Button 3) 29 03
LOGICAL_MINIMUM (0) 15 00
LOGICAL_MAXIMUM (1) 25 01
REPORT_COUNT (3) 95 03
REPORT_SIZE (1) 75 01
INPUT (Data,Var,Abs) 81 02
REPORT_COUNT (1) 95 01
REPORT_SIZE (5) 75 05
INPUT (Cnst,Var,Abs) 81 03
USAGE_PAGE (Generic Desktop) 05 01
USAGE (X) 09 30
USAGE (Y) 09 31
LOGICAL_MINIMUM (-127) 15 81
LOGICAL_MAXIMUM (127) 25 7F
REPORT_SIZE (8) 75 08
REPORT_COUNT (2) 95 02
INPUT (Data,Var,Rel) 81 06
END_COLLECTION C0
END_COLLECTION C0
//
//
//




今天就寫到這裡 ,Google可以查到的我就不多寫了 .若想要再自行深入研究可點下面的連結看更多資料

Google搜尋相關資料

相關文章
自製 USB HID搖桿

展開卷軸...