著作權歸作者所有。 商業轉載請聯繫作者獲得授權,非商業轉載請注明出處。 作者:科長 連結:http://zhuanlan.zhihu.com/makeblock/20306790 來源:知乎 在製作一些 Arduino 機器人項目時,我們通常希望能便捷地控制機器人。常用的方法有:紅外遙控器、手機 App 控制、USB 設備(鍵鼠/手把)控制等。其中紅外遙控器的控制距離和穩定性都不是很好,手機 App 的實現難度又比較高,比較理想的其實還是使用通用 USB 設備控制機器人。本文將以一款 USB 無線遊戲手把為例,講解如何解析 USB 設備的通信協定,並實現對機器人的控制。 為了讓 Arduino 能讀取 USB 設備的資料,必須使用一塊晶片——CH375B。這塊晶片可以將 USB 資料轉為串口資料,發送給 Arduino。本文使用的是 Makeblock USB Host 模組,其中就帶有一塊 CH375B 晶片。Makeblock 為這個模組提供了庫檔,可以通過簡單地調用庫函數來實現初始化、讀取等操作,不再需要發送一系列指令。簡單地安利一下,常規的 CH375 庫只能使用串口與 CH375 晶片通信,而 Makeblock 封裝後的庫可以使用任意兩個引腳類比串口,不需要佔用硬體串口資源。庫檔可以在這裡下載: Makeblock-official/Makeblock-Libraries · GitHub 先將 USB Host 模組連接到 Makeblock Orion 上,並將無線 USB 遊戲手把的接收器查到 USB Host 模組上。這個遊戲手把是淘寶上隨意買的一款,一般來說 CH375 支援的設備都是普通的 USB 設備,高端的遊戲鍵鼠和手把可能會不相容。 然後編寫一段程式,將 USB Host 接收到的資料通過串口發送到 PC 端查看。 #include "MeOrion.h" #include "SoftwareSerial.h" MeUSBHost usbhost(PORT_3); int length = 0; void parseJoypad(unsigned char *buf) //print the data from USB Host { for(int i = 0; i < length; i++) { Serial.print(buf[i]); Serial.print(" - "); } Serial.println(buf[length]); } void setup() { Serial.begin(57600); usbhost.init(USB1_0); //USB1_0 or USB2_0 } void loop() { if(!usbhost.device_online) { usbhost.probeDevice(); delay(1000); } else { length = usbhost.host_recv(); parseJoypad(usbhost.RECV_BUFFER); delay(5); } } 串口讀到的資料如下圖: 反復操作遊戲手把並觀察接收到的資料,可以總結出操作和資料之間的規律: // 手把代碼(紅燈亮) // 默認:128-127-128-127-15-0-0-128 // 左一:128-127-128-127-15-1-0-128 // 右一:128-127-128-127-15-2-0-128 // 左二:128-127-128-127-15-4-0-128 // 右二:128-127-128-127-15-8-0-128 // 三角:128-127-128-127-31-0-0-128 (0001 1111) // 方形:128-127-128-127-143-0-0-128 (1000 1111) // 叉號:128-127-128-127-79-0-0-128 (0100 1111) // 圓圈:128-127-128-127-47-0-0-128 (0010 1111) // 左微動: 128-127-128-127-15-64-0-128 // 右微動: 128-127-128-127-15-128-0-128 // 向上:128-127-128-127-0-0-0-128 (0000 0000) // 向下:128-127-128-127-4-0-0-128 (0000 0100) // 向左:128-127-128-127-6-0-0-128 (0000 0110) // 向右:128-127-128-127-2-0-0-128 (0000 0010) // 左上:128-127-128-127-7-0-0-128 (0000 0111) // 左下:128-127-128-127-5-0-0-128 (0000 0101) // 右上:128-127-128-127-1-0-0-128 (0000 0001) // 右下:128-127-128-127-3-0-0-128 (0000 0011) // 選擇:128-127-128-127-15-16-0-128 // 開始:128-127-128-127-15-32-0-128 // 搖杆:右X-右Y-左X-左Y-15-0-0-128 調用 usbhost.host_recv() 函數後,接收到的資料將保存在以 usbhost.RECV_BUFFER 為起始位址的緩存中。想要用這個手把控制機器人,只需要在 Arduino 的 loop 函數裡調用 host_recv() 函數,並在 parseJoypad() 函數中,訪問 RECV_BUFFER 位址讀取內容,並根據這些內容來控制機器人。
0 評論
發表回覆。 |