2011年10月24日 星期一

V-USB examples for Arduino

我把 V-USB 提供的 4 支範例程式 (custom-class, hid-mouse, hid-custom-rq, hid-data) 移植到 Arduino 上了,現在你只要用 Arduino IDE 就可以上傳這 4 支範例程式:

image

在你開始之前,我希望你已經看過「V-USB 簡介」一文,知道 V-USB 是什麼,而且也希望你看過底下這幾篇,因為這 4 支範例程式的使用方法都寫在這幾篇裏,在這我就不再重述了:

準備硬體

要在 Arduino 上跑 V-USB 這 4 支範例程式,首先你必須準備一張 USB Shield。底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。

image_thumb135

實物照片:

image
▲ 圖片來源: galileo  的 USB Shield

下載與安裝範例程式

Arduino 版的 V-USB 範例程式可以在底下的鏈結中取得:

下載後把檔案解壓縮到 Arduino-00xx\libraries 資料夾下,或是放到 Arduino 速寫簿(Sketchbook)資料夾的 Libraries 資料夾底下也行。

韌體調整

接著韌體要做兩個調整:

  1. 修改 usbconfig.h:  定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。其它不需要修改。 
  2. 這點很重要!由於 Arduino 的 timer0 ISR 執行時間太久,會影響 V-USB 的運作,所以你必須修改 Arduino-00xx\hardware\arduino\cores\arduino\wiring.c 的 Timer0 ISR,把 "sei();" 加到 ISR 的第一行,像這樣子:

完成之後,你就可以用 Arduino IDE 打開範例程式並且上傳到 Arduino 板子上執行。

就這樣!

希望你可以順利使用這四支範例程式。如果你遇到什麼困難,歡迎留言或寫信來詢問。

延伸閱讀

17 意見:

CC 提到...

給你一個讚...

coopermaa 提到...

謝謝!
你 USB Keyboard 弄出來了嗎?

CC 提到...

我很偷懶地去...買了這個....哈哈...
http://item.taobao.com/item.htm?id=8568380092

coopermaa 提到...

哈哈!參考一下我最新的一篇筆記: http://coopermaa2nd.blogspot.com/2011/10/v-usb-for-arduino-usbkeyboard.html

Galileo 提到...

小馬: 謝謝分享!!

記得要將 usbconfig.h 中的設定改一下:

#define USB_CFG_DMINUS_BIT 4
#define USB_CFG_DPLUS_BIT 2

這樣才會和電路圖一致.
不然是不會動做的喔!

coopermaa 提到...

Hi Galileo, 謝謝。電路圖我是從 V-USB 網站上拿來用的,我自己實際的電路 D- 是接在 pin 2 而 D+ 是在 pin 4,所以程式有調整過。稀客來訪,蓬壁生輝啊! ^o^

提到...

請問,可以使用 arduino IDE 控制游標的位置嗎?
就是把hid_mouse.h中控制游標位置的變數抓來arduino IDE使用。
有辦法做到嗎?請您指教一下。
謝謝!

coopermaa 提到...

用 arduino IDE 控制游標的位置?
你是說像底下這篇這樣嗎? 還是什麼?

http://coopermaa2nd.blogspot.com/2011/11/arduino-uno-mouse.html

提到...
作者已經移除這則留言。
提到...

我的意思是像下面這樣
http://www.arduino.nl/?p=34
就是有一個library可以給aruino IDE 讀取,像您的http://coopermaa2nd.blogspot.com/2011/10/v-usb-for-arduino-usbkeyboard.html
而我要製作的是V-USB,而不是arduino UNO。
可是我在使用http://www.arduino.nl/?p=34的時候發生了一個問題。
就是我編譯UsbMouseDemo.pde的時候,
出現錯誤
C:\DOCUME~1\MYPC\LOCALS~1\Temp\build3061850352232236916.tmp\/UsbMouse.h: In constructor 'UsbMouseDevice::UsbMouseDevice()':

C:\DOCUME~1\MYPC\LOCALS~1\Temp\build3061850352232236916.tmp\/UsbMouse.h:68: error: 'sei' was not declared in this scope
請問在UsbMouse.h中的sei()的作用是什麼,
我把sei()刪除掉可以編譯成功,但是不知道會不會影響功能
(因手上沒有製作V-USB的材料,所以無法測試。)
請問,如果我要用現有的arduino板子做USB Shield,那是不是只需對板子供電和照電路圖連接PD2和PD4即可。而不用連接石英和AVCC,AREF,AGND,VCC,GND的線路?
問題有點多,不好意思麻煩您了。
非常謝謝您!

coopermaa 提到...

sei 是 Enable Interrupts 指令

它的定義是在 avr/interrupt.h,把這個檔 include 進來,應該就可以編譯過關。

之前我試過 V-USB,發現 V-USB 跟 Arduino 的 ISR 會互相影響,如果刪掉 sei 的話,V-USB 可能會當掉喔。

是的,USB Shield 的部份參考這篇「準備硬體」這段做就可以了

提到...

您好!
我後來有找到這個:
http://miketeo.net/wp/index.php/2009/05/17/repackaged-usbmouse-library-for-arduino.html
他說UsbMouse library from arduino.nl
不能編譯,所以他重新package一個library。
http://miketeo.net/wp/wp-content/uploads/2009/05/usbmouse.zip
裡面有含Demo唷,如果您方便的話可以試試看。
謝謝您!

coopermaa 提到...

Hi, 那個程式還算簡單,很容易看得懂

你的目的是要用 Arduino 控制電腦滑鼠游標嗎?
那只要呼叫 usbmouse.zip 的 UsbMouse.move(x, y) 就可以辦到了
例如:

UsbMouse.move(-5,5); // Move the mouse with steps of minus 5 on x-axis and 6 on y-axis

不過,要注意一件事,x, y 值不是座標絕對值,而是 x, y 軸的移動的相對位置。

move() method 原始碼可以 UsbMouseDevice class 裏找到 (UsbMouse.h):

void move(char dx, char dy){
if(usbInterruptIsReady()){
reportBuffer[1] = dx;
reportBuffer[2] = dy;
usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
}
}

提到...

您好!
http://labpicareta.blogspot.tw/2010/10/arduino-usbmultihid.html
這個網頁中是用 V-USB 和 Wii Nunckuck 做成的滑鼠。
可是他程式中的 clock 是 Atmega 328 的,
剛剛好手邊沒有 328 ,但是有 Atmega 8,
不知道是否可以請您指導一下把 clock 改成Atmega 8 的。 謝謝!

coopermaa 提到...

「程式中的 clock 是 Atmega 328 的」?
你是指哪個程式?

提到...

UsbMultiHID_Demo.pde
這個程式,我板子用 8 沒有辦法編譯成功,
用 328 就可以。
請您指教一下。
謝謝!

coopermaa 提到...

你可以把這行:

#define BYPASS_TIMER_ISR 1

改成:

#define BYPASS_TIMER_ISR 0

然後照我底下這篇的「韌體調整」這段修改程式碼:

http://coopermaa2nd.blogspot.tw/2011/10/v-usb-examples-for-arduino.html

不過!Atmega8 Flash 只有 8KB,好像塞不下 Wiinuck 這支程式耶!