//Logo Image
「世大智科/天才家居」-我們創業囉
PDF Version

作者:張程皓 (2014-07-17);推薦:徐業良(2015-12-08)

附註:本文為102學年度元智大學機械工程研究所張程皓碩士論文「結合行動裝置之全向移動電動輪椅控制器開發」第四章。

第四章   Universal Serial I2C of Protocol

“Body, Cerebellar & Brain”架構中,Cerebellar (Raspberry Pi)Neurons (Arduino)之間是以序列通訊(serial communication)的方式進行通訊,Cerebellar會將經過演算法計算後的指令(command)傳送給Neurons,或是從Neurons接收訊號(signal)來進行計算。然而在通訊溝通的過程中可能遇到指令或訊號遺漏導致不正確的狀況,因此本研究使用由元智大學老人福祉研究中心Kim Lindholm所開發之K-USIP (Kim - Universal Serial I2C Protocol)編碼來提供Raspberry PiArduino之間或是ArduinoArduino之間進行數位/類比的指令和訊號傳輸等功能,另外也利用K-USIP中的所建立的循環冗餘校驗(Cyclic Redundancy Check, CRC)功能來確保整體指令或訊號的正確性和完整性。本章節即是在介紹K-USIP的架構、K-USIP Library和應用於全項移動電動輪椅控制器的K-USIP程式碼。

4.1    K-USIP介紹

隨著近年來行動裝置的普及,越來越多的應用以行動裝置透過藍牙和其他硬體設備進行連結,藉由行動裝置中App的開發設計,來增加硬體設備本身功能的多樣性,同時經由App功能更因延長產品生命週期。元智大學老人福祉科技研究中心在2013年開始以“Body, Cerebellar & Brain”架構作為各研究計畫的核心架構,期望各項研究在和行動裝置進行結合後,發展出更多元的使用情境,例如遠端臨場機器人TRiCmini+ [Chen et al. 2013]Wobot [Lin et al. 2013]便是在此架構下所發展設計的機器人(如圖4-1)。

4-1. TRiCmini+Wobot外觀圖

“Body, Cerebellar & Brain”架構中,“Brain”“Cerebellar”“Neurons”之間的資料傳輸的正確性和即時性十分關鍵。元智大學老人福祉研究中心最先採用的資料傳輸格式是以伺服馬達的轉動角度、轉動速度和時間為主,例如圖4-2所示為TRiCmini+Wobot兩項機器人中所使用的編碼格式。

protocol

4-2. 使用於TRiCmini+Wobot兩項機器人當中的編碼形式

然而這樣編碼形式僅限於伺服馬達控制,同時也有以下幾項缺點:

(1)       編碼形式是建立在ASCII格式下,每個字元需要1byte的記憶空間;

(2)       無法針對編碼進行錯誤偵測;

(3)       只提供伺服馬達控制,並無增加如訊號偵測、資料傳輸等功能的彈性;

(4)       開發者必須自行將編碼進行切割分段,增加編碼處理時間。

為了改善以上缺點,同時建立一編碼架構能同時提供除了伺服馬達控制以外的功能,本研究採用之K-USIP編碼,除針對訊號或指令進行編碼,同時也對編碼進行保護或錯誤檢測,以確保整體指令或訊號的正確性和完整性。K-USIP特點如下:

(1)       可同時使用於序列通訊溝通和I2C通訊溝通。

(2)       能在“Body, Cerebellar & Brain”架構下所使用,以提供行動裝置與微處理器(Raspberry Pi, Arduino)之間進行資料傳輸。

(3)       能在“Body, Cerebellar & Brain”架構下所使用,以提供兩個或以上微處理器(Raspberry Pi, Arduino)之間進行資料傳輸。

(4)       開發者不需自行針對編碼進行切割分段,減少編碼處理時間。

(5)       提供開發者進行資料傳輸、馬達控制和訊號偵測等功能。

(6)       能在資料傳輸的過程中進行錯誤檢測的功能,同時回報錯誤。

(7)       建立完整的Library提供開發者以直覺的方式進行編譯。

K-USIP編碼已完成第一版的架構,同時也實際應用於本研究全向移動電動輪椅控制器當中,做為數位/類比的指令和訊號傳輸、馬達控制以及資料傳輸的功能。

4.2    K-USIP編碼架構

4-3K-USIP架構,其結構為是由5bytes組成,每個皆以16進位的型態進行傳輸,第一格代表位址(Address)、第二格代表資料數值(Data)/其他資訊(Additional information)、第三和第四格代表資料數值(Data),最後一格代表CRC的運算結果。以下將針對各項進行功能說明:

4-3. Kim-Universal Serial I2c of Protocol架構

1.          位址(Address)

位址(Address)是用於設定Neuron (Arduino)之腳位,同時也可以宣告此K-USIP編碼所要執行的功能。K-USIP是以Arduino Mega作為設計參考(也因此可以涵蓋所有版本Arduino),因此K-USIP位址的宣告方式如下:

(1)       1~70為腳位設定,其數值對應到Arduino上的腳位編號,同時開啟數位輸入/輸出(DI/DO)和類比輸入/輸出(AI/AO)的功能。

(2)       71~124為伺服馬達功能,用來進行伺服馬達編號設定以進行伺服馬達控制。

(3)       125~144為資料傳輸功能,用來進行3bytes的資料傳輸,共提供20組資料傳輸功能。

K-USIP中位址的宣告直接影響之後3bytes資料字元所代表的功用,如果宣告錯誤將可能造成運作上的異常。

2.          資料數值(Data)/其他資訊(Additional information)

第二格的功能取決於第一格位址的宣告,當位址的宣告不同時,此第二格的字元也將代表不同的意義:

(1)       當位址(Address)宣告介於1~70之間時:

第二格的數值10代表數位輸入,數值11代表將腳位狀態從數位輸出改為數位輸入;數值20代表數位輸出,數值21代表將腳位狀態從數位輸入改為數位輸出。數值30代表類比輸入,數值31代表將腳位狀態從類比輸出改為類比輸入;數值40代表類比輸出,數值41代表將腳位狀態從類比輸入改為類比輸出。

(2)       當位址(Address)宣告介於71~124之間時:

第二格的數值代表伺服馬達轉動的速度,其值大小介於0~255之間。

(3)       當位址(Address)宣告介於125~144之間時:

第二格的數值即代表欲傳送之數值資料,其值大小介於0~255之間。

3.          資料數值(Data)

第三和第四格皆代表資料數值,當第一、第二格宣告為數位輸出時,第三格資料數值應寫入16或是17,分別代表輸出低電位或高電位;當位置宣告為類比輸出時,第三格資料數值應寫入PWM訊號(0~255)

當第一格位址宣告為伺服馬達控制時,第三和第四格資料字元的運算結果即代表伺服馬達的角度或是時間。而當位址宣告為資料傳輸功能時,第三第四格的資料字元即代表欲傳送之數值資料,其值大小介於0~255之間。

4.          CRC運算結果

CRC是由Peterson等人於1961年所發展的[Peterson et al. 1961],是網路通訊中一種常見的傳輸錯誤檢查技術。CRC的運算方式是將傳輸資料轉換成連續二進位的數值,並將此數值根據特定數值進行XOR的位元運算(如圖4-4),兩數相除後得到的餘數即為循環冗餘檢查碼(CRC code)。發送端會將運算過後所得的循環冗餘檢查碼附在傳輸資料之後一併傳送至接收端,當接收端收到資料後也會以相同方式進行CRC運算,接著將會比較兩者循環冗餘檢查是否相同,便可以判斷出資料在傳輸過程中是否遭到干擾而產生錯誤。

4-4. CRC運算原理

K-USIP編碼中,當前四個資料字元宣告完畢後,發送端將會先以137(0x89)來進行XOR的位元運算,接著將運算結果作為K-USIP編碼中的最後一個資料字元,連同前四個資料字元一併傳送至接收端。當接收端接收到前4bytes的資料後也會進行相同的CRC運算,並在運算過後和發送端的CRC結果進行比較,如果接收端和發送端的CRC運算結果皆相同,則表示此次K-USIP編碼沒有錯誤,反之則表示K-USIP編碼錯誤,並回報錯誤。

4.3    K-USIP編碼執行流程

4-5所示為K-USIP編碼執行流程圖。在K-USIP編碼傳輸的過程中,發送端將會把K-USIP編碼(5 bytes)傳送至接收端,而接收端每次都會收齊5bytes的資料字元後才會停止接收,在接收完後便會針對前四個資料字元進行CRC運算,並在運算完成後進行CRC比較,確認整體K-USIP編碼正確性後才會執行指令動作。

圖片3

4-5. K-USIP編碼執行流程圖

K-USIP將指令以5bytes形式進行編碼,同時藉由Address的宣告來讓K-USIP不單只是進行資料傳輸,也可進行數位和類比訊號的控制,然而以16進位方式組成的K-USIP畢竟無法讓開發者直覺性地了解指令的組成內容,因此為了方便開發者在程式上的編譯,K-USIP將以上所描述之編碼架構封包成Library,以較直覺性的編譯方式提供開發者在Arduino以及Raspberry Pi中進行編譯。

4.4    K-USIP Library

Raspberry PiArduino中如果要使用K-USIP,必須先加入K-USIP Library後才可以使用,其設定方式如圖4-6所示,同時在Arduino端需要先在setup中進行通訊設定,Raspberry則只需加入K-USIP Library即可,參數宣告方式為第一個表示通訊方式,1為序列通訊、2I2C通訊、3為兩者皆可使用;第二個表示I2C位址;第三個為序列通訊鮑率(如圖4-7)。另外在Arduino端的主程式當中需要寫入“Idle()”來讓Arduino執行K-USIP接收傳送和判別的工作(如圖4-8)。

4-6. Raspberry PiArduino加入K-USIP Library

4-7. Arduino中進行K-USIP通訊設定

4-8. Arduino的主程式中寫入“Idle()”來執行K-USIP功能

同時在Arduino端的程式碼中,也需新增20個功能(Function)的副函式,如圖4-9所示,這20個功能(Function)副函式便是提供前述所提的資料傳輸功能,三個data即是用來接收和儲存來自發送端的資料數值。每個功能(Function)副函式皆會回傳一個數值,當回傳值為-1時,表示該功能(Function)副函式尚未被使用,因此如果要利用功能(Function)副函式回傳資料給發送端,只需將-1改為要回傳的數值或變數即可。

4-9. Arduino端新增20Function副函式(片段)

當完成K-USIP通訊設定後便可以直接使用封包好的程式碼進行K-USIP通訊,以下將針對K-USIP Library中所提供的功能進行說明介紹

1.          數位輸出功能

在數位輸出功能中,K-USIP Library中提供開發者使用“digitalWrite(int Pin, BOOLEAN)”來進行序列通訊,在參數宣告上“int Pin”為宣告接收端的腳位,並在BOOLEAN中宣告10來表示高電位或是低電位(如圖4-10)。如果要使用I2C通訊的話,則是以 digitalWriteI(int Pin, BOOLEAN, int add)”來編譯,參數宣告和序列通訊相同,只需額外宣告位址讓發送端知道要將指令送至哪個接收端。

4-10. K-USIP Library中的數位輸出功能(以Raspberry Pi為例)

2.          數位輸入功能

在數位輸入功能中,K-USIP Library中提供開發者使用“digitalRead(int Pin)”來進行序列通訊,在參數宣告上int Pin為宣告接收端的腳位(如圖4-11)如果要使用I2C通訊的話,則是以“digitalReadI(int Pin, int add)”來編譯,參數宣告和序列通訊相同,只需額外宣告位址以讓發送端知道要從哪個接收端接收指令。

4-11. K-USIP Library中的數位輸入功能(以Raspberry Pi為例)

3.          類比輸出功能

在類比輸出功能中,K-USIP Library中提供開發者使analogWrite(int Pin, uint8_PWM)來進行序列通訊,在參數宣告上int Pin為宣告接收端的腳位,並在uint8_PWM中輸入PWM訊號(0~255),如果要使用I2C通訊的話(如圖4-12)。如果要使用I2C的話,則是以analogWriteI(int Pin, uint8_PWM, int add)來編譯,參數宣告和序列通訊相同,只需額外宣告位址以讓發送端知道要將指令送至哪個接收端。

4-12. K-USIP Library中的類比輸出功能(以Raspberry Pi為例)

4.          類比輸入功能

在類比輸入功能中,K-USIP Library中提供開發者使用“analogRead(int Pin)”來進行序列通訊,在參數宣告上“int Pin”為宣告接收端的腳位(如圖4-13)。如果要使用I2C通訊的話,則是以“analogReadI(int Pin, int add)”來編譯,參數宣告和序列通訊相同,只需額外宣告位址以讓發送端知道要從哪個接收端接收指令。

4-13. K-USIP Library中的類比輸入功能(以Raspberry Pi為例)

5.          資料傳輸功能(資料傳送)

K-USIP Library中如果要將資料或數值由發送端傳送至接收端時,序列通訊需使用“writeFunc(int Pin, uint8_data1, uint8_ data2, uint8_ data3)”“int Pin”宣告要將資料或數值傳送至接收端功能副函式中的哪個功能(Function)中,而三個data也分別對應到功能副函式中功能(Function)的三個data(如圖4-14)。如果要使用I2C通訊的話,則是以“writeFuncI(int Pin, uint8_data1, uint8_ data2, uint8_ data3, int add)”來進行編譯,參數宣告和序列通訊相同,只需額外宣告位址讓發送端知道要將指令送至哪個接收端。

4-14. K-USIP Library中的資料傳送功能(以Raspberry Pi為例)

6.          資料傳輸功能(資料接收)

K-USIP Library中如果從接收端接收資料或數值時,序列通訊需使用“readFunc(int Pin, uint8_data1, uint8_ data2, uint8_ data3, int time)”“int Pin”宣告要從接收端功能副函式中的哪個功能(Function)中接收資料或數值,而由於三個data僅提供在資料傳送功能中所使用,因此在資料接收功能裡,三個data 只需填入0即可,int time為宣告時間參數(ms)讓發送端有時間確保資料或數值接收正確和完整(如圖4-15)。如果要使用I2C通訊的話,則是以“readFuncI(int Pin, uint8_data1, uint8_ data2, uint8_ data3, int add, int time)”來進行編譯,參數宣告和序列通訊相同,只需額外宣告位址以讓發送端知道要從哪個接收端接收指令。

4-15. K-USIP Library中的資料接收功能(以Raspberry Pi為例)

7.          伺服馬達功能

K-USIP Library中如果要進行伺服馬達控制,“ServoDrive(int Pin, int8_spd, int8_pos)”提供開發者透過序列通訊來進行伺服馬達控制,在參數宣告上int Pin為宣告伺服馬達的編號,“int8_spd”“int8_pos”分別代表伺服馬達的速度和角度(如圖4-16)。如果要使用I2C通訊的話,則是以“ServoDriveI(int Pin, int8_spd, int8_pos, int add)”來進行編譯,參數宣告與序列通訊相同,只需額外宣告位址以讓發送端知道要將指令送至哪個接收端。

4-16. K-USIP Library中的伺服馬達功能(以Raspberry Pi為例)

4.5    應用K-USIP之全向移動電動輪椅控制器

本研究中,全向移動電動輪椅控制器中的Cerebellar先向Neurons要求回傳搖桿、感知推把和行動裝置App的訊號和指令,作為移動方向判別和速度演算的依據,其在K-USIP Library底下程式碼的編譯方式如圖4-17所示。由於搖桿和感知推把的訊號為類比訊號,因此在程式編譯裡使用“KUSIP.analogRead(int Pin)”來要求Neurons偵測相對應腳位的類比訊號;而由於行動裝置App傳來的為單一遙控指令,在Arduino端會先進行接收,並將“Func1”當中的-1取代為遙控指令來等待Raspberry Pi“KUSIP.readFunc(1,0,0,0,20)”的方式來向“Func1”取值(如圖4-18),同時在“KUSIP.readFunc(1,0,0,0,20)”中加入20毫秒的時間參數來讓Raspberry Pi有時間完成遙控指令接收。

4-17. 使用K–USIP Library來進行人機介面的訊號和指令接收(Raspberry Pi端)

4-18. 將接收到之遙控指令儲存在Func1當中等待Raspberry Pi取值(Arduino端)

而當Raspberry Pi將訊號和指令接收完畢後,便會開始進行作為移動方向判別和速度演算,轉換為馬達控制訊號後,經由Neurons來進行馬達的控制。在本研究中所使用的是直流馬達,在控制上必須透過馬達驅動晶片上的兩個數位腳位和一個PWM訊號來進行馬達控制。在Raspberry Pi端的程式必須進行數位輸出和類比輸出功能,其編譯方式是使用“KUSIP.digitalWrite(int Pin, BOOLEAN)”“KUSIP.analogWrite(int Pin, uint8_PWM)”兩種(如圖4-19)。

4-19. 使用K–USIP Library來進行馬達控制(Raspberry Pi端)

最後為了將馬達轉速的資訊透過Neurons顯示在全向移動電動輪椅App中,Raspberry Pi會以“KUSIP.writeFunc(int Pin, uint8_data1, uint8_ data2, uint8_ data3)”的編譯方式將四個馬達轉速資訊傳送至Arduino當中的四個Function裡(如圖4-20)。而在Arduino端則是因為Raspberry Pi在編碼方式中將馬達轉速資訊儲存在data1當中,因此當馬達轉速資訊傳送至Arduino時,是儲存在Function當中的data1裡(如圖4-21)。

4-20. 使用K–USIP Library來將資料傳送之ArduinoRaspberry Pi端)

4-21. 將馬達轉速資訊儲存在Function當中的data1Arduino端)

全向移動電動輪椅控制器是第一個使用K-USIP編碼的系統架構,並根據以上說描述到的功能來完成全向移動電動輪椅的控制。K-USIP編碼對資料字元的保護方式,讓使用“Body, Cerebellar & Brain”架構的控制系統能夠正確且即時地讓資料字元在“Cerebellar”“Neurons”之間進行傳輸;透過K-USIP LibraryK-USIP包裝成開發者較為熟悉的編譯方式,讓開發者即便不了解K-USIP運作流程也可以進行編譯。

參考資料

Chen, Y. S., Lu, J. M., & Hsu, Y. L., 2013. Design and Evaluation of a Telepresence Robot for Interpersonal Communication with Older Adults. In Inclusive Society: Health and Wellbeing in the Community, and Care at Home. pp. 298-303. Springer Berlin Heidelberg.

林怡錦,張程皓,卜令遠,徐業良, "Wobot-應用遠端臨場技術之互動溝通平台之設計," 2013福祉科技與服務管理研討會, pp. 41-42, 2013.

Peterson, W. W. and Brown, D. T., "Cyclic Codes for Error Detection," Proceedings of the IRE. 1961. January, 49: 228. [ISSN: 0096-8390] DOI: 10.1109/JRPROC.1961.287814