2009-07-25

mindsensors NXTHID 人性化介面裝置測試( Lego mindstorms NXT based HID)


最近剛完成對於mindsensors.com 人性化介面裝置NXTHID的測試, 測試過程先由NXT讀取ACCL-NX感應器3軸的Tilt資料, 再使用NXTHID以模擬鍵盤方式, 操作PC端MS-Excel軟體, 於指定的儲存格中輸入Tilt資料. 影片的記錄如后:

觀察影片可以發現筆電螢幕中所顯現Excel的操作過程就如同真人使用鍵盤操作一般, 事實上所有的動作都是NXT程式使用NXTHID所完成的, 本文將以本次測試為例說明NXTHID的用途與用法.
What is NXTHID:
NXTHID是NXT的標準I2C裝置, 具備PC端人性化介面裝置(HID)的功能, 主要用途在於提供NXT具備如同鍵盤一般, 可以對PC輸入的能力, 所以該裝置的mini USB接頭即用來與PC連接.
NXTHID的I2C操作方式很單純, 一次載入一個字元到資料暫存器中, 接著載入T指令到指令暫存器中, 即可透過USB傳送至PC, 同時並重複前面的動作直到全部傳送完成為止.
NXTHID對於資料的載入提供兩種模式: Ascii碼(Ascii String Mode)與鍵盤碼(Direct Data Mode), 分別載入A' D指令至指令暫存器中來進行模式切換.資料模式的選擇依據PC端的操作需求, 如果是字串資料的輸入, 則A模式在程式撰寫時較便利及具可讀性, 但如果是要傳送控制鍵(F1)與組合鍵(Ctrl-V), 則只能使用D模式.D模式載入的資料須為鍵盤碼而非Ascii碼, 請參閱NXTHID User Guide Appendix A, 例如: 'a'的Ascii碼為0x61, 但在D模式時必須改為鍵盤碼0x04.

NXTHID操作Excel的方式說明:
本案例使用Excel快捷鍵(shortcut keys)來操作所需功能, 並將快捷鍵按照操作步驟組合成兩個函數功能:
1. 移至指定的儲存格: F5(跳出'到/Goto'視窗) -> 輸入儲存格位置 -> Enter 確認
對應NXTHID的操作: 切換D模式 -> 送出0x3E -> 切換A模式 -> 傳送"儲存格位址\n"字串
<程式範例> HID_EXCEL_GotoCell(string excel_cell)
void HID_EXCEL_GotoCell (string excel_cell)
 {
      NXTHID_RunCmd(SET_DIRECT_DATA_MODE);
      HID_Transmit_Data(NONE_MODIFIER, 0x3E);    //F5 key     
      excel_cell += "\n" ;                                                     //Add Return key
      HID_Send_AsciiString (excel_cell);                        //cell no.
 }


2. 編輯儲存格內容後離開: F2(編輯選定的儲存格) -> 若須先清空欄位則送出Del鍵 -> 輸入值 -> Enter離開
對應NXTHID的操作: 切換D模式 ->  若須先清空欄位則送出0x4C -> 送出0x3B -> 切換A模式 -> 傳送"儲存格值\n"字串
<程式範例> HID_EXCEL_EditCell(string excel_cell, bool isClear)
 void HID_EXCEL_EditCell (string excel_value, bool isClear)
 {
      NXTHID_RunCmd(SET_DIRECT_DATA_MODE);
      if (isClear) HID_Transmit_Data(NONE_MODIFIER, 0x4C); //Delete key

      HID_Transmit_Data(NONE_MODIFIER, 0x3B);                   //F2 key
      excel_value += "\n" ;                                                                 //Add Return key
      HID_Send_AsciiString (excel_value);                                   //cell value.     
 }