Khepera III 工具箱/示例/i2c 氣味板
此示例展示瞭如何將i2c 和i2c_stream_read 程式與 Khepera III 機器人的擴充套件板一起使用。這裡使用的擴充套件板是 DISAL 開發的氣味感測器板。憑藉其三棵 VOC 感測器,該板允許測量空氣中酒精(或其他物質)的濃度。這些感測器在內部以幾千赫茲的頻率取樣,並且該板在一段時間內對它們進行積分(平均),以每秒提供幾個樣本給外部世界。
與外部世界的介面是 I2C 匯流排,連線到 Khepera III 機器人上的主 CPU。透過此 I2C 匯流排,可以配置該板,並且樣本可以以兩種不同的模式讀取
- 在快照模式下,該板返回每個感測器的最後一個獲取值。
- 在流模式下,該板將每個樣本精確地傳送一次。也就是說,一旦啟動流,該板就會將其內部記憶體中的樣本緩衝。為了避免緩衝區溢位,必須連續讀取(並清空)此緩衝區。
在此示例中,我們將配置積分間隔並以快照和流模式讀取樣本。所有這些都是使用通用的i2c 和i2c_stream_read 程式手動完成的。當然,如果需要更頻繁地執行此操作,建議為這些任務編寫單獨的程式。
啟動一個 Khepera III 機器人(配備氣味感測器板),並確保它連線到您的計算機。在本章的剩餘部分,我們假設您的機器人透過 USB 連線。
將 I2C 程式複製到機器人上
computer> cd Programs
computer> k3put +usb i2c i2c_stream_read
您現在可以開始使用氣味板了。
氣味板是一個基於暫存器的裝置,其 I2C 地址為 0x50。積分間隔儲存在地址為 0x90 的 8 位暫存器中。
首先,讓我們透過發出以下命令來讀取此暫存器
robot> ./i2c 0x50 write 0x90 read 1
$DATA,1,2,write 90,read 0a
輸出乍一看可能有點難以理解,但實際上非常容易閱讀。上面的訊息只是說在 I2C 總線上已傳輸了 2 條訊息。第一條訊息是具有單個位元組 (0x90) 的寫入訊息,第二條訊息是具有單個位元組 (0x0a) 的讀取訊息。最後一個位元組顯然是暫存器的內容,並轉換為十進位制表示法的 10。
因此,我們當前的積分間隔是 10。請注意,氣味板實際上使用二的冪比例來表示此間隔,也就是說,將間隔設定為 9 將產生每秒兩倍的樣本。
10 速度相當慢,讓我們將間隔設定為 8,這快了 4 倍。要寫入該暫存器,我們只需在暫存器號之後傳輸此新值即可
robot> ./i2c 0x50 write 0x90 8
$DATA,1,1,write 90 08
操作已確認!已傳送一條訊息,其中包含兩個位元組 (0x90, 0x08)。為了確保新值已被接受並存儲在暫存器中,讓我們再次讀取該暫存器
robot> ./i2c 0x50 write 0x90 read 1
$DATA,1,2,write 90,read 08
一切看起來都正常。
氣味板將最後一個獲取的樣本儲存在暫存器 0x92(只讀)中。一個樣本實際上由每個感測器的值加上來自氣味板上的內部振盪器的時戳組成。所有值都是 16 位的,因此需要 2 個位元組,總共暫存器大小為 8 個位元組。
要讀取此暫存器,我們將發出以下命令
robot> ./i2c 0x50 write 0x92 read 8
$DATA,1,2,write 92,read 6b ... TODO
接收到的訊息的解釋如下:- 感測器 1:- 感測器 2:- 感測器 3:- 時間戳:0x6b 0x0d -> 107 + 13 * 256 = 3435
這種快照模式對於偶爾需要請求樣本的情況非常方便,例如,要決定氣味濃度是否超過某個閾值。但是,如果您想繪製氣味濃度的演變過程,您可能希望一直查詢該板以獲取新值。如果您過於頻繁地執行此操作,您可能會多次獲得相同的樣本。這是一種可以透過以下方式輕鬆演示的效果
robot> ./i2c -r 100 -d 0x50 write 0x92 read 8
它與上面的操作相同,但重複了 100 次。輸出可能如下所示
TODO
在此示例中,每個樣本已傳輸了大約 N(待辦事項)次,但這將取決於 CPU 和 I2C 匯流排的負載。
為了獲得氣味濃度演變的連貫圖,建議以一種每個樣本精確傳輸一次的方式“流化”這些樣本。
氣味板確實提供了一個 VOC 流暫存器 (0x93)。使用i2c 程式讀取此暫存器有點痛苦,因為流化需要傳送多個(不同的)訊息。
幸運的是,還有另一個程式 -i2c_stream_read - 它會自動完成所有這些操作。此程式將 I2C 裝置地址 (0x50)、流暫存器 (0x93) 和塊長度 (8) 作為引數
robot> ./i2c_stream_read 0x50 stream 0x93 8
並將返回類似於以下內容
$BLOCK,0,1,A1 32 30 00 30 20 61
$BLOCK,1,1,BC 30 30 00 30 EB 52
$BLOCK,2,1,BD 31 30 00 30 64 54
$BLOCK,3,1,BE 32 30 00 30 D8 54
$BLOCK,4,1,BF 32 30 00 30 6B 53
$BLOCK,5,1,C0 31 30 00 30 9F 52
...
每行對應一個已傳輸的 8 位元組資料塊。塊中的第一個位元組是狀態位元組,指示緩衝區中剩餘的樣本數量(包括當前傳輸的樣本),並在第二列中列印(此處全部為 1)。以十六進位制表示法列印的 7 個數據位元組構成最後一列。
氣味感測器值以每個塊的最後 6 個數據位元組編碼。例如,在所獲得的塊中,我們獲得了以下值:- 感測器 1:- 感測器 2:- 感測器 3
要繪製氣味濃度的演變過程,我們只需要將i2c_stream_read 程式的輸出轉換為 Matlab 可以讀取的內容,然後在其中繪製即可。
首先,讓我們從計算機上啟動程式並將輸出重定向到檔案中
computer> ssh root@192.168.1.2 "/root/your_username/i2c_stream_read 0x50 0x93 8" > odor_stream
一旦您覺得收集了足夠多的樣本,請按 Ctrl-C 停止程式。
使用parse_stream.pl 將樣本轉換為具有製表符分隔值的文字檔案,即
computer> ./parse_stream < odor_stream > matlab_odor_stream
最後,啟動 Matlab 並鍵入
>> plot_odor
此 Matlab 指令碼(m 檔案)將載入matlab_odor_stream 檔案並繪製三條曲線。