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 則留言:

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

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

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

    回覆刪除
  4. 小馬: 謝謝分享!!

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

    #define USB_CFG_DMINUS_BIT 4
    #define USB_CFG_DPLUS_BIT 2

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

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

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

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

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

    回覆刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 我的意思是像下面這樣
    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的線路?
    問題有點多,不好意思麻煩您了。
    非常謝謝您!

    回覆刪除
  10. sei 是 Enable Interrupts 指令

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

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

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

    回覆刪除
  11. 您好!
    我後來有找到這個:
    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唷,如果您方便的話可以試試看。
    謝謝您!

    回覆刪除
  12. 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));
    }
    }

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

    回覆刪除
  14. 「程式中的 clock 是 Atmega 328 的」?
    你是指哪個程式?

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

    回覆刪除
  16. 你可以把這行:

    #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 這支程式耶!

    回覆刪除

注意:只有此網誌的成員可以留言。