本項目所用的 TS-7680 開發板搭載 MMA8451 三軸加速度計芯片,Linux 支持該芯片通過輪詢驅動。不幸的是,這種輪詢架構嚴重限制了采樣率。在實踐中,它每秒產生20-30個樣本,即使在最高的輪詢速率下,與芯片能夠達到的800 Hz的原始速率相比也是如此。使用像泰諾系統公司設計的定制驅動器可以實現更高的采樣率。但是,對于我們的目的,低采樣率就足夠了。
TS-7680 上的默認磁盤區目前并未編譯 MMA8451 芯片支持。雖然版本將載入日后,但該內核必須先編譯并安裝于主板上 TS-7680 使用手冊中的說明。
注意:加速度計是電路板選項。如果您的開發板上沒有加速度計,您仍然可以運行此演示。但是,您需要從 中刪除或注釋掉以下行:ts7680-demo-server.js
.API(“mma8451”)
如果您的內核不支持加速計,則這樣做尤其重要,因為缺少某些文件將導致服務器終止。
設置加速度計
加速度計可以通過/特殊文件訪問。每次讀取此文件都將返回整數個事件,因此無需設置某種狀態機來處理部分數據返回。但是,每個加速度計示例通常由至少 4 個事件組成:一個事件用于加速度計的每個軸,另一個表示數據已完成。
在實現中只有三個函數。第一個要查看的變量被分配給變量,該變量在包首次初始化時被調用。該函數將從檢查選項開始。如果有字符串選項,則該選項將用作終結點,而不是默認終結點:
接下來,我們向日志發送一條消息,指示已輸入服務。雖然日志記錄框架已經記錄了調用方的 IP 地址和 URL,但這是指示請求路由正確的附加信息。
之后,需要初始化加速度計。可以通過將 值 寫入 sys 文件系統中的相應文件來啟用加速度計:1
輪詢周期應設置為 10 毫秒。這是我們可用于此內核的最小值。
比例因子應設置為 +/-2 gs,或最多 2 gs (19.62 m/s^2),方法是寫入值 。如果需要更高的加速度范圍,但以較低的分辨率為代價,則可以將其設置為更高的值,例如+/-4 gs(通過寫入)或+/-8 gs(通過寫入)。
最后,調用快速應用,通過調用函數來響應來自終結點的 GET 請求。將參數附加到提供的基本終結點 – express 會將提供的名稱轉換為傳遞給我們的服務函數的請求對象中“param”對象中的鍵:
現在將調用該函數來處理以“”開頭的任何URL或選項中傳遞的任何端點上對加速度計數據的HTTP請求。將接受此字符串之后的 URL 中的任何其他字符,從而允許傳遞參數。處理程序的函數原型看起來與其他快速處理程序類似,采用請求對象 () 和響應對象 ()。
處理加速度計數據的 HTTP 請求
在函數中要做的第一件事是將參數解釋為一個數字 - 這是加速度計將被采樣的毫秒數。健全性檢查此值,允許任何正時間最多一小時。在實踐中,這么長的采樣時間可能沒有用,但我們必須在某個地方畫線:
此時,我們致力于將加速計值發送到客戶端,因此請繼續寫出 HTTP 標頭。
我們將發送純文本,每行一個樣本,其中逗號分隔時間值(自 Epoch 以來的毫秒數),x、y 和 z 軸值作為原始加速度計報告的整數。要開始采樣,需要調用該函數,該函數采用回調函數,每當收到樣本時,它將向該函數傳遞時間,x,y和z值。將這些值直接寫入響應數據:listen
這存儲了變量中的返回值。返回值是一個包含名為 的函數的對象,當調用該函數時將終止采樣過程。調用 setTimeout 以客戶端指定的毫秒數接收回調,并在收到時調用 stop 函數,然后結束對客戶端的響應:
現在進入函數,其中發生了流式傳輸數據并將其轉換為示例的實際工作。
流式處理和采樣加速度計數據
首先,聲明一些局部變量:
該變量將保存事件文件的文件描述符。、 、 和 變量將保存每個樣本的分量,直到它們準備好發送給調用方。該變量保存輸入流的當前狀態(每個樣本作為多個事件發送,并且此變量將跟蹤何時收到整個樣本)。最后,該變量將保存返回值,該值將是一個包含停止采樣過程的函數的對象。fdxyztstateret
首先打開事件設備文件。完成此操作后,加速度計將開始采集樣本。
每當采集樣本時,都會收到多個事件。Node.js將負責在數據可用時自動讀取數據,因此請設置回調以接受此數據并對其進行處理:
該參數將是包含從文件中讀取的數據的緩沖區。首先要做的是從塊中讀取事件。每個事件的長度為 16 個字節。在 C 中,事件的結構如下所示:chunk
來自事件設備的數據將始終以 16 字節的倍數提供,因此不需要特殊的邏輯來處理部分事件。下面是處理事件數據塊的代碼:
while 循環讓我們一直閱讀,只要至少剩下一個數據塊。索引變量 用于跟蹤接下來要處理的塊中的偏移量。Buffer 函數,用于從緩沖區中的指定偏移量以小字節序格式讀取 16 位和 32 位整數。
讀取事件后,前進索引。然后檢查事件是否為3,表示存在示例元素;如果是,請查看代碼以確定它是示例的 x、y 或 z 軸部分。type
請注意,時間在每個事件中都是冗余的,并且對于同一示例的所有部分應該相同,因此可以直接使用來自事件的值。當收到事件 0, 0 時,這表示示例已完成。但是,您可以使用該變量來跟蹤已記錄的樣本的哪些部分,并且僅當已收到所有部分時才發送樣本。通常,只有在樣本中間開始讀取事件(實際上確實發生)時,才會遺漏樣本的某些部分。typecodestate
最后,在設置函數以處理從內核流式傳輸的樣本后,使用該函數設置返回值對象,這會關閉文件描述符以停止流式處理。
在下一期中,我們將介紹如何實現對模數轉換器 (ADC) 的支持。
審核編輯:郭婷
-
加速度計
+關注
關注
6文章
702瀏覽量
45910 -
開發板
+關注
關注
25文章
5067瀏覽量
97608
發布評論請先 登錄
相關推薦
評論