【實測心得】如何讀取Quark D2000 的加速度計數據

作者:Sam Lin

最近,看了MakerPRO的2篇Intel Quark D2000 的文章介紹,對Intel Quark D2000 開發板的加速度感測器還蠻好奇的。因此就進一步研究D2000開發板,板子上使用一個Bosch BMC150 6軸eCompass 電子羅盤/加速度計晶片,內建了3軸加速度感測,以及3軸地磁感測,還有一個溫度感測,詳細規格可參考這裡

圖中紅色圈起來的部分,就是BMC150 6-軸感測器IC

BMC150是一顆系統整合包裝(SIP System in Package)晶片,內部整合封裝了一組3軸加速度計ASIC,和一組3軸地磁電子羅盤感測器ASIC,利用SIP 技術將晶片體積縮小,Intel D2000 SoC 透過2個不同的I2C 位址,來控制2顆感測ASIC。

Jumper J1

3-軸加速度計I2C位址

3-軸地磁指南針I2C位址

未接 (default)

0x10 0x13
接通 0x11

0x14

 

Quark D2000開發平台硬體架構圖(紅色箭頭為6軸加速度感測器及溫度感測器)

Intel D2000 MCU為低功耗(使用鈕扣電池)32-bit x86架構微控制器,所以D2000開發板很適合用來做IoT物聯網應用開發,我們安裝Intel® System Studio for Microcontroller SDK後,即可在Intel專用的IDE環境下,使用C/C++來開發Intel Quark Microcontroller D2000 的控制或IoT應用程式。(請參考【X86 MCU】安裝Quark D2000開發環境)

為了方便學習,我們可以參考Intel® System Studio for Microcontroller的”Quark Accelerometer”範例程式,藉以學習如何使用Intel® Quark™ Microcontroller Software Interface (Intel® QMSI)的基本函式,程式中除了讀取3軸加速度計的X、Y、Z 的值,並將讀到的加速度計數據經由串列埠傳送到電腦,還利用 Intel® Integrated Performance Primitives (IPP) for Microcontrollers (DSP 功能) 的程式庫,來計算最後15個Z軸加速度計的均方根值、差異值,以及平均值。

為了要將讀到的加速度計數據經由串列埠傳送到電腦,我們需要準備一條FTDI USB轉序列傳輸線(型號如: TTL-232R-3V3),也可以按此下載驅動程式。

FTDI傳輸線接線說明,如下圖:
從FTDI 序列傳輸線的 GND (紫色) 連接到D2000開發板的 GND 針腳。
從FTDI 序列傳輸線的 TXD (藍色) 連接到D2000開發板的 RX (0)針腳。
從FTDI 序列傳輸線的 RXD (綠色) 連接到D2000開發板的 TX (1)針腳。

FTDI傳輸線接線圖

當然你也可以使用別家的USB轉序列傳輸線,如Prolific PL2303等。不過,如果你使用的PL2303在Windows 10發生無法辨識使用情況時,可參考此文說明,重新安裝選用舊版驅動程式即可。

3軸加速度計測試程式

接著,我們可以利用Intel ® System Studio for Microcontrollers IDE提供的3軸加速度計範例程式,來測試3軸加速度計。

1. 首先,開啟Intel ® System Studio for Microcontrollers IDE
2. 依照下列步驟,建立一個”Accelerometer”範例專案:
1). 點選左上角”File”的”New”(*同時按下Alt+Shift+N也可以),選擇”Intel Project for Microcontrollers”
2). 接著,在”Create a new Project “ 的操作步驟中,依序設定下列提示的選項:
i. Developer board: Intel® Quark™ D2000 Developer Board
ii. Project type: Intel® QMSI (1.1)
iii. Connection type: USB-Onboard
iv. Project name: Accelerometer
3). 最後,再如下面畫面,點選”Finish”

4). IDE 會開啟” Accelerometer”範例專案程式,接著,我們要在IDE設定序列傳輸埠將加速度計感測值傳送到設定的序列埠。設定前,可以先打開Windows 的”裝置管理員”,檢查”連接埠(COM和 LPT)”,查看你的FTDI USB轉序列傳輸線的序列埠號碼(COMx ),如下列設定的是”COM5”。

5). 在Intel ® System Studio for Microcontrollers IDE畫面右下方,選擇”Serial Terminal” 選項,按下 “+”開啟新的序列傳輸連線”。

這樣就確定已選取正確的序列連接埠。您也可以按一下點按”+“,修改成正確的序列埠。或在「Custom Configuration」 功能表中,修改系統的預設序列連線設定,如傳輸鮑率(Baud Rate)。

3. 編譯專案、執行專案:
1). 在Project Explorer 中選擇”Accelerometer” 專案
2). 點按 Build按鈕,編譯程式與專案
3). 點選 “Run”下拉列表,選擇 “Accelerometer (flashing)”,開始將專案的程式燒錄到D2000 開發板的MCU中,並開始執行。
4). 這時候可以在右下角Serial Terminal 中,看到D2000傳到序列埠的加速度計感測數據、X、Y、Z,以及rms (均方根值)、var(偏差值)、mean (平均值)。

4. 程式說明
加速度計感測程式範例,透過I2C 介面控制板子上的Bosch BMC150加速度計,也利用Intel® Quark™ D2000 MCU 的RTC (即時時鐘)的設定,週期性的讀取板子上的 UARTBosch BMC150 加速度計感測數據。再將數據資料經由 UART 模組傳送到序列連接埠,將資料傳輸出去。

範例程式main() 主程式中,首先設定 rtc 組態結構(configuration structure)中的RTC參數:

1  /* Configure the RTC and request the IRQ. */
2  rtc.init_val = 0;
3  rtc.alarm_en = true;
4  rtc.alarm_val = INTERVAL;
5  rtc.callback = accel_callback;
6  rtc.callback_data = NULL;

組態設定中,先啟動RTC alarm,並設定”accel_callback”為RTC alarm 發生時的回呼函式(callback function),讓程式啟動後定時執行此函式來將加速度計的感測值回傳回去。

接下來,程式中利用QMSI API call設定RTC 岔斷要求(interrupt request),並啟動RTC 時脈(RTC Clock):

1 qm_irq_request(QM_IRQ_RTC_0, qm_rtc_isr_0);
2
3 /* Enable the RTC. */
4 clk_periph_enable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK);

之後,程式會根據板子種類,設定加速度計類型(BMC150 或 BMI160)的加速計參數,D2000 用的是BMC150:

1 #if (QUARK_D2000)
2 cfg.pos = BMC150_J14_POS_0;
3 #endif /* QUARK_D2000 */
4
5 /* Initialise the sensor config and setthe mode. */
6 bmx1xx_init(cfg);
7 bmx1xx_accel_set_mode(BMX1XX_MODE_2G);
8
9 #if (BMC150_SENSOR)
10 bmx1xx_set_bandwidth(BMC150_BANDWIDTH_64MS); /* Set the bandwidth. */
11 #elif(BMI160_SENSOR)
12 bmx1xx_set_bandwidth(BMI160_BANDWIDTH_10MS); /* Set the bandwidth. */
13 #endif /* BMC150_SENSOR */

cfg.pos 參數用來設定BMC150加速計的I2C位址,D2000開發板上有J1跳線帽(J1 Jumper),可讓您變更地址。D2000開發板的預設位址是BMC150_J14_POS_0 (沒有插跳線帽,I2C 位址 0x10)。

此時,終於完成RTC 組態的設定,可以啟動 RTC alarm 了:

1 /* Start the RTC. */
2 qm_rtc_set_config(QM_RTC_0, &rtc);

一旦RTC alarm被啟動計時,程式中RTC alarm設為每 125 毫秒的時間間隔,RTC alarm會發出中斷(interrupt),並叫用accel_callback 函式。accel_callback 函式則透過bmx1xx_read_accel 函式讀取加速計資料。如果此讀取作業成功完成時,加速計的資料會列印序列主控台輸出。否則,便會發出錯誤訊息。

01 /* Accel callback will run every timethe RTC alarm triggers. */
02 static void accel_callback(void *data)
03 {
04 bmx1xx_accel_t accel = {0};
05
06 if(0 == bmx1xx_read_accel(&accel)) {
07 QM_PRINTF("x %d y %d z %d\n", accel.x, accel.y, accel.z);
08 } else {
09 QM_PUTS("Error: unable to read from sensor");
10 }

如果IPP 已啟用(範例程式預設值),程式會呼叫 print_axis_stats 函式列印 Z 軸的統計資料。(請參閱 Intel® Integrated Performance Primitives for Microcontrollers Library, print_axis_stats功能的說明)。

1 #if (__IPP_ENABLED__)
2 print_axis_stats(accel.z);
3 #endif /* __IPP_ENABLE__ */

accel_callback 回呼函式中,還會檢查已讀取的加速度計樣品數據,是否達到預設的NUM_SAMPLES組數了,如果還沒有,RTC alarm會重新設定繼續計時,並將樣品計數加1,否則就將”complete” 變數設為 true,表示已完成預設讀取樣品數了。

1 /* Reset the RTC alarm to fire again ifnecessary. */
2 if(cb_count < NUM_SAMPLES) {
3 qm_rtc_set_alarm(QM_RTC_0,
4 (QM_RTC[QM_RTC_0].rtc_ccvr + INTERVAL));
5 cb_count++;
6 } else {
7 complete = true;
8 }

回到main程式碼,最後,使用一個while 迴圈等待程式讀完預設的500 組加速度計感測數據 (NUM_SAMPLES),並輸出到序列埠後,列印出完成加速度計讀取訊息,並結束程式。

1 /* Wait forthe correct number of samples to be read. */
2 while(!complete)
3 ;
4 QM_PUTS("Finished: Accelerometer example app");
5 return0;
6 }

由以上說明可以看出,Intel® System Studio IDE使用很方便,藉由Intel® QMSI 提供的函式庫,能夠輕易實現讀取Intel D2000開發板上的加速度計或電子指南針的感測值;再透過USB-轉序列傳輸線,我們可以將讀到的數據傳送到PC,如果將USB-轉序列傳輸線換成藍牙BLE 4.0模組,再加上手機App,我們也可以很容易的將數據傳送到手機,由於Intel D2000具有低功率的設計,可以使用一個鈕扣電池就可以運作,所以結合BLE,就很適合做物聯網應用專案。

限於篇幅,如果讀者有興趣,可以進一步參考Intel® Integrated Performance Primitives for Microcontrollers Library,了解Intel® IPP API 和常用的DSP-style API。

Sam Lin

現為慧手科技合夥人之一,於資訊電子產業有30多年經驗,主要以嵌入式系統、雷射印表機控制器開發為主。目前投入於Arduino科普教育、輪型機器人與物聯網應用開發;提供多種Arduino 控制板、感測模組與套件,並與學校老師合作開發教材,以及S2A/S4A教學推廣,致力於培訓青少年的程式與邏輯運算思維。同時,也幫忙客戶設計客製化產品,並偶爾開課與Maker們交流。

Author: Sam Lin

現為慧手科技合夥人之一,於資訊電子產業有30多年經驗,主要以嵌入式系統、雷射印表機控制器開發為主。目前投入於Arduino科普教育、輪型機器人與物聯網應用開發;提供多種Arduino 控制板、感測模組與套件,並與學校老師合作開發教材,以及S2A/S4A教學推廣,致力於培訓青少年的程式與邏輯運算思維。同時,也幫忙客戶設計客製化產品,並偶爾開課與Maker們交流。

Share This Post On
468 ad

Submit a Comment

你的電子郵件位址並不會被公開。 必要欄位標記為 *