2011年9月27日 星期二

V-USB custom-class 範例解說

這篇將摘要說明 V-USB custom-class 範例的程式碼。要讀這篇,讀者必須對 USB 有足夠的認識。

customer-class 分成兩個部份:韌體和 PC 端的指令列工具 (commandline)

韌體

usbconfig.h

usbconfig.h 是 V-USB 的設定檔,每個 V-USB 的程式都會從 V-USB 的 usbconfig-prototype.h 複製過來並改名為 usbconfig.h 然後根據自己的硬體調整設定。

底下是 custom-class 對 usbconfig.h 所做的調整:

  • USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT and USB_CFG_DPLUS_BIT

這些設定 USB bus D+ 和 D- 所用的接腳。預設是:

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DPLUS_BIT       2

  • USB_CFG_VENDOR_ID and USB_CFG_DEVICE_ID

這些設定 VID 和 PID。預設是:

#define  USB_CFG_VENDOR_ID       0xc0, 0x16
#define  USB_CFG_DEVICE_ID       0xdc, 0x05

資料表示方式是 low byte first,VID 0x16c0 和 PID 0x05dc 是 obdev 提供的共享 VID/PID。

  • USB_CFG_DEVICE_NAME and USB_CFG_DEVICE_NAME_LEN

這些設定 Device Name 和資料長度,custom-class 把 Device Name 設成 "LEDControl",資料長度是 10:

#define USB_CFG_DEVICE_NAME     'L', 'E', 'D', 'C', 'o', 'n', 't', 'r', 'o', 'l'
#define USB_CFG_DEVICE_NAME_LEN 10

  • USB_CFG_DEVICE_CLASS = 0xff

這個設定 Device Class。USB 定義了一些常用的 device class,你可以在 USB Class Codes 這個頁面中找到。0xff 代表的是 "Vendor Specific",也就是廠商自行定義的 function。

2011年9月21日 星期三

Arduino 1.0 RC 嚐鮮

Arduino 1.0 RC 已在 17 日開放下載,有興趣嚐鮮的人,可以在底下的網址取得:

http://code.google.com/p/arduino/wiki/Arduino1

讓我們來看看新版 IDE 做了哪些改變:

新的啟動畫面:

image

操作介面換了新的顏色風格、工具列的圖示 (Icon) 也除舊佈新了:

image

比較值得注意的是,Arduino sketch 副檔名原先使用 .pde (沿用自 Processing),現在已經全面改成 .ino。

編輯器下方的狀態列 (status line) 現在會顯示所用的 Board name 與 serial port:

image

編譯 (Verify) 與上傳 (upload) 會有進度顯示 (Progress bar):

2011年9月20日 星期二

Arduino 早餐來了!

image

Arduino 原創者 Massimo Banzi 本月 18 日在 Maker Faire New York 揭露了數個新款 Arduino 板子。前一天,Arduino 官方 blog 率先公佈了這則消息。根據官網的說明,這次 Arduino 有令人驚喜的新產品:

Arduino 1.0

image

在經過數年的發展後,Arduino API, IDE 以及 boards 的設計終於底定,本月 18 日將釋出 Arduino 1.0 RC 版,到時你可以在這裏下載,而之後再經過 1 個月的壓力測試後,官網就會正式公佈 Arduino 1.0 的版本。

2011年9月16日 星期五

V-USB hid-data

hid-data 是 V-USB 所附的一個範例,它示範如何透過 HID feature report 傳送固定大小的資料區塊 (blocks of data) 以讀取或寫入 eeprom 裏的內容。由於 Windows 內建 HID driver,因此 Windows 不會要求安裝驅動程式。這個範例同時也示範如何用 usbFunctionWrite() 和 usbFunctionRead() 傳送資料。

下載

hid-data 包在 V-USB 套件裏:

http://www.obdev.at/products/vusb/download.html

韌體調整

hid-data 需要調整的地方跟 hid-custom-rq 一樣:

● usbconfig.h:


定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。

● Makefile:


定義所用的 MCU 以及時脈頻率,必須根據你的硬體調整 DEVICE 和 F_CPU。

編譯韌體

下指令編譯韌體,你會需要 WinAVR:

cd hid-data/firmware 
make hex

接著把韌體燒錄到板子上,讓裝置重新上電,然後,「裝置管理員」視窗裏就會出現剛剛安裝的裝置,不用安裝驅動程式:

image_thumb2
▲ Windows 會將新裝置當成「HID-compliant device」

編譯 PC 端指令列工具 (commandline)

下指令編譯 PC 端指令列工具,你會需要 MingGW 和 MSYS:

cd hid-custom-rq/commandline 
make -f Makefile.windows

這會產生 hid-tool.exe。

使用 hid-tool

底下示範 hid-tool 的用法:

讀取 eeprom:

image

寫資料到 eeprom:

image 

hid-data 所用的資料區塊大小為 128 bytes。

延伸閱讀

V-USB hid-custom-rq

hid-custom-rq 是 V-USB 所附的一個範例,它示範如何定義 HID class device。hid-custom-rq 功能跟 custom-class 範例一樣,不過它宣告成 HID device,由於 Windows 內建 HID driver,因此 Windows 不會要求安裝驅動程式。

hid-custom-rq 一樣可以用 custom-data 所附的 commandline 工具,透過 libusb-win32 來控制裝置。libusb-win32 dll 必須跟 commandline 工具放在同一個資料夾。

下載

hid-custom-rq 包在 V-USB 套件裏:

http://www.obdev.at/products/vusb/download.html

韌體調整

hid-custom-rq 需要調整的地方跟 custom-data 一樣:

● usbconfig.h:


定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。

● Makefile:


定義所用的 MCU 跟時脈頻率,必須根據你的硬體調整 DEVICE 和 F_CPU。

  • main.c

定義所用的 LED 接腳,必須根據你的硬體調整 LED_PORT_DDR, LED_PORT_OUTPUT 和 LED_BIT。

編譯韌體

下指令編譯韌體,你會需要 WinAVR:

cd hid-custom-rq/firmware 
make hex

接著把韌體燒錄到板子上,讓裝置重新上電,然後,「裝置管理員」視窗裏就會出現剛剛安裝的裝置,不用安裝驅動程式:

image
▲ Windows 會將新裝置當成「HID-compliant device」

編譯 PC 端指令列工具 (commandline)

下指令編譯 PC 端指令列工具,你會需要 MingGW, MSYS 和 libusb-win32 函式庫:

cd hid-custom-rq/commandline 
make -f Makefile.windows

這會產生 set-led.exe。

註:libusb-win32 函式庫的安裝方法為,把 include\usb.h 複製到 C:\MingW\include\,而把 lib\gcc\libusb.a 複製到 C:\MingW\lib。

使用 hid-custom-rq

hid-custom-rq 的用法跟 custom-class 一樣:

打開 LED:

set-led on

關閉 LED:

set-led off

查詢 LED 狀態

set-led status

假如 LED 是開的,set-led status 會顯示 "LED is on",否則的話會顯示 "LED is off"。

註:雖然指令列工具是同一支,但因為 hid-custom-rq 用的 VID/PID 跟 custom-data 不一樣,custom-data 用的是 0x16c0/0x05dc,而 hid-custom-rq 的是 0x16c0/0x05df,所以 set-led 指令列工具必須重新編譯才行,不然執行時會找不到 device。

延伸閱讀

2011年9月15日 星期四

V-USB custom-class

custom-class 是 V-USB 所附的一個 custom class device 範例,它示範如何直接使用 default control pipe 傳送與接收小量的資料。

下載

custom-class 包在 V-USB 套件裏:

http://www.obdev.at/products/vusb/download.html

韌體調整

● usbconfig.h:


定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。

● Makefile:


定義所用的 MCU 跟時脈頻率,必須根據你的硬體調整 DEVICE 和 F_CPU。

  • main.c

定義所用的 LED 接腳,必須根據你的硬體調整 LED_PORT_DDR, LED_PORT_OUTPUT 和 LED_BIT。

編譯韌體

下指令編譯韌體,你會需要 WinAVR:

cd custom-class/firmware 
make hex

接著把韌體燒錄到板子上,讓裝置重新上電,安裝 libusb driver,然後「裝置管理員」視窗裏就會出現剛剛安裝的裝置:

image

編譯 PC 端指令列工具 (commandline)

下指令編譯 PC 端指令列工具,你會需要 MingGW, MSYS 和 libusb-win32 函式庫:

cd custom-class/commandline 
make -f Makefile.windows

這會產生 set-led.exe。

註:libusb-win32 函式庫的安裝方法為,把 include\usb.h 複製到 C:\MingW\include\,而把 lib\gcc\libusb.a 複製到 C:\MingW\lib。

使用 custom-class

custom-class 範例的使用方法為:

打開 LED:

set-led on

關閉 LED:

set-led off

查詢 LED 狀態

set-led status

假如 LED 是開的,set-led status 會顯示 "LED is on",否則的話會顯示 "LED is off"。

延伸閱讀

V-USB hid-mouse

HID-Mouse 是 V-USB 提供的一個範例,它實作了一個很簡單的滑鼠裝置。這個範例示範 HID device 的實作。

因為現在大部份作業系統都有內建 USB 滑鼠驅動程式,所以跑 HID-Mouse 不需要安裝驅動程式。

下載

HID-Mouse 包在 V-USB 套件裏:

http://www.obdev.at/products/vusb/download.html

硬體電路

基本上,HID-Mouse 可以用在所有 V-USB 支援的電路上。底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。

image_thumb13

韌體調整

● usbconfig.h:


定義所用的 D+ 和 D- data lines 腳位。必須根據你的硬體調整 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT 和 USB_CFG_DPLUS_BIT。其它不需要改變。

● Makefile:


定義所用的 MCU 以及時脈頻率。必須根據你的硬體調整 DEVICE 和 F_CPU。

編譯與執行

Hid-mouse 在 "vusb-xxxx/examples/hid-mouse" 資料夾裏。

下指令編譯韌體,你會需要 WinAVR:

cd examples/hid-mouse/firmware 
make hex

接著把韌體燒錄到板子上,讓裝置重新上電,然後你就會看到電腦畫面上的滑鼠指標會自己移動。

延伸閱讀

2011年9月14日 星期三

USBaspLoader

USBaspLoader 是給 AVR microcontrollers 使用的 USB bootloader,它可以用在支援 2 KB 以上 bootloader section 的所有 AVRs 上,例如 ATMega8。USBaspLoader 會燒錄到 Flash 的上層記憶體 (upper memory),並且會在 reset 的時候取得 MCU 的控制權。假如硬體狀況有符合 (這個狀況可以設定,例如利用 jumper),bootloader 會等待 USB bus 上的資料,然後把應用程式自我燒錄到 Flash 裏,當硬體狀況解除時 (例如拿掉 jumper),bootloader 就會把控制權交給應用程式。

USBaspLoader 跟 Thomas Fischl 的 avrusbboot 以及 bootloadHID 很像,不過 USBaspLoader 不需要特殊撰寫的燒錄工具,它模擬了 Thomas Fischl 的 USBasp programmer,因此你只需要用 avrdude 便可以燒錄韌體。

另外,由於 USBaspLoader 可以搭配 avrdude 使用,因此它同時也可以跟 Arduino IDE 整合。

下載

USBaspLoader 可以在底下的網址取得:

http://www.obdev.at/products/vusb/usbasploader.html

USBasp 驅動程式:

http://www.fischl.de/usbasp/usbasp-windriver.2011-05-28.zip

硬體電路

基本上,USBaspLoader 可以用在所有 V-USB 支援的電路上 (MCU 的 bootloader section 至少要有 2 KB)。底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。

image_thumb1354
註: USBaspLoader 所用的 Jumper 預設是 PD7 接腳,這部份圖上沒有畫出來

BootloadHID

BootloadHID 是給 AVR microcontrollers 使用的 USB bootloader,它可以用在支援 2 KB 以上 bootloader section 的所有 AVRs 上,例如 ATMega8。BootloadHID 會燒錄到 Flash 的上層記憶體 (upper memory),並且會在 reset 的時候取得 MCU 的控制權。假如硬體狀況有符合 (這個狀況可以設定,例如利用 jumper),bootloader 會等待 USB bus 上的資料,然後把應用程式自我燒錄到 Flash 裏,當硬體狀況解除時 (例如拿掉 jumper),bootloader 就會把控制權交給應用程式。

BootloadHID 用的是 HID device class,除了這點以外,BootloadHID 跟 Thomas Fischl 的 avrusbboot 很像,由於大部份作業系統都有內建 HID 驅動程式,所以跑 BootloadHID 不需要安裝驅動程式。

下載

BootloadHID 可以在底下的網址取得:

http://www.obdev.at/products/vusb/bootloadhid.html

硬體電路

基本上,BootloadHID 可以用在所有 V-USB 支援的電路上 (MCU 的 bootloader section 至少要有 2 KB)。底下是一個參考電路,由於 USB D+ 和 D- 用 3.3V 的電壓,因此在 D+ 和 D- 上使用稽納二極體 (Zener diodes)。你必須確保 D- 準位在 2.5V 與 3.6V 之間。

image_thumb135
註: BootloadHID 所用的 Jumper 預設是 PD3 接腳,這部份圖上沒有畫出來

2011年9月9日 星期五

USB 筆記: 基本概念

USB 架構

Universal Serial Bus (USB) 是一個廣泛使用的高速 Serial 通訊介面,原因是它簡單、方便與彈性。

image
▲ USB Topology example,圖片來源: Microsoft Technet

USB Bus 是 tiered star 拓撲架構,在一個 USB Bus 上,可以容納一個 host 以及最多 127 個 devices (這是因為封包中的 address field 長度是 7 bits,而 address 0 不使用,因為它有特殊的用途)。Device 可以插到 hub 上,而 hub 也可以插到另一個 hub 上,諸如此類,不過最多只允許串接到 6 層。

資料傳輸速度 (Data Speeds)

USB 規格規範了三種資料傳輸速度:

  • Low Speed: 1.5 Mb/s
  • Full Speed: 12 Mb/s
  • High Speed (USB 2.0): 480 Mb/s

USB 2.0 向後相容,因此涵蓋早期版本的資料傳輸速度。

以 host 為中心的通訊系統

USB 是以 host 為中心的通訊系統 (host-centric connectivity system), bus 上的所有通訊都是由 host 發起,device 不能自行發起,必須等待 host 的命令。USB bus 上的每個 device 都會被分配一個 address,當一個新的 USB device 插到 bus 上時,host 會先用 address 0 向 device 詢問如 manufacturer, device capabilities, product ID, vendor ID 等基本資訊,做完身家調查之後,才會分配一個唯一的 USB address 給 device,之後 device 便可以開始跟 host 進行通訊。

USB On-The-Go

USB OTG 是 USB 規格的一個延伸,OTG 允許 device 具備雙重身份,既可以當 device 又可以當 host,這讓兩個 devices 得以不用透過 host computer 而相互連結。

USooBie

USooBie 是一 USB 介面的 AVR 開發板, 硬體和韌體都是 Open Source 的,它可以插在麵包板上使用,而且還提供 bootloader 功能與運作電壓的選擇。

image

image
▲ USooBie 的外觀

USooBie 的特色如下:

  • 使用 ATmega328P
  • 相容於 Arduino,可用 Arduino IDE 燒錄韌體
  • 支援 USB,因此可以實作諸如 keyboards, Mice, Joysticks, Gamepads 等 USB 裝置。
  • 可透過 jumper 選擇使用 5V 或 3.3V 的運作電壓
  • 硬體和韌體完全 Open Source
硬體電路

USooBie 的電路圖如下:

usnoobie_sch_pic-20110115
▲ 點一下看大圖

2011年9月8日 星期四

metaboard

什麼是 Metaboard ?

Metaboard 是一個 USB 介面的 AVR 產品雛型開發板 (prototyping board),它的設計跟 Arduino 幾乎完全相容, 而且硬體和韌體都是 Open Source 的。

image
▲ Metaboard 的外觀

Metaboard 特色如下:

  • 複雜度低,而且超便宜
  • 單層印刷電路 (Single Sided PCB),因此可以在家裏自行製作板子。
  • 沒用到 SMD 元件,容易組裝
  • 板子尺寸與 connector layout 跟 Arduino 幾乎完全相容,而且也可以透過 USB 介面用 Arduino IDE 上傳韌體
  • 支援 USB,因此可以實作諸如 keyboards, Mice, Joysticks 等 USB 裝置。
  • 硬體和韌體完全 Open Source
硬體電路

Metaboard 的電路圖如下:

image

韌體

Metaboard 最適合搭配 USBaspLoader 使用,USBaspLoader 會模擬 USBasp 燒錄器。

整合 Metaboard 與 Arduino

為了從 Arduino IDE 上傳韌體到 Metaboard,你必須調整 "arduino-00xx/hardware/boards.txt",把底下這串設定加到 boards.txt 中:

其中一組是 ATmega168 的設定,另一組是 ATmega328p 的設定,請自行選擇。調整好 boards.txt 的設定後, Arduino IDE 選單「Tools > Board」底下就會多出 Metaboard 可供使用:

image

Metaboard 與 Arduino 的差別

Metaboard 幾乎跟 Arduino 完全相容,不過還是有些不一樣的地方:

  • 韌體上傳程序:Metaboard 需要一個用來選擇 bootloader mode 的 jumper,而且必須按下 reset 鍵才能切到 bootloader。
  • 上傳協定:Metaboard 模擬 USBasp,而非 Arduino 的 STK500 協定。
  • USB 介面:Metaboard 使用 USB 介面,這代表 Metaboard 可以用來實作諸如 keyboards, Mice, Joysticks 等 USB 裝置,不過 Metaboard 沒辦法直接用 USART 與電腦進行序列通訊。
延伸閱讀

2011年9月7日 星期三

AVRStick

image

AVR Stick 是一個簡單的 data logging 裝置,基於 ATtiny85,它會把自己當成是一個 HID Keyboard 定時回報伴隨 timestamp 的電壓資訊。AVR Stick 使用 V-USB 這套純軟體實作的 USB 1.1 裝置,它是基於 V-USB 的 EasyLogger 範例撰寫而成。AVR Stick 的硬體電路如下:

image

AVR Stick 的使用方法很簡單:把它插進電腦 USB Port,過一陣子,電腦就會辨識出裝置並把 AVR Stick 當成 keyboard 看待,然後 AVR Stick 會自動開始回報量測到的電壓。因此要取得量測結果,只要打開 notepad 或 excel,然後把 AVR Stick 插到電腦即可。AVR Stick 預設使用 2.56V 參考電壓,如果需要,必須自行調整程式碼。

底下是 ATtiny85 的規格摘要:

  • Flash: 8 KB
  • SRAM: 0.5 KB
  • EEPROM: 0.5 KB
  • Timers: 2
  • Output Compare channels: 5
  • 最高運算速度:20 MHz
  • Max I/O Pins: 6
  • Ext. Interrupts: 6
  • SPI: 1
  • TWI: 1
  • ADC channels: 4

AVR Stick 的電路圖、PCB Layout 和韌體原始碼都可以在 AVR Stick 官網取得。

延伸閱讀

漫畫 Arduino

藝術家兼教育家 Jody Culkin 畫了一本介紹 Arduino 的漫畫 "introduction to Arduino comic" 。這本漫畫小冊子涵蓋了 Arduino 入門的基本概念以及電子學裏的歐姆定律,對於喜歡藉由看漫畫來吸收知識的學生來說,這是一個很好的介紹方式。

image

2011年9月2日 星期五

HID Report Descriptor 教學#3

這是「HID Report Descriptor 教學」這系列的第三篇。這次要講的是 USB 鍵盤。

keyboard 範例

我們將製作一個標準鍵盤,標準鍵盤會包含 101 個按鍵、8 個組合鍵 (modifiers)、1 個 OEM 保留鍵以及 5 個指示燈 (LED Indicators)。也就是說,我們要送按鍵的資料給 host,這會需要:一個 bit 代表一個組合鍵,一個 byte 代表 OEM 保留鍵,而一個 byte 代表一個按鍵敲擊 (keystroke)。根據 HID Device Class Deinifition 文件,標準鍵盤似乎最多可以同時按下 6 個按鍵,但有沒效我想是作業系統說了算。所以,我們需要像這樣的資料結構:

Byte Description
0 Modifier keys
1 Reserved
2 Keycode 1
3 Keycode 2
4 Keycode 3
5 Keycode 4
6 Keycode 5
7 Keycode 6

其中,組合鍵包括從鍵盤左邊的 Ctrl、Shift、Alt、GUI (WIN 鍵) 到右邊的 Ctrl、Shift、Alt、GUI (WIN 鍵) 總共 8 個按鍵。而 Byte 1 是 OEM 保留鍵,一般是填 0。

另外,host 也可以送資料給鍵盤,用來控制鍵盤上的 LED,標準鍵盤上有 5 顆 LED (並非每個鍵盤都如此,大部份只有 Num Lock, Caps Lock 和 Scroll Lock 這三顆 LED),因此我們需要一個 byte 來儲存 LED 的設定資料:

Bit Description
0 Num Lock
1 Caps Lock
2 Scroll Lock
3 Compose
4 KANA
5-7 Constant