2007年11月27日 星期二

USB韌體解析-2

HID裝置

有時我們去郵局辦事會遇到一些保險業務拿些資料讓我們填,有的人還會誤認他們是郵局的人,還真的就填了咧。



這種偷偷搭上現成官僚系統便車的做法就與今天所要探討的主題非常相似。從USB韌體解析-1我們學到:整個USB系統就是一個官僚系統,一切流程都已經被制定得非常嚴謹。既然它是經由非常週詳的考慮而制定的,那當我們想要自己搞些創新的應用時(如開場白的直銷之於郵務)就可以偷偷撘上這輛官僚便車而不用自己再重頭制定一套規則。



我們可以從USB 2.0規格書中usb_20.pdf 位於9.3的table 9-2發現一個Request Type叫做Vendor ,這就是原本USB在制定規範時保留給我們做一些還沒有變成標準的創新應用來用的。譬如說要做一種給小孩玩的音樂滑鼠,那可以利用這種Vendor Request來下載音樂到滑鼠裡。



這個部落格要是放上那麼完美的範例大家看完就不會燃起要改寫的衝動,所以今天只是稍微把之前用EasyLogger改的搖桿範例加上一個PC的小程式來啟動自動按鈕功能而已。



因為今天要寫PC平台的程式了,在開始之前我們要先下載PC的開發工具和程式庫。在這裡選用的開發工具是Dev-C++。而程式庫是libusb所以是可跨平台的,相關細節就麻煩大家自己用Google找一下吧。我今天只提供在Windows上實際執行過的壓縮檔。



另外,雖然Dev-c++跟WinAVR的核心編譯器都是GCC,但目前我還沒時間去研究如何一魚二吃。如果要研究可能要等到助手來我們公司以後了,所以這邊再打個誠徵助手的廣告。



現在就進入正題,這次的搖桿程式大致只加了下面三行而已.從新加的第一行大致就可看出Vendor Request是一片完全屬於我們自己的天地,我們自己想要如何定義就如何定義。像我就定了Request=38這個命令當做是開始自動按按鈕的命令。


else if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){
if(rq->bRequest == 38)
Start=1;
}




再來就是在PC上寫一個會送這種Request的程式就完工了。首先參考一下libusb的usb_control_msg函式用法。看完後我們知道只要在PC端寫下下面片段這樣的程式就可以讓我們的搖桿自己亂按按鈕了。




nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 38, 0, 0, (char *)buffer, sizeof(buffer), 5000);




請再注意官僚這個詞。PC端和裝置端的命令千萬要統一,38就二邊都要38,不然只會看到二部機器在空轉而已。





今天的完整程式在這裡



usb using attiny45

展開卷軸...

2007年11月1日 星期四

USB 韌體解析-1

回想一下我去公所辦事的狀況:當一踏進大門,義工媽媽就馬上問"帥哥,請問要來辦什麼事情?"(純屬事實,絕無虛構)並且引導我去抽號碼牌。然後坐著等待叫號之後再去櫃台填表辦事。這就是一個典型的官僚系統。



原始的USB界面(也就是非OTG的USB)就像現實世界的官僚系統一樣,全部都是PC(host 端)主導一切的動作,甚至連上傳資料都不能裝置端自己要傳就傳,一定要host叫你傳才能傳。所以實作上就非常簡單,不會發生其他網路界面那種搶頻寬的問題。



接下來的解說需要去usb.org下載USB2.0規格書配合來看。



裝置插入

我們可以看看剛才下載的USB_20.pdf 的7.1.5.1。根據USB 2.0的規範,USB的裝置端需要如下圖所示依裝置的速度並聯一個電阻在D+或D-與3.3V間。









看到這裡,我們就可以知道在自製USB滑鼠裡畫的電路圖是一個低速的USB裝置,也知道PC怎樣知道有個有個"帥哥"進來而該派"義工媽媽"去幫忙抽號碼牌了。可是電阻的接法好像跟上面的圖不太一樣也跟USB 2.0規範不太一樣耶?這個部份先保留,等到USB高級心法再詳細解說。



Device Request



再來也跟現實狀況一樣,在抽號碼牌前都是由義工媽媽來服務,等到抽完號碼牌後就要等到叫到號碼後才去櫃台由小姐服務。USB裝置在剛被RESET或是接到PC時都是固定為0號,等到PC下了一個Set Address的Request後變成由HOST指定的號碼了。



在USB的世界裡一切就是很官僚,一切都只有填充題。所有要填的表格和該填什麼都在USB_20.pdf的9.3和9.4裡。



韌體解析-1

經過前面的解說和參考資料的研讀後,我們可以知道USB韌體最重要的部份就是在處理request表格。以我們一直當範例的EasyLogger來說,在usbdrv.c的347行附近像下面這樣就是在處理request表格。




}else if(rq->bRequest == USBRQ_SET_ADDRESS){ /* 5 */
usbNewDeviceAddr = rq->wValue.bytes[0];
}else if(rq->bRequest == USBRQ_GET_DESCRIPTOR){ /* 6 */
flags = USB_FLG_MSGPTR_IS_ROM | USB_FLG_USE_DEFAULT_RW;
if(rq->wValue.bytes[1] == USBDESCR_DEVICE){ /* 1 */

//
//
//




不過這個程式不太好閱讀,有興趣者可以參考Silicon LabsUSB Firmware Programmer's Guide 第34頁開始的程式碼,這份文件寫得很工整很容易閱讀。



今天就暫時在這裡告一段落。

展開卷軸...

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搖桿

展開卷軸...

2007年9月27日 星期四

超簡單的USB電路




在網路上看到Objective Development這個奧地利公司的現成範例 ,使用的埋控是AVR的ATTiny45. 剛好2根電源,2根USB 信號, 另外4根腳可以來做熱舞墊最終版改裝的上下左右輸入. 有興趣的人可以先去看看.

實際做出來的範例可以看自製 USB HID搖桿

展開卷軸...

2007年9月24日 星期一

使用 wii遙控器來做PCB layout

powerpcb


前一篇有提到 ,本來興致勃勃地要拿wii控制器來玩全民打棒球 ,但是中間遇到了困難就再用google找有關線上遊戲擋外掛的資料.在過程中又激盪出一個特別的想法.


在我工作上因為人力很精簡 ,有時我要充個數去做PCB 的layout工作. 一做起碼就是一兩天跑不掉 ,整天就是左手掛在鍵盤上按快捷鍵 ,右手移動滑鼠. 如果把螢幕遮住還真跟打online game沒什麼兩樣咧 !一塊板子layout完也是腰酸背痛的. 正好在找資料的過程中看到了一盞明燈---手裡鍵



乍看之下 ,wii的控制器跟手裡鍵長得還 真像 啊 .在寫了一個glovePIE 的 script後稍微試了一下, 以後要再被抓去充數lay PCB時就可以舒服地靠在椅子上輕鬆lay囉!

另外還有一個理由跟手裡鍵的說明又是不謀而合 ,既然有了glovePIE可以寫腳本 ,那以後就不必再被PowerPCB這種很貴的商用軟體給綁住了 ,不論是用便宜的EAGLE甚至是gEDA裡的PCB ,只要改寫腳本檔都可以使用相同的方式來操作了 ,厲害吧 ?Protel 快降價吧 ,PowerPCB 快降價吧 !



// Code for using PADS PowerPCB 5.x


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


if var.init==0 then
var.init=1
var.width=10
endif


if wiimote.B==false then

key.Shift=wiimote.A

if wiimote.one then
var.xpos=mouse.CursorPosX
var.ypos=mouse.CursorPosy

key.Escape=true
wait (1ms)
key.Escape=false

mouse.CursorPos=[680, 472]
mouse.RightButton=true
wait (1ms)
mouse.RightButton=false
wait (1ms)
mouse.CursorPos=[731, 511]
mouse.LeftButton=true
wait (1ms)
mouse.LeftButton=false
mouse.CursorPos=[var.xpos,var.ypos]
wait (1s)

endif

if wiimote.two then
var.xpos=mouse.CursorPosX
var.ypos=mouse.CursorPosy


key.Escape=true
wait (1ms)
key.Escape=false

mouse.CursorPos=[680, 472]
mouse.RightButton=true
wait (1ms)
mouse.RightButton=false
wait (1ms)
mouse.CursorPos=[731, 623]
mouse.LeftButton=true
wait (1ms)
mouse.LeftButton=false
mouse.CursorPos=[var.xpos,var.ypos]

wait (1s)

endif



if wiimote.Left then
mouse.CursorPos=[14, 963]
mouse.LeftButton=true
wait (1ms)
mouse.LeftButton=false
wait (100ms)
endif

if wiimote.right then
mouse.CursorPos=[1250, 963]
mouse.LeftButton=true
wait (1ms)
mouse.LeftButton=false
wait (100ms)
endif

if wiimote.up then
mouse.CursorPos=[1265, 98]
mouse.LeftButton=true
wait (1ms)
mouse.LeftButton=false
wait (100ms)
endif
if wiimote.down then
mouse.CursorPos=[1265, 942]
mouse.LeftButton=true
wait (1ms)
mouse.LeftButton=false
wait (100ms)
endif


if wiimote.Minus then
var.width --
type 'w '+ var.width
key.Enter=true
wait (0.5ms)
key.Enter=false
wait (100ms)
endif

if wiimote.Plus then
var.width ++
type 'w '+ var.width
key.Enter=true
wait (0.5ms)
key.Enter=false
wait (100ms)

endif
else
if wiimote.a then
^Q=true
wait (1ms)
^Q=false
wait (0.5s)

end if

if wiimote.Roll > 50 then
^R=true
wait (1ms)
^R=false
wait (0.5s)

endif

if wiimote.Pitch > 50 then
type 'ss '
wait (0.5s)

endif


if wiimote.Minus then
var.width = var.width-5
type 'w '+ var.width
key.Enter=true
wait (0.5ms)
key.Enter=false
wait (1ms)
endif

if wiimote.Plus then
var.width =var.width+5
type 'w '+ var.width
key.Enter=true
wait (0.5ms)
key.Enter=false
wait (1ms)

endif

endif

if wiimote.home then
debug=' home'
type 'w '+ var.width
key.Enter=true
wait (0.5ms)
key.Enter=false
wait (0.5ms)

endif



if mouse.WheelDown then
'debug=' wheel down'
mouse.CursorPos=[640, 512]
^W=true
wait (0.5ms)
^W=false
mouse.RightButton=true
wait (0.5ms)
mouse.RightButton=false
wait (0.1s)
key.Escape=true
wait (0.1ms)
key.Escape=false

endif

if mouse.wheelup then
'debug=' wheel up'
mouse.CursorPos=[640, 512]
^W=true
wait (0.5ms)
^W=false
mouse.LeftButton=true
wait (0.5ms)
mouse.LeftButton=false
wait (0.1s)
key.Escape=true
wait (1ms)
key.Escape=false
endif

if mouse.MiddleButton
'debug=' middle'
^B=true

wait (0.5ms)
^B=false

endif
//
//



展開卷軸...

使用 wii 手把 來玩全民打棒球

全民打棒球
平常總是以工作太忙為藉口而不運動

不過在任天堂wii的體感控制器推出後 ,藉口居然自己消失了

居然我也想寓運動於遊戲 ,第一個想到的當然是連結到現在很熱門的全民打棒球.這樣以後運動,娛樂,交友......一次到位

於是就用google找了一下使用wiimote控制PC的相關資料 ,之後便開始試著連結到全民打棒球的遊戲中.可惜 ,從未玩過線上遊戲的我涉事未深 ,不知道江湖的黑暗.線上遊戲公司為了防止作弊掛網洗錢洗寶物 ,都加上了防護程式來擋掉外掛程式, 當然網路上找到的方法也不通了.

還好 ,山不轉路轉. 通往目的地的路不是只有一條. 從台北到高雄可以走中山高也可以走福爾摩沙高, 甚至可以繞台2線和台9線走東部.

1/6/08 更新:低調增加一個連結.因已發現有人公開實做出來的程式,就不再刻意藏了.


用google可以查到在全民打棒球官網上的搖桿使用小教學提到了可以利用JoyToKey這程式來用搖桿玩, 所以我們只需另外開闢一條路把wiimote的信號用glovePIE和PPJoy模擬成搖桿就可以了.

目前測試出的方案為:
glovePIE -> PPJoy -> JoyToKey

4/19/08補充的各種藍芽驅動程式連線教學
貓星球提供的藍芽連接wiimote教學


GlovePIE 的簡易全民打棒球腳本



// Code for playing BBONLINE

ppjoy.Digital0=wiimote.A
ppjoy.Digital1=wiimote.b
ppjoy.Digital2=wiimote.Up
ppjoy.Digital3=wiimote.Down
ppjoy.Digital4=wiimote.Left
ppjoy.Digital5=wiimote.Right
ppjoy.Digital6=wiimote.One
ppjoy.Digital7=wiimote.Two
ppjoy.Digital8=wiimote.Plus
ppjoy.Digital9=wiimote.Minus
ppjoy.Digital10=wiimote.Home

if abs (wiimote.gz) > 3.5 then
ppjoy.Digital12=true
wait (5 ms)
ppjoy.Digital12=false
endif

//
//




JoyToKey設定檔
joytokey 設定

展開卷軸...